이번엔 이 공부 끝내겠다 시리즈/github actions

github actions로 버전 관리하기-릴리즈 노트편

by GicoMomg (Lux) 2021. 12. 15.
  • 이번 시간에는 병합된 PR의 라벨에 따라 버전을 올리고 release note를 작성해보자!
  • 이 작업을 위해, 자동 라벨링을 해주는 labeler-action과 릴리즈 노트를 작성해주는 release drafter 쓴다.
  • 대략적인 컨셉은 아래와 같다.
    • pull_request가 opened됐을 때 labeler-action을 사용해 라벨링을 한다.
    • 이때, pull_request 제목에 feat가 들어갔다면 enhancement라는 라벨을 지정해준다.
    • pull_request가 main에 merge되었을 때 release drafter을 사용해 릴리즈 노트를 작성하도록 한다.
    • 기본적으로 patch 버전을 올리며, 만약 라벨이 enhancement인 경우 minor 버전을 올린다.



1. labeler-action 사용하기

🏃 labeler-action을 사용해 각 PR에 대한 라벨링을 한다.

1) 폴더 구조

  • 프로젝트에는 아래와 같은 폴더구조로 생성하면 된다.
  • workflows/labeler.yml: labeler-action에 대한 workflows를 작성한다. (어떤 조건일 때 실행하자)
  • .github/labeler.yml: 어떤 기준으로 라벨링을 하는지 작성한다.



2) workflows/labeler.yml

pull_request가 opened됐을 때 라벨링을 하도록 한다.

(1) 전체 코드보기

name: auto labeling
on:
  pull_request:
    types: [opened]
    branches:
      - main
jobs:
  update_release_draft:
    runs-on: ubuntu-latest
    steps:
      - uses: jimschubert/labeler-action@v1
        with:
          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}

(2) 코드 상세보기

  • 해당 workflows의 이름을 작성한다.
name: auto labeling
  • main을 분기로 pull_request가 opened되었을 때 이 워크 플로우를 실행한다.
name: auto labeling
on:                 
  pull_request:      # this
    types: [opened]
    branches:
      - main

  • jobs는 step(실행 커멘트)의 잡합으로 작업 제목과 구동 환경을 설정할 수 있다.
  • jobs은 병렬적으로 실행되며, 모든 jobs는 job_id를 가진다.
  • 아래 코드는 labeler-action 모듈을 실행한다는 내용이다.
jobs:
  update_release_draft:     # 작업 제목
    runs-on: ubuntu-latest  # 구동 환경
    steps:
      - uses: jimschubert/labeler-action@v1        # 사용할 모듈
        with:
          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}  # 환경 변수 (토큰은 자동 생성됨)



3) .github/labeler.yml

라벨링에 대한 설정 파일이다.

  • 아래 코드는 pull_request 제목에 feat가 들어갔을 때, enhancement라는 라벨을 붙인다는 의미이다.
labels:
  "enhancement":
    - '\bfeat\b'



4) 작동 모습

  • main을 분기로 한 PR이 open이 된다.
  • 그러면 auto labeling이 작동하는데, 이때 PR제목에 feat가 들어갔으므로 라벨은 enhancement가 된다.
  • 만약 PR 제목에 feat가 들어가있지 않다면, 라벨은 추가되지 않는다.






2. Release drafter 사용하기

🏃 Release drafter는 master(혹은 main)에 PR이 병합되었을 때 릴리즈 노트 초안을 작성해준다.

1) 폴더 구조

  • 프로젝트에는 아래와 같은 폴더 구조로 생성하면 된다.
  • draft-release.yml: release drafter에 대한 workflows를 작성한다. (어떤 조건일 때 실행하자)
  • config.yml: 릴리즈 노트 형식과 버전 업 기준에 대한 설정을 작성한다.



2) draft-release.yml

main에 merge되었을 때 릴리즈 노트를 작성하게 하자

(1) 전체 코드보기

# projectName > .github > workflows/draft-release.yml
name: draft-release
on:
  pull_request:
    types: [closed]
jobs:
  draft-release:
    runs-on: ubuntu-18.04
    if: github.event.pull_request.merged == true && github.base_ref == 'main'
    steps:
      - name: Release drafter
        uses: release-drafter/release-drafter@v5
        with:
          config-name: config.yml
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

(2) 코드 상세보기

  • 해당 workflows의 이름을 작성한다.
name: draft-release  # this

  • pull_request가 closed되었을 때 이 워크 플로우를 실행한다.
name: draft-release
on:                  # this
  pull_request:    
    types: [closed]

  • 작업(jobs)의 이름은 draft-release이며, 구동환경은 우분투 18.04버전이다.
jobs:
  draft-release:            # jobs 제목
    runs-on: ubuntu-18.04   # 구동 환경

  • jobs에서 if를 사용해 특정 조건을 만족했을 때 steps를 실행하도록 할 수 있다.
  • 아래 코드는 pull_request가 main에 병합되었을 때 steps를 실행하겠다는 의미이다. ([github 변수 보기])
jobs:
  draft-release:            
    runs-on: ubuntu-18.04   
    if: github.event.pull_request.merged == true && github.base_ref == 'main' # this

  • steps에 있는 내용은 Release drafter을 사용하기 위해 기본적으로 추가해야할 값이다.

jobs:
  draft-release:
    runs-on: ubuntu-18.04
    if: github.event.pull_request.merged == true && github.base_ref == 'main'
    steps: 
      - name: Release drafter                        # steps 이름
        uses: release-drafter/release-drafter@v5     # 사용할 모듈
        with:
          config-name: config.yml                    # config 파일 이름
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}  # 자동 생성되는 환경 변수



3) config.yml

🏃 릴리즈 노트 작성 템플릿과 버전 업에 대한 설정 파일이다.

(1) 전체 코드보기

# projectName/.github/config.yml

name-template: "v$RESOLVED_VERSION"
tag-template: "v$RESOLVED_VERSION"
template: | 
  ## Changes
  $CHANGES
version-resolver:
  minor:
    labels:
      - "enhancement"
  default: patch
change-template: "- $TITLE @$AUTHOR (#$NUMBER)"

(2) 코드 상세보기

  • Major.minor.patch 중 어떤 버전을 올릴지 정의한다.
변수 설명
v$NEXT_PATCH_VERSION Major.minor.patch에서 patch버전을 올린다. (v12.1.2 → v12.1.3)
v$NEXT_MINOR_VERSION Major.minor.patch에서 minor버전을 올린다. (v12.1.2 → v12.2.2)
v$NEXT_MAJOR_VERSION Major.minor.patch에서 major버전을 올린다. (v12.1.2 → v13.1.2)
v$RESOLVED_VERSION version-resolver에 정의한 labels에 따라 버전을 올린다.
name-template: "v$RESOLVED_VERSION"
tag-template: "v$RESOLVED_VERSION"

  • template는 릴리즈 노트 형식을 정의한다.
template: | 
  ## Changes
  $CHANGES

  • version-resolver을 정의하면, 라벨에 따라 버전을 올릴 수 있다.
  • 아래 코드는 enhancement 라벨인 경우 minor버전을 올리고, 그 이외엔 patch버전을 올린다는 말이다.
version-resolver:
  minor:
    labels:
      - "enhancement"
  default: patch

  • change-template는 병합된 각 PR에 대한 설명 형식이다.
change-template: "- $TITLE @$AUTHOR (#$NUMBER)"



4) 작동 모습

  • main을 기반으로 PR을 올린 상태이다.
  • 커밋 제목에 feat가 들어가므로 enhancement라벨이 적용되었다. (1)
  • 릴리즈 노트 작성이 잘 되는 지 보기 위해 (2)를 눌러 병합을 하자.

  • 레파지토리 메인을 가면 오른쪽에 Release가 보인다.
  • 추가된 릴리즈 노트를 보기 위해 (3)을 누르자

  • 들어가보면 새로 작성된 릴리즈 노트가 보인다.
  • (5)를 클릭해서 릴리즈 노트를 출시하러 가보자.

  • publish release를 누르면 정식 출시가 된다.

  • 이 과정을 거치면 릴리즈 완료이다!



그런데 이 과정을 거쳐 릴리즈를 했지만 package.json 버전을 올리지 못했다 json 파일의 버전은 어떻게 올려야할까? 다음 시간에 알아보자!

반응형

댓글