使用Docker構建企業Jenkins CI平台

  在如今的互聯網時代,隨著軟體開發複雜度的不斷提高,軟體開發和發布管理也越來越重要。目前已經形成一套標準的流程,最重要的組成部分就是持續集成(Continuous Integration,CI)及持續部署、交付(CD)。在此,我們來以一個案例初步了解 CI 流程。那麼什麼是 CI 呢?簡單來講,CI 就是將傳統的程式碼合併、構建、部署、測試都集成在一起,不斷地執行這個過程,並對結果進行回饋。
CI 流程設計圖:
 

工作流程:

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

伺服器規劃:

IP地址
角色
10.0.0.111
Jenkins,Docker,JDK,Maven
10.0.0.100
Harbor(Docker,docker-compose),Git

部署Git程式碼版本倉庫

10.0.0.100 操作
# yum install git -y
# useradd git
# passwd git
# su – git
# mkdir wenlong.git
# cd wenlong.git/
#初始化倉庫
# git --bare init

 

10.0.0.111 操作
Jenkins主機測試訪問該倉庫:
git clone git@10.0.0.100:/home/tools/git/wenlong.git
正克隆到 'wenlong'...
git@10.0.0.100's password: "git帳號的密碼"
warning: 您似乎克隆了一個空版本庫。
模擬生產項目,拉取github上的一個demo,並上傳至本地git庫
# mv tomcat-java-demo-master/* wenlong/
# git add .
需要驗證
# git config --global user.email "[email protected]"
# git config --global user.name "xuewenlong"
# git commit -m "all"
# git push origin master

 

部署Harbor鏡像倉庫

10.0.0.100 操作
 

Jenkins主機安裝Docker並配置可信任

10.0.0.111 操作
# wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# yum install docker-ce -y
# cat /etc/docker/daemon.json 
{"registry-mirrors": ["//f1361db2.m.daocloud.io"],
  "insecure-registries": ["192.168.31.63"]
}
# systemctl start docker
# systemctl enable docker

 

Jenkins環境部署

# tar zxvf jdk-8u45-linux-x64.tar.gz
# mv jdk1.8.0_45 /usr/local/jdk
# tar zxf apache-maven-3.5.0-bin.tar.gz
# mv apache-maven-3.5.0 /usr/local/maven
# vim /etc/profile
JAVA_HOME=/usr/local/jdk
PATH=$PATH:$JAVA_HOME/bin:/usr/local/maven/bin
export JAVA_HOME PATH
# source /etc/profile
在10.0.0.111主機安裝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.38/bin/apache-tomcat-8.5.38.tar.gz
# tar zxf apache-tomcat-8.5.38.tar.gz
# mv apache-tomcat-8.5.38 /usr/local/tomcat-jenkins
# rm -rf /usr/local/tomcat-jenkins/webapps/*
# mv jenkins.war /usr/local/tomcat-jenkins/webapps/ROOT.war
# cd /usr/local/tomcat-jenkins/bin/
# ./startup.sh

 

啟動後,瀏覽器訪問
//10.0.0.111:8080/,按提示輸入密碼,登錄即可。

Jenkins安裝必要插件

由於jenkins是離線安裝,所有在此需要配置一下插件下載地址:系統管理–>插件管理–>Advanced
修改下方地址
jenkins插件清華大學鏡像地址
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
http://mirror.xmission.com/jenkins/updates/update-center.json

 

將https修改為http 再點Submit
Submit後點擊Available,Check now此時我們可以看到很多可獲得插件
安裝git和pipeline插件
 

Jenkins流水線部署

pipeline 是一套運行於jenkins上的工作流框架,將原本獨立運行於單個或者多個節點的任務連接起來,實現單個任務難以完成的複雜流程編排與可視化。
創建一個pipeline類型的Job
 
選擇流水線類型
 
配置Pipeline script,點擊Pipeline語法,來自動生成我們需要的配置。
選擇Git方式,配置Git倉庫地址,再添加認證相關
使用秘鑰認證方式需要將jenkins上生成的公鑰發送到git伺服器上,然後將jenkins上的生成的私鑰內容粘貼到下圖Key中,這樣jenkins就可以免交互的拉取git倉庫中的程式碼了。
[root@docker-jenkins bin]# ssh-keygen
[root@docker-jenkins bin]# cd
[root@docker-jenkins ~]# ls .ssh/
id_rsa  id_rsa.pub  known_hosts
[root@docker-jenkins ~]# ssh-copy-id git@10.0.0.100

 

 
 
 
 
配置完成後,生成Pipeline腳本了。點擊下方Generate Pipeline Script,然後複製方框內的內容。
編寫我們所需要的Pipeline腳本如下,將其粘貼到script的拉取程式碼模組中,並修改分支master為${branch},其他模組內容自行編寫。
node {
   def mvnHome
   stage('Preparation') { // for display purposes
   //拉取程式碼
      checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '7c00a680-53fd-42db-a12a-21b803dd6c40', url: '[email protected]:/home/tools/git/wenlong.git']]])
   }
   //編譯程式碼
   stage('Build') {
        sh '''
        export JAVA_HOME=/home/tools/jdk1.8.0_221
        mvn clean package -Dmaven.test.skip=true
        '''
   }
   // 項目打包到鏡像並推送到鏡像倉庫
   stage('Build and Push Image') {
sh '''
REPOSITORY=10.0.0.100/library/wenlong:${branch}
cat > Dockerfile << EOF
FROM 10.0.0.100/library/tomcat:v1 
LABEL maintainer wenlong
RUN rm -rf /usr/local/tomcat/webapps/*
ADD target/*.war /usr/local/tomcat/webapps/ROOT.war
EOF
docker build -t $REPOSITORY .
docker login 10.0.0.100 -u admin -p Harbor12345
docker push $REPOSITORY
'''
   }
   // 部署到Docker主機
   stage('Deploy to Docker') {
        sh '''
        REPOSITORY=10.0.0.100/library/wenlong:${branch}
        docker rm -f tomcat-java-demo |true
        docker pull $REPOSITORY
        docker container run -d --name wenlong -p 88:8080 $REPOSITORY
        '''
   }
}

 

 
在Pipeline腳本裡面我們指定了一個branch參數,所以我們需要傳遞一個參數變數,這裡我們選擇參數化構建,默認值為master分支。
然後保存配置

發布測試

回到主介面,我們開始構建任務:
 
查看構建成功後的圖形構建過程:
通過瀏覽器來訪問java項目://10.0.0.111:88/
至此部署完成,文章參考於李振良老師