文章目錄
- Pipeline
- 什么是Jenkins Pipeline
- 聲明式和腳本式Pipeline語法
- 為何使用Pipeline
- Pipeline概念
- Pipeline
- Node
- Stage
- Step
- Pipeline語法概述
- 聲明式Pipeline
- 腳本式Pipeline
- Pipeline示例
- 參考
Pipeline
什么是Jenkins Pipeline
Jenkins Pipeline是一套插件,它支持實現和集成“continuous delivery (CD) pipeline”到Jenkins。
CD pipeline是流程的自動化表達,用于從版本控制向用戶和客戶獲取軟件。 軟件的每個變化(在源碼控制中提交),在其被發布的過程中,都經歷了一個復雜的過程。該過程包括了以一種可靠并可重復的方式來構建軟件, 以及通過測試和部署的多階段來處理構建軟件(稱為一個build)。
Pipeline提供了一組可擴展的工具,通過“Pipeline domain-specific language (DSL) syntax”對從簡單到復雜的交付pipeline“作為代碼”來建模。
Jenkins Pipeline的定義寫在一個文本文件中(稱為 Jenkinsfile
),該文件可以被提交到項目的源碼控制倉庫。這是“Pipeline-as-code”的基礎;將CD pipeline作為應用的一部分,像其它代碼一樣,可以版本化和審查。
創建 Jenkinsfile
并提交到源碼控制,提供了很多立竿見影的好處:
- 自動為所有branch和PR(Pull Request)創建Pipeline構建流程。
- 在Pipeline上代碼審查/迭代 (以及剩余的源碼)。
- 對Pipeline進行審計追蹤。
- Pipeline只有單一源,可被項目里的多個成員查看和編輯。
定義Pipeline的語法,無論是在web UI還是在 Jenkinsfile
文件中,都是相同的,不過通常認為,在 Jenkinsfile
中定義Pipeline,并納入源碼控制,是最佳實踐。
聲明式和腳本式Pipeline語法
Jenkinsfile
可用兩種語法進行編寫:聲明式和腳本式。
聲明式和腳本式的Pipeline,從根本上是不同的。聲明式Pipeline是Jenkins Pipeline新一些的特性:
- 相比腳本式Pipeline語法,它提供更加豐富的語法特性
- 是為了使讀寫Pipeline代碼更容易而設計的。
不過, Jenkinsfile
里很多單個的語法組件(或稱“步驟”),對于聲明式和腳本式Pipeline是通用的。
為何使用Pipeline
Jenkins本質上是一個自動化引擎,它支持許多自動化模式。Pipeline添加了一組強大的工具到Jenkins,支持從簡單的CI到復雜的CD Pipeline的用例。通過對一系列的相關任務進行建模,用戶可以利用Pipeline的很多特性:
- 代碼:Pipeline是在代碼中實現的,通常會納入源碼控制,團隊有編輯、審查和迭代其交付Pipeline的能力。
- 持久:Pipeline可以從Jenkins控制器的計劃和非計劃的重啟中存活下來。
- 可暫停:Pipeline可以停止并等待人工輸入或批準,然后繼續運行Pipeline。
- 多功能:Pipeline支持復雜的現實世界的CD需求,包括fork/join,循環, 并行工作。
- 可擴展:Pipeline插件支持指定擴展到它的DSL,以及與其它插件集成的多個選項。
盡管Jenkins一直允許將自由式job鏈接到一起的初級形式來執行串行任務,Pipeline使這個概念成為了Jenkins的頭等公民。
構建在可擴展性這個核心Jenkins價值之上,Pipeline也可以擴展,用戶可使用Pipeline Shared Libraries,開發人員可使用插件來擴展。
下面的流程圖是一個CD場景的示例,在Jenkins Pipeline中很容易建模:
Pipeline概念
Pipeline
Pipeline是CD pipeline的用戶自定義模型。Pipeline代碼定義了整個構建流程,通常包含了構建應用、測試和發布階段。
同時, pipeline
塊是聲明式Pipeline語法的重要部分。
Node
Node是一個機器,它是Jenkins環境的一部分,能夠執行Pipeline。
同時, node
塊是腳本式Pipeline語法的重要部分。
Stage
stage
塊定義了任務的概念上的不同子集,這些任務在整個Pipeline上被執行(比如:Build、Test和Deploy stage),很多插件用它來可視化或者展示Jenkins Pipeline狀態/進度。
Step
單個任務。本質上,step告訴Jenkins在一個特定的時間點上做什么(或者叫流程里的一步)。比如,要執行shell命令 make
,使用 sh
step: sh 'make'
。當插件擴展Pipeline DSL,通常意味著檢查實現了一個新的step。
Pipeline語法概述
聲明式Pipeline
在聲明式Pipeline語法中, pipeline
塊定義了整個Pipeline要做的工作。
Jenkinsfile(聲明式Pipeline):
pipeline {agent anystages {stage('Build') {steps {//}}stage('Test') {steps {//}}stage('Deploy') {steps {//}}}
}
腳本式Pipeline
在腳本式Pipeline語法中,一個或多個 node
塊在整個Pipeline中做核心工作。盡管這不是腳本式Pipeline語法的強制需求,把Pipeline的工作限制在 node
塊中,做了兩件事:
- 通過向Jenkins隊列中添加一項,安排塊中包含的step運行。一旦node上的執行器空閑,該step就會運行。
- 創建workspace(某個Pipeline所特有的目錄),在此處工作在從源碼控制檢出的文件上。
注意:取決于Jenkins配置,一些workspace在一段時間靜止(inactivity)后,可能不會自動清理。
Jenkinsfile(腳本式Pipeline):
node {stage('Build') {//}stage('Test') {//}stage('Deploy') {//}
}
Pipeline示例
Jenkinsfile(聲明式Pipeline):
pipeline {agent anyoptions {skipStagesAfterUnstable()}stages {stage('Build') {steps {sh 'make'}}stage('Test'){steps {sh 'make check'junit 'reports/**/*.xml'}}stage('Deploy') {steps {sh 'make publish'}}}
}
Jenkinsfile(腳本式Pipeline):
node {stage('Build') {sh 'make'}stage('Test') {sh 'make check'junit 'reports/**/*.xml'}if (currentBuild.currentResult == 'SUCCESS') {stage('Deploy') {sh 'make publish'}}
}
參考
https://www.jenkins.io/doc/book/pipeline
https://www.jenkins.io/zh/doc/book/pipeline
(中文文檔)