1. 程式人生 > >Jenkins pipeline 語法詳解

Jenkins pipeline 語法詳解

數列 自定義 為什麽 box catcher k8s fork dom choice

原文地址http://www.cnblogs.com/fengjian2016/p/8227532.html

pipeline 是一套運行於jenkins上的工作流框架,將原本獨立運行於單個或者多個節點的任務連接起來,實現單個任務難以完成的復雜流程編排與可視化。

pipeline 是jenkins2.X 最核心的特性, 幫助jenkins 實現從CI 到 CD與 DevOps的轉變

pipeline 提供一組可擴展的工具, 通過 pipeline domain specific language syntax 可以到達pipeline as code 目的

pipiline as code : jenkinsfile 存儲在項目的 源代碼庫

為什麽要使用pipeline

1. 代碼: pipeline 以代碼的形式實現,通過被撿入源代碼控制, 使團隊能夠編譯,審查和叠代其cd流程

2 可連續性: jenkins 重啟 或者中斷後都不會影響pipeline job

3.停頓: pipeline 可以選擇停止並等待人工輸入或者批準,然後在繼續pipeline運行

4.多功能: pipeline 支持現實世界的復雜CD要求, 包括fork、join子進程,循環和並行執行工作的能力

5.可擴展: pipeline 插件支持其DSL的自動擴展以及其插件集成的多個選項。

jenkins pipeline 入門

pipeline 腳本是有groovy 語言實現的

-無需專門學習 groovy

pipeline 支持兩種語法

  -  Declarative 聲明式

  -  Scripted pipeline 腳本式

如何創建基本的pipeline

  -  直接在jenkins web ui 網頁界面輸入腳本

  -  通過常見一個jenkins 可以檢入項目的源代碼管理庫

Declarativ 聲明式 pipeline

聲明式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{}

 

agent

需要 必須存在,agent必須在pipeline塊內的頂層定義,但是stage內是否使用為可選
參數 any/none/label/node/docker/dockerfile
常用參數 label/customWorkspace/reuseNode
展示:
agent { label ‘this k8s-api-label‘}

agent {

    node{

      label ‘ this is k8sapi-label‘

      customWorkspace ‘/some/other/path‘

    }

}

agent {

     docker {

        image ‘im-web‘

        label ‘this is k8sapi-label‘

        args ‘-v /tmp:/tmp‘

      }

}

# customWorkspace node節點的工作空間

post

需要 否,用於pipeline的最外層或者stage{}中
參數
常用選項

構建後操作的內置判定條件

always,changed,failure,sucess,unstable,aborted

展示:
技術分享圖片
pipeline {
    agent any
    stages {
        stage(‘Example‘) {
            steps {
                echo ‘Hello World‘
            }
        }
    }
    post {
        always {
            echo ‘I will ........!‘
        }
    }
}
技術分享圖片

stages

需要 是,包括順序執行的一個或者多個stage命令
參數
常用選項

構建後操作的內置判定條件

always,changed,failure,sucess,unstable,aborted

展示:
技術分享圖片
pipeline {
    agent any
    stages {
        stage(‘Example‘) {
            steps {
                echo ‘Hello World‘
            }
        }
    }
      stage(‘echo‘) {
          steps {
              echo ‘I will ........!‘
          }
      }
}
技術分享圖片

steps

需要 是,steps位於stage指令塊內部,包括一個或者多個step
參數
說明

僅有一個step的情況下可以忽略關鍵字step及其{}

展示:
技術分享圖片
pipeline {
    agent any
    stages {
        stage(‘Example‘) {
            steps {
                echo ‘Hello World‘
            }
        }
    }
      stage(‘echo‘) {
          steps {
              echo ‘I will ........!‘
          }
      }
}
技術分享圖片

Directives (指令)

environment指令指定一系列鍵值對,這些鍵值對將被定義為所有step或stage-specific step的環境變量,具體取決於environment指令在Pipeline中的位置。
該指令支持一種特殊的方法credentials(),可以通過其在Jenkins環境中的標識符來訪問預定義的憑據。
對於類型為“Secret Text”的憑據,該 credentials()方法將確保指定的環境變量包含Secret Text內容;對於“標準用戶名和密碼”類型的憑證,指定的環境變量將被設置為username:password。

environment

需要 是,environment 定義了一組全局的環境變量鍵值對
參數
說明

存在於pipeline{} 或者stage指令內,

註意特殊方法credentials() ,可以獲取jenkins中預定義的憑證明文內容

展示:
技術分享圖片
pipeline {
    agent any
    
    environment {
        SONAR_SERVER = ‘http://172.16.230.171:9000‘
    }
    
    stages {
        stage(‘Example‘) {
            steps {
                echo "${SONAR_SERVER}"
            }
        }
    }
}
技術分享圖片

options

buildDiscarder
    pipeline保持構建的最大個數。例如:options { buildDiscarder(logRotator(numToKeepStr: ‘1‘)) }
  disableConcurrentBuilds
    不允許並行執行Pipeline,可用於防止同時訪問共享資源等。例如:options { disableConcurrentBuilds() }
  skipDefaultCheckout
    默認跳過來自源代碼控制的代碼。例如:options { skipDefaultCheckout() }
  skipStagesAfterUnstable
    一旦構建狀態進入了“Unstable”狀態,就跳過此stage。例如:options { skipStagesAfterUnstable() }
  timeout
    設置Pipeline運行的超時時間。例如:options { timeout(time: 1, unit: ‘HOURS‘) }
  retry
    失敗後,重試整個Pipeline的次數。例如:options { retry(3) }
  timestamps
    預定義由Pipeline生成的所有控制臺輸出時間。例如:options { timestamps() }

options

需要 否,預定義pipeline專有的配置信息,僅可定義一次
參數
說明
authorizationMatrix, buildDiscarder, catchError, disableConcurrentBuilds, overrideIndexTriggers, 
retry, script, skipDefaultCheckout, skipStagesAfterUnstable, timeout, waitUntil, withContext,
withCredentials, withEnv, ws
展示: 設置構建超時時間 為1個小時
技術分享圖片
pipeline {
    agent any
    
    options {
        timeout(time:1, unit: ‘HOURS‘)
    }
    
    environment {
        SONAR_SERVER = ‘http://172.16.230.171:9000‘
        JAVA_HOME=‘/data/jdk‘
    }
    
    stages {
        stage(‘sonarserver‘) {
            steps {
                echo "${SONAR_SERVER}"
            }
        }
        stage(‘javahome‘) {
            steps {
                echo "${JAVA_HOME}"
            }
        }
    }
}
技術分享圖片

parameters

parameters指令提供用戶在觸發Pipeline時的參數列表。這些參數值通過該params對象可用於Pipeline步驟

可用參數
  string
    A parameter of a string type, for example: parameters { string(name: ‘DEPLOY_ENV‘, defaultValue: ‘staging‘, description: ‘‘) }
  booleanParam
    A boolean parameter, for example: parameters { booleanParam(name: ‘DEBUG_BUILD‘, defaultValue: true, description: ‘‘) }
  目前只支持[booleanParam, choice, credentials, file, text, password, run, string]這幾種參數類型,其他高級參數化類型還需等待社區支持。

parameters

需要 否,定義參數化構建的參數
參數
說明
booleanParam,choice,file,text,password,run,string
示例

技術分享圖片
pipeline {
    agent any
    
    options {
        timeout(time:1, unit: ‘HOURS‘)
    }
    
    parameters {
        choice(name:‘PerformMavenRelease‘,choices:‘False\nTrue‘,description:‘desc‘)
     //   password(name:‘CredsToUse‘,defaultValue:‘‘,description:‘A password to build with‘)
    }
    
    environment {
        SONAR_SERVER = ‘http://172.16.230.171:9000‘
        JAVA_HOME=‘/data/jdk‘
    }
    
    stages {
        stage(‘sonarserver‘) {
            steps {
                echo "${SONAR_SERVER}"
            }
        }
        stage(‘javahome‘) {
            steps {
                echo "${JAVA_HOME}"
            }
        }
        stage(‘get parameters‘) {
            steps {
                echo "${params.PerformMavenRelease}"
            }
        }        
    }
}
技術分享圖片

調用定義的參數, 需要使用 params.PerformMavenRelease

技術分享圖片

技術分享圖片

triggers

triggers指令定義了Pipeline自動化觸發的方式。對於與源代碼集成的Pipeline,如GitHub或BitBucket,triggers可能不需要基於webhook的集成也已經存在。目前只有兩個可用的觸發器:cron和pollSCM。

triggers

需要 否,定義pipeline被自動觸發的方式
參數
說明
cron,pollSCM,upstream
示例

技術分享圖片
pipeline {
    agent any
    
    options {
        timeout(time:1, unit: ‘HOURS‘)
    }
    
    parameters {
        choice(name:‘PerformMavenRelease‘,choices:‘False\nTrue‘,description:‘desc‘)
     //   password(name:‘CredsToUse‘,defaultValue:‘‘,description:‘A password to build with‘)
    }
    
    environment {
        SONAR_SERVER = ‘http://172.16.230.171:9000‘
        JAVA_HOME=‘/data/jdk‘
    }
    
   triggers {
     cron(‘H 4/* 0 0 1-5‘)
}
stages { stage(‘sonarserver‘) { steps { echo "${SONAR_SERVER}" } } stage(‘javahome‘) { steps { echo "${JAVA_HOME}" } } stage(‘get parameters‘) { steps { echo "${params.PerformMavenRelease}" } } } }
技術分享圖片

when

  when指令允許Pipeline根據給定的條件確定是否執行該階段。該when指令必須至少包含一個條件。如果when指令包含多個條件,則所有子條件必須為stage執行返回true。這與子條件嵌套在一個allOf條件中相同(見下面的例子)。
更復雜的條件結構可使用嵌套條件建:not,allOf或anyOf。嵌套條件可以嵌套到任意深度

 內置條件
  branch
    當正在構建的分支與給出的分支模式匹配時執行,例如:when { branch ‘master‘ }。請註意,這僅適用於多分支Pipeline。
  environment
    當指定的環境變量設置為給定值時執行,例如: when { environment name: ‘DEPLOY_TO‘, value: ‘production‘ }
  expression
    當指定的Groovy表達式求值為true時執行,例如: when { expression { return params.DEBUG_BUILD } }
  not
    當嵌套條件為false時執行。必須包含一個條件。例如:when { not { branch ‘master‘ } }
  allOf
    當所有嵌套條件都為真時執行。必須至少包含一個條件。例如:when { allOf { branch ‘master‘; environment name: ‘DEPLOY_TO‘, value: ‘production‘ } }
  anyOf
    當至少一個嵌套條件為真時執行。必須至少包含一個條件。例如:when { anyOf { branch ‘master‘; branch ‘staging‘ } }

when

需要
參數
說明
inside a stage directive
技術分享圖片
pipeline {
    agent any
    stages {
        stage(‘Example Build‘) {
            steps {
                echo ‘Hello World‘
            }
        }
        stage(‘Example Deploy‘) {
            when {
                allOf {
                    branch ‘production‘
                    environment name: ‘DEPLOY_TO‘, value: ‘production‘
                }
            }
            steps {
                echo ‘Deploying‘
            }
        }
    }
}
技術分享圖片

Parallel(並行)

Declarative Pipeline近期新增了對並行嵌套stage的支持,對耗時長,相互不存在依賴的stage可以使用此方式提升運行效率。除了parallel stage,單個parallel裏的多個step也可以使用並行的方式運行。

技術分享圖片
pipeline {
    agent any
    stages {
        stage(‘Non-Parallel Stage‘) {
            steps {
                echo ‘This stage will be executed first.‘
            }
        }
        stage(‘Parallel Stage‘) {
            when {
                branch ‘master‘
            }
            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"
                    }
                }
            }
        }
    }
}
技術分享圖片

變量傳遞

1. 自定義變量(局部)

def username = ‘jenkins‘

echo "hello Mr.${username}"

 

2. 環境變量

withEnv([‘JAVA_HOME=/data/jdk‘]) {

  sh ‘$JAVA_HOME/bin/start.sh‘

}

3. 環境變量(全局)

environment {
        JAVA_HOME=‘/data/jdk‘        
}

echo " java path $JAVA_HOME"

4. 參數化構建(全局)

技術分享圖片
parameters  {
        string(name: ‘GIT_BRANCH‘, defaultValue: ‘master‘, description: ‘default build branch‘)  
}


調用:
 echo  "${params.name}" 
技術分享圖片

判斷:

1.when 僅用於stage內部

2. when 的內置條件

技術分享圖片
1). when {branch ‘master‘}  #當是master的時候,才執行某些事情                                            
2). when {envionment name:‘DEPLOY_TO‘,value:‘production‘}  #當環境變量name 的值是production的時候,才執行某些事情
3). when {expression {return params.DEBUG_BUILD}}   #表達式的返回值是真的情況下,才執行
4). when {not {branch ‘master‘}}            #不是master的情況下,執行
5). when {allOf {branch ‘master‘; environment name: ‘DEPLOY_TO‘,value:‘production‘}} #當大括號中所有的項都成立,才去做某些事情
6). when {anyOf {branch ‘master‘; branch ‘staging‘}}  #只要滿足大括號裏面的某一個條件,才去做某些事情
技術分享圖片

Jenkins pipeline 語法詳解