Github Action으로 Labeling 자동화하기

전병민·2023년 3월 15일
5

자동화

목록 보기
1/1

서론

자동화에는 표준이 없습니다. 자동화는 생산성을 올릴 수 있지만 모든 프로젝트에 해당하는 말이 아닙니다. 프로젝트는 수없이 많은 환경에 처할 수 있고 각자 프로젝트가 처한 상황에 맞는 자동화를 하는 것이 무엇보다 중요합니다. 오늘은 Issue 혹은 Pull Request 가 오픈될 때 labeling 를 자동화하는 법을 알아봅시다. 레이블은 릴리즈 노트 작성을 자동화할 때에 카테코리를 분류하는 기준으로 사용되기도 합니다. 또 이후에 레이블 별로 PR을 확인하고 싶을 때도 유용하겠지요.

목표

PR 제목을 파싱하여 PR에 적당한 레이블 붙이기




Github Action

Github Action 이용하면 Github로 하는 거의 모든 것들을 자동화할 수 있습니다. 더 자세한 내용은 Github Action 공식문서에서 확인할 수 있지만 역시나 한번에 모든 것을 배울 필요는 없다고 생각합니다. 필요한 자동화에 맞게 찾아보며 학습합시다. Github Action 으로는 크게 다음과 같은 자동화가 가능합니다.

  • 코드를 빌드 및 테스트
  • 패키지 빌드 및 게시
  • 프로젝트 배포
  • 이슈 및 풀 리퀘스트 관리
  • 그 외 많은 것

그리고 주요한 개념을 요약하자면 다음과 같습니다.

Workflows

workflow 는 하나 이상의 job 을 실행하는 자동화된 프로세스입니다. workflow 는 yaml 파일에 의해 정의되며 리파지토리의 event 에 의해 트리거될 때 실행되거나 수동으로 또는 정의된 일정에 따라 트리거될 수 있습니다. workflow 는 리파지토리의 .github/workflows 디렉토리에 정의되며, 하나의 리파지토리에서는 각각 다른 작업 집합을 수행할 수 있는 여러 workflow 가 있을 수 있습니다. workflow 의 모듈화도 물론 가능합니다.

Events

eventworkflow 실행을 트리거하는 리파지토리의 특정 활동입니다. 예를들면 누군가 풀 리퀘스트를 생성하거나, 이슈를 열거나, 리파지토리에 커밋을 푸쉬할 때 입니다.

Jobs

jobworkflow의 한 단계입니다. 병렬적으로 실행될 수도 있고 특정 job 에 종속되어 job 이 끝나야 실행되게 할 수 있습니다.

Action

action 은 복잡하면서 자주 반복되는 작업을 수행하는 모듈입니다. action 을 이용하여 workflow 파일에 작성되는 반복 코드의 양을 줄일 수 있습니다. action은 특정 리파지토리를 가져오거나 빌드 환경에 대한 올바른 도구 체인을 설정하거나 클라우드 공급자에 대한 인증을 설정할 수 있습니다. 고유 action 을 작성하거나 Github Marketplace 에서 사용할 action 을 찾을 수 있습니다.

Runner

runner 는 트리거될 때 workflow를 실행하는 서버입니다. 각 runner 는 한번에 하나의 작업을 실행할 수 있습니다.


Action

labeler 중 가장 유명한 action은 action/labeler 입니다. 변경된 파일의 Path를 기반으로 labeling 합니다. 훌륭한 action 이고 누군가에겐 솔루션이 되겠지만 저에게는 아닙니다. 저의 프로젝트는 feat, refactor, fix 등 과 같은 PR 컨벤션을 적용하였습니다. 이에 맞게 적당히 레이블을 붙여주면 좋겠군요. 제가 사용할 action은 actions/auto-labeler 입니다. 굳이 이 action이 아니라도 찾아보면 labeling 자동화를 도와주는 많은 action이 있습니다. Github Marketplace에서 찾아보고 자신의 상황에 맞는 action을 찾아보는 것도 좋겠습니다.

Workflow

자신의 리파지토리 root에 .github/workflows 디렉토리를 생성하고 다음과 같은 yml 파일을 생성합니다.

# .github/workflows/pr-labeler.yml

# workflow 의 이름
name: PR labeler

# 트리거될 이벤트 설정
on:
  pull_request:
    types: [opened]
    
# 트리거되었을 때 실행될 job 작성
jobs:
  labeler:
  	# runner 설정
    runs-on: ubuntu-latest
    # 리파지토리에 대한 권한 설정
    permissions:
      contents: read
      pull-requests: write
    steps:
      - name: Check Labels
        id: labeler
        uses: jimschubert/labeler-action@v1
        with:
          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}

permissions 에서 특히 pull-requests: write 를 설정하지 않으면 동작하지 않을 수 있습니다. 리파지토리에 따라 workflow 퍼미션이 아래의 사진처럼 Readonly 로 설정되어 있을 수 있기 때문에 이 경우 직접 리파지토리 설정을 변경하거나 yml 파일에서 퍼미션을 재정의해야 합니다.

labeler.yml

jimschubert/labeler-action.github/labeler.yml 을 파싱하여 레이블을 설정합니다.

# enable labeler on issues, prs, or both.
enable:
  issues: false
  prs: true

# 레이블을 성공적으로 붙이고 PR에 보낼 코멘트를 설정
comments:
  prs: |
    Labeler has applied any labels matching special text in your title and description.
    Please review the labels and make any necessary changes.

# 레이블
labels:
  'bug':
    include:
      - '\bfix\b'
  'test':
    include:
      - '\btest\b'
  'feature':
    include:
      - '\bfeat\b'
  'documentation':
    include:
      - '\bdocs\b'
  'refactor':
    include:
      - '\brefactor\b'
  'chore':
    include:
      - '\bchore\b'

레이블을 자신의 프로젝트에서 사용할 레이블로 변경할 수 있습니다.

테스트 해보기

잘 동작하는군요.




후기

Github Action 을 처음 다뤄보지만 정말 무궁무진하게 사용할 수 있겠다는 생각이 듭니다. 재밌는 action을 찾아 리파지토리에 적극 적용해보고 싶은 실험 정신이 샘솟는군요. 다시 찾아오겠습니다.

profile
JavaScript/React 개발자

0개의 댓글