이전 글에서 Jenkins를 원격으로 빌드하기 위한 세팅을 하고 cURL 명령어와 Python 코드로 원격 빌드를 실행해 보았다.
이 글은 이전 글과 이어지는 내용이므로 보고 오는 것을 추천한다.
이전 글에서 작성했던 Lambda 함수 코드를 다음과 같이 수정해준다.
(Lambda 함수명 : jenkins-remote-build)
import json
import requests
from requests.auth import HTTPBasicAuth
import logging
import os
# logger setting
logger = logging.getLogger()
logger.setLevel(logging.INFO)
JENKINS_USER_NAME = os.environ['JENKINS_USER_NAME']
JENKINS_API_TOKEN = os.environ['JENKINS_API_TOKEN']
JENKINS_URL = os.environ['JENKINS_URL']
JOB_NAME = os.environ['JOB_NAME']
TOKEN_NAME = os.environ['TOKEN_NAME']
SLACK_VERIFICATION_TOKEN = os.environ['SLACK_VERIFICATION_TOKEN']
def lambda_handler(event, context):
logger.info(json.dumps(event))
if event['token'] != SLACK_VERIFICATION_TOKEN:
return {
'statusCode': 401,
'result': 'Invalid Token'
}
URL = 'http://'+JENKINS_URL+'/job/'+event['text']+'/build'
response = requests.post(URL, params={'token': TOKEN_NAME}, auth=HTTPBasicAuth(JENKINS_USER_NAME, JENKINS_API_TOKEN))
logger.info(response)
return {
'statusCode': response.status_code,
}
SLACK_VERIFICATION_TOKEN
은 Slack 콘솔에서Basic Information
탭에 있는App Credentials
의Verification Token
을 말한다.
이제 AWS API Gateway 콘솔에서 API 생성
을 클릭하고 REST API
구축을 선택한다.
작업
에서 리소스 생성
및 메소드 생성
을 다음과 같이 해준다.
Lambda 함수는 앞에서 코드를 수정했던 jenkins-remote-build
를 선택하고 저장한다.
/jenkins-build
->POST
->통합 요청
에 들어가면 아래쪽에 매핑 템플릿
항목이 있다. 이 부분을 다음과 같이 세팅해주면 된다.
매핑 템플릿 코드: https://gist.github.com/sjoonk/20ae13e5cd8be88e9824e3bad11b2859
매핑 템플릿을 세팅하는 이유는 slash command
를 실행하면 Slack이 x-www-form-urlencoded
형식(key1=value1&key2=value2
)으로 데이터를 넘겨주는데
매핑 템플릿에 세팅한 코드가 이를 json
형식으로 변환해준다. 따라서 Lambda(jenkins-remote-build
)는 아래와 같은 데이터를 받게 된다.
{
"token": "3OaoCK000rXv0000000cOqN1",
"team_id": "T01FNCJFLFM",
"team_domain": "study-srq5704",
"channel_id": "C01M8S3ML82",
"channel_name": "deploy-dev",
"user_id": "U*******",
"user_name": "ayl*****",
"command": "/build",
"text": "test",
"api_app_id": "A01S*******",
"is_enterprise_install": "false",
"response_url": "https://hooks.slack.com/commands/T000000LFM/18890000098/VPas9DeS6GuoZZFXI0000000",
"trigger_id": "1896754648403.1532426530531.9d000000000000000fdb00acf4882316fe"
}
Preparing your app to receive Commands(Slack API Docs): https://api.slack.com/interactivity/slash-commands#app_command_handling
매핑 템플릿을 저장하고 작업
에서 API 배포
를 클릭한다.
스테이지를 생성하고 나면 다음과 같이 호출 URL이 나온다. Slack의 Slash Command
를 만들 때 이 URL이 필요하다.
이제 Slack에서 Slash Command를 세팅해보자.
https://api.slack.com 에서 새로운 APP 을 만들고 Slash Commands 탭으로 들어간다. (나는 APP 이름을 slash-command
로 했다.)
Create New Command
를 클릭한다.
여기서 Request URL
에 API Gateway의 호출 URL을 넣어주면 된다. 주의해야할 점은 우리가 POST 메소드를 루트(/
)에 세팅하지 않았으니 URL 뒤에 /jenkins-build
를 추가해 주어야한다.
(Request URL
은 <호출 URL>/jenkins-build
)
이렇게 세팅을 하면 Slack에서 /build
라는 명령어를 입력하면 Slack이 Request URL
로 POST 요청을 보내게 된다.
저장해주고 Basic Information
탭으로 와서 Install to Workspace
를 해준다.
Install이 완료되면 이제 Slack에서 /build
명령을 사용할 수 있다.
명령 실행 : /build <Jenkins_Job_Name>
결과