본문 바로가기
  • 분조장의 개발 블로그
카테고리 없음

Github Action으로 코멘트 정리하기

by 무아니 2021. 9. 10.

현재 진행 중인 Effective Java 스터디에서 나온 의견 중에 "우리가 질문을 많이 다니까 나중에 한번에 볼 수 있게 모든 질문을 하나의 이슈에 정리해두자"가 있었다.

 

우리는 지금 각 Item별로 이슈를 만들고, 해당 Item에서 질문이 생기면 코멘트를 달아두고, leading하는 사람이 답변하고있다. 그래서 모든 질문을 정리할 이슈를 만들고 정리하려보니까 생각보다 질문이 많고 복붙하는 작업이 귀찮다...!

그래서 혹시 이를 자동화할 수 있는 방법이 없을까?하는 생각과 동시에 Github Action이 생각났다. 들어만 봤지만 어렵지 않고 재밌을 것 같아 함 만들어보기로 했다.

 

Github Action이란?

Github Action은 간단히 말하면 Github에 있는 저장소를 이용해서 sw개발 Workflow를 자동화하는 도구다.

보통 CI/CD를 위한 pipeline을 구축하기 위해 사용하지만 그 외에도 많은 것을 자동화, 커스터마이징할 수 있다!

 

깃헙 Marketplace에 가면 Actions를 볼 수 있다. 정적 분석, 이슈 생성, 셋업 등 많다.

 

질문 정리 봇을 만들자!

우선 목표는 생겼는데 어떻게 만드는지 몰라서 단순하게 '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의 이름. 

Github Action 실행 목록에서 확인할 수 있다.

(2) on : workflow를 trigger하는 Github 이벤트 (이벤트도 다양한 옵션이 있으니 문서를 참고하면 좋다.)

  • 나는 comment가 달렸을 때 action이 작동하게 하고 싶어서 'issue_comment'를 사용했다.
  • 'issue_comment'의 타입으론 'created', edited, deleted 세 가지가 있는데 삭제에 대해선 실수로 코멘트 삭제를 할 수도 있으니 이에 대해선 동작을 허용하지 않았다.

(3) jobs : workflow를 구성하는 작업 단위. 이 작업 실행 수에 따라 billing이 적용되는데 public 저장소를 사용하면 free다.

 

(4) 임의로 job 이름을 설정했다.

Github Action 실행 목록 중 하나에 들어가면 왼쪽에 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을 달아준다.
  • 오답노트에 기록된 질문은 기존에 등록된 내용이 있으면 업데이트, 없으면 생성한다.
  • 또한 원래 질문에 질문자, 원래 코멘트의 주소를 추가해서 당시 답변을 바로 참조할 수도 있다!

특정 Item에 해당하는 이슈에 질문이 생겨 코멘트를 달았다.
Correction Note(#13)에 봇이 내 질문을 자동으로 기록했다.

 

참고할 만 한 문서

더 많은 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 액션 

https://github.com/peter-evans/find-comment 

https://github.com/peter-evans/create-or-update-comment

댓글