[ZenHub - Slack 알리미] Pull Request를 알림에서 제외해보자
zl존석동
·2022. 5. 21. 01:43
Aws Lambda 를 활용한 Github(ZenHub) 이슈 상태 이동 Slack 알리미 서비스를 만들며 발생한
사소한 문제와 그에 대한 해결을 기록해보았다!
문제 상황
프로젝트 진행을 아래 이미지 처럼 이슈를 발행하고 1:1로 Pull Request를 만들어 리뷰 받고 합쳐나가는 식으로 하고 있었는데..

리뷰요청과 리뷰 완료 파이프라인에 대해서만 알림이 가도록 설정해두었는데
해당 파이프라인 이동으로 알림이 갈 때 이슈에 묶인 Pull Request에 대한 알림이 같이 중복되어서 간다!

이대로 방치해둬도 사실 큰 상관은 없겠지만 사용하는 사람 입장에서 뭘 눌러야 할지 굉장히 헷갈릴 것이고
중복된 메시지로 불편할 것이고 미관상에도 좋지 않기 때문에 누구도 불만을 표하지는 않았으나 알아서 개선하기로 했다.
어차피 이슈 기반으로 작업을 진행하고 PR 하는 식이기 때문에 PR 에는 따로 알림이 필요없다고 판단했다.
해결해보기
가정: 이벤트 발생 응답 데이터에 구분지을 수 있는 의미있는 정보가 있을 것이다.
- ISSUE TRANSFER FORMAT -
{
"type": "issue_transfer",
"github_url": "https://github.com/ZenHubIO/support/issues/618",
"organization": "ZenHubHQ",
"repo": "support",
"user_name": "ZenHubIO",
"issue_number": "618",
"issue_title": "ZenHub Change Log",
"to_pipeline_name": "New Issues",
"workspace_id": "603fc3e575de63001cc163f9",
"workspace_name": "My Workspace",
"from_pipeline_name": "Discussion"
}
ZenHub API 문서를 보면 기본적으로 이슈 이동에 대한 커스텀 웹훅으로 보내주는 데이터 전체 포맷이 있다.
여기서 최소한 github_url 에서는 이슈와 PR 을 구분할 의미있는 정보가 있을 것이라고 판단했는데..

콘솔로 들어온 데이터를 찍고 CloudWatch 로 확인해봤는데 이슈나 PR 모두 같은 경로로 들어왔고 어떤 정보로도 구분을 지어줄 수 없었다..
그래서 매우 직관적으로 떠오른 방법으로 해결해보고자 다음과 같은 시도를 했다.
해결: 무식하게 해결하기
분명히 Github 자체에서 Pull Request와 이슈가 이슈번호는 공유한다 하더라도 다른 정보를 보여주기 위해 자원 구분 경로가 다를 것이라 생각했고 확인해보니 정말 달랐다.
그래서 PR과 이슈에 대해 헤더 요청을 보내고 비교해보았다.


역시나 Pull Request 는 경로의 Issues 컬렉션으로 요청해도 Redirect 되고 있었다.
이를 이용해서 Aws Lamba 에서 axios 를 활용해 Pull Request 에 대해서는 알림 메시지 전송을 막아야 겠다는 생각을 했다!
젠허브 웹훅으로부터 전달 받은 데이터의 github_url 에 대해 axios head 요청을 보내고
302 라면 메시지를 보내지 않도록 하는 처리를 추가할 것이다.
const checkPullRequest = (github_url) => {
return axios
.head(github_url,{
maxRedirects: 0,
validateStatus: function (status) {
return status >= 200 && status <= 302;
}
})
.then((response) => {
return response.status === 302 ? true : false;
})
.catch((error) => {
return false;
});
};
어차피 알림 메시지 전송을 위해 axios 를 사용하고 있었기에 함수 하나를 만들어 처리에 사용하였다.
redirect 횟수를 0으로 제한해 Pull Request 에 대해 200이 아닌 302 응답을 얻을 수 있게 처리해주고
302 응답을 catch(error) 가 아닌 then(success) 에서 얻기 위한 처리를 해주었다.
const isPullRequest = await checkPullRequest(data.github_url);
if (data.type && data.type === permitEvent && !isPullRequest) {
if (alertPipelineArray.includes(data.to_pipeline_name)) {
axios
.post(WEBHOOK_URL, { attachments, link_names: 1 })
.catch(console.log);
}
}
딱히 깔끔해보이지 않지만 우선은 동작이 아주 잘 된다! 지금은 그거면 돼!

이제 Pull Request를 제외하고 이슈의 파이프라인 이동에 대해서만 알림 메시지가 오는 것을 확인할 수 있다!
느낀점
사소한 것이지만 필요하다는 것을 느끼고 만들어서 동작시키고
사소한 문제이지만 발견한 다음 그것을 개선해나간다는 것이 참 재밌는 것 같았다.
좀 바보같은 생각으로 문제를 해결했다고 생각이 되지만 생각을 구현해보니 동작이 된다는게 신기하다 ㅎㅎ
깃허브 코드
GitHub - pds0309/zen_slack_alert: Aws Lambda + Zenhub + Slack web hook 을 연동한 이슈 이동 알림 서비스
Aws Lambda + Zenhub + Slack web hook 을 연동한 이슈 이동 알림 서비스 - GitHub - pds0309/zen_slack_alert: Aws Lambda + Zenhub + Slack web hook 을 연동한 이슈 이동 알림 서비스
github.com
References
GitHub - ZenHubIO/API: Learn how to use ZenHub's API.
Learn how to use ZenHub's API. . Contribute to ZenHubIO/API development by creating an account on GitHub.
github.com
'Git & Github' 카테고리의 다른 글
| [Zenhub - Slack 알리미] Issue 이동 알림 서비스 (0) | 2022.05.18 |
|---|---|
| [ZenHub] 프로젝트 이슈 관리도구 Zenhub 사용해보기 (0) | 2022.05.07 |
| [Github] 5분이면 하는 Slack 채널과 원격 저장소 연동 (0) | 2022.01.02 |