一.簡介
執行imput步驟會暫停pipeline,直到用戶輸入參數。這是一種特殊的參數化pipeline的方法。
我們可以利用input步驟實現以下兩種場景:
1.實現簡易的審批流程。例如,pipeline暫停在部署前的階段,由負責人點擊確認后,才能部署。
2.實現手動測試階段。在pipeline中增加一個手動測試階段,該階段中只有一個input步驟,當手動測試通過后,測試人員才可以通過這個unput步驟
在Jenkinsfile中加入input步驟
steps {
input message:"發布或者停止"
}
若只有message參數,則 input"發布或停止",需要點擊按鈕,才可以繼續。
不管是哪個選項,日志都會記錄是誰操作的,對審計很友好
二.input步驟復雜用法
//變量名,用於存儲input步驟的返回值
def approvalMap
pipeline {
agent any
stages {
stage('pre deploy') {
steps {
script {
approvalMap = input(
message: '准備發布到哪個環境?',
ok:'確定',
parameters: [
choice(choices:'dev\ntest\nprod', description:'發布到什么環境?', name:'ENV'),
string(defaultValue:'', description:'', name:'myparam')
],
submitter:'admin,admin2,releaseGroup',
submutterParameter:'APPROVER'
)
}
}
}
stage('deploy') {
steps {
echo "操作者是 ${approvalMap['APPROVER']}"
echo "發布到什么環境? ${approvalMap['ENV']}"
echo "自定義參數: ${approvalMap['myparam']}"
}
}
}
}
在pipeline外定義了一個變量approvalMap。這是因為定義在階段內的變量的作用域只在這個階段中,而input步驟的返回值需要跨階段使用,所以需要將其定義在pipeline外。
同時,由於在pipeline中直接使用了Groovy語法賦值表達式,所以需要將approvalMap=input(..) 放到script塊中。
input步驟的返回值類型取決於要返回的值的個數。如果只有一個值,返回值類型就是這個值的類型。如果有多個值,返回值類型為Map類型。本實例返回的approvalMap就是一個map。Map的key就是每個參數的name屬性,比如EVN,myparam都是key。
除了可以在返回的map中放手動輸入的值,還可以放其他數據,比如submintterParameter:'APPROVER'代表將key APPROVER放到返回的map中。
步驟的參數:
- message: input步驟的提示信息
- submitter(可選) 字符串類型,可以進行操作的用戶ID或用戶組名,使用逗號分隔,在逗號左右不允許有空格。者在做input步驟的權限控制方面很實用。
- submitterParameter(可選):字符串類型,保存input步驟的實際操作者的用戶名的變量名。
- ok(可選):自定義確定按鈕的文本。
- parameters(可選):手動輸入的參數列表。
- parameters指令支持的參數類型,input步驟都支持,寫法一樣
approvalMap還有一種定義方式,放在environment中。這樣不需要定義頂部變量了。
environment {
approvalMap = ''
}
三.獲取上游pipeline信息
上游pipeline觸發下游pipeline時,並沒有自動帶上自身的信息。所以,當下游pipeline需要使用上游pipeline的信息時,上游pipeline信息就要以參數的方式傳給下游pipeline。比如在上游pipeline中調用下游pipeline時,可以采用以下做法。
build job: 'all-in-one-deploy', parameters: [
string(name:'DEPLOY_ENV', value: "${deploy_env}"),
string(name:'triggerJobName', value:"${env.JOB_NAME}"),
string(name:'triggerJobBuildNumber', value:"${env.BUILD_NUMBER}")
]
四.超時中止
input步驟可以與timeout步驟實現超時自動中止pipeline,防止無限等待。以下pipeline一小時不處理就自動終止
steps{
timeout(time:1,unit:'HOURS') {
inout message:"發布或停止"
}
}