流水線基礎-Pipeline


1. 認識Pipleine

1.1 Pipeline是什么?

  • Pipeline是Jenkins的核心功能,提供一組可擴展的工具。
  • 通過Pipeline 的DSL語法可以完成從簡單到復雜的交付流水線實現。
  • jenkins的Pipeline是通過Jenkinsfile(文本文件)來實現的。
  • 這個文件可以定義Jenkins的執行步驟,例如檢出代碼。

1.2 Jenkinsfile

  • Jenkinsfile使用兩種語法進行編寫,分別是聲明式和腳本式。
  • 聲明式和腳本式的流水線從根本上是不同的。
  • 聲明式是jenkins流水線更友好的特性。
  • 腳本式的流水線語法,提供更豐富的語法特性。
  • 聲明式流水線使編寫和讀取流水線代碼更容易設計。

1.3 為什么使用Pipeline?

本質上,jenkins是一個自動化引擎,它支持許多自動模式。流水線向Jenkins添加了一組強大的工具,支持用例、簡單的持續集成到全面的持續交付流水線。 通過對一系列的發布任務建立標准的模板,用戶可以利用更多流水線的特性,比如:

  • 代碼化: 流水線是在代碼中實現的,通常會存放到源代碼控制,使團隊具有編輯、審查和更新他們項目的交付流水線的能力。
  • 耐用性:流水線可以從Jenkins的master節點重啟后繼續運行。
  • 可暫停的:流水線可以由人功輸入或批准繼續執行流水線。
  • 解決復雜發布: 支持復雜的交付流程。例如循環、並行執行。
  • 可擴展性: 支持擴展DSL和其他插件集成。

構建一個可擴展是Jenkins的核心價值,流水線可以通過ShareLibrary的方式來擴展。 下面是一個CD的場景實例 

2.Pipeline概念

pipeline演示

來我們一起看下這里的配置,看下Jenkinsfile的組成及每個部分的功能含義。

  • 使用agent{},指定node節點/workspace(定義好此流水線在某節點運行)
  • 指定options{}運行選項(定義好此流水線運行時的一些選項,例如輸出日志的時間)
  • 指定stages{}(stages包含多個stage,stage包含steps。是流水線的每個步驟)
  • 指定post{}(定義好此流水線運行成功或者失敗后,根據狀態做一些任務)

    pipeline{
    //指定運行此流水線的節點
    agent any
        
    
    //流水線的階段
    stages{
    
        //階段1 獲取代碼
        stage("CheckOut"){
            steps{
                script{
                    println("獲取代碼")
                }
            }
        }
        stage("Build"){
            steps{
                script{
                    println("運行構建")
                }
            }
        }
    }
    post {
        always{
            script{
                println("流水線結束后,經常做的事情")
            }
        }
            
        success{
            script{
                println("流水線成功后,要做的事情")
            }
            
        }
        failure{
            script{
                println("流水線失敗后,要做的事情")
            }
        }
            
        aborted{
            script{
                println("流水線取消后,要做的事情")
            }
            
        }
    }
    }
    

      

 

 

 

 

參考文檔:http://www.idevops.site/jenkins/pipelinesyntax/chapter01/

 

聲明式流水線

 

聲明式Pipleine是官方推薦的語法,聲明式語法更加簡潔。所有的聲明式Pipeline都必須包含一個 pipeline塊中,比如:

 

pipeline { //run } 

 

在聲明式Pipeline中的基本語句和表達式遵循Groovy的語法。但是有以下例外:

 

  • 流水線頂層必須是一個塊,特別是pipeline{}。
  • 不需要分號作為分割符,是按照行分割的。
  • 語句塊只能由階段、指令、步驟、賦值語句組成。例如: input被視為input()。

 

agent代理

 

agent指定了流水線的執行節點。

 

agent { node { label 'labelname' }} aget { label ' labelname '} 

 

參數:

 

  • any 在任何可用的節點上執行pipeline。none 沒有指定agent的時候默認。
  • label 在指定標簽上的節點上運行Pipeline。 node 允許額外的選項(自定義workspace)。

 

post運行后處理

 

當流水線完成后根據完成的狀態做一些任務。例如:構建失敗后郵件通知

 

post { always { echo 'I will always say Hello again!' } failure{ email : xxxx@dxx.com } } 

 

常用的狀態:

 

  • always 無論流水線或者階段的完成狀態。
  • changed 只有當流水線或者階段完成狀態與之前不同時。
  • failure 只有當流水線或者階段狀態為”failure”運行。
  • success 只有當流水線或者階段狀態為”success”運行。
  • unstable 只有當流水線或者階段狀態為”unstable”運行。例如:測試失敗。
  • aborted 只有當流水線或者階段狀態為”aborted “運行。例如:手動取消。

 

stages階段

 

stages是流水線的整個運行階段,包含一個或多個 stage , 建議 stages 至少包含一個 stage

 

stages { 
    stage('Example') { steps { echo 'Hello World' } } } 

 

environment環境變量

 

定義流水線環境變量,可以定義在全局變量或者步驟中的局部變量。這取決於 environment 指令在流水線內的位置。

 

agent any

//全局變量
environment { activeEnv = 'dev' } stages { stage('Example') { //局部變量 environment { AN_ACCESS_KEY = credentials('my-prefined-secret-text') } steps { sh 'printenv' } } } 

 

options運行選項

 

定義流水線運行時的配置選項,流水線提供了許多選項, 比如buildDiscarder,但也可以由插件提供, 比如 timestamps。

 

agent any
options { timeout(time: 1, unit: 'HOURS') } stages { stage('Example') { steps { echo 'Hello World' } } } 

 

其他部分參數:

 

  • buildDiscarder: 為最近的流水線運行的特定數量保存組件和控制台輸出。
  • disableConcurrentBuilds: 不允許同時執行流水線。 可被用來防止同時訪問共享資源等。
  • overrideIndexTriggers: 允許覆蓋分支索引觸發器的默認處理。
  • skipDefaultCheckout: 在agent 指令中,跳過從源代碼控制中檢出代碼的默認情況。
  • skipStagesAfterUnstable: 一旦構建狀態變得UNSTABLE,跳過該階段。
  • checkoutToSubdirectory: 在工作空間的子目錄中自動地執行源代碼控制檢出。
  • timeout: 設置流水線運行的超時時間, 在此之后,Jenkins將中止流水線。
  • retry: 在失敗時, 重新嘗試整個流水線的指定次數。
  • timestamps 預測所有由流水線生成的控制台輸出,與該流水線發出的時間一致。

 

parameters參數

 

為流水線運行時設置項目相關的參數,就不用在UI界面上定義了,比較方便。

 

//string 字符串類型的參數, 例如: parameters { string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '') } //booleanParam 布爾參數, 例如: parameters { booleanParam(name: 'DEBUG_BUILD', defaultValue: true, description: '') } 

 

agent any
parameters { string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?') } stages { stage('Example') { steps { echo "Hello ${params.PERSON}" } } } 

 

trigger觸發器

 

構建觸發器

 

//cron 計划任務定期執行構建。
triggers { cron('H */4 * * 1-5') } //pollSCM 與cron定義類似,但是由jenkins定期檢測源碼變化。 triggers { pollSCM('H */4 * * 1-5') } agent any triggers { cron('H */4 * * 1-5') } stages { stage('Example') { steps { echo 'Hello World' } } } 

 

tool構建工具

 

構建工具maven、ant、gradle,獲取通過自動安裝或手動放置工具的環境變量。支持maven/jdk/gradle。工具的名稱必須在系統設置->全局工具配置中定義。

 

agent any
tools { maven 'apache-maven-3.0.1' } stages { stage('Example') { steps { sh 'mvn --version' } } } 

 

input交互輸入

 

input用戶在執行各個階段的時候,由人工確認是否繼續進行。

 

agent any
stages { stage('Example') { input { message "Should we continue?" ok "Yes, we should." submitter "alice,bob" parameters { string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?') } } steps { echo "Hello, ${PERSON}, nice to meet you." } } } 

 

參數解釋:

 

  • message 呈現給用戶的提示信息。
  • id 可選,默認為stage名稱。
  • ok 默認表單上的ok文本。
  • submitter 可選的,以逗號分隔的用戶列表或允許提交的外部組名。默認允許任何用戶。
  • submitterParameter 環境變量的可選名稱。如果存在,用submitter 名稱設置。
  • parameters 提示提交者提供的一個可選的參數列表。

 

when條件判斷

 

when 指令允許流水線根據給定的條件決定是否應該執行階段。 when 指令必須包含至少一個條件。

 

//branch: 當正在構建的分支與模式給定的分支匹配時,執行這個階段,這只適用於多分支流水線例如: when { branch 'master' } //environment: 當指定的環境變量是給定的值時,執行這個步驟,例如: when { environment name: 'DEPLOY_TO', value: 'production' } //expression 當指定的Groovy表達式評估為true時,執行這個階段, 例如: when { expression { return params.DEBUG_BUILD } } //not 當嵌套條件是錯誤時,執行這個階段,必須包含一個條件,例如: when { not { branch 'master' } } //allOf 當所有的嵌套條件都正確時,執行這個階段,必須包含至少一個條件,例如: when { allOf { branch 'master'; environment name: 'DEPLOY_TO', value: 'production' } } //anyOf 當至少有一個嵌套條件為真時,執行這個階段,必須包含至少一個條件,例如: when { anyOf { branch 'master'; branch 'staging' } } stage('Example Deploy') { when { branch 'production' environment name: 'DEPLOY_TO', value: 'production' } steps { echo 'Deploying' } } 

 

parallel並行

 

聲明式流水線的階段可以在他們內部聲明多隔嵌套階段, 它們將並行執行。 注意,一個階段必須只有一個 steps 或 parallel的階段。 嵌套階段本身不能包含 進一步的 parallel 階段, 但是其他的階段的行為與任何其他 stageparallel 的階段不能包含 agent 或 tools階段, 因為他們沒有相關 steps。

 

 stage('Parallel Stage') { when { branch 'master' } failFast true parallel { stage('Branch A') { agent { label "for-branch-a" } steps { echo "On Branch A" } } stage('Branch B') { agent { label "for-branch-b" } steps { echo "On Branch B" } } } } 

 

failFast true 當其中一個進程失敗時,強制所有的 parallel 階段都被終止。

 

script腳本標簽

 

可以通過此標簽嵌入腳本式語法。

 

stage("Build"){ steps{ script{ println("運行構建") } } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM