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
감사합니다! 찾고 있던 정보였어요!