[Jenkins] pipeline interactive input (choice parameter)

14324 ワード

Jenkins input stepを使用してPipelineを構成し、構築中にユーザー入力を受信します.
Pipeline input step : https://www.jenkins.io/doc/pipeline/steps/pipeline-input-step/
input(
    id: 'wait-approval',
    message: 'Approve?',
    submitterParameter: 'approver',
    parameters: [
    	choice(
        	choices: ['Cancel', 'Deploy'],
            description: 'Are you sure?',
            name: 'choice'
        )
    ]
)
Input stepを上記の手順に記述すると、Job buildを行うと、構築中に次のような入力ウィンドウが表示されます.

配管全体を見ると、以下のようになります.
pipeline {
    agent any
    stages {
        stage('Approval') {
            steps {
                script {
                    try {
                        def approval = input(
                            id: 'wait-approval'
                            message: 'Approve?',
                            submitterParameter: 'approver',
                            parameters: [choice(choices: ['Cancel', 'Deploy'],description: 'Are you sure?',name: 'choice')]
			)
    		        if (approval['approver'] != "${administrator}") {
    		            throw new Exception('You do not have permission.')
    		        }
                    
                        if (approval['choice'] == 'Deploy') {
    		            print('choice deploy')
    		            currentBuild.result = 'Success'
    		        } else {
    		            throw new Exception('Choosed cancel')
  	                }
                    } catch(Exception e) {
                        error e
                        currentBuild.result = 'Fail'
                    }   
                } 
            }
        }
    }
}
Deployを選択し、Proceedボタンを押してこそ、次のステップに進むことができます.AbortまたはCancelを押すと、パイプは終了します.
Jenkins API Tokenを設定すると、以下のコマンドでinput stepに答えることもできます.
curl -d "token=<Token_이름>" -d json='{"parameter": {"name": "choice", "value": "Deploy"}}' -d proceed='Yes' -X POST http://<Jenkins_Username>:<Token_값>@<Jenkins_URL>/job/<Job_Name>/<Build_Number>/input/<Input_ID>/submit
ここには少し注意が必要です.(これで時間がもったいない…)
私が書いたpipeline scriptを見ると、inputにはid: 'wait-approval'が入っています.このidはInput_IDで、apiを要求するときは最初の字を大文字に変更します.私がwait-approvalと書いていても、このように要求してこそ正常に出てくることができます..../input/Wait-approval/submitが要求されると、.../input/wait-approval/submitが返却される.
$ curl -d "token=from_lambda" -d json='{"parameter": {"name": "choice", "value": "Deploy"}}' -d proceed='Yes' -X POST http://jenkins:[email protected]/job/slack-integration/2/input/wait-approval/submit
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Error 404 Not Found</title>
</head>
<body><h2>HTTP ERROR 404 Not Found</h2>
<table>
<tr><th>URI:</th><td>/job/slack-integration/2/input/wait-approval/submit</td></tr>
<tr><th>STATUS:</th><td>404</td></tr>
<tr><th>MESSAGE:</th><td>Not Found</td></tr>
<tr><th>SERVLET:</th><td>Stapler</td></tr>
</table>
<hr><a href="https://eclipse.org/jetty">Powered by Jetty:// 9.4.33.v20201020</a><hr/>

</body>
</html>
404 Not Foundwait-approvalに変換すると、要求が正常に完了します.
$ curl -d "token=from_lambda" -d json='{"parameter": {"name": "choice", "value": "Deploy"}}' -d proceed='Yes' -X POST http://jenkins:[email protected]/job/slack-integration/2/input/Wait-approval/submit
注意:https://issues.jenkins.io/browse/JENKINS-34509