二十、DevOps落地:Jenkins基礎入門(一)
文章目錄
- 二十、DevOps落地:Jenkins基礎入門(一)
- 1、DevOps初識
- 1.1 什么是DevOps
- 1.2 DevOps相關工具鏈
- 1.3 什么是CICD?
- 1.4 持續集成CI介紹
- 1.5 持續交付和持續部署CD介紹
- 1.6 什么是Pipeline(流水線)?
- 1.7 Pipeline編排任務的優勢
- 1.8 Pipeline相關工具介紹
- 1.9 Jenkins介紹及核心功能
- 1.10 Jenkins Pipeline介紹
- 2、Jenkins部署
- 2.1 集群規劃
- 2.2 Jenkins 安裝
- 2.3 插件安裝
- 2.4 Jenkins Pipeline 初體驗
- 3、聲明式 Pipeline 語法
- 3.1 Sections
- 3.1.1 Stages
- 3.1.2 Steps
- 3.1.3 Agent
- 3.1.4 Agent 配置示例
- 3.1.5 Post
- 3.1.6 Post 配置示例
- 3.2 Directives
- 3.2.1 Environment
- 3.2.2 Options
- 3.2.3 Parameters
- 3.2.4 Triggers
- 3.2.5 Input
- 3.2.6 When
- 3.3 Parallel
- 4、Pipeline 常用變量處理
- 4.1 內置環境變量
- 4.2 憑證管理
- 4.2.1 用戶名密碼
- 4.2.2 加密文件
1、DevOps初識
1.1 什么是DevOps
DevOps是Development和Operations的組合,是一種重視開發人員(Dev)和運維人員(Ops)之間的溝通合作的方法論。DevOps打破了傳統開發與運維之間的壁壘,強調跨團隊協作與工具鏈整合。
DevOps核心目標:
- 加速交付:快速迭代,頻繁發布新功能
- 提高質量:通過自動化任務減少錯誤
- 增強協助:開發、運維、測試等角色緊密配合
- 全自動化:減少手動操作,提升效率
一句話總結:DevOps是跨部門溝通的橋梁,利用相關工具的融合提升整個團隊的工作效率。
1.2 DevOps相關工具鏈
階段 | 工具示例 |
---|---|
代碼管理 | Git、GitLab、Gitee、Github |
代碼掃描 | Sonarqube |
持續集成 | Jenkins、Tekton、GitLab CI |
持續部署 | Jenkins、Tekton、ArgoCD |
容器化 | Docker、Containerd、Kaniko |
制品管理 | Harbor、Nexus |
服務編排 | Kubernetes |
1.3 什么是CICD?
CI/CD是DevOps中尤為重要的一個環節,主要是通過自動化流程實現代碼從開發到生產的快速和可靠的交付。
CI/CD主要分為了三個方面:
- 持續集成(CI, Continuous Integration)
- 持續交付(CD, Continuous Delivery)
- 持續部署(CD, Continuous Deployment)
1.4 持續集成CI介紹
CI/CD中的CI指持續集成,它屬于開發人員的自動化流程,可以幫助開發人員更加頻繁地將代碼合并到共享分支或主干中,并觸發一系列測試和構建的工作。
持續集成相關流程:
- 代碼提交:開發者推送代碼到版本控制系統(如GitHub)
- 自動化構建:Jenkins自動編譯并打包應用(生成鏡像或產物)
- 自動化測試:運行單元測試、集成測試等(如Sonarqube)
- 任務反饋:每個環節集成通知和反饋機制
1.5 持續交付和持續部署CD介紹
持續交付:用于把持續集成過程中的產物(代碼、鏡像、包)轉變為可隨時發布的狀態,主要目的是擁有一個可以隨時部署到生產環境的產物。
持續部署:持續部署時CI/CD最后一個環節,作為持續交付的延伸,用于把產物自動發布到生產環境中。利用持續部署可以讓開發人員在修改代碼后幾分鐘就能把新功能全自動部署到生產環境中。
持續交付和持續部署流程:
- 制品交付:把CI階段的產物交付到制品倉庫(如Harbor)
- 制品發布:將制品自動發布到開發、測試和生產環境
- 驗收測試:驗證發布后的功能是否正常
1.6 什么是Pipeline(流水線)?
Pipeline(流水線)是一種自動化流程框架,用于定義、管理和執行一系列有序的任務。
在軟件開發中,從代碼開發到部署,也會經過一系列有序的任務,把這些任務串起來自動化執行,也屬于流水線。
1.7 Pipeline編排任務的優勢
- 標準化流程:通過聲明式方式確保每個環節的一致性,避免人工操作差異導致的錯誤
- 自動化執行:Pipeline由多個任務組成,每個任務均可以自動完整,可完整無需人工操作
- 流程可視化:Pipeline工具可以清晰的看到流水線中的每個環節
- 可追溯性:流水線的每個環節都有執行的過程、日志和結果,方便追溯和排查問題
- 支持并行:Pipeline支持多個任務同時運行,減少任務等待時間
- 重復執行:Pipeline中的任務執行錯誤重試,無需特殊處理
- 靈活性高:無需編寫過多代碼,即可完成對任務的編排
1.8 Pipeline相關工具介紹
Jenkins
- 優點
- 長期占據CI/CD市場頭部
- 社區支持強大,可擴展性和可集成性強,插件生態系統豐富(超2000+插件)
- 基本可以滿足企業內的任何場景需求
- 支持跨平臺:Windows、Linux、Mac、容器、K8s等
- 缺點
- 配置稍復雜
- 需要手動管理插件依賴和版本兼容性
Tekton
- 優點
- 轉為K8s設計,以CI/CD方式運行,天然支持容器化和動態資源分配
- Pipeline定義與底層K8s解耦,遷移方便,擴展性強
- 方便集成與企業內部平臺進行二次開發
- 缺點
- 插件支持較少
- 學習難度較大,部分功能需要自行開發集成
- 需要K8s基座支持
GitLab CI/CD
- 優點
- 與GitLab代碼倉庫深度集成,無需額外配置
- 使用
.gitlab-ci.yaml
- 缺點
- 高功能需付費
- 擴展性一般
- 需要自行維護Runner
- 無權限隔離
1.9 Jenkins介紹及核心功能
Jenkins是一個開源的CI/CD工具,用于自動化構建、測試和部署軟件。Jenkins支持多種編程語言和版本控制系統,并可以通過插件擴展功能,是DevOps流程中最流行的自動化工具之一。
Jenkins架構為主從架構,Master節點為主節點,主要用于管理任務調度、任務配置、提供Web UI。Agent節點為從節點,主要用于執行具體的任務,可動態擴展。
Jenkins核心功能:
- 持續集成:Jenkins可以集成各種工具完成CI過程,比如GitLab、Sonarqube等
- 持續部署:Jenkins支持自動化部署至各種平臺,比如K8s、物理機等
- 插件生態:執行2000+插件,無需自行開發即可集成各種平臺
- 流水線:支持聲明式和腳本試Pipeline,用于定制CICD中的各個階段
- 分布式:Jenkins支持主從架構,可以跨多臺機器執行任務,也可以結合K8s實現動態slave
1.10 Jenkins Pipeline介紹
Jenkins Pipeline分為聲明式(Declarative Pipeline)和腳本式(Scripted Pipeline)
聲明式流水線采用結構化語法實現,格式固定、易讀性強,并且內置錯誤處理機制,可以不需要掌握Groovy語言可以完成編寫,同時可以與Blue Ocean結合實現可視化,是目前比較推薦的實現方式。
2、Jenkins部署
2.1 集群規劃
主機名稱 | 物理IP | 系統 | 資源配置 |
---|---|---|---|
jenkins | 192.168.200.54 | Rocky9.4 | 2核4g |
2.2 Jenkins 安裝
安裝 Docker
# 添加docker的yum源配置文件
[root@jenkins ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 安裝docker
[root@jenkins ~]# yum install docker-ce docker-ce-cli -y# 啟動docker
[root@jenkins ~]# systemctl daemon-reload && systemctl enable --now docker
創建 Jenkins 的數據目錄,防止容器重啟后數據丟失:
[root@jenkins ~]# mkdir /data/jenkins_data -p
[root@jenkins ~]# chmod -R 777 /data/jenkins_data
啟動 Jenkins,并配置管理員賬號密碼為 admin/admin123:
# 拉取鏡像
[root@jenkins ~]# docker pull crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/jenkins:2.504.3-debian-12-r1# 啟動容器
[root@jenkins ~]# docker run -d --name=jenkins --restart=always -e JENKINS_PASSWORD=admin123 -e JENKINS_USERNAME=admin -e JENKINS_HTTP_PORT_NUMBER=8080 -p 8080:8080 -p 50000:50000 -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -v /data/jenkins_data:/bitnami/jenkins crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/jenkins:2.504.3-debian-12-r1# 查看容器
[root@jenkins ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8e44a0ba9584 crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/jenkins:2.504.3-debian-12-r1 "/opt/bitnami/script…" 2 minutes ago Up 2 minutes 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp, 0.0.0.0:50000->50000/tcp, [::]:50000->50000/tcp, 8443/tcp jenkins
其中 8080 端口為 Jenkins Web 界面的端口,50000 是 jnlp 使用的端口,后期 Jenkins Slave 需要使用 50000 端口和 Jenkins 主節點通信。
查看 Jenkins 日志:
# 查看到這條日志說明 Jenkins 已完成啟動
[root@jenkins ~]# docker logs -f Jenkins
....
INFO hudson.lifecycle.Lifecycle#onReady: Jenkins is fully up and running
之后通過 Jenkins 宿主機的 IP+8080 即可訪問 Jenkins
2.3 插件安裝
登錄后點擊 Manage Jenkins → Manage Plugins 安裝需要使用的插件:
在安裝之前首先配置國內的插件源,點擊 Advanced,將插件源更改為國內插件源(https://mirrors.huaweicloud.com/jenkins/updates/update-center.json)
點擊 Submit 后在 Available 可以看到所有的可用插件:
Git
Git Parameter
Git Pipeline for Blue Ocean
GitLab
Credentials
Credentials Binding
Blue Ocean
Blue Ocean Pipeline Editor
Blue Ocean Core JS
Web for Blue Ocean
Pipeline SCM API for Blue Ocean
Dashboard for Blue Ocean
Build With Parameters
List Git Branches Parameter
Pipeline
Pipeline: Declarative
Kubernetes
Kubernetes CLI
Kubernetes Credentials
Image Tag Parameter
Docker
Docker Slaves
Docker Pipeline
Role-based Authorization Strategy
最后安裝完記得重啟
等待安裝后自動重啟后,就可以在 Installed 看到已經安裝的插件:
至此 Jenkins 和 Jenkins 插件的安裝就完成了。
2.4 Jenkins Pipeline 初體驗
首先創建一個 Job:
查看流程圖:
3、聲明式 Pipeline 語法
3.1 Sections
聲明式流水線中的 Sections 不是一個關鍵字或指令,而是包含一個或多個 Agent、Stages、Post、Directives 和 Steps 的代碼區域塊。
3.1.1 Stages
Stages 包含一個或多個 stage 指令,同時可以在 stage 中的 steps 塊中定義真正執行的指令。
比如創建一個流水線,stages 包含一個名為 Example 的 stage,該 stage 執行 echo 'Hello World’命令輸出 Hello World 字符串:
pipeline {agent anystages {stage('Example') {steps {echo 'Hello World'}}}
}
3.1.2 Steps
Steps 部分在給定的 stage 指令中執行的一個或多個步驟,比如在 steps 定義執行一條 shell 命令:
pipeline {agent anystages {stage('Example') {steps {echo 'Hello World'}}}
}
或者是使用 sh 字段執行多條指令:
pipeline {agent anystages {stage('Example') {steps {sh """echo 'steps01'echo 'steps02'echo 'steps03'"""}}}
}
3.1.3 Agent
Agent 表示整個流水線或特定階段中的步驟和命令執行的位置,該部分可以在 pipeline 塊的頂層被定義,也可以在 stage 中再次定義,也可以同時在兩處定義。
1、any:在任何可用的代理上執行流水線,配置語法:
pipeline {agent any
}
2、none:表示該 Pipeline 腳本沒有全局的 agent 配置。當頂層的 agent 配置為 none 時,可以為每個 stage 配置局部的 agent。配置語法:
pipeline {agent nonestages {stage('Stage For Build') {agent any}}
}
3、label:選擇某個具體的節點執行 Pipeline 命令,例如:agent { label 'my-defined-label' }
。配置語法:
pipeline {agent anystages {stage('Hello') {steps {echo 'Hello World'}}stage('Example') {agent { label 'my-slave-label' }steps {sh """echo 'steps01'echo 'steps02'echo 'steps03'"""}}}
}
如果 agent 不存在,任務會一直處于等待 agent 狀態:
4、docker:agent 支持直接使用鏡像作為 agent,這也是比較推薦的方式,可以避免處理
編譯環境或者 slave 的版本問題。比如 Java 編譯,可以直接使用 maven 鏡像啟動 slave,之后進行打包,同時可以指定 args:
pipeline {agent anystages {stage('Example') {agent { docker {image 'crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/maven:3.5.3'args '-v /tmp:/tmp'}}steps {sh 'mvn -version'}}}
}
此時運行 pipeline,如果不存在該鏡像運行的容器,會使用該鏡像啟動容器:
5、kubernetes:Jenkins 也支持使用 Kubernetes 創建 Slave,也就是常說的動態 Slave。配置示例如下:
agent {kubernetes {label podlabelyaml """
kind: Pod
metadata:name: jenkins-agent
spec:containers:- name: kanikoimage: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/executor:debugimagePullPolicy: Alwayscommand:- /busybox/cattty: truevolumeMounts:- name: aws-secretmountPath: /root/.aws/- name: docker-registry-configmountPath: /kaniko/.dockerrestartPolicy: Nevervolumes:- name: aws-secretsecret:secretName: aws-secret- name: docker-registry-configconfigMap:name: docker-registry-config
"""}
}
3.1.4 Agent 配置示例
示例 1:假設有一個 Java 項目,需要用 mvn 命令進行編譯,此時可以使用 maven 的鏡像作為 agent。配置如下:
pipeline {agent { docker {image 'crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/maven:3.5.3'}}stages {stage('Example Build') {steps {sh 'mvn -version'}}}
}
示例 2:本示例在流水線頂層將 agent 定義為 none,那么此時可以在 stage 部分配置局部的 agent。在 stage(‘Example Build’)部分使用 registry.cn-beijing.aliyuncs.com/dotbalo/maven:3.5.3
執行該階段步驟,在 stage(‘Example Test’)部分使用 openjdk:8-jre 執行該階段步驟。此時 Pipeline 如下:
pipeline {agent nonestages {stage('Example Build') {agent { docker {image 'crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/maven:3.5.3'}}steps {echo 'Hello, Maven'sh 'mvn -version'}}stage('Example Test') {agent { docker {image 'crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/jre:8u211-data'}}steps {echo 'Hello, JDK'sh 'java -version'}}}
}
示例 3:上述的示例也可以用基于 Kubernetes 的 agent 實現。比如定義具有三個容器的 Pod,分別為 jnlp(負責和 Jenkins Master 通信)、build(負責執行構建命令)、kubectl(負責執行 Kubernetes
相關命令),在 steps 中可以通過 containers 字段,選擇在某個容器執行命令:
pipeline {agent {kubernetes {cloud 'kubernetes-default'slaveConnectTimeout 1200yaml '''
apiVersion: v1
kind: Pod
spec:containers:- args: [\'$(JENKINS_SECRET)\', \'$(JENKINS_NAME)\']image: 'crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/jnlp-agent-docker:latest'name: jnlpimagePullPolicy: IfNotPresent- command:- "cat"image: "crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/maven:3.5.3"imagePullPolicy: "IfNotPresent"name: "build"tty: true- command:- "cat"image: "crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/kubectl:latest"imagePullPolicy: "IfNotPresent"name: "kubectl"tty: true'''}
}stages {stage('Building') {steps {container(name: 'build') {sh """mvm clean install"""}}
}stage('Deploy') {steps {container(name: 'kubectl') {sh """kubectl get node"""}}}}
}
3.1.5 Post
Post 一般用于流水線結束后的進一步處理,比如錯誤通知等。Post 可以針對流水線不同的結果做出不同的處理,就像開發程序的錯誤處理,比如 Python 語言的 try catch。Post 可以定義在 Pipeline 或 stage 中,目前支持以下條件:
- always:無論 Pipeline 或 stage 的完成狀態如何,都允許運行該 post 中定義的指令;
- changed:只有當前 Pipeline 或 stage 的完成狀態與它之前的運行不同時,才允許在該post 部分運行該步驟;
- fixed:當本次 Pipeline 或 stage 成功,且上一次構建是失敗或不穩定時,允許運行該 post 中定義的指令;
- regression:當本次 Pipeline 或 stage 的狀態為失敗、不穩定或終止,且上一次構建的狀態為成功時,允許運行該 post 中定義的指令;
- failure:只有當前 Pipeline 或 stage 的完成狀態為失敗(failure),才允許在 post 部分運行該步驟,通常這時在 Web 界面中顯示為紅色;
- success:當前狀態為成功(success),執行 post 步驟,通常在 Web 界面中顯示為藍色或綠色;
- unstable:當前狀態為不穩定(unstable),執行 post 步驟,通常由于測試失敗或代碼違規等造成,在 Web 界面中顯示為黃色;
- aborted:當前狀態為終止(aborted),執行該 post 步驟,通常由于流水線被手動終止觸發,這時在 Web 界面中顯示為灰色;
- unsuccessful:當前狀態不是 success 時,執行該 post 步驟;
- cleanup:無論 pipeline 或 stage 的完成狀態如何,都允許運行該 post 中定義的指令。和 always 的區別在于,cleanup 會在其它執行之后執行。
3.1.6 Post 配置示例
示例一:一般情況下 post 部分放在流水線的底部,比如本實例,無論 stage 的完成狀態如何,都會輸出一條I will always say Hello again!
信息:
pipeline {agent anystages {stage('Example') {steps {sh '''echo 'Hello World'xxxx'''}}}post {always {echo 'I will always say Hello again!'}}
}
示例二:只有 stage 的完成狀態是成功的時候,才會輸出一條我只有在成功的時候才會執行!
信息
pipeline {agent anystages {stage('Example') {steps {sh '''echo 'Hello World'xxxx'''}}}post {always {echo 'I will always say Hello again!'}success {echo '我只有在成功的時候才會執行!'}}
}
沒有執行
刪除錯誤命令
成功執行
示例三:也可以將 post 寫在 stage,并且在失敗時執行,此時只有流水線失敗時才會執行:
pipeline {agent anystages {stage('Test') {steps {sh 'EXECUTE_TEST_COMMAND'}post {failure {echo "Pipeline Testing failure..."}}}}
}
失敗的狀態才會執行這個命令
改成正確的命令就不會執行了
3.2 Directives
Directives可用于一些執行stage時的條件判斷或預處理一些數據,和Sections一致,Directives也不是一個關鍵字或指令,而是包含了 environment、options、parameters、triggers、stage、tools、input、when 等配置。
3.2.1 Environment
Environment 主要用于在流水線中配置的一些環境變量,根據配置的位置決定環境變量的作用域。可以定義在 pipeline 中作為全局變量,也可以配置在 stage 中作為該 stage 的環境變量。
假如需要定義個變量名為 CC 的全局變量和一個局部變量,可以通過以下方式定義:
pipeline {agent anyenvironment {CC = 'global' # Pipeline 中定義,屬于全局變量}stages {stage('local') {environment {CC2 = 'local' # 定義在 stage 中,屬于局部變量}steps {sh '''echo CC: $CC echo CC2: $CC2 '''}}stage('global') {steps {sh '''echo CC: $CC echo CC2: $CC2 '''}} }
}
3.2.2 Options
Jenkins 流水線支持很多內置指令,比如 retry 可以對失敗的步驟進行重復執行 n 次,可以根據不同的指令實現不同的效果。比較常用的指令如下:
- buildDiscarder : 保 留 多 少 個 流 水 線 的 構 建 記 錄 。 比 如:
options { buildDiscarder(logRotator(numToKeepStr: '1')) }
;- disableConcurrentBuilds:禁止流水線并行執行,防止并行流水線同時訪問共享資源導致流水線失敗。比如:
options { disableConcurrentBuilds() }
;- disableResume : 如 果 控 制 器 重 啟 , 禁 止 流 水 線 自 動 恢 復 。 比 如 :
options { disableResume() }
;- retry:流水線失敗后重試次數。比如:
options { retry(30) }
;- timeout:設置流水線的超時時間,超過流水線時間,job 會自動終止。比如:
options { timeout(time: 1, unit: 'HOURS') }
;
配置示例如下,只需要添加 options 字段即可:
pipeline {agent anyoptions {timeout(time: 1, unit: 'HOURS') # 全局超時}stages {stage('Example') {steps {echo 'Hello World'}}}
}
Option 除了寫在 Pipeline 頂層,還可以寫在 stage 中,但是寫在 stage 中的 option 僅支持 retry、timeout、timestamps,或者是和 stage 相關的聲明式選項,比如 skipDefaultCheckout。處于 stage 級別的 options 寫法如下:
pipeline {agent anyoptions {timeout(time: 1, unit: 'HOURS')}stages {stage('Example') {options {timeout(time: 10, unit: 'SECONDS') # 局部超時}steps {sh 'sleep 60' # 模擬一個長時間任務}}}
}
超時重試
pipeline {agent anyoptions {timeout(time: 1, unit: 'HOURS')}stages {stage('Example') {options {timeout(time: 10, unit: 'SECONDS')retry(3) # 錯誤重試三次}steps {sh 'xxx' # 模擬錯誤命令}}}
}
3.2.3 Parameters
Parameters 提供了一個用戶在觸發流水線時應該提供的參數列表,這些用戶指定參數的值可以通過 params 對象提供給流水線的 step。
目前支持的參數類型如下:
- string:字符串類型的參數,例如:
parameters { string(name: 'DEPLOY_ENV', defaultValue:'staging', description: '') }
,表示定義一個名為 DEPLOY_ENV 的字符型變量,默認值為staging;- text:文本型參數,一般用于定義多行文本內容的變量。例如
parameters { text(name: 'DEPLOY_TEXT', defaultValue: 'One\nTwo\nThree\n', description: '') }
,表示定義一個名為 DEPLOY_TEXT 的變量,默認值是'One\nTwo\nThree\n'
;- booleanParam:布爾型參數,例如:
parameters { booleanParam(name: 'DEBUG_BUILD', defaultValue: true, description: '') }
;- choice:選擇型參數,一般用于給定幾個可選的值,然后選擇其中一個進行賦值,例如:
parameters { choice(name: 'CHOICES', choices: ['one', 'two', 'three'], description: '') }
,表示定義一個名為 CHOICES 的變量,可選的值為 one、two、three;- password:密碼型變量,一般用于定義敏感型變量,在 Jenkins 控制臺會顯示為*。例如:
parameters { password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'A secret password') }
,表示定義一個名為 PASSWORD 的變量,其默認值為 SECRET。
Parameters 用法示例如下:
pipeline {agent anyparameters {string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')choice(name: 'CHOICE', choices: ['One', 'Two', 'Three'], description: 'Pick something')}stages {stage('Example') {steps {sh """echo ${params.PERSON}echo ${params.CHOICE}"""}}}
}
除了上述內置的參數外,還可以通過插件擴展參數的能力,比如使用 Git 插件定義參數:
1、選擇流水線
2、選擇parameters
3、生成語法
# 該字段會在 Jenkins 頁面生成一個選擇分支的選項,用于賦值到 BRANCH 參數
parameters {gitParameter branch: '', branchFilter: '.*', defaultValue: 'master', description: '構建的分支', name: 'BRANCH', quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '*', type: 'GitParameterDefinition'
}
3.2.4 Triggers
在 Pipeline 中可以用 triggers 實現自動觸發流水線執行任務,可以通過 Webhook、Cron、pollSCM 和 upstream 等方式觸發流水線。
假如某個流水線構建的時間比較長,或者某個流水線需要定期在某個時間段執行構建,可以使用 cron 配置觸發器,比如周一到周五每隔四個小時執行一次:
pipeline {agent anytriggers {cron('H */4 * * 1-5')}stages {stage('Example') {steps {echo 'Hello World'}}}
}
使用 cron 字段可以定期執行流水線,如果代碼更新后觸發流水線,無更新則不觸發流水線,可以使用 pollSCM 字段:
pipeline {agent anytriggers {pollSCM('H */4 * * 1-5')}stages {stage('Example') {steps {echo 'Hello World'}}}
}
Upstream 可以根據上游 job 的執行結果決定是否觸發該流水線。比如當 job1 或 job2 執行成功時觸發該流水線:
pipeline {agent anytriggers {upstream(upstreamProjects: 'job1,job2', threshold: hudson.model.Result.SUCCESS)}stages {stage('Example') {steps {echo 'Hello World'}}}
}
目前支持的狀態有 SUCCESS、UNSTABLE、FAILURE、NOT_BUILT、ABORTED 等
3.2.5 Input
Input 字段可以實現在流水線中進行交互式操作,比如選擇要部署的環境、是否繼續執行某個階段等。
配置 Input 支持以下選項:
- message:必選,需要用戶進行 input 的提示信息,比如:“是否發布到生產環境?”;
- id:可選,input 的標識符,默認為 stage 的名稱;
- ok:可選,確認按鈕的顯示信息,比如:“確定”、“允許”;
- submitter:可選,允許提交 input 操作的用戶或組的名稱,如果為空,任何登錄用戶均可提交 input;
- parameters:提供一個參數列表供 input 使用。
假如需要配置一個提示消息為“還繼續么”、確認按鈕為“繼續”、提供一個 PERSON 的變量的參數,并且所有登錄用戶均可提交的 input 流水線:
pipeline {agent anystages {stage('Example') {input {message "還繼續么?"ok "繼續"submitter ""parameters {string(name: 'PERSON', defaultValue: 'false', description: '確認部署')}}steps {echo "${PERSON}"}}}
}
3.2.6 When
When 指令允許流水線根據給定的條件決定是否應該執行該 stage,when 指令必須包含至少
一個條件。如果 when 包含多個條件,所有的子條件必須都返回 True,stage 才能執行。
目前比較常用的內置條件如下:
- branch:當正在構建的分支與給定的分支匹配時,執行這個 stage,例如:
when { branch 'master' }
。注意,branch 只適用于多分支流水線;- changelog :匹配 提交的 changeLog 決定是否 構 建, 例如 :
when { changelog'.*^\\[DEPENDENCY\\] .+$' }
;- environment:當指定的環境變量和給定的變量匹配時,執行這個 stage,例如:
when { environment name: 'DEPLOY_TO', value: 'production' }
;- expression:當指定的 Groovy 表達式評估為 True,執行這個 stage,例如:
when { expression { return params.DEBUG_BUILD } }
;- tag:如果 TAG_NAME 的值和給定的條件匹配,執行這個 stage,例如:
when { tag "release-*" }
;- not:當嵌套條件出現錯誤時,執行這個 stage,必須包含一個條件,例如:
when { not { branch 'master' } }
;- allOf:當所有的嵌套條件都正確時,執行這個 stage,必須包含至少一個條件,例如:
when { allOf { branch 'master'; environment name: 'DEPLOY_TO', value: 'production' } }
;- anyOf:當至少有一個嵌套條件為 True 時,執行這個 stage,例如:
when { anyOf { branch 'master'; branch 'staging' } }
。
示例一:當分支為 production 時,執行 Example Deploy 步驟:
pipeline {agent anystages {stage('Example Build') {steps {echo 'Hello World'}}stage('Example Deploy') {when {branch 'production' # 條件判斷,當分支必須是production的時候,才會執行steps里面的字段}steps {echo 'Deploying'}}}
}
我們這里沒有設置分支字段,所以它就會跳過這個步驟
示例二:也可以同時配置多個條件,比如分支是 production,而且 DEPLOY_TO 變量的值為 production 時,才執行 Example Deploy:
pipeline {agent anystages {stage('Example Build') {steps {echo 'Hello World'}}stage('Example Deploy') {when { # 兩個條件必須全部滿足branch 'production'environment name: 'DEPLOY_TO', value: 'production'}steps {echo 'Deploying'}}}
}
示例三:也可以使用 anyOf 進行匹配其中一個條件即可,比如分支為 production,DEPLOY_TO 為 production 或 staging 時執行 Deploy:
pipeline {agent anyenvironment {DEPLOY_TO = 'production'}stages {stage('Example Build') {steps {echo 'Hello World'}}stage('Example Deploy') {when {anyOf { # 滿足其中一個條件即可environment name: 'DEPLOY_TO', value: 'production'environment name: 'DEPLOY_TO', value: 'staging'}}steps {echo 'Deploying'}}}
}
示例四:也可以使用 expression 進行正則匹配,比如當 BRANCH_NAME 為 production 或 staging,并且 DEPLOY_TO 為 production 或 staging 時才會執行 Example Deploy:
pipeline {agent anystages {stage('Example Build') {steps {echo 'Hello World'}}stage('Example Deploy') {when { # expression與anyOf屬于同級子條件,必須全部滿足expression { BRANCH_NAME ==~ /(production|staging)/ }anyOf { # 而anyOf內只需滿足其中一個條件即可environment name: 'DEPLOY_TO', value: 'production'environment name: 'DEPLOY_TO', value: 'staging'}}steps {echo 'Deploying'}}}
}
默認情況下,如果定義了某個 stage 的 agent,在進入該 stage 的 agent 后,該 stage 的 when 條件才會被評估,但是可以通過一些選項更改此選項。比如在進入 stage 的 agent 前評估 when,可以使用 beforeAgent,當 when 為 true 時才進行該 stage。
目前支持的前置條件如下:
- beforeAgent:如果 beforeAgent 為 true,則會先評估 when 條件。在 when 條件為 true 時,才會進入該 stage;
- beforeInput:如果 beforeInput 為 true,則會先評估 when 條件。在 when 條件為 true 時,才會進入到 input 階段;
- beforeOptions:如果 beforeInput 為 true,則會先評估 when 條件。在 when 條件為 true 時,才會進入到 options 階段;
配置一個 beforeAgent 示例如下:
pipeline {agent nonestages {stage('Example Build') {steps {echo 'Hello World'}}stage('Example Deploy') {agent {label "some-label"}when {beforeAgent truebranch 'production'}steps {echo 'Deploying'}}}
}
配置一個 beforeInput 示例如下:
pipeline {agent nonestages {stage('Example Build') {steps {echo 'Hello World'}}stage('Example Deploy') {when {beforeInput truebranch 'production'}input {message "Deploy to production?"id "simple-input"}steps {echo 'Deploying'}}}
}
配置一個 beforeOptions 示例如下:
pipeline {agent nonestages {stage('Example Build') {steps {echo 'Hello World'}}stage('Example Deploy') {when {beforeOptions truebranch 'production'}options {retry(3)}steps {echo "Deploying to ${deployEnv}"}}}
}
3.3 Parallel
在聲明式流水線中可以使用 Parallel 字段,即可很方便的實現并發構建,比如對下面幾個操作進行并行處理:
pipeline {agent anystages {stage('Non-Parallel Stage') {steps {echo 'This stage will be executed first.'}}stage('Parallel Stage') {failFast trueparallel {stage('build') {steps {echo "開始構建"}}stage('sonarqube') {steps {echo "代碼掃描"}}stage('Stage C') {steps {echo "其他長時間任務"}}}}}
}
設置 failFast 為 true 表示并行流水線中任意一個 stage 出現錯誤,其它 stage 也會立即終止。也可以通過 options 配置在全局:
pipeline {agent anyoptions {parallelsAlwaysFailFast()}stages {stage('Non-Parallel Stage') {steps {echo 'This stage will be executed first.'}}stage('Parallel Stage') {parallel {stage('build') {steps {echo "開始構建"}}stage('sonarqube') {steps {echo "代碼掃描"}}stage('Stage C') {steps {echo "其他長時間任務"}}}}}
}
4、Pipeline 常用變量處理
4.1 內置環境變量
Jenkins 有許多內置變量可以直接在 Jenkinsfile 中使用,可以通過 JENKINS_URL/pipelinesyntax/globals#env
獲取完整列表。目前比較常用的環境變量如下:
- BUILD_ID:構建 ID,對于 1.597 及以上版本和 BUILD_NUMBER 一致,而對于更早版本的構建則是一個
YYYY-MM-DD_hh-mm-ss
格式的時間戳;- BUILD_NUMBER:當前構建的 ID,和 BUILD_ID 一致;
- BUILD_TAG:用來標識構建的版本號,格式為:
jenkins-${JOB_NAME}-${BUILD_NUMBER}
,可以對產物進行命名,比如生產的 jar 包名字、鏡像的 TAG 等;- BUILD_URL:本次構建的完整URL,比如:http://buildserver/jenkins/job/MyJobName/17/;
- JOB_NAME:本次構建的項目名稱;
- NODE_NAME:當前構建節點的名稱;
- JENKINS_URL:Jenkins 完整的 URL,需要在 System Configuration 設置;
- WORKSPACE:執行構建的工作目錄。
上述變量會保存在一個 Map 中,可以使用 env.BUILD_ID 或 env.JENKINS_URL 引用某個內置變量:
pipeline {agent anystages {stage('Example') {steps {echo "Running ${env.BUILD_ID} on ${env.JENKINS_URL}"}}}
}
4.2 憑證管理
4.2.1 用戶名密碼
本示例用來演示 credentials 賬號密碼的使用,比如使用一個公用賬戶訪問 Bitbucket、GitLab、Harbor 等,此時可以使用 Jenkins 用戶名密碼類型的憑證進行管理。
比如添加一個用于訪問 Harbor 的憑證:
接下來可以使用訪問獲取憑證的值,HARBOR_ACCOUNT 為接收的變量名,可以自定義:
environment {HARBOR_ACCOUNT = credentials('HARBOR_USER_PASSWORD')
}
上述的配置會自動生成 3 個環境變量:
- HARBOR_ACCOUNT : 包 含 一 個 以 冒 號 分 隔 的 用 戶 名 和 密 碼 , 格 式 為
username:password
;- HARBOR_ACCOUNT_USR:僅包含用戶名的附加變量;
- HARBOR_ACCOUNT_PSW:僅包含密碼的附加變量。
此時可以用如下方式獲取變量:
pipeline {agent anystages {stage('Example stage 1') {environment {HARBOR_ACCOUNT = credentials(' HARBOR_USER_PASSWORD ')}steps {echo """HARBOR_ACCOUNT: $HARBOR_ACCOUNTHARBOR_ACCOUNT_USR: $HARBOR_ACCOUNT_USRHARBOR_ACCOUNT_PSW: $HARBOR_ACCOUNT_PSW"""}}}
}
4.2.2 加密文件
如果需要加密某個文件,也可以使用 credential,比如鏈接到 Kubernetes 集群的 kubeconfig文件等。
首先創建文本形式的憑證
接下來可以在 Pipeline 中引用該文件:
pipeline {agent anystages {stage('Secret File') {environment {MY_KUBECONFIG = credentials('STUDY_CLUSTER_CONFIG')}steps {echo "MY_KUBECONFIG: $MY_KUBECONFIG"}}}
}
更多其它類型的憑證可以參考:https://www.jenkins.io/doc/book/pipeline/jenkinsfile#handling-credentials。
此博客來源于:https://edu.51cto.com/lecturer/11062970.html