基於Docker+Jenkins+Git的CI/CD實戰
與上一篇隨筆:基於 Jenkins+Docker+Git 的CI流程初探 有所不同,該內容更偏向於實際業務的基礎需求。
有幾點需要注意:
- 該實戰中沒有涉及到映象倉庫,所以略去了映象推送階段,可以參考基於 Jenkins+Docker+Git 的CI流程初探。
- 與上一篇對比,該實戰是基於外網伺服器進行的,所以加入了Jenkins自動觸發拉取程式碼以及傳送構建報告功能。
- 實戰中的Jenkins也是基於docker執行,對於Jenkins資料持久化是通過VOLUME實現的。
- 不再進行自建git程式碼倉庫,選擇使用Gitee管理程式碼。
- 實驗環境均已提前準備完畢。
1、Jenkins啟動
docker run \ -u root \ -d \ -p 8080:8080 \ -p 50000:50000 \ -v jenkins-data:/var/jenkins_home \ -v /etc/localtime:/etc/localtime:ro \ -v /var/run/docker.sock:/var/run/docker.sock \ --restart=always \ jenkinsci/blueocean
Jenkins重要的點
pipeline{ //全部的CI/CD流程都需要在這裡定義 //任何一個代理可用就可以執行 agent any //定義一些環境資訊 environment { WS = "${WORKSPACE}" } //定義流水線的加工流程 stages{ stage('環境檢查'){ steps { sh 'printenv' echo "正在檢測基本資訊" sh 'java -version' sh 'git --version' sh 'docker version' sh 'pwd && ls -alh' } } //1、編譯 "abc" stage('maven編譯'){ agent { docker { image 'maven:3-alpine' args '-v /var/jenkins_home/appconfig/maven/.m2:/root/.m2' //docker run -v /var/jenkins_home/appconfig/maven/.m2:/root/.m2 } } //要做的所有事情 //jenkins不配置任何環境的情況下, 僅適用docker相容所有場景 steps{ echo "編譯..." sh 'pwd && ls -alh' sh 'cd ${WS} && mvn clean package -s "/var/jenkins_home/appconfig/maven/settings.xml" -Dmaven.test.skip=true' } } //2、打包 stage('生成映象'){ steps{ sh 'pwd && ls -alh' sh 'docker version' sh 'docker build -t java-devops-demo .' } } //3、部署 stage('部署'){ steps{ echo "部署..." sh 'docker rm -f java-devops-demo-dev' sh 'docker run -d -p 80:8080 --name java-devops-demo-dev java-devops-demo' } } //4、推送報告 stage("傳送報告"){ steps { //簡訊通知,購買api介面即可 // sh 'curl -i -k -X POST 'https://gyytz.market.alicloudapi.com/sms/smsSend?mobile=mobile¶m=**code**%3A12345%2C**minute**%3A5&smsSignId=2e65b1bb3d054466b82f0c9d125465e2&templateId=908e94ccf08b4476ba6c876d13f084ad' -H 'Authorization:APPCODE dddddddd'' //REST API 所有都行 // sh 'curl ' echo '準備傳送報告' emailext body: '''<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次構建日誌</title> </head> <body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0"> <table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif"> <h3>本郵件由系統自動發出,請勿回覆!</h3> <tr> <br/> 各位同事,大家好,以下為${PROJECT_NAME }專案構建資訊</br> <td><font color="#CC0000">構建結果 - ${BUILD_STATUS}</font></td> </tr> <tr> <td><br /> <b><font color="#0B610B">構建資訊</font></b> <hr size="2" width="100%" align="center" /></td> </tr> <tr> <td> <ul> <li>專案名稱 : ${PROJECT_NAME}</li> <li>構建編號 : 第${BUILD_NUMBER}次構建</li> <li>觸發原因: ${CAUSE}</li> <li>構建狀態: ${BUILD_STATUS}</li> <li>構建日誌: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li> <li>構建 Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li> <li>工作目錄 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li> <li>專案 Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li> </ul> <h4><font color="#0B610B">最近提交</font></h4> <ul> <hr size="2" width="100%" /> ${CHANGES_SINCE_LAST_SUCCESS, reverse=true, format="%c", changesFormat="<li>%d [%a] %m</li>"} </ul> 詳細提交: <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a><br/> </td> </tr> </table> </body> </html>''', subject: '${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次構建日誌', to: 'xxxxx@163.com' } } } //後置處理過程 post { failure { echo "這個階段 完蛋了.... $currentBuild.result" } success { echo "這個階段 成了.... $currentBuild.result" } } }
Dockerfile:
#這個也得有 FROM openjdk:8-jre-alpine LABEL maintainer="xxxxxxx@qq.com" #複製打好的jar包 COPY target/*.jar /app.jar RUN apk add -U tzdata; \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime; \ echo 'Asia/Shanghai' >/etc/timezone; \ touch /app.jar; ENV JAVA_OPTS="" ENV PARAMS="" EXPOSE 8080 ENTRYPOINT [ "sh", "-c", "java -Djava.security.egd=file:/dev/./urandom $JAVA_OPTS -jar /app.jar $PARAMS" ]
Jenkinsfile與Dockerfile均位於java-devops-jemo目錄下,由Jenkins從git倉庫拉取。
2)
agent { docker { image 'maven:3-alpine' //用完就會殺掉 args '-v /var/jenkins_home/appconfig/maven/.m2:/root/.m2' // 將jar包對映到宿主機上/var/jenkins_home/appconfig/maven/.m2目錄中 // 也可以將jar包以資料卷方式掛載到宿主機 } }