1. 程式人生 > 其它 >Jenkins Pipeline script 指令建立和變數定義

Jenkins Pipeline script 指令建立和變數定義

一、Jenkins Pipeline 

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

 

Stage:階段,一個Pipeline可以劃分成若干個Stage,每個Stage代表一組操作,例如:“Build”,“Test”,“Deploy”。

【注意】Stage是一個邏輯分組的概念,可以跨多個Node

Node:節點,一個Node就是一個Jenkins節點,或者是Master,或者是Agent,是執行Step的具體執行環境。

Step:步驟,Step是最基本的操作單元,小到建立一個目錄,大到構建一個Docker映象,由各類Jenklins Plugin提供,例如:sh ‘make’



Pipeline五大特性

程式碼:Pipeline以程式碼的形式實現,通常被檢入原始碼控制,使團隊能夠編輯、審查和迭代其CD流程。
可持續性:Jenklins重啟或者中斷後都不會影響Pipeline Job。
停頓:Pipeline可以選擇停止並等待任工輸入或批准,然後再繼續Pipeline執行。
多功能:Pipeline支援現實世界的複雜CD要求,包括fork/join子程序,迴圈和並行執行工作的能力
可擴充套件:Pipeline外掛支援其DSL的自定義擴充套件以及與其他外掛整合的多個選項。

 

宣告式Pipeline的基本語法和表示式遵循與Groovy語法相同的規則,但有以下例外:

1、宣告式pipeline必須包含在固定格式pipeline{}快內
2、每個宣告語句必須獨立一行,行尾無需使用分號
3、塊(blocks{})

只能包含章節(Sections),指令(Directives)步驟(Steps)或賦值語句
4、屬性引用語句被視為無引數方法呼叫。例:輸入被視為 input()

塊(blocks{})
由大括號括起來的語句,如pipeline{},Section{},parameters{},script{}
章節(Sections)
通常包含一個或多個指令或步驟。如 agent 、post、stages、steps
指令(Directives)
environment、options、parameters、triggers(觸發)、stage、tools、when
步驟(Steps)
Pipeline steps reference
執行指令碼式pipeline:使用script{}

指令agent
必須存在,agent必須在pipeline塊內的頂層定義,但stage內是否使用使可選的

指令stages 必須,包括順序執行的一個或多個stage命令,在pipeline內僅能使用一次,通常位於agent/options後面,例子如上

指令steps 必須,steps位於stage指令塊內部,包括一個或多個step。僅有一個step的情況下可以忽略關鍵字step及其{},例子如上

指令environment 不是必須的,該environment指令指定一系列鍵值對,這些對值將被定義為所有步驟的環境變數或階段特定步驟,具體取決於environment指令位於Pipeline中的位置。

解釋一下什麼意思,environment{…}, 大括號裡面寫一些鍵值對,也就是定義一些變數並賦值,這些變數就是環境變數。環境變數的作用範圍,取決你environment{…}所寫的位置,你可以寫在頂層環境變數,讓所有的stage下的step共享這些變數,也可以單獨定義在某一個stage下,只能供這個stage去呼叫變數,其他的stage不能共享這些變數。一般來說,我們基本上上定義全域性環境變數,如果是區域性環境變數,我們直接用def關鍵字宣告就可以,沒必要放environment{…}裡面。

environment {CC='clang'}
environment {AN_ACCESS_KEY = credentials('my-prefined-secret-text')}
steps {sh 'printenv'}

指令options ,該options指令允許在Pipeline本身內配置Pipeline專用選項,不是必須的 預定義pipeline專有的配置資訊,僅可定義一次

pipeline {
    agent any
    options{
    timeout(time:1,unit: 'HOURS')
    }
    ...
}

指令parameters ,改parameters是引數的意思,不是必須的 定義引數化構建的引數,可選引數如下:

booleanParam布林值引數

就是定義一個布林型別引數,使用者可以在Jenkins UI上選擇是還是否,選擇是表示程式碼會執行這部分,如果選擇否,會跳過這部分。一般需要使用布林值的場景有,執行一些特定整合的指令碼或則工作,或者事後清除環境,例如清楚Jenkins的workspace這樣的動作。

Pipeline {
    agent any
    parameters {
        booleanParam(name: 'DEBUG_BUILD', defaultValue: true, description: '')
    }
}

choice選擇引數

#選擇(choice)引數就是支援使用者從多個選擇項中,選擇一個值用來表示這個變數的值。工作中常用的場景,有選擇伺服器型別,選擇版本號等。

Pipeline {
    agent any
    parameters {
        choice(name: 'ENV_TYPE', choices: ['test', 'dev', 'product'], description: 'test means test env,….')
 
    }
}

file檔案引數

檔案(file)引數就是在Jenkins 引數化構建UI上提供一個檔案路徑的輸入框,Jenkins會自動去你提供的網路路徑去查詢並下載。一般伴隨著還有你需要在Pipleline程式碼中寫解析檔案。也有這樣場景,這個構建job就是把一個war包部署到伺服器上特定位置,你可以使用這個檔案引數。

Pipeline {
    agent any
    parameters {
        name: 'FILE', description: 'Some file to upload')
    }
 
}

text文字引數

文字(text)的引數就是支援寫很多行的字串:

Pipeline {
    agent any
    parameters {
        text(name: 'Welcome_text', defaultValue: 'One\nTwo\nThree\n', description: '')
    }
 
}

password密碼引數

密碼(password)引數就是在Jenkins 引數化構建UI提供一個暗文密碼輸入框,例如,我需要在一些linux機器上做自動化操作,需要提供機器的使用者名稱和密碼,由於密碼涉及安全問題,一般都採用暗文顯示,這個時候你就不能用string型別引數,就需要使用password引數型別。

Pipeline {
    agent any
    parameters {
        password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'A secret password')
 
    }
}

string字串引數

就是定義一個字串引數,使用者可以在Jenkins UI上輸入字串,常見使用這個引數的場景有,使用者名稱,收件人郵箱,檔案網路路徑,主機名稱的或者url等

Pipeline {
    agent any   
    parameters {
        string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '')
    }
}

引數情況

paramenters {
    choice(name:'PerformMavenRelease',choices:'False\nTrue',description:'desc')
   choice(name:'ENV_TYPE',choices:['test', 'dev', 'product'],description:'test means test env,…')
   password(name:'CredsToUse',description:'Apassword to build with',defaultValue:'')
   string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '')
}
environment {
    BUILD_USR_CHOICE="${params.PerformMavenRelease}"
    BUILD_USR_CREDS="${params.CredsToUse}"
}

 

二、快速建立一個pipeline
  1.新建 Item ,點選紅框中的"新建Item":

  2.新建 pipeline,輸入任務名稱,點選紅框中的"新建流水線",點選確定:

  3.接下來會彈出詳細設定的表單,如下圖,選擇"流水線"的Tab頁,在頁面上直接輸入一段pipeline內容,再點選左下角的"儲存"按鈕:

 

pipeline script參考:

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'    
            }
        }
    }
}

  4.點選下圖紅框中的"立即構建",即可執行剛才輸入的pipeline指令碼:

   5.任務執行完畢後如下圖所示,點選紅框中的圖示,即可檢視本次任務執行過程中的控制檯輸出:

 

 

 

常用的輔助工具

· Snipper Generator(程式碼片段生成器,語法檢查器)
· Replay Pipeline(重放pipeline,可以修改script,修改後的不存入config.xml)
· DSL Reference 語法參考手冊
· 全域性變數引用
· Stage View
· BlueOcean(視覺化)
· Pipeline神器:視覺化編輯器
· 命令列Pipeline除錯工具

三、變數的傳遞

  1. 自定義變數(區域性)
def username = 'Jenkins'
echo "Hello Mr.${username}"
#注意一定要用雙引號,單引號識別為字串

      2.環境變數(區域性)

withEnv(['MYTOOL_HOME=/usr/local/mytool']){
    sh '$MYTOOL_HOME/bin/start'
}

  3.環境變數(全域性)

environment {CC='clang'}
echo "Compiler is ${env.CC}"

  4.引數化構建(全域性)

parameters {string(name:'Jenkins',defaultValue:'Hello',description:'How should I greet the world')}
ehco "${params.Greeting} World!"

 

判斷

when僅用於stage內部
when的內建條件為:

 - when {branch 'master'}
 - when {environment name:'DEPLOY_TO',value:'production'}
#當有環境變數 name 為 DEPLOY_TO 值是 production 條件成立
 - when {expression {return params.DEBUG_BUILD}}
#表示式返回值為真時
 - when {not {branch 'master'}}
 - when {allOf {branch 'master'; environment name:'DEBUG_TO',value:'production'}}
#allOf 所有條件都滿足時
 - when {anyOf {branch 'master' ; branch 'staging'}}
#anyOf有一個條件滿足時即可

判斷和異常處理
流程控制if/else條件

node {
    stage('Example'){
        if(env.BRANCH_NAME == 'master'){
            echo 'I only execute on the master branch'
        }else {
            echo 'Iexecute elsewhere'
        }
    }
}

迴圈
for迴圈僅存在域指令碼式pipeline中,但是可以通過在宣告式pipeline中呼叫script step來執行

pipeline {
    agent any
    stages {
        stage('Example'){
            steps{
                echo 'Hello world!'
                script {
                    def browsers = ['chrome','firefox']
                    for (int i = 0;i < browers.size();++i){
                        echo "Testing the ${browsers[i]} browser"
                    }
                }
            }
        }
    }
}

 

 

 

 

————————————————

參考連結:https://blog.csdn.net/diantun00/article/details/81075007

Jenkins高階篇之Pipeline語法篇-6-Declarative Pipeline指令:environment/options/parameters_Anthony_tester的部落格-CSDN部落格_jenkins parameters