1. 程式人生 > >基於Jenkins與Docker的CI/CD實戰部署

基於Jenkins與Docker的CI/CD實戰部署

    本實踐介紹了利用Jenkins和docker技術,如何實現CI/CD的各環節的步驟,包括環境準備,程式碼提交,編譯程式,構建映象,部署,測試,一套完整的安裝部署流程。

一、應用場景問題

       一個產品專案,開發測試所需要處理的事情大概有:申請測試機器、編碼實現、部署測試、整合等,而其中申請測試機器和部署測試是兩個最耗時且低技術含量的操作。那如何簡化整個流程,使開發人員一提交程式碼後,就能快速將應用部署到一臺伺服器上,以提高專案的開發效率?
     測試環境和正式環境,由於兩者環境的不同,比如作業系統、中介軟體版本、環境變數、安裝路徑等等,導致洩露到正式環境的bug通常是由於這種原因引起,那如何儘可能保證這兩個環境的一致性,以提高專案的質量?

二、解決思路及步驟

基於docker容器技術的自動化部署,程式設計師提交程式碼到gitLab倉庫,可觸發Jenkins觸發構建專案,拉取程式碼,編碼、再打包映象,推送到映象倉庫,並由Jenkins執行指令碼把docker映象Run起來。

整個流程需要用到如下的工具:
gitlab:原始碼版本管理工具,開發人員提交程式碼到GitLab倉庫
Jenkins:Jenkins人工或定時觸發構建專案,拉取程式碼,編碼、再打包映象,推送到映象倉庫
harbor:存放映象的倉庫

 環境準備:

主機名                          IP                          角色

gitlab.jackyops.com    192.168.3.17          gitlab

reg.jackyops.com       192.168.3.16           jenkins   harbor

node01                        92.168.3.10            docker 

作業系統centos 7.3  關閉防火牆 ,selinux 

三、gitlab倉庫部署

安裝GitLab倉庫並啟動

[[email protected] gitlab]# curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
[
[email protected]
gitlab]# yum install -y gitlab-ce # 配置和啟動GitLab [[email protected] gitlab]# gitlab-ctl reconfigure GitLab常用命令 sudo gitlab-ctl start # 啟動所有 gitlab 元件; sudo gitlab-ctl stop # 停止所有 gitlab 元件; sudo gitlab-ctl restart # 重啟所有 gitlab 元件; sudo gitlab-ctl status # 檢視服務狀態; sudo gitlab-ctl reconfigure # 啟動服務; sudo vim /etc/gitlab/gitlab.rb # 修改預設的配置檔案; gitlab-rake gitlab:check SANITIZE=true --trace # 檢查gitlab; sudo gitlab-ctl tail # 檢視日誌;

或者直接使用git建立倉庫

[[email protected] gitlab]# yum install git -y
# 建立Git使用者並設定密碼
[[email protected] gitlab]# useradd git
[[email protected] gitlab]# passwd git
# 建立倉庫
[[email protected] gitlab]# su - git
[[email protected] gitlab]# mkdir solo.git
[[email protected] gitlab]# cd solo.git
[[email protected] gitlab]# git --bare init
# 訪問建立的這個倉庫
[[email protected] gitlab]# git clone [email protected]:/home/git/solo.git

四、安裝Jenkins

      Jenkins是一個功能強大的應用程式,允許持續整合和持續交付專案,無論用的是什麼平臺。這是一個免費的原始碼,可以處理任何型別的構建或持續整合。整合Jenkins可以用於一些測試和部署技術。Jenkins是一種軟體允許持續整合。

產品設計成型 -> 開發人員開發程式碼 -> 測試人員測試功能 -> 運維人員釋出上線 
持續整合 (Continuous integration,簡稱CI) 
持續交付(Continuous delivery) 
持續部署(continuous deployment)

下載長期TLS維護版本,本次是通過下載Generic Java package(.war)包安裝Jenkins

下載 apache-maven-3.5.4-bin.tar.gz

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

[[email protected] ~]# tar zxf jdk-8u45-linux-x64.tar.gz 
[[email protected] ~]# tar zxf apache-maven-3.5.4-bin.tar.gz
[[email protected] ~]# mv jdk-8u45-linux-x64 /usr/local/jdk8
[[email protected] ~]# mv apache-maven-3.5.4-bin /usr/local/maven
[[email protected] ~]# vi /etc/profile
export MAVEN_HOME=/usr/local/maven
export JAVA_HOME=/usr/local/jdk8
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
[[email protected] ~]# source /etc/profile 

在reg.jackyops.com主機安裝Jenkins,下載Tomcat二進位制包將war包到webapps下

[[email protected] ~]# wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war 
[[email protected] ~]# wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v8.5.32/bin/apache-tomcat-8.5.32.tar.gz 
[[email protected] ~]# tar zxf apache-tomcat-8.5.32.tar.gz 
[[email protected] ~]# mv apache-tomcat-8.5.32 /opt/tomcat-jenkins
[[email protected] ~]# rm /opt/tomcat-jenkins/webapps/* -rf 
[[email protected] ~]# unzip jenkins.war -d /opt/tomcat-jenkins/webapps/ROOT 
[[email protected] ~]# /opt/tomcat-jenkins/bin/startup.sh
[[email protected] ~]# tailf /opt/tomcat-jenkins/logs/catalina.out
... 
Jenkins initial setup is required. An admin user has been created and a password generated. 
Please use the following password to proceed to installation: 

3kd844lde167fd4b8ab62f9497d3242ldsfs 

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

第一步:輸入上面日誌輸出的密碼:3kd844lde167fd4b8ab62f9497d3242ldsfs ,或者從本機/root/.jenkins/secrets/initialAdminPassword檔案獲取,點選繼續
第二步:點選“選擇外掛來安裝”
第三步:保持預設,點選繼續
第四步:建立管理員使用者,儲存並完成
第五步:設定Jenkins訪問地址,保持預設,點選儲存完成

安裝完成,開始使用Jenkins:

五 安裝dokcer

分配在reg.jackyops.com,node01主機安裝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 -y install docker-ce

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

6. 配置國內映象(可選)

# cat /etc/docker/daemon.json 
{
"registry-mirrors": [ "https://registry.docker-cn.com"],
"insecure-registries":["jackyops.com","192.168.3.16","reg.jackyops.com"]
}

六  部署harbor私有倉庫

       Harbor是映象倉庫,那麼就應當是儲存映象的,這個可能是大多數接觸harbor的人的一個誤區,當深入瞭解以後才發現,映象的儲存harbor使用的是官方的docker registry服務去完成,至於registry是用本地儲存或者s3都是可以的,harbor的功能是在此之上提供使用者許可權管理、映象複製等功能,提高使用的registry的效率。

# unzip docker-compose-linux-x86_64.zip 
# cp docker-compose /usr/bin/
# chmod +x /usr/bin/docker-compose 
# tar -xvf harbor-offline-installer-v1.5.1.tgz 
# cd harbor
# vim harbor.cfg
  hostname = reg.jackyops.com
#  ./prepare
# ./install.sh 
# 檢視容器是否執行
#  docker-compose ps


七. 構建Tomcat基礎映象

     JAVA程式必須有JDK環境才可以執行,為了減少映象檔案大小及提高效能,這裡直接把JDK放到宿主機上,容器以掛載形式使用。
在reg.jackyops.com,node01上安裝JDK:

# tar zxvf jdk-8u45-linux-x64.tar.gz 
# mv jdk-8u45-linux-x64 /usr/local/jdk
Tomcat基礎映象Dockerfile:

# cat Dockerfile

FROM centos:7
MAINTAINER zhouyuchun

ENV VERSION=8.5.32

ENV JAVA_HOME /usr/local/jdk

RUN yum -y update && \
    yum install wget curl -y && \
    yum clean all && \
    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 -p /usr/local/tomcat/webapps/ROOT  && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

WORKDIR /usr/local/tomcat

EXPOSE 8080
CMD ["./bin/catalina.sh", "run"]

構建映象並上傳到registry:

# docker pull reg.jackyops.com/ops/tomcat8:v1.0 -f Dockerfile .
# docker push reg.jackyops.com/ops/tomcat8:v1.0

 

 八. Jenkins配置全域性工具配置

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

指定JDK、Maven、Git路徑

如果Jenkins主機沒有git命令,需要安裝Git:
# yum install git -y

九、Jenkins安裝必要外掛

1. Jenkins安裝必要外掛
主頁面 -> 系統管理 ->管理外掛

安裝SSH與Git Parameter外掛。

外掛說明:

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

2. 配置SSH外掛
第一步:先建立一個用於連線Docker主機的憑據。
主頁面 -> 憑據 -> 系統 -> 右擊全域性憑據 -> 新增憑據:

輸入連線node01主機的使用者名稱和密碼: 

第二步:新增SSH遠端主機
主頁面 -> 系統管理 -> 系統設定 -> SSH remote hosts:

十. 上傳solo專案程式碼到gitlab倉庫

從Github拉取開源部落格系統solo:

# git clone https://github.com/b3log/solo
# cd solo
移除舊的推送地址,新增新的:
# git remote remove origin 
# git remote add origin [email protected]/solo.git
提交程式碼到Git倉庫並建立tag:
# touch src/main/webapp/test.html
# git add .
# git commit -m “init jacky”
建立標籤:
# git tag 3.0.0
推送到Git伺服器:
# git push origin 3.0.0 

十一. Jenkins建立專案併發布測試

主頁》新建任務>輸入任務名,構建一個Maven專案

如果沒有顯示“構建一個Maven專案”選項,需要在管理外掛裡安裝“Maven Integration plugin”外掛。
配置Git引數化構建:

動態獲取GitLab倉庫tag,與使用者互動選擇Tag釋出:

指定專案Gitlab倉庫地址:

修改*/master為$Tag,Tag是上面動態獲取的變數名,表示根據使用者選擇打程式碼tag版本。

設定maven構建命令選項:

利用pom.xml檔案構建solo專案。
在Jenkins本機映象構建與推送到harbor映象倉庫,並SSH遠端連線到node01主機使用推送的映象建立容器:

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

docker login reg.jackyops.com --username=jacky --password=Jacky123
REPOSITORY=reg.jackyops.com/project/solo:${Tag}
# 構建映象
cat > Dockerfile << EOF
FROM reg.jackyops.com/ops/tomcat8:v1.0
RUN rm -rf /usr/local/tomcat/webapps/ROOT
COPY target/*.war /usr/local/tomcat/webapps/ROOT.war
WORKDIR /usr/local/tomcat
CMD ["./bin/catalina.sh", "run"]
EOF
docker build -t $REPOSITORY .
# 上傳映象
docker push $REPOSITORY

圖中,SSH遠端node01主機執行的Shell命令如下:

REPOSITORY=reg.jackyops.com/project/solo:${Tag}

# 部署
docker rm -f blog-solo |true
docker images $REPOSITORY  |true
docker container run -d --name blog-solo -v /usr/local/jdk:/usr/local/jdk -p 89:8080 $REPOSITORY

注:容器名稱blog-solo,暴露宿主機埠89,即使用宿主機IP:89訪問blog-solo專案。
blog-solo專案已配置完成,開始構建:

選擇tag,開始構建:

最終訪問的web介面如下

如果輸出上述頁面說明是正常的,頁面沒有載入成功樣式,需要修改下專案裡訪問地址。

Jenkins+docker的CI/CD環境搭建完成,可以模擬提交程式碼並打tag測試自動化釋出流程。