[Jenkins] pipeline interactive input (choice parameter)

이아영·2021년 3월 25일
0

Jenkins

목록 보기
3/4

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을 보면 다음과 같다.

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을 선택하면 pipeline은 끝난다.

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 이렇게 요청하면 404 Not Found가 반환된다.

$ curl -d "token=from_lambda" -d json='{"parameter": {"name": "choice", "value": "Deploy"}}' -d proceed='Yes' -X POST http://jenkins:11900000000000cee0a46a4f1fd6800087@jenkins.aylee.com/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>

wait-approval을 아래처럼 Wait-approval로 바꿔주면 정상적으로 요청이 완료된다.

$ curl -d "token=from_lambda" -d json='{"parameter": {"name": "choice", "value": "Deploy"}}' -d proceed='Yes' -X POST http://jenkins:11900000000000cee0a46a4f1fd6800087@jenkins.aylee.com/job/slack-integration/2/input/Wait-approval/submit

참고: https://issues.jenkins.io/browse/JENKINS-34509

1개의 댓글

comment-user-thumbnail
2021년 12월 1일

감사합니다! 찾고 있던 정보였어요!

답글 달기