1. 程式人生 > 其它 >JS高階—05—純函式、柯里化、組合函式

JS高階—05—純函式、柯里化、組合函式

實現 Pipeline 功能的指令碼語言叫做 Jenkinsfile,由 Groovy 語言實現。Jenkinsfile 一般是放在專案根目錄,隨專案一起受原始碼管理軟體控制,無需像建立"自由風格"專案一樣,每次可能需要拷貝很多設定到新專案,提供了一些直接的好處:

  • Pipeline 上的程式碼審查/迭代
  • Pipeline 的審計跟蹤
  • Pipeline 的唯一真實來源,可以由專案的多個成員檢視和編輯
    Pipeline 支援:Declarative(在 Pipeline 2.5 中引入)和 Scripted Pipeline 兩種格式。兩者都支援建立 Pipeline,兩者都可以用於在 Web UI 中定義一個流水線 Jenkinsfile,將 Jenkinsfile 檔案建立並檢查到原始碼控制庫中通常被認為是最佳做法。

Declared Pipeline

Declared Pipeline樹

Declared Pipeline 必須包含在固定格式 Pipeline {} 塊內,每個宣告語句必須獨立一行,行尾無需使用分號。塊( blocks{} )只能包含章節(Sections),指令(Directives),步驟(Steps)或賦值語句。

塊 blocks{}

由大括號括起來的語句,如 Pipeline{},Section{},parameters{},script{}

章節(Sections)

章節中通常包含一個或多個指令或步驟。如 agent 、post、stages、steps

指令(Directives)

environment、options、parameters、triggers(觸發)、stage、tools、when

節點(agent)

必須存在,agent 必須在 Pipeline 塊內的頂層定義,但 stage 內是否使用是可選的
引數:any/none/label/node/docker/dockerfile
常用選項 label/cuetomWorkspace/reuseNode
示例:

agent { label 'my-label' }

agent {
    node {
        label 'my-label'
        customWorkspace '/some/other/path'
    }
}

agent {
    docker {
        image 'nginx:1.12.2'
        label 'my-label'
        args '-v /tmp:/tmp'
    }
}

構建後(post)

不是必須,用於 Pipeline 的最外層或者 stage{} 中,主要用於表達 Jenkins 完成構建動作之後需要做的事情。

示例:

pipeline {
    agent any
    stages {
        stage('Example'){
            steps {
                echo 'Hello world'
            }
        }
    }
    post {
        always {
            echo 'say goodbay'
        }
    }
}

階段集(stages)

必須存在,包括順序執行的一個或多個 stage 命令,在 Pipeline 內僅能使用一次,通常位於 agent/options 後面。

步驟(steps)

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

環境(environment)

不是必須,environment 定義了一組全域性的環境變數鍵值對,存在於 pipeline {} 或者 stage 指令內。執行特殊方法 credentials()可以獲取 Jenkins 中預定義的憑證明文內容。

示例:

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

選項(options)

不是必須,預定義 Pipeline 專有的配置資訊,僅可定義一次

示例:

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

引數(parameters)

不是必須, 定義引數化構建的引數可選引數, 引數型別 booleanParam,choice,file,text,password,run,string
示例:

parameters {
        string(name: 'PERSON', defaultValue: 'Jenkins', description: '輸入的文字引數')
        choice(name: 'CHOICE', choices: ['One', 'Two', 'Three'], description: 'Pick something')
}

觸發器(rtiggers)

不是必須,定義 Pipeline 被自動觸發的方式選項 cron、pollSCM、upstream

示例:

triggers {
       cron('0 8 * * 1-5')
}

Script Pipeline

Script Pipeline語句樹

一個 Script Pipeline 可以劃分成若干個 Stage,每個 Stage 代表一組操作,例如 Build,Test;Node 代表 Jenkins 節點,比如 Master, Slave 這樣的節點;Step 是最基本的操作單元,在對應 Node 節點上執行的動作語句直接寫在 node {} 中。

1080×443 111 KB

流程控制語句

如同傳統的指令碼語言一樣,Script Pipeline 是從上至下順序執行,可以使用 Groovy 表示式進行流程控制,如 if/else 語句通過邏輯條件判斷來對流程進行控制:

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

異常處理語句

Script Pipeline 指令碼流程控制的另一種方式是異常處理機制。當任何一個步驟因各種原因而出現異常時,都必須在程式碼中使用 try/catch/finally 語句塊進行異常捕獲,並通過預先設定程式碼進行處理,保證指令碼能夠順利執行:

stage('Error Handling') {
    node{
        echo "This is test demo for the error handling"

        try {

            echo "This is in the try block."

            sh 'exit 1'

        }catch (exc) {

            echo "Something failed, I'm in the catch block."

        }finally {

            echo "Finally, I'm in the finally block."

        }
    }
}

Jenkinsfile 中呼叫plugin功能

在 Jenkinsfile 中除了可以使用常規的邏輯、流程控制,還可以呼叫 Jenkins 的外掛功能。下面用如下例項進行說明。

Email Extension外掛

Email Extension 是 Jenkins 中的一個外部外掛,用來發送郵件,從 Jenkins 的 Plugin Manager 中進行安裝。在 Pipeline 中通過程式碼呼叫可以觸發該外掛的執行,實現傳送郵件的功能。

基礎配置

在安裝好 Email Extension 外掛之後,首先需要選擇一個準備用來發送 Jenkins 通知郵件的郵箱,發件郵箱的具體引數要提前知曉(通常引數可以從郵箱的配置引數資訊頁面上查到);之後要在 Manage Jenkins → Configure System 中將對應引數填寫該外掛的對應配置項中,必須配置的引數如下:

  • SMTP server:smtp 服務地址
  • SMTP port:smtp 埠號
  • Use SMTP Authentication:啟用 smtp 安全校驗
  • User Name:發件人使用者名稱
  • Password:發件人密碼
  • Default Recipients:預設收件人
    其他的引數可以根據自己的需要進行配置,Email Extension 配置參考截圖如下:
     

Pipeline程式碼

pipeline{
    agent {
        label 'master'
    }
    stages{
        stage('傳送郵件測試') {
            steps{
                echo 'Test Email'
            }
        }
    }
    post {
        always {
            emailext body: '$DEFAULT_CONTENT', recipientProviders: [[$class: 'RequesterRecipientProvider']], subject: '$DEFAULT_SUBJECT'
        }
    }
}

Declared Pipeline 的入門學習難度相對不高,這種類似我們在做自動化測試時所接觸的關鍵字驅動模式,只要理解其定義好的關鍵詞,按要求填充資料即可。
雖然這種方式入門容易,但靈活性欠缺。相比之下 script Pipeline 的好處就是靈活,好封裝,易於大規模使用,但需要有一定的程式設計功底。

喜歡軟體測試的小夥伴們,如果我的部落格對你有幫助、如果你喜歡我的部落格內容,請 “點贊” “評論” “收藏” 一鍵三連哦。更多技術文章