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

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

一、發佈流程設計

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

Jenkins與Docker的自動化CI/CD實戰
工作流程:

  1. 開發人員提交代碼到Git版本倉庫;
  2. Jenkins人工/定時觸發項目構建;
  3. Jenkins拉取代碼、代碼編碼、打包鏡像、推送到鏡像倉庫;
  4. Jenkins在Docker主機創建容器併發布。

環境規劃如下:

角色 IP
Jenkins/Docker 192.168.0.217
Docker 192.168.0.218
Git/Registry 192.168.0.219

操作系統:CentOS7.4

二、部署Git倉庫

# yum install git -y
  1. 創建Git用戶並設置密碼

    # useradd git
    # passwd git
  2. 創建倉庫

    # su - git
    # mkdir solo.git
    # cd solo.git
    # git --bare init
  3. 訪問創建的這個倉庫

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

    三、準備Jenkins環境

    Jenkins是一個開源軟件項目,是基於Java開發的一種持續集成工具,用於代碼編譯、部署、測試等工作。 Jenkins也是一個跨平臺的,大多數主流的平臺都支持,而且安裝很簡單,我們這裏以部署war包方式安裝它。
    官網下載地址:https://jenkins.io/download/
    如圖點擊下載最後一個Generic Java package(war):
    Jenkins與Docker的自動化CI/CD實戰
    在安裝前需要具備Java環境,安裝方式如下:

    # tar zxf jdk-8u45-linux-x64.tar.gz 
    # mv jdk-8u45-linux-x64 /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

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

# wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war 
# wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v8.5.32/bin/apache-tomcat-8.5.32.tar.gz 
# tar zxf apache-tomcat-8.5.32.tar.gz 
# mv apache-tomcat-8.5.32 /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: 

a5f1f7c167fd4b8ab62f9497d32d97db 

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

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

第一步:輸入上面日誌輸出的密碼:a5f1f7c167fd4b8ab62f9497d32d97db,或者從本機/root/.jenkins/secrets/initialAdminPassword文件獲取,點擊繼續
第二步:點擊“選擇插件來安裝”
第三步:保持默認,點擊繼續
第四步:創建管理員用戶,保存並完成
第五步:設置Jenkins訪問地址,保持默認,點擊保存完成

安裝完成,開始使用Jenkins:
Jenkins與Docker的自動化CI/CD實戰

四、部署私有鏡像倉庫

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

# 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.217,192.168.0.218)添加HTTP可信任:

 # vi /etc/docker/daemon.json 
{"insecure-registries":["192.168.0.219:5000"]}
# service docker restart

五、安裝Docker

在192.168.0.217/192.168.0.218/192.168.0.219主機安裝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

    六、構建Tomcat基礎鏡像

    JAVA程序必須有JDK環境纔可以運行,爲了減少鏡像大小及提高性能,這裏直接把JDK放到宿主機上,容器以掛載形式使用。
    在192.168.0.217/192.168.0.218安裝JDK:

# tar zxvf jdk-8u45-linux-x64.tar.gz 
# mv jdk-8u45-linux-x64 /usr/local/jdk1.8

Tomcat基礎鏡像Dockerfile:

# cat Dockerfile
FROM centos:7
MAINTAINER www.aliangedu.com

ENV VERSION=8.5.32
ENV JAVA_HOME /usr/local/jdk

RUN yum install wget -y

RUN wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz && \
    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"]

構建鏡像並上傳到registry:

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

七、Jenkins配置全局工具配置

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

指定JDK、Maven路徑,Git保持默認:
Jenkins與Docker的自動化CI/CD實戰
如果Jenkins主機沒有git命令,需要安裝Git:
# yum install git -y

八、Jenkins安裝必要插件

1. Jenkins安裝必要插件
主頁面 -> 系統管理 ->管理插件:
Jenkins與Docker的自動化CI/CD實戰
安裝SSH與Git Parameter插件。

插件說明:

  • SSH:用於SSH遠程Docker主機執行Shell命令
  • Git Parameter:動態獲取Git倉庫Branch、Tag

2. 配置SSH插件
第一步:先創建一個用於連接Docker主機的憑據。
主頁面 -> 憑據 -> 系統 -> 右擊全局憑據 -> 添加憑據:
Jenkins與Docker的自動化CI/CD實戰
輸入連接Docker主機的用戶名和密碼:
Jenkins與Docker的自動化CI/CD實戰
第二步:添加SSH遠程主機
主頁面 -> 系統管理 -> 系統設置 -> SSH remote hosts:
Jenkins與Docker的自動化CI/CD實戰

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

從Github拉取開源JAVA博客系統solo:

# git clone https://github.com/b3log/solo
# cd solo
移除舊的推送地址,添加新的:
# git remote remove origin 
# git remote add origin [email protected]:/home/git/solo.git
提交代碼到Git倉庫並創建tag:
# touch src/main/webapp/a.html
# git add .
# git commit -m “a”
創建標籤:
# git tag 1.0.0
推送到Git服務器:
# git push origin 1.0.0 

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

主頁面 -> 新建任務 -> 輸入任務名稱,構建一個Maven項目:
Jenkins與Docker的自動化CI/CD實戰
注意:如果沒有顯示“構建一個Maven項目”選項,需要在管理插件裏安裝“Maven Integration plugin”插件。
配置Git參數化構建:
Jenkins與Docker的自動化CI/CD實戰
動態獲取Git倉庫tag,與用戶交互選擇Tag發佈:
Jenkins與Docker的自動化CI/CD實戰
指定項目Git倉庫地址:
Jenkins與Docker的自動化CI/CD實戰
修改*/master爲$Tag,Tag是上面動態獲取的變量名,表示根據用戶選擇打代碼版本。

設置maven構建命令選項:
Jenkins與Docker的自動化CI/CD實戰

利用pom.xml文件構建項目。
在Jenkins本機鏡像構建與推送到鏡像倉庫,並SSH遠程連接到Docker主機使用推送的鏡像創建容器:
Jenkins與Docker的自動化CI/CD實戰
上圖中,在Jenkins主機執行的Shell命令如下:

REPOSITORY=192.168.0.219:5000/solo:${Tag}
# 構建鏡像
cat > Dockerfile << EOF
FROM 192.168.0.219:5000/tomcat-85:latest
RUN rm -rf /usr/local/tomcat/webapps/ROOT
COPY target/*.war /usr/local/tomcat/webapps/ROOT.war
CMD ["catalina.sh", "run"]
EOF
docker build -t $REPOSITORY .
# 上傳鏡像
docker push $REPOSITORY

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

REPOSITORY=192.168.0.219: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/jdk -p 88:8080 $REPOSITORY

注:容器名稱blog-solo,暴露宿主機端口88,即使用宿主機IP:88訪問blog-solo項目。
blog-solo項目已配置完成,開始構建:

選擇tag,開始構建:

Jenkins與Docker的自動化CI/CD實戰
Jenkins與Docker的自動化CI/CD實戰
點擊左下角構建歷史裏,右擊第一個查看控制檯輸出:
Jenkins與Docker的自動化CI/CD實戰
Jenkins與Docker的自動化CI/CD實戰

瀏覽器訪問solo項目:http://192.168.0.218:88
Jenkins與Docker的自動化CI/CD實戰
如果輸出上述頁面說明是正常的,頁面沒有加載成功樣式,需要修改下項目裏訪問地址。

至此,自動化CI環境搭建完成,你可以模擬提交代碼並打tag測試自動化發佈流程。


原文地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章