Jenkins Pipeline語法(中)

Jenkins Pipeline語法(上)
Jenkins Pipeline語法(中)
Jenkins Pipeline語法(下)

指令 Directives

環(huán)境 environment

environment指令指定一系列鍵值對,這些鍵值對將被定義為所有step或特定stage的step的環(huán)境變量,具體取決于environment指令位于Pipeline中的位置。

該指令支持一種特殊的助手方法credentials(),可以通過Jenkins環(huán)境中的標識符來訪問預定義的憑據(jù)。對于類型為“Secret Text”的憑據(jù),該 credentials()方法將確保環(huán)境變量中包含該Secret Text內容。對于“標準用戶名和密碼”類型的憑證,指定的環(huán)境變量將被設置為username:password并且將自動定義兩個附加的環(huán)境變量:MYVARNAME_USRMYVARNAME_PSW

是否必填
參數(shù) 沒有
允許出現(xiàn)在 pipeline塊內或stage
例如:
Jenkinsfile (Declarative Pipeline)
pipeline {
    agent any
    environment { 
        CC = 'clang'
    }
    stages {
        stage('Example') {
            environment { 
                AN_ACCESS_KEY = credentials('my-prefined-secret-text') 
            }
            steps {
                sh 'printenv'
            }
        }
    }
}
  1. environment頂級pipeline塊中使用的指令將適用于Pipeline中的所有步驟
  2. 在一個stage中定義的environment指令只將給定的環(huán)境變量應用于該stage中的步驟
  3. environment具有一個幫助方法credentials(),可用于在Jenkins環(huán)境中通過其標識符訪問預定義的憑據(jù)

選項 options

options指令允許在Pipeline內配置Pipeline專用選項。Pipeline提供了許多這些選項,例如buildDiscarder,但它們也可能由插件提供,例如 timestamps。

是否必填
參數(shù) 沒有
允許出現(xiàn)在 pipeline塊內,只有一次

可用選項

  • buildDiscarder

    持久化工件和控制臺輸出,用于保存Pipeline最近幾次運行的數(shù)據(jù)。例如:options { buildDiscarder(logRotator(numToKeepStr: '1')) }

  • checkoutToSubdirectory

    在工作區(qū)的子目錄中執(zhí)行源代碼檢出。例如:options { checkoutToSubdirectory('foo') }

  • disableConcurrentBuilds

    不允許并行執(zhí)行Pipeline??捎糜诜乐雇瑫r訪問共享資源等。例如:options { disableConcurrentBuilds() }

  • preserveStashes

    保留已完成構建的存儲,用于stage重新啟動。例如:options { preserveStashes() }保存最近完成的構建中的stash,或者options { preserveStashes(5) }保留最近五個完成的構建中的stash。

  • quietPeriod

    設置管道的靜默期(以秒為單位),覆蓋全局默認值。例如:options { quietPeriod(30) }

  • retry

    如果失敗,請按指定的次數(shù)重試整個管道。例如:options { retry(3) }

  • skipDefaultCheckout

    agent指令中默認跳過源代碼檢出。例如:options { skipDefaultCheckout() }

  • skipStagesAfterUnstable

    一旦構建狀態(tài)進入了“不穩(wěn)定”狀態(tài),就跳過stage。例如:options { skipStagesAfterUnstable() }

  • timeout

    設置Pipeline運行的超時時間,之后Jenkins應該中止Pipeline。例如:options { timeout(time: 1, unit: 'HOURS') }

  • timestamps

    當執(zhí)行時,預處理由Pipeline生成的所有控制臺輸出運行時間。例如:options { timestamps() }

例如:
Jenkinsfile (Declarative Pipeline)
pipeline {
    agent any
    options {
        timeout(time: 1, unit: 'HOURS') 
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

指定一個小時的全局執(zhí)行超時,之后Jenkins將中止Pipeline運行。

stage選項

stageoptions指令類似于Pipeline根目錄中的options指令。但是,stageoptions只能包含與stage相關的步驟,如retrytimeouttimestamps,或聲明性選項,如skipDefaultCheckout。

stage內,options在進入agent或檢查任何when條件之前調用指令中的步驟。

可用的stage選項
  • skipDefaultCheckout

    默認情況下,在agent指令中跳過檢查源代碼管理中的代碼。例如:options { skipDefaultCheckout() }

  • timeout

    設置此stage的超時時間,之后Jenkins應該中止該stage。例如:options { timeout(time: 1, unit: 'HOURS') }

  • retry

    如果失敗,請重試此stage指定次數(shù)。例如:options { retry(3) }

  • timestamps

    當執(zhí)行時,預處理由Pipeline生成的所有控制臺輸出運行時間。例如:options { timestamps() }

Jenkinsfile(聲明性管道)

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

為stageExample指定一小時的執(zhí)行超時,之后Jenkins將中止Pipeline運行。

參數(shù) parameters

parameters指令提供用戶在觸發(fā)Pipeline時應提供的參數(shù)列表。這些用戶指定的參數(shù)的值通過該params對象可用于Pipeline步驟,具體用法見示例。

是否必填
參數(shù) 沒有
允許出現(xiàn)在 pipeline塊內,只有一次
可用參數(shù)
  • string

    字符串類型的參數(shù),例如: parameters { string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '') }

  • 文本

    一個text參數(shù),可以包含多行,例如: parameters { text(name: 'DEPLOY_TEXT', defaultValue: 'One\nTwo\nThree\n', description: '') }

  • booleanParam

    一個布爾參數(shù),例如: parameters { booleanParam(name: 'DEBUG_BUILD', defaultValue: true, description: '') }

  • choice

    選擇參數(shù),例如: parameters { choice(name: 'CHOICES', choices: ['one', 'two', 'three'], description: '') }

  • file

    一個文件參數(shù),指定用戶在計劃構建時要提交的文件,例如: parameters { file(name: 'FILE', description: 'Some file to upload') }

  • password

    密碼參數(shù),例如: parameters { password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'A secret password') }

例如:
Jenkinsfile (Declarative Pipeline)
pipeline {
    agent any
    parameters {
        string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')

        text(name: 'BIOGRAPHY', defaultValue: '', description: 'Enter some information about the person')

        booleanParam(name: 'TOGGLE', defaultValue: true, description: 'Toggle this value')

        choice(name: 'CHOICE', choices: ['One', 'Two', 'Three'], description: 'Pick something')

        password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'Enter a password')

        file(name: "FILE", description: "Choose a file to upload")
    }
    stages {
        stage('Example') {
            steps {
                echo "Hello ${params.PERSON}"

                echo "Biography: ${params.BIOGRAPHY}"

                echo "Toggle: ${params.TOGGLE}"

                echo "Choice: ${params.CHOICE}"

                echo "Password: ${params.PASSWORD}"
            }
        }
    }
}

觸發(fā)器 triggers

triggers指令定義了Pipeline應重新觸發(fā)的自動化方式。對于與源代碼集成的Pipeline,如GitHub或BitBucket,triggers可能不需要基于webhook的集成可能已經(jīng)存在。目前只有兩個可用的觸發(fā)器是cron和pollSCM。

需要 沒有
參數(shù) 沒有
允許 只有一次,在pipeline塊內。
  • cron

    接受一個cron風格的字符串來定義Pipeline應重新觸發(fā)的常規(guī)間隔,例如: triggers { cron('H 4/* 0 0 1-5') }

  • pollSCM

    接受一個cron風格的字符串來定義Jenkins應該檢查新的源更改的常規(guī)間隔。如果存在新的更改,則Pipeline將被重新觸發(fā)。例如:triggers { pollSCM('H 4/* 0 0 1-5') }

該pollSCM觸發(fā)器僅在Jenkins 2.22或更高版本可用

例如:

Jenkinsfile (Declarative Pipeline)
pipeline {
    agent any
    triggers {
        cron('H 4/* 0 0 1-5')
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

Jenkins cron 語法

Jenkins cron語法遵循cron實用程序的語法 (略有不同)。具體來說,每行包含由TAB或空格分隔的5個字段:

分鐘 小時 DOM DOW
一小時內的分鐘數(shù)(0-59) 一天中的小時(0-23) 每月的某一天(1-31)</ td> 月(1-12) 星期幾(0-7),其中0和7是星期日。

要為一個字段指定多個值,可以使用以下運算符。按優(yōu)先順序排列,

  • * 指定所有有效值
  • M-N 指定一系列值
  • M-N/X或者按照指定范圍或整個有效范圍的*/X間隔步長X
  • A,B,…,Z 枚舉多個值

為了允許定期計劃的任務在系統(tǒng)上產(chǎn)生均勻負載,應盡可能使用符號H(“哈?!保@?,使用0 0 * * *十幾個日常工作將導致午夜大量飆升。相比之下,使用H H * * *仍然會每天執(zhí)行一次,但不能同時執(zhí)行,更好地使用有限的資源。

所述H符號可以與范圍內使用。例如,H H(0-7) * * * 表示從凌晨12:00(午夜)到早上7:59之間的某個時間段。您也可以使用H帶有或不帶范圍的步長間隔。

H符號可以被認為是在一定范圍內的隨機值,但它實際上是作業(yè)名稱的hash值,而不是隨機函數(shù)的哈希值,所以對于給定的項目該值仍然是穩(wěn)定的。

請注意,對于月份日期字段,由于月份長度可變,短期周期(例如/3H/3)將不會在大多數(shù)月份結束時始終如一地工作)。例如,/3 將在第1st, 4th, …31st 天運行, 然后在下個月的第一天運行。 哈??偸窃?-28的范圍內運行, 所以 H/3在一個月末將產(chǎn)生3到6天的空隙。(更長的周期也會有不一致的長度,但效果可能相對不太明顯。)

#開頭的行和空行將被當做注釋忽略。

此外,還有如下方便的別名:@yearly@annually,@monthly@weekly@daily,@midnight,和@hourly。這些使用哈希系統(tǒng)進行自動平衡。例如,@hourlyH * * * *都意味著在一小時內的任何時間。 @midnight實際上意味著在凌晨12:00到凌晨2:59之間的某個時間。

每十五分鐘(也許在:07,:22,:37,:52)

triggers{ cron('H/15 * * * *') }

每小時上半場每十分鐘一次(三次,也許在:04,:14,:24)

triggers{ H(0-29)/10 * * * *) }

從上午9:45開始每小時45分鐘一次,每個工作日下午3:45結束。

triggers{ 45 9-16/2 * * 1-5) }

每個工作日上午9點到下午5點之間每兩小時一次(可能在上午10:38,下午12點38分,下午2點38分,下午4點38分)

triggers{ H H(9-16)/2 * * 1-5) }

除了12月之外,每個月的1日和15日每天一次

triggers{ H H 1,15 1-11 *) }

階段 stage

stage指令在stages部分中,應包含步驟部分,可選agent部分或其他特定于stage的指令。實際上,Pipeline完成的所有實際工作都將包含在一個或多個stage指令中。

是否必填 至少一個
參數(shù) 一個必填參數(shù),一個用于stage名稱的字符串
允許出現(xiàn)在 stages
例如:
Jenkinsfile (Declarative Pipeline)
pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

工具 tools

定義自動安裝和放置工具的部分PATH。如果指定agent none,這將被忽略。

是否必填
參數(shù) 沒有
允許出現(xiàn)在 pipeline塊或stage塊內
支持的工具
  • maven
  • jdk
  • gradle

例如:

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

工具名稱必須在Jenkins 管理Jenkins → 全局工具配置中預置。

輸入 input

stageinput指令允許您使用input步驟提示輸入 。在進入stageagent或評估其when狀態(tài)之前,stage將處于暫停狀態(tài)。如果input 獲得批準,stage則將繼續(xù)。作為input提供的任何參數(shù)將在stage的剩下部分的環(huán)境中可用 。

配置選項
  • message

    必填。這將在用戶提交input時呈現(xiàn)給用戶。

  • id

    這是一個可選的標識符input。默認為stage名稱。

  • ok

    input表單上“ok”按鈕的可選文本。

  • submitter

    允許提交此input選項的用戶或外部組名列表,用逗號分隔。默認允許任何用戶。

  • submitterParameter

    要使用submitter名稱設置的環(huán)境變量的名稱,可選(如果存在)。

  • parameters

    用于提示提供的可選參數(shù)列表。有關更多信息,請參閱參數(shù)

Jenkinsfile (Declarative Pipeline)
pipeline {
    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."
            }
        }
    }
}

條件 when

when指令允許Pipeline根據(jù)給定的條件確定是否執(zhí)行該stage。when指令必須至少包含一個條件。如果when指令包含多個條件,則所有子條件必須都返回true,stage將會執(zhí)行。這與子條件嵌套在一個allOf條件中相同(見下面的例子)。

更復雜的條件結構可使用嵌套條件建:not,allOfanyOf。嵌套條件可以嵌套到任意深度。

是否必填
參數(shù) 沒有
允許出現(xiàn)在 stage指令內
內置條件
  • branch

    當正在構建的分支與給出的分支模式匹配時執(zhí)行stage,例如:when { branch 'master' }。請注意,這僅適用于多分支Pipeline。

  • environment

    當指定的環(huán)境變量設置為給定值時執(zhí)行stage,例如: when { environment name: 'DEPLOY_TO', value: 'production' }

  • expression

    當指定的Groovy表達式求值為true時執(zhí)行stage,例如: when { expression { return params.DEBUG_BUILD } }

  • not

    當嵌套條件為false時執(zhí)行stage。必須包含一個條件。例如:when { not { branch 'master' } }

  • allOf

    當所有嵌套條件都為真時,執(zhí)行舞臺。必須至少包含一個條件。例如:when { allOf { branch 'master'; environment name: 'DEPLOY_TO', value: 'production' } }

  • anyOf

    當至少一個嵌套條件為真時執(zhí)行舞臺。必須至少包含一個條件。例如:when { anyOf { branch 'master'; branch 'staging' } }

例如:
Jenkinsfile (Declarative Pipeline)
pipeline {
    agent any
    stages {
        stage('Example Build') {
            steps {
                echo 'Hello World'
            }
        }
        stage('Example Deploy') {
            when {
                branch 'production'
            }
            steps {
                echo 'Deploying'
            }
        }
    }
}
Jenkinsfile (Declarative Pipeline)
pipeline {
    agent any
    stages {
        stage('Example Build') {
            steps {
                echo 'Hello World'
            }
        }
        stage('Example Deploy') {
            when {
                branch 'production'
                environment name: 'DEPLOY_TO', value: 'production'
            }
            steps {
                echo 'Deploying'
            }
        }
    }
}
Jenkinsfile (Declarative Pipeline)
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'
            }
        }
    }
}
Jenkinsfile (Declarative Pipeline)
pipeline {
    agent any
    stages {
        stage('Example Build') {
            steps {
                echo 'Hello World'
            }
        }
        stage('Example Deploy') {
            when {
                branch 'production'
                anyOf {
                    environment name: 'DEPLOY_TO', value: 'production'
                    environment name: 'DEPLOY_TO', value: 'staging'
                }
            }
            steps {
                echo 'Deploying'
            }
        }
    }
}
Jenkinsfile (Declarative Pipeline)
pipeline {
    agent any
    stages {
        stage('Example Build') {
            steps {
                echo 'Hello World'
            }
        }
        stage('Example Deploy') {
            when {
                expression { BRANCH_NAME ==~ /(production|staging)/ }
                anyOf {
                    environment name: 'DEPLOY_TO', value: 'production'
                    environment name: 'DEPLOY_TO', value: 'staging'
                }
            }
            steps {
                echo 'Deploying'
            }
        }
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容