.github/workflows 경로의 들어가는 yaml, yml 파일은 깃허브 레포지토리에 업로드 되는 커밋의 내역을 통해 CI (Continuous Integration)을 진행할 수 있다.
주로 소프트웨어의 버전을 "Release" 할 때 사용
v 이후 .으로 분리된 형식 v<MAJOR>.<MINOR>.<PATCH> 형태로 저장되먄 각 숫자는 주로 아래와 같이 커밋 내용에 따라 관리한다 (Semantic Versioning)
**MAJOR**
- 새로운 & 큰 변화가 있는 경우
- `v1.0.0` -> `v2.0.0`
**MINOR**
- 새로운 부가적인 기능이 추가되는 경우
- `v1.0.0` -> `v1.1.0`
**PATCH**
- 버그 수정 및 유지보수
- `v1.0.0` -> `v1.0.1`
❗️ 프로젝트의 규모가 커질수록 본인을 포함한 팀원들의 커밋이 많아지며 이를 수작업으로 관리하기 힘들다
이를 해결하기 위해 커밋 내역에 따라 버젼관리를 하고 태그를 생성시켜주게 되면 관리가 수월해진다.
해당 스펙에서 제시하는 safelist 된 prefix를 사용하하여 커밋 컨벤션을 맞추면 많은 장점이 생긴다
TriPS/conventioanl-changelog-action
Conventional Commit을 확인하여 CHANGELOG.md 파일을 만든다CHANGELOG.md 를 확인하여 태그 버전을 Semantic Versioning에 맍게 업데이트package.json) 업데이트 후 커밋node.js환경을 기준으로 기본 설정값을 가지고 있기 때문에 특수 케이스가 아닌 이상 추가 설정을 크게 건드릴 필요가 없다🤯 특수케이스 예시 :
name: Create Tag
on:
pull_request:
branches:
- dev
types:
- synchronize
- opened
jobs:
create-tag:
runs-on: ubuntu-latest
steps:
- name: Checkout Pull Request Branch
uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.head.ref }}
- name: Conventional Changelog Action
id: changelog
uses: TriPSs/conventional-changelog-action@v3.19.0
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
git-branch: ${{ github.event.pull_request.head.ref }}
git-branch 설정은 태그 업데이트 후 버전 업데이트의 대한 커밋을 할 브랜치를 지정한다pull_request 경우 default브랜치는 base 브랜치인 dev 가 되는데 dev브랜치가 protection rule이 설정되어있다면 액선 내부에서 바로 커밋을 진행할 수 없다.head브랜치에 커밋을 하고 pull_request가 머지될 때 dev브랜치에 커밋이 된다.기록의 특정 지점을 표시하는 Git 태그를 기반으로 공실 릴리즈 내역을 만든다
release-drafter
이전 릴리즈까지의 Pull Request중 라벨링을 사용하여 버젼관리 및 내역을 정리할 수 있다
name: Create Tag on Push Dev
on:
push:
branches:
- dev
jobs:
create-tag:
runs-on: ubuntu-latest
steps:
uses: actions/checkout@v3
- name: Get Version
id: get_version
run: |
VERSION=$(node -p "require('./package.json').version")
echo $VERSION
echo "::set-output name=version::$VERSION"
- name: Create Draft
id: release_drafter
uses: release-drafter/release-drafter@v5
with:
config-name: release-drafter.yml
version: ${{ steps.changelog.outputs.tag }}
tag: ${{ steps.changelog.outputs.tag }}
publish: false
prerelease: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
dev브랜치로 merge를 하기 전에 버젼 업데이트와 태그를 생성했기 때문에 업데이트 된 버젼을 package.json 안에서 가져온다release.body), 버젼관리, 사용될 라벨 설정 등은 내용이 길기 때문에 release-drafter.yml파일을 분리해서 config-name인풋으로 가져와 관리한다 (문서에서도 이러한 방식을 추천)release-drafter.yml
name-template: 'v$RESOLVED_VERSION 🌈'
tag-template: 'v$RESOLVED_VERSION'
categories:
- title: '🚀 Features'
labels:
- 'feature'
- 'enhancement'
- title: '🐛 Bug Fixes'
labels:
- 'fix'
- 'bugfix'
- 'bug'
- title: '🧰 Maintenance'
label: 'chore'
change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
change-title-escapes: '\<*_&' # You can add # and @ to disable mentions, and add ` to disable code blocks.
version-resolver:
major:
labels:
- 'major'
minor:
labels:
- 'minor'
patch:
labels:
- 'patch'
default: patch
template: |
## Changes
$CHANGES