Jenkins與Docker的自動化CI

在互聯網時代,對於每一家公司,軟件開發和發佈的重要性不言而喻,目前已經形成一套標準的流程,最重要的組成部分就是持續集成(CI)及持續部署、交付(CD)。本文基於Jenkins+Docker+Git實現一套CI自動化發佈流程。

1、發佈流程設計

Jenkins與Docker的自動化CI/CD流水線實戰


Jenkins與Docker的自動化CI/CD流水線實戰


工作流程:

1.開發人員提交代碼到Git版本倉庫;

2.Jenkins人工/定時觸發項目構建;

3.Jenkins拉取代碼、代碼編碼、打包鏡像、推送到鏡像倉庫;

4.Jenkins在Docker主機創建容器併發布。

環境規劃如下:

角色IP

Jenkins/Docker 192.168.0.13

Docker 192.168.0.14

Git/Registry 192.168.0.15

操作系統:CentOS7.5

systemctl stop firewalld

setenforce 0

yum install -y ntpdate

ntpdate time.windows.com

2、部暑git倉庫

1、創建Git用戶並設置密碼

# yum install -y git

2、創建Git用戶並設置密碼

# useradd git

# passwd git

3、創建倉庫

# su - git

# mkdir solo.git

# cd solo.git

# git --bare init

4、訪問這個倉庫

# git clone [email protected]:/home/git/solo.git

3、準備jenkins環境

Jenkins是一個開源軟件項目,是基於Java開發的一種持續集成工具,用於代碼編譯、部署、測試等工作。 Jenkins也是一個跨平臺的,大多數主流的平臺都支持,而且安裝很簡單,我們這裡以部署war包方式安裝它。

官網下載地址:https://jenkins.io/download/

如圖點擊下載最後一個Generic Java package(war):


Jenkins與Docker的自動化CI/CD流水線實戰


在安裝前需要具備Java環境,安裝方式如下:

# tar -xzf jdk-8u45-linux-x64.tar.gz

# mv jdk1.8.0_45/ /usr/local/jdk1.8

# vi /etc/profile

JAVA_HOME=/usr/local/jdk1.8

PATH=$PATH:$JAVA_HOME/bin

CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export JAVA_HOME PATH CLASSPATH

# source /etc/profile

# java -version

在192.168.0.13主機安裝Jenkins,下載Tomcat二進制包將war包到webapps下即可:

# wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war

# tar -xzf apache-tomcat-8.5.31.tar.gz

# mv apache-tomcat-8.5.31 /usr/local/tomcat-jenkins

# rm /usr/local/tomcat-jenkins/webapps/* -rf

# unzip jenkins.war -d /usr/local/tomcat-jenkins/webapps/ROOT

# cd /usr/local/tomcat-jenkins/bin/

# ./startup.sh

# tail ../logs/catalina.out -f

...

Jenkins initial setup is required. An admin user has been created and a password generated.

Please use the following password to proceed to installation:

063de6a478ac44fb8d807a8a46313e38

This may also be found at: /root/.jenkins/secrets/initialAdminPassword

部署成功,訪問Jenkins:http://192.168.0.13:8080

第一步:輸入上面日誌輸出的密碼:063de6a478ac44fb8d807a8a46313e38

,或者從本機/root/.jenkins/secrets/initialAdminPassword文件獲取,點擊繼續

第二步:點擊“選擇插件來安裝”

第三步:保持默認,點擊繼續

第四步:創建管理員用戶,保存並完成

第五步:設置Jenkins訪問地址,保持默認,點擊保存完成

安裝完成,開始使用Jenkins:


Jenkins與Docker的自動化CI/CD流水線實戰


4、安裝docker

在192.168.0.13/192.168.0.14/192.168.0.15主機安裝Docker,如下:

1、安裝依賴包

# yum install -y yum-utils device-mapper-persistent-data lvm2

2、添加Docker軟件包源:

# yum-config-manager \\

--add-repo \\

https://download.docker.com/linux/centos/docker-ce.repo

3、安裝Docker CE

# yum install docker-ce -y

4、配置加速器

# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://bc437cce.m.daocloud.io

5、啟動並開機啟動

# systemctl start docker

# systemctl enable docker

5、部署私有鏡像倉庫

Docker Hub作為Docker默認官方公共鏡像;如果想自己搭建私有鏡像倉庫,官方也提供registry鏡像,使得搭建私有倉庫非常簡單。

在192.168.0.15部署:

# docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry

接下來測試registry可用性。

由於Docker CLI默認以HTTPS訪問,而部署的registry並未提供HTTPS,因此,需要在pull鏡像的Docker主機(192.168.0.13,192.168.0.14)添加HTTP可信任:

# vi /etc/docker/daemon.json

{

"registry-mirrors": ["http://bc437cce.m.daocloud.io"],

"insecure-registries": ["192.168.0.15:5000"]

}

# systemctl restart docker

6、構建Tomcat基礎鏡像

JAVA程序必須有JDK環境才可以運行,為了減少鏡像大小及提高性能,這裡直接把JDK放到宿主機上,容器以掛載形式使用。

在192.168.0.13/192.168.0.14安裝JDK:

# tar -xzf jdk-8u45-linux-x64.tar.gz

# mv jdk1.8.0_45/ /usr/local/jdk1.8

# vi /etc/profile

JAVA_HOME=/usr/local/jdk1.8

PATH=$PATH:$JAVA_HOME/bin

CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export JAVA_HOME PATH CLASSPATH

# source /etc/profile

# java -version

Tomcat基礎鏡像Dockerfile:

# cat Dockerfile

FROM centos:7

MAINTAINER andy

ENV VERSION=8.5.31

ENV JAVA_HOME /usr/local/jdk1.8

COPY apache-tomcat-8.5.31.tar.gz /opt

#RUN yum install wget -y

#RUN wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz && \\

RUN cd /opt && \\

tar zxf apache-tomcat-${VERSION}.tar.gz && \\

mv apache-tomcat-${VERSION} /usr/local/tomcat && \\

rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && \\

mkdir /usr/local/tomcat/webapps/ROOT

EXPOSE 8080

CMD ["catalina.sh", "run"]

# docker build -t 192.168.0.15:5000/tomcat-85 -f Dockerfile .

# docker push 192.168.0.15:5000/tomcat-85

7、Jenkins配置全局工具配置

主頁面 -> 系統管理 -> 全局工具配置

指定JDK、Maven路徑,Git保持默認:

安裝git:

# yum install git -y

安裝maven:

下載地址:http://maven.apache.org/download.cgi

# tar -xzf apache-maven-3.5.4-bin.tar.gz -C /usr/local/

# cd /usr/local/

# mv apache-maven-3.5.4/ maven

配置環境變量:

# cat /etc/profile

export MAVEN_HOME=/usr/local/maven

export PATH=$MAVEN_HOME/bin:$PATH

# source /etc/profile

# mvn -v


8、Jenkins安裝必要插件

1. Jenkins安裝必要插件

主頁面 -> 系統管理 ->管理插件:


安裝SSH與Git Parameter插件。

插件說明:

•SSH:用於SSH遠程Docker主機執行Shell命令

•Git Parameter:動態獲取Git倉庫Branch、Tag

2. 配置SSH插件

第一步:先創建一個用於連接Docker主機的憑據。

主頁面 -> 憑據 -> 系統 -> 右擊全局憑據 -> 添加憑據:


Jenkins與Docker的自動化CI/CD流水線實戰


輸入連接Docker主機的用戶名和密碼:


Jenkins與Docker的自動化CI/CD流水線實戰


Jenkins與Docker的自動化CI/CD流水線實戰


第二步:添加SSH遠程主機

主頁面 -> 系統管理 -> 系統設置 -> SSH remote hosts:


Jenkins與Docker的自動化CI/CD流水線實戰


9、上傳JAVA項目代碼到Git倉庫

從GitHub拉取開源Java博客系統solo:

# git clone -b v2.9.0 https://github.com/b3log/solo.git

# cd solo

修改Git地址:

# vim .git/config

[core]

repositoryformatversion = 0

filemode = true

bare = false

logallrefupdates = true

[remote "origin"]

url = [email protected]:/home/git/solo.git

fetch = +refs/heads/*:refs/remotes/origin/*

提交代碼到Git倉庫

# git add .

# git commit -m 'solo'

創建標籤

# git tag 1.0.0

推送到Git服務器

# git push origin 1.0.0

10、Jenkins創建項目併發布測試

主頁面 -> 新建任務 -> 輸入任務名稱,構建一個Maven項目:


Jenkins與Docker的自動化CI/CD流水線實戰


Jenkins與Docker的自動化CI/CD流水線實戰


注意:如果沒有顯示“構建一個Maven項目”選項,需要在管理插件裡安裝“Maven Integration plugin”插件。

配置Git參數化構建:


Jenkins與Docker的自動化CI/CD流水線實戰


動態獲取Git倉庫tag,與用戶交互選擇Tag發佈:


Jenkins與Docker的自動化CI/CD流水線實戰


指定項目Git倉庫地址:

jenkins服務器配置:

# ssh-keygen

# ssh-copy-id [email protected]


Jenkins與Docker的自動化CI/CD流水線實戰


修改*/master為$Tag,Tag是上面動態獲取的變量名,表示根據用戶選擇打代碼版本。

設置maven構建命令選項:

clean package -Dmaven.test.skip=true


Jenkins與Docker的自動化CI/CD流水線實戰


利用pom.xml文件構建項目。

在Jenkins本機鏡像構建與推送到鏡像倉庫,並SSH遠程連接到Docker主機使用推送的鏡像創建容器:

上圖中,在Jenkins主機執行的Shell命令如下:

REPOSITORY=192.168.0.15:5000/solo:${Tag}

# 構建鏡像

cat > Dockerfile << EOF

FROM 192.168.0.15:5000/tomcat-85:latest

RUN rm -rf /usr/local/tomcat/webapps/ROOT

COPY target/*.war /usr/local/tomcat/webapps/ROOT.war

ENV PATH /usr/local/tomcat/bin:$PATH

CMD ["catalina.sh", "run"]

EOF

docker build -t $REPOSITORY .

# 上傳鏡像

docker push $REPOSITORY


Jenkins與Docker的自動化CI/CD流水線實戰


Jenkins與Docker的自動化CI/CD流水線實戰


上圖中,SSH遠程Docker主機執行的Shell命令如下:

REPOSITORY=192.168.0.15:5000/solo:${Tag}

# 部署

docker rm -f blog-solo |true

docker image rm $REPOSITORY |true

docker container run -d --name blog-solo -v /usr/local/jdk1.8:/usr/local/jdk1.8 -p 88:8080 $REPOSITORY

注:容器名稱blog-solo,暴露宿主機端口88,即使用宿主機IP:88訪問blog-solo項目。

blog-solo項目已配置完成,開始構建:


Jenkins與Docker的自動化CI/CD流水線實戰


Jenkins與Docker的自動化CI/CD流水線實戰


Jenkins與Docker的自動化CI/CD流水線實戰


Jenkins與Docker的自動化CI/CD流水線實戰


選擇tag,開始構建:


點擊左下角構建歷史裡,右擊第一個查看控制檯輸出:


瀏覽器訪問solo項目:http://192.168.0.14:88


Jenkins與Docker的自動化CI/CD流水線實戰


分享到:


相關文章: