使用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/