[Jenkins] Slack Slash Command로 원격 빌드 유발 with AWS API Gateway, Lambda(Python)

이아영·2021년 3월 25일
0

Jenkins

목록 보기
2/4
post-custom-banner

이전 글에서 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 CredentialsVerification 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>

결과

post-custom-banner

0개의 댓글