Pipeline是一套運行於jenkins上的工作流框架,將原本獨立運行於單個或者多個節點的任務連接起來,實現單個任務難以完成的複雜流程編排與可視化。它通過Domain Specific Language(DSL)syntax定義Pipeline As Code並且實現持續交付的目的。
Pipeline是Jenkins2.X的最核心的特性,幫助Jenkins實現從CI到CD與DevOps的轉變、
注:Jenkins 1.0 只能通過UI界面手動操作來“描述”流水線; Jenkins 2.0 開始支持pipeline as code.
爲什麼要使用pipeline
1.代碼: pipeline 以代碼的形式實現,通過被撿入源代碼控制,使團隊能夠編譯,審查和迭代其CD流程
2.可連續性: jenkins 重啓或者中斷後都不會影響pipeline job
3.停頓: pipeline 可以選擇停止並等待人工輸入或者批准,然後在繼續pipeline運行
4.多功能: pipeline 支持現實世界的複雜CD要求, 包括fork、join子進程,循環和並行執行工作的能力
5.可擴展: pipeline 插件支持其DSL的自動擴展以及其插件集成的多個選項。
Pipeline結構快速解析
Jenlins Pipeline的腳本語法是由Groovy語言實現,學習成本較低,簡單易學。 目前Jenlins Pipeline支持兩種語法:
-
Declarative 聲明式(在Pipeline plugin 2.5中引入)
-
Scripted Pipeline 腳本式
image.png
聲明式pipeline 基本語法和表達式遵循 groovy語法,但是有以下例外:
-
聲明式pipeline 必須包含在固定格式的pipeline{} 塊內
-
每個聲明語句必須獨立一行, 行尾無需使用分號
-
塊(Blocks{}) 只能包含章節(Sections),指令(Directives),步驟(Steps),或者賦值語句
-
屬性引用語句被視爲無參數方法調用。 如input()
-
塊(Blocks{})
由大括號括起來的語句: 如 Pipeline{}, Sections{}, parameters{}, script{}
- 章節(Sections)
通常包括一個或者多個指令或步驟 如 agent,post,stages,steps
- 指令(Directives)
environment, options, parameters, triggers, stage, tools, when
- 步驟(steps)
執行腳本式pipeline, 如script{}
Jenkins pipeline包含兩類元素:stages和steps。如下圖:
image.png
Stage:階段,一個Pipeline可以劃分成若干個Stage,每個Stage代表一組操作,例如:“Build”,“Test”,“Deploy”。 注意,Stage是一個邏輯分組的概念,可以跨多個Node
Step:步驟,Step是最基本的操作單元,小到創建一個目錄,大到構建一個Docker鏡像,由各類Jenklins Plugin提供,例如:sh ‘make’ Node:節點,一個Node就是一個Jenkins節點,或者是Master,或者是Agent,是執行Step的具體運行環境。
pipeline{
agent any
stages {
stage('Build') {
steps{
echo 'This is a build step'
}
}
stage('Test') {
steps{
echo 'This is a test step'
}
}
stage('Deploy') {
steps{
echo 'This is a deploy step'
}
}
}
}
Pipeline編寫的輔助工具
Snipper Generator(代碼片段生成器,語法檢查器)
image.png
Replay Pipeline
重放pipeline,可以修改script,修改後的不存入config.xml
DSL Reference 語法參考手冊
- 全局變量引用
image.png
Jenkinsfile本地校驗
Jenkins Pipeline Linter Connector (vscode 插件)
image.png
如下圖所示,插件按照後需要配置如下參數:
-
jenkins.pipeline.linter.connector.url 是 Jenkins 期望的 POST 請求地址,包含你要校驗的 Jenkinsfile 文件。通常爲 http://<your_jenkins_server:port>/pipeline-model-converter/validate。
-
jenkins.pipeline.linter.connector.user 允許指定你的 Jenkins 用戶名。
-
jenkins.pipeline.linter.connector.pass 允許指定你的 Jenkins 密碼。
-
jenkins.pipeline.linter.connector.crumbUrl 當你的 Jenkins 啓用了 CRSF 時必須指定。通常爲 http://<your_jenkins_server:port>/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,%22:%22,//crumb)。
Ctrl+Shift+P
執行如下命令,對編寫的Jenkinsfile進行校驗
Jenkins Declarative Parser
❯ jdp check data/valid/complex-deployment/Jenkinsfile
Checking: data/valid/complex-deployment/Jenkinsfile
Looks valid! Great work!