天天看點

使用Docker建構企業Jenkins CI平台

  在如今的網際網路時代,随着軟體開發複雜度的不斷提高,軟體開發和釋出管理也越來越重要。目前已經形成一套标準的流程,最重要的組成部分就是持續內建(Continuous Integration,CI)及持續部署、傳遞(CD)。在此,我們來以一個案例初步了解 CI 流程。那麼什麼是 CI 呢?簡單來講,CI 就是将傳統的代碼合并、建構、部署、測試都內建在一起,不斷地執行這個過程,并對結果進行回報。

CI 流程設計圖:

使用Docker建構企業Jenkins CI平台

工作流程:

1. 開發人員送出代碼到Git版本倉庫;
2. Jenkins人工/定時觸發項目建構;
3. Jenkins拉取代碼、代碼編碼、打包鏡像、推送到鏡像倉庫;
4. Jenkins在Docker主機建立容器并釋出
使用Docker建構企業Jenkins CI平台

伺服器規劃:

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 [email protected]:/home/tools/git/wenlong.git
正克隆到 'wenlong'...
[email protected]'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 操作

參考:企業級harbor鏡像倉庫部署

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": ["http://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      
啟動後,浏覽器通路

http://10.0.0.111:8080/,按提示輸入密碼,登入即可。

使用Docker建構企業Jenkins CI平台

Jenkins安裝必要插件

由于jenkins是離線安裝,所有在此需要配置一下插件下載下傳位址:系統管理-->插件管理-->Advanced
使用Docker建構企業Jenkins CI平台
使用Docker建構企業Jenkins CI平台
修改下方位址
jenkins插件清華大學鏡像位址
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
http://mirror.xmission.com/jenkins/updates/update-center.json      
将https修改為http 再點Submit
使用Docker建構企業Jenkins CI平台
Submit後點選Available,Check now此時我們可以看到很多可獲得插件
使用Docker建構企業Jenkins CI平台
安裝git和pipeline插件
使用Docker建構企業Jenkins CI平台

Jenkins流水線部署

pipeline 是一套運作于jenkins上的工作流架構,将原本獨立運作于單個或者多個節點的任務連接配接起來,實作單個任務難以完成的複雜流程編排與可視化。

建立一個pipeline類型的Job
使用Docker建構企業Jenkins CI平台
選擇流水線類型
使用Docker建構企業Jenkins CI平台
配置Pipeline script,點選Pipeline文法,來自動生成我們需要的配置。
使用Docker建構企業Jenkins CI平台
選擇Git方式,配置Git倉庫位址,再添加認證相關
使用Docker建構企業Jenkins CI平台
使用秘鑰認證方式需要将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 [email protected]      
使用Docker建構企業Jenkins CI平台
使用Docker建構企業Jenkins CI平台
配置完成後,生成Pipeline腳本了。點選下方Generate Pipeline Script,然後複制方框内的内容。
使用Docker建構企業Jenkins CI平台
編寫我們所需要的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
        '''
   }
}      
使用Docker建構企業Jenkins CI平台
在Pipeline腳本裡面我們指定了一個branch參數,是以我們需要傳遞一個參數變量,這裡我們選擇參數化建構,預設值為master分支。
使用Docker建構企業Jenkins CI平台
然後儲存配置

釋出測試

回到主界面,我們開始建構任務:
使用Docker建構企業Jenkins CI平台
檢視建構成功後的圖形建構過程:
使用Docker建構企業Jenkins CI平台

通過浏覽器來通路java項目:http://10.0.0.111:88/

至此部署完成,文章參考于李振良老師