이전 포스팅을 이어서, 이번에는 실제로 프로젝트에 Github Action을 적용한 사례를 소개하고자 한다. 현재 진행하고 있는 프로젝트의 협업 도구는 메세지로는 디스코드, 이슈 트래킹 및 칸반의 용도로 지라를 사용하고 있다. 이번 포스팅에서는 Github Action을 통해, 자동으로 Discord로 Github Event를 전송하는 방법과 이슈 생성시 자동으로 Jira Issue를 생성하는 방법을 소개한다.
그전에, 받았던 질문에 답을 기록하고자 한다.
1. Github Webhook에 Discord Webhook을 등록하면, 자동으로 알림 서비스를 받을 수 있는데요?
Github Webhook을 사용하지 않고, 따로 Github Action을 사용하는 몇가지 이유가 있다.
- 첫번째로 메세지 커스텀이 가능하다. 디스코드 Embeds 를 확인하면, 색 부터, 이미지등과 같은 메세지 형태를 커스텀할 수 있다.
- 두번째로 관리하는 측면에서 용이하다. 여러개의 자동화 프로세스 중 몇 개는 Github Action을, 나머지는 Github Webhook을 등록한다면, 수정 및 삭제할 때 어려움이 발생할 수 있다.
또한, 빌드 및 테스트 과정을 함께 사용한다면, 하나의 workflows안에 여러 개의 action을 통해 구현하면 더욱 가독성 쉽고 관리하기 쉽게 구성할 수 있다. - 하지만, 여러가지 Github Action Events 및 Discord Embed와 같은 템플릿 구조를 알아야 하는 초기 러닝커브가 단점이다.
2. 그냥 Github Issue, Project 활용해서 이슈 및 칸반 사용하면 안돼요?
Github의 다양한 기능을 사용하면, 우리가 Jira에서 사용하는 기능을 거의 구현할 수 있다. 그럼에도 사용한 이유는 다음과 같다.
- 첫번째는 높은 가시성이다. 칸반이나 대시보드를 통해 프로젝트 진행상황을 확인하기 쉽게 느껴졌다. 또한 큰 에픽 밑 여러 이슈를 연계할 수 있다는 점도 프로젝트를 하면서 필요하다고 느꼈던 기능이다.
- 두번째로 현업에서 자주 사용되는 도구이다. 채용공고를 확인하면, 현업에서 많이 사용되고 있는 것 같다. 이번 기회에 먼저 경험하면 좋을 것 같았다.
그럼 이번에는 예시를 통해, 자동화 프로세스를 구축하는 방법을 확인해보자!
1. Github Action + Discord
가장 먼저, Github Action을 통해, Events가 발생할 때마다 Discord를 통해 Message를 보내는 방식이다.
우리팀은 다음과 같은 이벤트에 디스코드 메세지를 보내기로 결정했다.
- 이슈 생성했을 때
- 이슈 닫혔을 때
- PR 성공했을 때
- PR 실패했을 때
우리 팀은 GitFlow 전략을 선택하고 있는데, 아직 main Branch로의 병합 요청 및 배포에 대해 계획된게 없어, 기능 개발할 때를 기준으로 구성했다. 그럼 진짜 예시를 통해 알아보자.
Discord Webhook을 Github Secrets에 등록하기
Discord Webhook은 원하는 채널의 편집 -> 연동 -> 웹 후크에서 확인할 수 있다.
그 후 사용하고자 하는 Github Repository Setting에 Secrets으로 등록한다. (Settings -> secrets and variables -> actions -> New repository secrets)
DISCORD_WEBHOOK이라는 이름으로 secrets를 생성한다. (사용하는 github action에 따라, 웹 후크 뒤에 /github을 붙여주는 경우도 있다. 우리가 사용하는 action은 필요 없다.)
workflows YAML 파일 생성하기
Github Action을 통해, 플러그인처럼 다른 사람이 작성한 코드를 사용할 수 있다. 우리가 사용할 Discord Github Action은 Ilshidur discord action 이다. 해당 링크를 통해 들어가보면, 예시를 확인할 수 있다.
해당 action을 사용한 이유는 Discord Action중 가장 많은 스타를 받았고, Embed를 사용가능하기 때문이다. Discord Embed를 사용해, 작성자 원하는 마음대로 메세지 템플릿을 수정할 수 있다.
(임베드 예시가 많이 없어, 진짜 엄청 찾아봤다... 분명 레퍼런스 그대로 했는데, 되지 않았다. 답은 해당 예시 레포에 이슈 탭에서 확인할 수 있었다..!)
opend-issue-notifiaction.yml
name: Opend Issue Notification # 1
on: # 2
issues:
types:
- opened
jobs:
create-issue:
name: Discord notification
runs-on: ubuntu-latest
steps:
- name: Send Issue
uses: Ilshidur/action-discord@0.3.2 # 3
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} # 4
DISCORD_USERNAME: WAPP_BOT # 5
DISCORD_AVATAR: https://github.com/pknu-wap/WAPP/blob/main/image/icon.png?raw=true # 6
DISCORD_EMBEDS: | # 7
[
{
"title": "왔어요 왔어~ 새로운 이슈가 왔어요~🥳\n${{ github.event.issue.title }}",
"color": 10478271,
"description": "${{ github.event.issue.html_url }}",
"fields": [
{
"name": "Issue Number",
"value": "#${{ github.event.issue.number }}",
"inline": true
},
{
"name": "Author",
"value": "${{ github.event.issue.user.login }}",
"inline": true
}
]
}
]
차근차근 코드를 알아보면 다음과 같다.
# 1
workflow의 이름을 설정한다. 설정한 이름은 Github Action에서 확인할 수 있다.
# 2
workflow가 실행되는 Event를 설정한다.
위의 workflow는 이슈를 생성할 떄 알림을 주는 workflow이므로, issue의 typed 속성에 opend를 지정했다.
다른 Event를 확인하고 싶다면 해당 Github Docs를 확인하자.
# 3
위에서 소개한 github action을 입력한다. use 키워드를 사용해, 다른 사람이 작성한 action을 가져올 수 있다.
# 4
이전 등록했던 Discord Webhook을 Github Secrets로부터 가져온다.
# 5
Discord Message를 보내주는 Bot의 이름을 설정한다.
# 6
Discord Message를 보내주는 Bot의 아바타 이미지를 설정한다.
# 7
Discord Message를 구성하는 Embeds 객체를 정의한다. '|' 는 줄 바꿈에 영향을 받지 않도록 하는 YAML문법이다.
Discord Title에 이슈가 열렸다는 안내와 이슈 제목을 함께 명시한다. description에는 바로 이슈로 갈 수 있는 url를, field에서는 이슈 번호와 이슈를 작성한 사람을 지정하였다.
이렇게, workflow를 생성하여 다음과 같은 메세지를 받아볼 수 있다.
2. Github Action + Jira
이번에 Jira를 함께 사용하게 되면서, 하나의 이슈를 생성하기 위해 Gihub Issue 하나, Jira Issue 하나, 총 두 개의 이슈를 생성해야 했다. 이런 작업을 줄이기 위해 Github Action을 통해, Github Issue를 생성하면 자동으로 Jira Issue를 생성하는 방법으로 해결했다.
Jira Token 및 Url 등록하기
Discord와 마찬가지로, Jira Webhook을 Github Secrets에 등록해야 한다. Discord와 다르게 이번에는 총 3개를 등록해야 한다.
- Jira Token, Jira Docs 를 통해, API Token을 발급하는 방법을 확인할 수 있다.
- Jira Url, 현재 Jira 프로젝트의 Base Url를 입력한다. ex) https://jaino.atlassian.net
- Jira Email, 사용하는 계정의 이메일을 입력한다.
Github Secrets에 등록하는 방법은 이전 Discord와 동일하다.
workflows YAML 파일 생성하기
이번에 사용한 Jira Action은 총 두 가지, Jira Login과, Jira Create Issue이다. 둘 다 공식 Jira에서 만든 것 같다.
Jira Login을 통해 권한을 얻고, 얻은 권한을 통해 Issue를 생성하는 구조이다. 코드는 다음과 같다.
name: Create Jira issue # 1
on: # 2
issues:
types:
- opened
jobs:
create-issue:
name: Create Jira issue
runs-on: ubuntu-latest
steps:
- name: Jira Login
uses: atlassian/gajira-login@v3 # 3
env: # 4
JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }}
JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}
JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }}
- name: Create Issue
uses: atlassian/gajira-create@v3
with:
project: WAPP
issuetype: Task # 5
summary: '${{ github.event.issue.title }}' # 6
description: '${{ github.event.issue.body }}' # 7
이전 Discord workflow를 깊이있게 봤다면, 사실 코드는 큰 내용은 없다.
# 1
workflow의 이름을 설정한다. 설정한 이름은 Github Action에서 확인할 수 있다.
# 2
workflow가 실행되는 Event를 설정한다.
# 3
Jira Login을 하기 위해 사용되는 action이다. Jira Login 링크를 통해 확인할 수 있다.
# 4
로그인을 하기 위해 이전에 Github Secrets에 정의한 변수를 가져온다.
# 5
Jira Create Issue를 확인하면 다양한 Issue type을 설정할 수 있는데, 필자는 Task 타입으로 이슈를 생성했다.
# 6
Jira Issue의 제목으로 github issue title을 설정한다. 자세한 내용은 Github Docs를 통해 확인할 수 있다.
# 7
Jira Issue의 내용으로 github issue body를 설정한다.
마치며
이전 자동화 프로세스 소개에 이어 이번에 실제 프로젝트에 도입한 사례를 소개했다.
실제로 도입해보니, 처음에 여러개의 Docs를 확인하고 테스트 해보면서 많은 시간이 걸렸다. 그래도 막상 구축해보니, 커스텀하는 재미도 있고, 다양한 도구나 이벤트에 맞게 구현하니 재미도 있었다.
그리고 이런 자동화 프로세스의 목적에 대해서 생각해보게 되었다. 개발 외 작업은 자동화를 통해, 개발에만 집중할 수 있도록 하는 환경을 구축하는 것이 자동화 프로세스의 핵심이라고 느꼈다.
추후에 배포하는 과정에서 또 다른 Action이 필요할 것 같다. 그 때 또 포스팅해 보도록 하겠습니다🤗🤗
사용한 예시는 다음 링크에서 확인할 수 있습니다
https://github.com/pknu-wap/WAPP/tree/develop/.github/workflows
참고 자료
https://prolog.techcourse.co.kr/studylogs/3779
https://birdie0.github.io/discord-webhooks-guide/structure/embeds.html