1. 程式人生 > 實用技巧 >jenkins-pipleline學習筆記(一)

jenkins-pipleline學習筆記(一)

目錄

建立一個Jenkinsfile

Jenkinsfile(宣告性管道)

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                echo 'Building..'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing..'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying....'
            }
        }
    }
}

大多數專案並不止三個步驟,不過這建立、測試、交付是最基本的工作流。

常量和變數

字串插入

def singlyQuoted = 'Hello'
def doublyQuoted = "World"

僅最後一個字串支援($)的字串插值

def username = 'Jenkins'
echo 'Hello Mr. ${username}'
echo "I said, Hello Mr. ${username}"

結果:

Hello Mr. ${username}
I said, Hello Mr. Jenkins

環境變數

Jenkins Pipeline通過全域性變數公開環境變數,全域性變數env

可以在Jenkinsfile。可在Jenkins Pipeline中訪問的環境變數的完整列表記錄在$ {YOUR_JENKINS_URL} / pipeline-syntax / globals#env中,包括:

BUILD_ID

當前的版本ID,與在Jenkins版本1.597+中建立的版本相同,為BUILD_NUMBER

BUILD_NUMBER

當前的內部版本號,例如“ 153”

BUILD_TAG

jenkins字串-$ {JOB_NAME}-$ {BUILD_NUMBER}。方便放入資原始檔,JAR檔案等中,以便於識別

BUILD_URL

可以找到此構建結果的URL(例如http:// buildserver / jenkins / job / MyJobName / 17 /)

EXECUTOR_NUMBER

標識執行此構建的當前執行程式(在同一計算機的執行程式中)的唯一編號。這是您在“構建執行器狀態”中看到的數字,除了該數字從0而不是1開始

JAVA_HOME

如果您的作業配置為使用特定的JDK,則此變數設定為指定JDK的JAVA_HOME。設定此變數後,PATH也將更新為包括JAVA_HOME的bin子目錄

JENKINS_URL

Jenkins的完整URL,例如https://example.com:port/jenkins/(注意:僅在“系統配置”中設定了Jenkins URL時可用)

JOB_NAME

此生成的專案的名稱,例如“ foo”或“ foo / bar”。

NODE_NAME

當前構建正在其上執行的節點的名稱。將主節點設定為“ master”。

工作空間

工作區的絕對路徑

設定

根據使用的是宣告式管道還是指令碼式管道,在Jenkins管道內設定環境變數的方法有所不同。宣告性管道支援環境 指令,而指令碼化管道的使用者必須使用該withEnv步驟。

Jenkinsfile(宣告性管道)

pipeline {
    agent any
    environment { 
        CC = 'clang'
    }
    stages {
        stage('Example') {
            environment { 
                DEBUG_FLAGS = '-g'
            }
            steps {
                sh 'printenv'
            }
        }
    }
}
  • environment頂層pipeline塊中使用的指令將應用於管道中的所有步驟。
  • environment中定義的指令stage只會將給定的環境變數應用於內的步驟stage

引用

Jenkinsfile(宣告性管道)

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                echo "Running ${env.BUILD_ID} on ${env.JENKINS_URL}"
            }
        }
    }
}

動態設定環境變數

環境變數可以在執行時設定,可以由Shell指令碼(sh),Windows批處理指令碼(bat)和PowerShell指令碼(powershell)的狀態returnStatus或結果returnStdout作為變數值。

Jenkinsfile(宣告性管道)

pipeline {
    agent any 
    environment {
        // Using returnStdout
        CC = """${sh(
                returnStdout: true,
                script: 'echo "clang"'
            )}""" 
        // Using returnStatus
        EXIT_STATUS = """${sh(
                returnStatus: true,
                script: 'exit 1'
            )}"""
    }
    stages {
        stage('Example') {
            environment {
                DEBUG_FLAGS = '-g'
            }
            steps {
                sh 'printenv'
            }
        }
    }
}
  1. 一個agent必須在管道的頂層設定。如果將agent設定為,這將失敗agent none
  2. 使用returnStdout尾隨空格時,會將空白附加到返回的字串中。使用.trim()刪除它。

使用憑證

對於祕密文字,使用者名稱和密碼以及祕密檔案

credentials()支援 祕密文字使用者名稱和密碼以及祕密檔案憑據。

Jenkinsfile(宣告性管道)

pipeline {
    agent {
        // Define agent details here
    }
    environment {
        AWS_ACCESS_KEY_ID     = credentials('jenkins-aws-secret-key-id')
        AWS_SECRET_ACCESS_KEY = credentials('jenkins-aws-secret-access-key')
    }
    stages {
        stage('Example stage 1') {
            steps {
                // 
            }
        }
        stage('Example stage 2') {
            steps {
                // 
            }
        }
    }
}

其他憑證型別

credentialsId()支援ssh憑據、docker憑據等使用者名稱和密碼或祕密檔案以外的憑據。使用Jenkins的程式碼段生成器功能,可以通過Jenkins的經典UI進行訪問。

要為您的管道專案/專案訪問程式碼段生成器,請執行以下操作:

  1. 在Jenkins主頁(即Jenkins經典UI的儀表板)中,單擊您的Pipeline專案/專案的名稱。

  2. 在左側,單擊“ 管道語法”,並確保“ 程式碼段生成器” 連結在左上角為粗體。(如果沒有,請單擊其連結。)

  3. 在“ 樣本步驟”欄位中,選擇withCredentials:將憑證繫結到變數

  4. 在“ 繫結”下,單擊“ 新增”,然後從下拉列表中選擇:

    • SSH使用者私鑰 -處理 SSH公/私鑰對憑據,您可以從中指定:
      • 金鑰檔案變數 -將繫結到這些憑據的環境變數的名稱。Jenkins實際上將此臨時變數分配給SSH公鑰/私鑰對身份驗證過程中所需的私鑰檔案的安全位置。
      • 密碼短語變數可選)-將繫結到 與SSH公鑰/私鑰對關聯的密碼短語的環境變數的名稱 。
      • 使用者名稱變數可選)-將繫結到與SSH公鑰/私鑰對關聯的使用者名稱的環境變數的名稱。
      • 憑證 -選擇儲存在Jenkins中的SSH公/私鑰憑證。該欄位的值是憑證ID,jenkins將其寫入已生成的程式碼段。
    • 證書 -處理PKCS#12證書,您可以從中指定:
      • 金鑰庫變數 -將繫結到這些憑據的環境變數的名稱。Jenkins實際上將此臨時變數分配給證書認證過程中所需的證書金鑰庫的安全位置。
      • 密碼變數可選)-將繫結到與證書關聯的密碼的環境變數的名稱。
      • 別名變數可選)-將繫結到與證書關聯的唯一別名的環境變數的名稱。
      • 憑證 -選擇儲存在Jenkins中的憑證憑證。該欄位的值是憑證ID,jenkins將其寫入已生成的程式碼段。
    • Docker客戶端證書 -處理Docker主機證書身份驗證。
  5. 單擊Generate Pipeline Script,Jenkins withCredentials( … ) { … }將為您指定的憑證生成一個 Pipeline步驟片段,然後您可以將其複製並貼上到宣告性或指令碼化Pipeline程式碼中。
    筆記:

    • 所述憑證欄位(如上)顯示了jenkins配置的憑據的名稱。但是,在單擊Generate Pipeline Script之後,這些值將轉換為憑證ID 。

    • 要在單個“ withCredentials( … ) { … }流水線”步驟中合併多個憑證,請參閱“ 在一個步驟中合併憑證”(以下)以獲取詳細資訊。

     	steps {
     		//拉取front程式碼
     		echo '正在拉取程式碼...'
     		dir("projdir/front"){
     			git  credentialsId: '10e76a46-7872-4266-9e32-e0dbcb7df1c2', url: 'http://10.60.1.90/front.git',branch:'dev',changelog:true
     		}
     		//拉取middle程式碼
     		dir("projdir/middle"){
     			git  credentialsId: '10e76a46-7872-4266-9e32-e0dbcb7df1c2', url: 'http://10.60.1.90/middle.git',branch:'dev',changelog:true
     		}
     	}

合併憑證


sh 'echo hello' /* short form */

使用程式碼段生成器,您可以withCredentials( … ) { … }通過執行以下操作在一個步驟中提供多個憑據:

  1. 在Jenkins主頁(即Jenkins經典UI的儀表板)中,單擊您的Pipeline專案/專案的名稱。
  2. 在左側,單擊“ 管道語法”,並確保“ 程式碼段生成器” 連結在左上角為粗體。(如果沒有,請單擊其連結。)
  3. 在“ 樣本步驟”欄位中,選擇withCredentials:將憑證繫結到變數
  4. 單擊繫結下的新增
  5. withCredentials( … ) { … }從下拉列表中選擇要新增到步驟的憑據型別。
  6. 指定憑證繫結詳細資訊。在以上針對其他憑證型別的過程中,詳細瞭解 上述內容。
  7. 對每個(一組)憑據重複單擊``單擊新增 ...''(上方)以新增到withCredentials( … ) { … }步驟。
  8. 單擊生成管道指令碼以生成最後 withCredentials( … ) { … }一步程式碼段。

使用引數

宣告性管道支援現成的引數,允許管道在執行時通過parameters指令接受使用者指定的引數。通過指令碼管道配置引數是通過以下properties步驟完成的,可以在程式碼片段生成器中找到該步驟。

如果使用Build with Parameters選項將管道配置為接受引數,則可以將這些引數作為params 變數的成員進行訪問。

假設已在中配置了名為“ Greeting”的String引數 Jenkinsfile,則可以通過${params.Greeting}以下方式訪問該引數:

Jenkinsfile(宣告性管道)

pipeline {
    agent any
    parameters {
        string(name: 'Greeting', defaultValue: 'Hello', description: 'How should I greet the world?')
    }
    stages {
        stage('Example') {
            steps {
                echo "${params.Greeting} World!"
            }
        }
    }
}

失敗處理

在滿足條件下觸發操作,條件如下:

  • always: 無論pipeline或者stage的執行結果如何,此塊中的預置操作都會執行。

  • changed:只有當pipeline或者stage的執行後,當前狀態與之前發生了改變時,此塊中的預置操作才會執行。

  • fixed:前一次執行為不穩定狀態或者失敗狀態,而且本次執行成功結束,這兩個條件同時滿足時,此塊中的預置操作才會執行。

  • regression: 本次執行狀態為不穩定狀態,失敗狀態或者是中止狀態,而且前一次執行成功結束,這兩個條件同時滿足時,此塊中的預置操作才會執行。

  • aborted:當前pipeline或者stage的狀態為aborted時,此塊中的預置操作才會執行。通常是由於流水線被手工中會導致此狀態產生,而產生此狀態後,通常在Jenkins的UI介面會顯示為灰色。

  • failure:當前pipeline或者stage的狀態為failed時,此塊中的預置操作才會執行。而產生此狀態後,通常在Jenkins的UI介面會顯示為紅色。

  • success:當前pipeline或者stage的狀態為success時,此塊中的預置操作才會執行。而產生此狀態後,通常在Jenkins的UI介面會顯示為綠色。

  • unstable: 當前pipeline或者stage的狀態為unstable時,此塊中的預置操作才會執行。通常情況下測試失敗或者程式碼規約的違反都會導致此狀態產生,而產生此狀態後,通常在Jenkins的UI介面會顯示為黃色。

  • unsuccessful:當前pipeline或者stage的狀態不是success時,此塊中的預置操作才會執行。

  • cleanup:無論pipeline或者stage的狀態為何種狀態,在post中的其他的條件預置操作執行之後,此塊中的預置操作就會執行。

Jenkinsfile(宣告性管道)

pipeline {
    agent any
    stages {
        stage('Test') {
            steps {
                sh 'make check'
            }
        }
    }
    post {
        always {
            junit '**/target/*.xml'
        }
        failure {
            mail to: [email protected], subject: 'The Pipeline failed :('
        }
    }
}

使用多個代理

agent lable可以使用不同的jenkins代理來執行構建,多用在跨平臺的測試。如下:

構建結果將在“測試”階段期間在兩個後續代理(分別標記為“ linux”和“ windows”)上重用。

Jenkinsfile(宣告性管道)

pipeline {
    agent none
    stages {
        stage('Build') {
            agent any
            steps {
                checkout scm
                sh 'make'
                stash includes: '**/target/*.jar', name: 'app' 
            }
        }
        stage('Test on Linux') {
            agent { 
                label 'linux'
            }
            steps {
                unstash 'app' 
                sh 'make check'
            }
            post {
                always {
                    junit '**/target/*.xml'
                }
            }
        }
        stage('Test on Windows') {
            agent {
                label 'windows'
            }
            steps {
                unstash 'app'
                bat 'make check' 
            }
            post {
                always {
                    junit '**/target/*.xml'
                }
            }
        }
    }
}

並行執行

使用parallel可以在不同的代理商同時執行某項任務,和lable的區別在於,lable是線性的,比如完成一項測試需要30MIN分別在windows上執行和linux上執行需要60M。使用parallel可以同時在兩個代理上執行測試。

Jenkinsfile(指令碼管道)

stage('Build') {
    /* .. snip .. */
}

stage('Test') {
    parallel linux: {
        node('linux') {
            checkout scm
            try {
                unstash 'app'
                sh 'make check'
            }
            finally {
                junit '**/target/*.xml'
            }
        }
    },
    windows: {
        node('windows') {
            /* .. snip .. */
        }
    }
}

簡寫

管道遵循Groovy語言約定,允許在方法引數周圍省略括號。語法[key1: value1, key2: value2]

git([url: 'git://example.com/amazing-project.git', branch: 'master'])
簡寫 git url: 'git://example.com/amazing-project.git', branch: 'master'

為方便起見,當呼叫僅採用一個引數(或僅採用一個強制性引數)的步驟時,可以省略引數名稱,例如

sh 'echo hello' /* short form  */
sh([script: 'echo hello'])  /* long form */