[Slack] Github Webhook을 이용한 슬랙 PR 자동 Mention

박상원·2022년 4월 24일
3

Git

목록 보기
1/2

Github을 사용하면서 팀원에게 Pull Request 를 할 때, PR 올렸다고 매번 알려주기가 귀찮다. 이것마저 리소스 낭비인것. 개발자는 자동화에 목숨을 걸지 않습니까. 슬랙을 이용해 PR 을 알리기 위해 몇가지 방법을 생각했습니다.

우선 기본적으로 Slack 에 Application으로 제공되는 GitHub App 이 존재합니다. 이방식으로 쉽게 PR 을 요청할 수 있습니다!

/github subscribe {org}/{repo} {feature}

이 앱을 사용하면 원하는 PR이라던지, 이슈, 리뷰, 코멘트까지 구독이 가능합니다!

얼마나 편한가요? 구독하기도 쉽고 하지만...

알림은가는데 수많은 팀원이 쓰는 채널에서 내껀지 너껀지 누구껀지 알아보기도 귀찮고, 알림도 매번옵니다.

저는 멘션기능을 원했습니다.

@로버트 식으로 누군가에게 알림을 울리게하여 내껀지 확실하게 구분해주기 위함이었습니다.

그래서 구현하려는 기능을 GitHub의 Webhook을 사용하여 알림을 보내는 것입니다.

우선 이 Pull Request 알람에 사용된 옵스는

Github Webhook, AWS API Gateway, AWS Lambda, Incoming Webhook, Slack 입니다!

나열한 순서대로 로직이 실행될 겁니다.

UML 으로 쉽게 보겠습니다.


1. Github에서 PR 이 발생합니다

2. Webhook을 걸어 API Gateway로 POST 요청을 합니다

3. API Gateway는 연결된 Lambda 로 함수를 실행시킵니다.

4. Lamda는 Incoming Webhook의 Url 로 payload 를 만들어 PR 알림메세지를 전송합니다.

5. Incoming webhook은 연결된 Slack CH 로 알림을 전송합니다

순서대로 하면 좋겠지만 시퀀스의 역순으로 작업해야 필요한 데이터를 적용할 수 있습니다.

슬랙 Incoming Webhook 연결

먼저 슬랙에서 Incoming webhook 을 설치하고 해당 채널에 연결합니다.



원하는 채널에 생성을 하고 나면 Webhook URL 가 생성됩니다! 이 키는 우리가 http 통신을 통해 해당 채널에 메세지를 보내는 용도로 사용됩니다.

테스트 방법도 같이 있으니 테스트를 통해 샘플메세지를 직접 채널에 전송해보시면 됩니다.

Lambda 생성하기

람다는 실질적인 처리를 하는 함수로 사용합니다. 사용하시는 언어에 맞춰 함수를 구현합니다.

로직은 간단합니다.

option을 Incoming Webhook 에서 제공해주는 폼에 맞춰 데이터를 만들어줍니다. 아래는 가장 기본 폼으로 사용했습니다.

전체적은 구조는 알려드리지 못하지만 가장 기본 구조는 아래와 같습니다.

HTTP 요청은 POST 메소드를 사용하여야 합니다.

const SLACK_CH_URI = 'https://hooks.slack.com/services/{- 생략 -}/{- 생략 -}';
const send_option = {
        headers: {"Content-Type": "application/json"},
        method: 'POST',
        url: SLACK_CH_URI,
        body: {
            "blocks": [
                {
                    "type": "section",
                    "text": {
                        "type": "mrkdwn",
                        "text": slackMessage
                    },
                }
            ]
        },
        json: true,
    };
    
const request.post(option)

메세지는 Github Pull Request 로부터 생성되는 Payload 를 받습니다.

payload의 기본구조는 아래와 비슷합니다. 직접 호출하여 payload 를 확인하시면 이해가 빠릅니다.

payload {
  action: 'opened',
  number: 384,
  pull_request: {
    url: 'https://api.github.com/repos/',
    ...
    user: {
      login: 'parksangwon0610',
      ... 
      type: 'User',
      site_admin: false
    },
...

저는 이 기능을 구현하려는 이유가 멘션의 기능을 사용하기위함입니다.

멘션하는 방법은 사용자 slack id를 <@slack_id> 처럼 템플릿 내 포함해주면 @member_name 한 것처럼 사용자에게 멘션을 보낼 수 있습니다.

그래서 필요한 부분은 github id 와 slack id 를 미리 설정해야합니다.

Map 구조를 하셔도 상관없고, object { github_id: '깃헙사용자1', slack_id: '슬랙사용자1'} 배열로 미리 매퍼를 만들어 둬야합니다.

원하시는 방법을 사용하시어 깃헙사용자 아이디를 통해 슬랙 아이디를 알아두기만 하면 됩니다.

const slack_msg = 'pr to <@${slack_id}>'

API Gateway 를 사용하여 람다 호출

lambda를 그냥 실행할 수 없으니 gateway를 지정해줍니다.

API 를 생성하고, POST 리소스를 하나 생성합니다. 저는 end-point 를 /pull-request 로 하겠습니다.


람다를 연결해주고 테스트까지 합니다. 연결이 잘된다면,

API 를 배포하여 사용할 수 있는 URL 할당하여 줍니다.

사용자지정 도메인은 사용하지않을 것이니 생성된 URL 을 사용합니다.

https://sample1234.execute-api.ap-northeast-2.amazonaws.com/prod/pull-request

위와 같은 URI 를 복사하여 Github 에서 요청할 수 있도록 webhook을 연결해야합니다.

Github Webhook 생성하기

PR요청을 연결할 레파지토리로 이동하여

repository/settings/webhooks/

경로를따라 이동합니다. Add webhook 을 눌러 생성하는 페이지로 넘어갑니다. payload URL 에 위에서 생성한 API Gateway의 URL을 입력하고, 아래 사진처럼 설정합니다.원하시는 기능에 웹훅을 걸어줄 수 있습니다. 저는 PR만 체크하고 사용할겁니다. 이제 풀리퀘스트를 만들면 람다가 실행됩니다!




페이로드를 요청하여 람다를 구현하시고 구조에 맞는 template 을 만들어 Slack 에서 확인해보시기 바랍니다.!

profile
BE Dev

0개의 댓글