北京 網(wǎng)站 優(yōu)化足球比賽今日最新推薦
Jenkins
第三章 Jenkins + Git + Maven 自動化部署配置
十、幾種構(gòu)建方式
- 快照依賴構(gòu)建/Build whenever a SNAPSHOT dependency is built
- 當(dāng)依賴的快照被構(gòu)建時執(zhí)行本job
- 觸發(fā)遠程構(gòu)建 (例如,使用腳本)
- 遠程調(diào)用本job的restapi時執(zhí)行本job
- job依賴構(gòu)建/Build after other projects are built
- 當(dāng)依賴的job被構(gòu)建時執(zhí)行本job
- 定時構(gòu)建/Build periodically
- 使用cron表達式定時構(gòu)建本job
- 向GitHub提交代碼時觸發(fā)Jenkins自動構(gòu)建/GitHub hook trigger for GITScm polling
- Github-WebHook出發(fā)時構(gòu)建本job
- 定期檢查代碼變更/Poll SCM
- 使用cron表達式定時檢查代碼變更,變更后構(gòu)建本job
1. 觸發(fā)遠程構(gòu)建/gitlab上改動自動構(gòu)建
代碼改動自動可以使用gitlab的webhook回調(diào)鉤子調(diào)起Jenkins的啟動任務(wù)接口
在構(gòu)建觸發(fā)器中配置接口和token
2. 定時構(gòu)建
Jenkins cron表達式
標(biāo)準(zhǔn)cron
https://crontab.guru
Jenkins cron不是標(biāo)準(zhǔn)的cron表達式
第一個 * 表示每個小時的第幾分鐘,取值0~59H * * * *
H:每小時執(zhí)行一次第二顆 * 表示小時,取值0~23* 15 * * * 表示每天下午3點
* 1 * * * 表示每天凌晨1點第三顆 * 表示一個月的第幾天,取值1~31
* 1 5 * * 表示每月5日凌晨1點第四顆 * 表示第幾月,取值1~12
* 15 5 1 * 表示每年幾月執(zhí)行第五顆 * 表示一周中的第幾天,取值0~7,其中0和7代表的都是周日
“/”
表示每隔多長時間,比如 */10 * * * * 表示 每隔10分鐘
“H”
hash散列值,以job名取值,獲取到以job名為入?yún)⒌奈ㄒ恢?#xff0c;相同名稱值也相同,這個偏移量會和實際時間相加,獲得一個真實的運行時間
意義在于:不同的項目在不同的時間運行,即使配置的值是一樣的,比如 都是15 * * * *
,表示每個小時的第15分鐘開始執(zhí)行任務(wù),那么會造成同一時間內(nèi)在Jenkins中啟動很多job,換成H/15 * * * *
,那么在首次啟動任務(wù)時,會有隨機值參與進來,有的會在17分鐘啟動 有的會在19分鐘啟動,隨后的啟動時間也是這個值。這樣就能錯開相同cron值的任務(wù)執(zhí)行了。
H的值也可以設(shè)置范圍
H * * * *
表示一小時內(nèi)的任意時間
*/10 * * * *
每10分鐘
H/10 * * * *
每10分鐘,可能是7,17,27,起始時間hash,步長不變
45 3 * * 1-6
每個周一至周六,凌晨3點45 執(zhí)行1次
45 3-5 * * 1-6
每個周一至周六,凌晨3點45 ,凌晨4點45,凌晨5點45 各執(zhí)行1次
H(40-48) 3-5 * * 1-6
在40~48之間取值 其他同上
45 3-5/2 * * 1-6
每個周一至周六,凌晨3點45 ,凌晨5點45 各執(zhí)行1次
45 0-6/2 * * 1-6 * * 1-6
0點開始,每間隔2小時執(zhí)行一次 0:45、2:45、4:45
3. 源碼變更構(gòu)建
使用Poll SCM 方式與Build periodically一樣
會主動定期檢查代碼托管服務(wù)器上是否有變化,一旦發(fā)生變化執(zhí)行job構(gòu)建
4. 測試報告郵件通知
十一、自動化部署到docker容器中
1. docker外掛目錄
docker run -d -p 8080:8080 --name demo-out -v /root/jarfile/demo-1-0.0.1-SNAPSHOT.jar:/app.jar openjdk:11 java -jar app.jar
2. 打包到容器內(nèi)
2.1 準(zhǔn)備一臺測試服務(wù)器 docker環(huán)境
2.2 準(zhǔn)備支持jdk的鏡像
FROM openjdk:11
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
RUN javac Main.java
CMD ["java", "Main"]
2.3 把jar包打包到容器內(nèi)
dockerfile
FROM openjdk:11
EXPOSE 8080WORKDIR /rootADD jarfile/demo*.jar /root/app.jar
ENTRYPOINT ["java","-jar","/root/app.jar"]
打包鏡像
docker build -t demo .
配置國內(nèi)鏡像
修改/etc/docker/daemon.json
文件,沒有的話創(chuàng)建一個
寫入
{"registry-mirrors": ["https://ustc-edu-cn.mirror.aliyuncs.com","http://hub-mirror.c.163.com","https://registry.aliyuncs.com"]
}
重啟服務(wù)
systemctl daemon-reload
systemctl restart docker
十二、Jenkins集群/并發(fā)構(gòu)建
集群化構(gòu)建可以有效提升構(gòu)建效率,尤其是團隊項目比較多或是子項目比較多的時候,可以并發(fā)在多臺機器上執(zhí)行構(gòu)建。
- 勾選 在必要的時候并發(fā)構(gòu)建
第四章 流水線 pipeline
流水線既能作為任務(wù)的本身,也能作為Jenkinsfile
使用流水線可以讓我們的任務(wù)從ui手動操作,轉(zhuǎn)換為代碼化,像docker的dockerfile一樣,從shell命令到配置文件,更適合大型項目,可以讓團隊其他開發(fā)者同時參與進來,同時也可以編輯開發(fā)Jenkins web ui不能完成的更復(fù)雜的構(gòu)建邏輯,作為開發(fā)者可讀性也更好。
一、完整語法
5個必備的組成部分
pipeline:整條流水線
agent:指定執(zhí)行器
stages:所有階段
stage:某一階段,可有多個
steps:階段內(nèi)的每一步,可執(zhí)行命令
二、測試腳本
1. 基礎(chǔ)框架
pipeline {agent anystages {stage('拉取代碼') {steps {echo '拉取代碼完成'}}stage('執(zhí)行構(gòu)建') {steps {echo '執(zhí)行構(gòu)建完成'}}}post {always {echo "完成"}failure {echo "失敗"}}
}
2. 階段視圖 Stage View
2.1 blue ocean可視化界面
全新的流水線控制ui,可重復(fù)執(zhí)行某階段代碼
插件中心搜索blue ocean安裝即可
2.2 post
流水線完成后可執(zhí)行的任務(wù)
- always 無論流水線或者階段的完成狀態(tài)。
- changed 只有當(dāng)流水線或者階段完成狀態(tài)與之前不同時。
- failure 只有當(dāng)流水線或者階段狀態(tài)為"failure"運行。
- success 只有當(dāng)流水線或者階段狀態(tài)為"success"運行。
- unstable 只有當(dāng)流水線或者階段狀態(tài)為"unstable"運行。例如:測試失敗。
- aborted 只有當(dāng)流水線或者階段狀態(tài)為"aborted "運行。例如:手動取消。
2.3 agent
可以指定執(zhí)行節(jié)點
label 指定運行job的節(jié)點標(biāo)簽
any 不指定,由Jenkins分配
pipeline {agent {node {label "jenkins-02"}}stages {stage('拉取代碼') {steps {sh """sleep 10"""echo '拉取代碼完成'}}stage('執(zhí)行構(gòu)建') {steps {echo '執(zhí)行構(gòu)建完成'}}}post {always {echo "完成"}failure {echo "失敗"}}
}
3. pipeline中執(zhí)行自動化構(gòu)建
pipeline {agent anytools {maven "maven3"}stages {stage("拉取代碼") {steps {git branch: 'main', credentialsId: 'gitlab', url: 'http://192.168.44.103/root/java-project.git'echo '拉取成功'}}stage("執(zhí)行構(gòu)建") {steps {// sh "mvn --version"sh """ cd demo-1mvn clean package"""echo '構(gòu)建完成'}}stage("clean test server"){steps{sshPublisher(publishers: [sshPublisherDesc(configName: 'testserver', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''rm -rf *docker stop demo
docker rm demo
docker rmi demo
''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '/root')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}}stage("發(fā)送jar包到測試服務(wù)器") {steps {sshPublisher(publishers: [sshPublisherDesc(configName: 'testserver', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/jarfile', remoteDirectorySDF: false, removePrefix: 'demo-1/target', sourceFiles: '**/demo*.jar'), sshTransfer(cleanRemote: false, excludes: '', execCommand: '''docker build -t demo .
docker run -d -p 8080:8080 --name demo demo''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/', remoteDirectorySDF: false, removePrefix: 'demo-1/docker', sourceFiles: 'demo-1/docker/dockerfile')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])echo 'jar send over!'}}}
}
三、聲明式流水線
好處
- 更像是在Jenkins web ui中的操作
- 可讀性比較高
- 可以使用blue ocean自動生成
- 支持語法檢查
壞處
- 代碼邏輯能力比腳本式弱,不能完成特別復(fù)雜的任務(wù)
四、腳本式流水線
好處
- 更少的代碼和弱規(guī)范要求
- 更靈活的自定義代碼操作
- 不受約束,可以構(gòu)建特別復(fù)雜的工作流和流水線
壞處
- 讀寫對編程要求比較高
- 比聲明式流水線代碼更復(fù)雜