현재 진행 중인 Effective Java 스터디에서 나온 의견 중에 "우리가 질문을 많이 다니까 나중에 한번에 볼 수 있게 모든 질문을 하나의 이슈에 정리해두자"가 있었다.
우리는 지금 각 Item별로 이슈를 만들고, 해당 Item에서 질문이 생기면 코멘트를 달아두고, leading하는 사람이 답변하고있다. 그래서 모든 질문을 정리할 이슈를 만들고 정리하려보니까 생각보다 질문이 많고 복붙하는 작업이 귀찮다...!
그래서 혹시 이를 자동화할 수 있는 방법이 없을까?하는 생각과 동시에 Github Action이 생각났다. 들어만 봤지만 어렵지 않고 재밌을 것 같아 함 만들어보기로 했다.
Github Action이란?
Github Action은 간단히 말하면 Github에 있는 저장소를 이용해서 sw개발 Workflow를 자동화하는 도구다.
보통 CI/CD를 위한 pipeline을 구축하기 위해 사용하지만 그 외에도 많은 것을 자동화, 커스터마이징할 수 있다!
질문 정리 봇을 만들자!
우선 목표는 생겼는데 어떻게 만드는지 몰라서 단순하게 'github action 코멘트'라고 검색했다. 그랬더니 Github Marketplace에 있는 Create or Update Comment라는 Action을 찾을 수 있었다. 추후 Github Action에 필요한 파일을 작성하면서 알게 모르게 사용한 job이 Find Comment라는 Action이란 걸 알게됐다(같은 개발자의 개발물).
아래 사진을 첨부해놔서 설치가 필요할 것 같지만 실제론 뭘 설치하진 않는다. yml파일에 작성한다.
1. 파일 만들기
Github Action을 동작시키기 위한 코딩을 어디서 하느냐? 하면 아래 사진처럼 프로젝트 루트 경로에 .github/workflow/(이름).yml 구조로 만든 .yml에서 한다. 이 구조대로 만들어야 한다.
ISSUE_TEMPLATE은 그냥 우리 스터디 이슈 템플릿이라 이 작업과는 연관이 없다.
2. 질문 정리할 이슈 만들기
우리는 Correction Note (#13) 라는 이름의 이슈를 생성해서 이 이슈에 모든 질문을 정리할 것이다.
3. 파일 작성하기
이제 아래 코드를 이해해보자
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
name: Add comment -(1)
on: -(2)
issue_comment:
types: [created, edited]
jobs: -(3)
issue_commented:
name: Issue comment -(4)
runs-on: ubuntu-latest -(5)
if: ${{ startsWith(github.event.comment.body, '[질문]') }} -(6)
permissions: -(7)
issues: write
steps: -(8)
- run : |
echo '${{ github.event.comment.id }}'
echo '${{ github.event.comment.body }}'
echo '${{ github.event.comment.user.login }}'
- name: Find Comment -(9)
uses: peter-evans/find-comment@v1.3.0
id: fc
with:
issue-number: 13
body-includes: ${{ github.event.comment.body }}
- name: Create or Update Comment -(10)
uses: peter-evans/create-or-update-comment@v1.4.5
with:
comment-id: ${{steps.fc.outputs.comment-id}}
issue-number: 13
body: |
> @${{ github.event.comment.user.login }}, ${{ github.event.comment.html_url }}
${{ github.event.comment.body }}
- name: Add reactions -(11)
uses: peter-evans/create-or-update-comment@v1.4.5
with:
comment-id: ${{github.event.comment.id}}
reactions: rocket
(1) name: workflow의 이름.
(2) on : workflow를 trigger하는 Github 이벤트 (이벤트도 다양한 옵션이 있으니 문서를 참고하면 좋다.)
- 나는 comment가 달렸을 때 action이 작동하게 하고 싶어서 'issue_comment'를 사용했다.
- 'issue_comment'의 타입으론 'created', edited, deleted 세 가지가 있는데 삭제에 대해선 실수로 코멘트 삭제를 할 수도 있으니 이에 대해선 동작을 허용하지 않았다.
(3) jobs : workflow를 구성하는 작업 단위. 이 작업 실행 수에 따라 billing이 적용되는데 public 저장소를 사용하면 free다.
(4) 임의로 job 이름을 설정했다.
(5) runs-on : Github Action은 GitHub-hosted runner에 의해 별도의 장비 없이 실행시키거나 self-hosted runner로 자기가 직접 셋팅한 환경에서 실행시킬 수 있다. 이걸 결정하는 옵션으로, 나는 Github-hosted runner 타입 중 하나를 선택했다.
(6) if : job을 실행시키는 조건
- 표현식이 따로 있어서 필요한 대로 참고해서 쓰면 된다.
- 나는 '[질문]'으로 시작하는 코멘트에 대해 job을 실행시키도록 했다.
(7) permissions : Github Action에게 권한을 부여하는 방법이다. 코멘트를 생성해야하니 write 권한을 줬다.
(8) steps : 각 job을 구성하는 일련의 순서 있는 작업단위다.
- 각 step은 run이나 name으로 시작할 수 있다. run은 내가 직접 작성해야하고 name과 used에은 Github Marketplaces에 올라와있는 Actions 들 중에 사용할 것들을 써준다.
- id로 step을 특정할 수 있어서 step 실행 후 결과물에 대해 참조할 수 있다.
(9)~(11)
봇의 동작 과정은 이렇다.
(9)에서 올린 코멘트와 같은 내용으로 이슈 13(질문들 정리하는 이슈)에 작성된 것이 있는지 확인한다.
(10)에서 작성된 것이 있으면 새로운 내용으로 업데이트, 없으면 새로 생성한다.
- 여기서 (9)에 id를 달아놨었기 때문에 (9)의 결과값을 사용해서 comment-id 옵션을 채운 것을 볼 수 있다.
(11)에서 작업을 다 마친 후 action을 작동시킨 코멘트에 로켓 reaction을 달아 작업이 끝났다고 보여줄 수 있게 했다.
결과물
- 각 Item 별 이슈에 코멘트로 질문 등록시 [질문] 키워드로 시작하게 작성하면-> 깃헙 액션이 동작해서 작업을 수행하고 -> 내가 등록했던 질문에 🚀 reaction을 달아준다.
- 오답노트에 기록된 질문은 기존에 등록된 내용이 있으면 업데이트, 없으면 생성한다.
- 또한 원래 질문에 질문자, 원래 코멘트의 주소를 추가해서 당시 답변을 바로 참조할 수도 있다!
참고할 만 한 문서
더 많은 syntax들
https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions
'on' syntax에서 사용할 event 옵션들
https://docs.github.com/en/actions/reference/events-that-trigger-workflows
Find Comment, Create or Update Comment 액션
댓글