二十、DevOps落地:Jenkins基礎入門(一)

二十、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系統資源配置
jenkins192.168.200.54Rocky9.42核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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/97829.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/97829.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/97829.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

簡單易實現的數據校驗方法Checksum

簡單易實現的數據校驗方法Checksum 在數據傳輸中,Checksum(校驗和) 扮演著 “數據完整性哨兵” 的角色。它的主要作用是 快速檢測數據在傳輸過程中是否發生了錯誤 。 下面我將詳細解釋它的作用、工作原理、優缺點以及典型應用。 核心作用&…

再次深入學習深度學習|花書筆記1

我已經兩年沒有碰過深度學習了,寫此文記錄學習過程,加深理解。 深度學習再次深入學習深度學習|花書筆記1信息論第四節 數值計算中的問題上溢出 和 下溢出病態條件優化法再次深入學習深度學習|花書筆記1 這本書說的太繁瑣了,如果是想要基于這…

DeerFlow實踐:華為LTC流程的評審智能體設計

目錄 一、機制設計核心邏輯 二、4 個評審點智能體機制詳解 (一)立項決策(ATI)智能體機制 1. 知識調用與匹配 2. 評審校驗流程 3. 異常處理 (二)投標決策(ATB)智能體機制 1. …

C++與Lua交互:從原理到實踐指南

核心原理:Lua虛擬棧機制 C與Lua能夠高效交互的核心在于Lua虛擬棧的設計,這是一個精巧的中立通信區,解決了兩種語言間的本質差異:特性對比CLua語言類型靜態編譯型動態解釋型數據管理明確內存布局虛擬機統一管理類型系統編譯時確定運…

CSS 編碼規范

CSS 編碼規范1 CSS1.1 編碼規范1.1.1 【強制】所有聲明必須以分號結尾1.1.2 【推薦】使用 2 個空格縮進1.1.3 【推薦】選擇器與 { 之間保留一個空格1.1.4 【推薦】屬性值規范1.1.5 【推薦】組合器規范1.1.6 【推薦】逗號分隔規范1.1.7 【推薦】注釋規范1.1.8 【推薦】右大括號規…

ORA-12514:TNS:監聽程序當前無法識別連接描述符中請求的服務

已經不止一次自己本機電腦安裝的Oracle使用plsqldev軟件登入提示這個了.一般前一天還好好的,今天就不行了.好好總結一下吧,也共大家一起借鑒.主要原因還是數據的歸檔日志因為內部內存已經耗盡,不能在進行歸檔導致數據庫啟動異常,沒…

Spring框架的JDBC模板技術和事務管理

SpringJDBCJDBC模板技術概述JDBC的模板類的使用Spring框架的事務管理配置文件方式半注解的方式純注解的方式JDBC模板技術概述 什么是 JDBC 模板技術? JDBC 模板技術是 Spring 框架為簡化持久層(數據庫操作)編程而提供的一種封裝機制&#xf…

將文件部署到受管主機

目錄 1.ansible.builtin中用于創建、更新或刪除多行文本塊的模塊是什么 2.copy模塊的作用 3.fetch模塊的作用 4.file模塊的作用 5.lineinfile模塊的作用 6.stat模塊的作用 7.要確保受管主機上存在文件,類似touch命令功能,還能設置權限等的模塊及操作是怎…

Dell PowerEdge R620 服務器內存和硬盤罷工了

文章目錄前言調查原因查找解決方案硬盤問題內存問題總結前言 月黑風高夜,服務宕機時。做服務端技術的,誰還沒半夜遇到個服務掛掉的情況,而像我這種半兼職網管的工作,遇到機器問題的概率也就更大了,本來周五晚上寫完總…

2025:SourceTree 啟用/禁用Mercurial 或 Git,像素級細節

最近使用Git管理工具的時候,發現還是SourceTree好用些,但是使用SourceTree帶來一個問題:就是每次在重新打開SourceTree的時候,都會重新下載Mercurial.zip文件,查了一下,一般情況下我們是不需要使用Mercuria…

安卓 Google Maps 的使用和開發步驟

文章目錄1. main2. Android 谷歌地圖3. 源碼Reference1. main 在國內選擇的SDK可以是高德、百度、騰訊、xxxx等,但在國外,你首選是谷歌,因此要進行Google地圖的開發你首先要解決下面三個問題 VPN Google賬號 信用卡American Express&#x…

Linux -- 應用層協議Http

1.HTTP背景知識 HTTP協議:HTTP(HyperText Transfer Protocol,超文本傳輸協議)的本質是運行在 TCP/IP 協議族之上的 “應用層協議”,核心作用是定義客戶端(如瀏覽器、APP)與服務器之間的 “數據…

R 語言本身并不直接支持 Python 中 f“{series_matrix}.txt“ 這樣的字符串字面量格式化(f-string)語法 glue函數

R 語言本身并不直接支持 Python 中 f"{series_matrix}.txt" 這樣的字符串字面量格式化(f-string)語法。 在 R 中,要實現字符串拼接或格式化,你需要使用其他方法。下表對比了 Python f-string 和 R 中常見對應方法的主要…

【AI智能體】亮數據MCP Server × Dify:AI智能體獲取實時影音數據就是這么簡單

文章目錄一、引言:AI 應用與實時影音數據的融合價值1、傳統采集方式的痛點2、MCP Server 的創新價值二、亮數據 MCP Server 概覽1、什么是 MCP Server?2、支持的影音平臺和API接口3、產品特色亮點三、業務場景示例設計1、選定場景:競品分析與…

從《Attention Is All You Need》深入理解Transformer

2017年的《Attention Is All You Need》論文提出的Transformer架構,不僅徹底改變了自然語言處理的格局,更為現代人工智能的發展奠定了堅實基礎。本文將帶你深入解析這一劃時代模型的核心思想、技術細節及其深遠影響。🔄 一、背景與動機&#…

【08】AI輔助編程完整的安卓二次商業實戰-修改消息聊天框背景色-觸發聊天讓程序異常終止bug牽涉更多聊天消息發送優化處理-優雅草卓伊凡

【08】AI輔助編程完整的安卓二次商業實戰-修改消息聊天框背景色-觸發聊天讓程序異常終止bug牽涉更多聊天消息發送優化處理-優雅草卓伊凡引言本次二開布局沒有變,但是下一次整體布局會有變,不過本次開發發現朋友圈跳轉功能的流程步驟也做了一定的變化。原…

心理調適與情緒管理實訓室:支撐康養旅游人才心理能力培養

在康養休閑旅游服務專業的教學體系中,心理調適與情緒管理實訓室作為關鍵教學場所,承擔著培養學生心理服務能力、情緒疏導技能和人際溝通素養的重要任務。隨著社會對康養旅游服務質量要求的提升,具備心理調適與情緒管理能力的專業人才日益受到…

Oracle sql tuning guide 翻譯 Part 6 --- 優化器控制

第五部分優化器控制你可以用提示信息和初始化參數來影響優化器的判斷和運作方式。Influencing the Optimizer Optimizer defaults are adequate for most operations, but not all.In some cases you may have information unknown to the optimizer, or need to tune the opti…

pthread_mutex_lock函數深度解析

摘要 pthread_mutex_lock是POSIX線程庫中用于實現線程同步的核心函數,它通過對互斥鎖的加鎖操作來確保多個線程對共享資源的安全訪問。本文從互斥鎖的歷史背景和發展脈絡入手,詳細解析了pthread_mutex_lock函數的設計理念、實現機制和使用場景。通過生產…

qt QBoxSet詳解

1、概述QBoxSet 類代表箱形圖中的一個條目。箱形條目是范圍和由五個不同值構成的三個中值的圖形表示。這五個值分別是:下極值、下四分位數、中位數、上四分位數和上極值。QBoxSet 提供了多種方法來設置和獲取這些值,并且可以與 QBoxPlotSeries 和 QChart…