๊ฐ๋ฐ์ ์งํํ๋ค ๋ณด๋ฉด ์ปค๋ฐ์ด ์์ด๊ณ , ๊ทธ๋ฌ๋ค๊ฐ ์์ ์ ์ด๋ป๊ฒ ์์ ํ๋์ง ์ฐพ์์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธด๋ค. ๋๋ ๊ฐ๋ฐ ๋ฒ์ ๊ณผ ์ค์ ๋ฐฐํฌ ( ์๋น์ค ) ๋ฒ์ ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ๊ฐ ์์ด์ , ๊ทธ ๊ฒฝ์ฐ์ ๋ฐ๋ผ์ ๋ค๋ฅด๊ฒ ๊ด๋ฆฌํด์ผํ ํ์์ฑ์ด ์๋ค. ์ด๋ ์ฌ์ฉํ๋ ๊ฒ์ด versioning ์ธ๋ฐ , ๊ฐ ์ปค๋ฐ์ด๋ ํน์ ์ฅ์์ ๋ฒ์ ์ ์ ๋ ฅํด๋๊ณ , ๊ฐ ์๋น์ค๋ณ๋ก ๋ฒ์ ์ ๊ด๋ฆฌํ๋ค. ๊ฐ ์๋น์ค๋ณ , ํ๋ก์ ํธ๋ณ๋ก ๋ค๋ฅธ ๋ฒ์ ๋์ ์ฌ์ฉํ์ง๋ง ๊ฐ์ฅ ๋์ค์ ์ผ๋ก ๋ง์ด ์ฌ์ฉ๋๋ ๊ฒ์ด SemVer ( Semantic Versioning ) ๋ค.
Semantic Versioning ( ์ดํ semver ) ์ major , minor , patch ๋ก ๋๋ ์ ์๋ค. ๊ฐ๊ฐ ๋ณ๊ฒฝ์ฌํญ์ ๋ฐ๋ผ์ ๋ฒ์ ์ ์์ ํ์ง๋ง, ๊ธฐ๋ณธ์ ์ธ ํ์ ๋ฒ์ด๋์ง ์๋๋ค. ํ์ง๋ง ๊ฒฐ๊ตญ ๋ฒ์ ์ ์ ์ํ / ์ํฉ์ ํ๋ก์ ํธ๋ณ, ์๋น์ค๋ณ๋ก ๋ฌ๋ผ์ง ์ ์๋ค. ์ค์ ๋ก ํ์ฌ๋ฅผ ๋ค๋๋ ํด๋น ๋ฒ์ ๋์ ๊ท์น๋ง 3 ~ 4๋ฒ์ ๋ ๋ณ๊ฒฝํ๋ ๊ฒ ๊ฐ๋ค. ๋ง์ง๋ง์ ์ต์ ํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์๋ค.
๋ง ๊ทธ๋๋ก ์์ ๊ณผ์ ์ ์๋ํํ ๊ฒ์ด๋ค. ์์ด๋์ด๋ ๋ฐฐํฌ๊ฐ ์งํ๋๋ฉด ๋ง์ง๋ง ๋ฒ์ ์ ๊ฐ์ ธ์ค๊ณ , ํน์ flag ( branch ์ด๋ฆ ๋ฑ ) ์ ์ด์ฉํด์ minor์ patch๋ฅผ ํ์ธํด์ ์ฆ๊ฐ์ํจ๋ค. ๋ฒ์ ๋์ ๊ฒฝ์ฐ ๊ต์ฅํ ์์ฃผ ์ผ์ด๋๊ณ , ๊ทธ๋ฌ๋ค๋ณด๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ๋ฑ๋กํ๋ ๊ฒฝ์ฐ ๊ท์ฐฎ๊ธฐ๋ ํ๊ณ ์ค์๋ ๋ง์ด ์๊ธด๋ค. ์ด๋ฌํ ๊ณผ์ ์ ์๋ํํ๋ฉด ์ค์๋ ์ค์ผ ์ ์๊ณ , ๊ท์ฐฎ์ง ์์์ ๋งค์ฐ ํธํ ๊ฒฝํ์ด์๋ค. ์๋์์๋ ์ด ์๋ํ ๊ณผ์ ์ ์ ์ฉํ๋ ๊ฒ์ ์ ์ด๋ณด๋ ค ํ๋ค.
์ด์ ํ์ฌ์์ ๊ต์ฅํ ์ฆ์ ๋ฒ์ ๋ ํ์๋ฅผ ์งํํ์๋๋ฐ , ๊ทธ ๋ฐฐ๊ฒฝ์๋ ํฌ๊ฒ 2๊ฐ์ง๊ฐ ์์๋ค. ์ฒ์์๋ ๋ชจ๋ ธ๋ ํฌ๋ก ์ ํํ๋ฉด์ ๊ฐ๊ฐ ๋ค๋ฅด๊ฒ ๋ฒ์ ๋์ ๊ด๋ฆฌํด์ผํ๋ ๋ถ๋ถ์ด์๊ณ , ๋๋ฒ์งธ๋ก๋ ์ ์ฌ์ ์ผ๋ก ์ผ์ ํ ๋ฒ์ ์ ๊ฐ์ ธ๊ฐ๊ธฐ ์ํด์ ํ์๋ฅผ ์งํํ์๋ค. ์ค๊ฐ์ค๊ฐ์๋ ๋ณ๊ฒฝ๋๋ ๋ถ๋ถ์ด ์์๋๋ฐ ๊ทธ๋๋ง๋ค ํ์๋ค๋ผ๋ฆฌ ๋ชจ์ฌ์ ๋ช์๊ฐ๋์ ํ์ํ ๊ฒฝํ๋ค์ด ์๋ค. ๊ทธ ํ ๋ฐฉํฅ์ด ์ ํด์ง๋ฉด ์๋ํ๋ฅผ ํตํด์ ๋ฒ์ ๋์ ์งํํ๋๋ฐ , ๋ฒ์ ๋ ๊ด๋ จํด์ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋์ด์ ๋๋ฌด ํธ๋ฆฌํ๋ค. ์ถํ์๋ ์๋์ผ๋ก ๋ ธ์ ์ ์ถ๊ฐํด์ฃผ๋ ๋ถ๋ถ๋ ์งํํ๋๋ฐ ๋ชจ๋๊ฐ ๋ฒ์ ์ ํ์ธํ๊ธฐ ์ฌ์์ ๊ต์ฅํ ์ข์ ๊ฒฝํ์ด์๋ค.
2 ๋จ๊ณ๋ก ๋๋์ด์ ์ถ๊ฐํ๋ค. ์ฒซ๋ฒ์งธ๋ ์ด์ ๋ฒ์ ์ ๊ฐ์ ธ์ค๋ action , ๋๋ฒ์งธ๋ ๊ทธ ๋ฒ์ ์์ 1์ฌ๋ ค์ ๋ฒ์ ์ ์ถ๊ฐํ๋ ๊ณผ์ ์ด๋ค.
.github ํด๋์ actions ํด๋ ๋ง๋ค๊ณ , action์ ์ถ๊ฐํ๋ค. ์ด์ ๋ฒ์ ์ ๊ฐ์ ธ์ค๋ฏ๋ก , get_latest_version ์ด๋ผ๋ ํด๋ ์์ฑ ํ ๋ด๋ถ์ action.yml ํ์ผ์ ์์ฑํ๊ณ , ์๋์ ๊ฐ์ด ์
๋ ฅํ๋ค.
yaml
name: get_latest_version
outputs:
version:
value: ${{ steps.get-tag.outputs.result }}
runs:
using: composite
steps:
- id: get-tag
shell: bash
run: |
git fetch --all --tags
tag=$(echo `git tag -l --sort -v:refname "v*" --merged HEAD | head -n 1` | cut -d/ -f2)
echo latest tag: $tag
echo "result=$tag" >> $GITHUB_OUTPUT
outputs : ํด๋น action์ ์ํํ๊ณ version์ด๋ผ๋ ๊ฐ์ ๋ค๋ฅธ action์์ ์ธ ์ ์๋๋ก ์ ์ฅํ๋ค.using: composite : ์ฌ๋ฌ ๋จ๊ณ๋ฅผ ์ํํ๊ธฐ ์ํ ๋ช
๋ น์ดshell: bash : bash ์์ ์ด์ฉํด์ ๋ช
๋ น์ ์ํํ๋ค๋ ์๋ฏธrun ์ ๊ฒฝ์ฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
v ~ ํํ์ ํ๊ทธ๋ฅผ ๊ฐ์ ธ์์ ๊ฐ์ฅ ์ต์ ํ๊ทธ๋ฅผ ๊ฐ์ ธ์์ tag์ ์ ์ฅํ๋ค.๋ง์ฐฌ๊ฐ์ง๋ก actions ํด๋์ versioning ํด๋๋ฅผ ์ถ๊ฐํ๊ณ , action.yml ํ์ผ ์์ฑ ํ ์๋์ ๊ฐ์ด ์
๋ ฅํ๋ค.
yaml
name: versioning
inputs:
segment:
required: true
previous:
required: true
description:
required: true
outputs:
new_version:
value: ${{ steps.versioning.outputs.new_version }}
runs:
using: composite
steps:
- id: commit-info
shell: bash
run: |
echo "commit_id=$(echo `git log -n 1 --pretty=format:%H` | cut -c -12)" >> $GITHUB_OUTPUT
echo "username=$(echo `git log -n 1 --pretty=format:%an`)" >> $GITHUB_OUTPUT
echo "email=$(echo `git log -n 1 --pretty=format:%ae`)" >> $GITHUB_OUTPUT
- id: versioning
shell: bash
run: |
version=$(echo ${{ inputs.previous }} | cut -d 'v' -f2)
major=$(echo $version | cut -d '.' -f1 )
minor=$(echo $version | cut -d '.' -f2 )
patch=$(echo $version | cut -d '.' -f3 )
if [[ ${{ inputs.segment }} == 'minor' ]]
then
_new_version=$(echo v$major.$((minor+1)).0)
elif [[ ${{ inputs.segment }} == 'patch' ]]
then
inputs : versioning์ ์ฌ์ฉ๋๋ 3๊ฐ์ ๋ณ์๋ค.
segment : minor ์ธ์ง , patch ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ค.previous : ์ด์ ๋ฒ์ ์ ๋ํ๋ธ๋ค.description : PR ์ title ์ ๊ฐ์ ธ์จ๋ค.outputs : ์ ๋ฒ์ ์ ๊ฐ์ ธ์จ๋ค.commit-info : merge commit์ด ๊ฐ์ฅ ๋ง์ง๋ง์ ๋ถ๊ฒ ๋๋๋ฐ , ํด๋น merge commit ์ id , username , email ์ ๊ฐ์ ธ์จ๋ค. ํด๋น ์ ๋ณด๋ ๋ค์ ๋ฒ์ ๋์ ์ฌ์ฉ๋๋ค.versioning : ์ด์ ๋ฒ์ ์ ๊ฐ์ ธ์จ ํ , segment ์ ๋ฐ๋ผ์ ๋ฒ์ ๋์ ์งํํ๋ค.push-tags : ์๋ก์ด ๋ฒ์ ๋์ ์งํํ๋ค..github ์ workflows ํด๋ ๋ด๋ถ์ auto_versioning.yml ํ์ผ์ ์์ฑ ํ ์๋์ ๊ฐ์ด ์
๋ ฅํ๋ค.
yml
name: auto_versioning
on:
pull_request:
types:
- closed
jobs:
changes:
if: github.event.pull_request.merged == true
runs-on: ubuntu-latest
steps:
- id: get-tags
uses: actions/checkout@v4
with:
fetch-depth: 0
- id: get-latest-version
uses: ./.github/actions/get_latest_version
- id: versioning
uses: ./.github/actions/versioning
with:
segment: patch
previous: ${{ steps.get-latest-version.outputs.version }}
description: ${{ github.event.pull_request.title }}
pull-request ๊ฐ ๋ซํ๊ณ , merged event๊ฐ ๋ฐ์ํ๋ฉด ํด๋น action์ด ๋์ํ๋ค.
get-tags : ์์ค์ฝ๋๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด checkout์ ์งํํ๋ค. ์ด๋ , fetch-depth: 0 ์ผ๋ก ๋ชจ๋ ๊ธฐ๋ก์ ๊ฐ์ ธ์จ๋ค. ์ถ๊ฐํ์ง ์์ผ๋ฉด , ๊ฐ์ฅ ์ต๊ทผ ์ปค๋ฐ๋ง ๊ฐ์ ธ์จ๋ค.get-latest-version : ์์์ ๋ง๋ get_latest_version ๋ฅผ ์ฌ์ฉํด์ ์ต๊ทผ ๋ฒ์ ์ ๊ฐ์ ธ์จ๋ค.versioning : ๋ณ์๋ค๊ณผ ํจ๊ป ๋ฒ์ ๋์ ์งํํ๋ค. ์ผ๋จ์ patch ๋ฒ์ ๋ง ์ฆ๊ฐ์ํค๊ธฐ ์ํด์ segment ์ patch๋ฅผ ๋ฃ์ด์ฃผ๊ณ , ์ด์ ๋ฒ์ ๊ณผ description ๋ ์ถ๊ฐํด์ค๋ค.์ ๋ณ๊ฒฝ์ฌํญ์ push ํ , pr ์ ์์ฑํ๋ค.

๊ทธ ํ , merge pull request ๋ฅผ ๋๋ฅด๊ฒ ๋๋ฉด

์๋์ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค ! ํด๋น ์ค๋ฅ์ ๋ํด์ ์ฐพ์๋ณด๋ , workflow์ ๊ถํ์ด ์ถ๊ฐ๋์ด์์ง ์์์ ๋ฐ์ํ๋ ํ์์ด๋ผ๊ณ ํ๋ค. ์ฐธ๊ณ ๋งํฌ
๋ฐ๋ผ์ settings > actions > general > Workflow permissions ์์ Read and write permissions ์ ์ ํํด์ค๋ค.

๊ทธํ actions์์ ์คํจํ action ํด๋ฆญ ํ , Re-run jobs ๋ฅผ ํด๋ฆญํ๋ฉด

์ฑ๊ณต์ ์ผ๋ก versioning์ด ์งํ๋๊ณ tag๊ฐ ์ฐํ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.

์ด์ ์ ๋ฒ์ ๋์ด ๋๋ฌด ์์ฃผ ๋ฐ๋์ด์ ํท๊ฐ๋ฆฌ๊ณ ๋ณต์กํ ๋ถ๋ถ์ด ๋ง์ด ์์๋๋ฐ , ๊ฐ๋จํ ๋ฐฉ๋ฒ์ผ๋ก ์ ๋ฆฌํ ์ ์์ด์ ์ข์ ์๊ฐ์ด์๋ ๊ฒ ๊ฐ๋ค. ํนํ ํผ์ ๊ฐ๋ฐํ ๋๋ ๋ฒ์ ์ ์ ์ ๋ฆฌํ๊ณ ์ถ์๋๋ฐ , ๊ทธ ๋ชฉํ๋ ์ด๋ฃฌ ๊ฒ ๊ฐ์์ ๋ฟ๋ฏํ๋ค. ๋ค์ ์์ ์ผ๋ก๋ notion์ ๋ฒ์ ๋์ ์ถ๊ฐํ๋ ์์ ์ ์งํํ๋ ค๊ณ ํ๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด ํจ์น๋ ธํธ๋ ์์ฑํ ์ ์์ ๊ฒ ๊ฐ์์ ๋ ๋ณธ๊ฒฉ์ ์ธ ํ๋ก์ ํธ๊ฐ ์งํ๋ ๊ฒ ๊ฐ๋ค.
์ github actions๊ฐ ์๋ repo๋ ์ฌ๊ธฐ ์์ ํ์ธํ์ค ์ ์์ต๋๋ค.