๐ ํํซ์ ๋ฐฐํฌ์ ๋ฒ์ ๋ ๊ด๋ฆฌ ์๋ํํ๊ธฐ
์ด๋ฒ๊ธ์์๋ ํํซ์ ์ปค๋จธ์ค ์ค์ฟผ๋์์์ด๋ป๊ฒ ์น ๋ฒ์ ๋์ ํ๊ณ ์์๋์ง
๊ทธ๋ฆฌ๊ณ ์ด๋ค ๊ฐ์ ์ ์๋ํ๊ณ , ์์ผ๋ก ํ ์ผ์ ๋ฌด์์ด ์์์ง ์์ฑํด๋ณด์์ต๋๋ค.
๊ณ ๋ฏผ์ ์์
์ปค๋จธ์ค ์ค์ฟผ๋์์๋ ํ๋ก ํธ์๋, ๋ฐฑ์๋๊ฐ์ Versioning ๋ฐฉ์์ด ์์์ต๋๋ค. Versioning ์ ์ํด์ Release Note์ ์ง์ tag๊ฐ์ ์ ๋ ฅํ๊ณ ์์์ต๋๋ค.
๋ฐ์์ง ์์๋๋ ํฌ๊ฒ ๋ฌธ์ ๊ฐ ์์์ผ๋ ์ ์ ์์ด ๋ฐ์๋ ์๋ ๋ฐฐํฌ๋ฅผ ์ํด์ ํด์ผํ๋ ์ฌ๋ฌ๋ฒ์ ํด๋ฆญ๊ณผ ์ ๋ ฅ์ ์คํธ๋ ์ค๊ฐ ๋๊ธฐ์ ์ถฉ๋ถํ์ต๋๋ค.
์ด๋ฐ ๋ฐ๋ณต์ ์ธ ์์ ์ ์ค์ด๊ธฐ ์ํด์๋ ์๋ํ๋ ๋ฒ์ ๋์ด ํ์ํ๋ค๊ณ ์๊ฐ๋์๊ณ , ์ฌ์ฉ๊ธฐ์ ์ ๊ด๊ณ์๋ ๋ฒ์ ๋๋ฐฉ์์ด ์์ผ๋ฉด ๋ ์ข์ ๊ฒ ๊ฐ์์ต๋๋ค.
๋ฐฐํฌ ํ์๋ Release Note ๋ด์ฉ์ ๋ชจ๋ ๊ตฌ์ฑ์์ด ์๋ slack ์ฑ๋์ ๊ณต์งํ์๋๋ฐ, ๊ณต์ง ๋ด์ฉ์๋ task ๋งํฌ (์์ฌ๋ ๋งํฌ)๋ฅผ ํจ๊ป ์ ์ด์ค์ผํ์ต๋๋ค.
์ ๊ด๋ถ์์์๋ pr ๋งํฌ๋ก ๋ด์ฉํ์ธ์ ํ ์๊ฐ ์์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ฅผ ์ํด์๋ PR์ ์ ์ด๋ ์์ฌ๋ ๋งํฌ๋ฅผ ๋ค ๊ฐ์ ธ์์ ๋ด์ฉ์ ์ฌ๊ตฌ์ฑํด์ผํ๋๋ฐ, ์ด๊ฒ ๋ํ ๊ท์ฐฎ๊ณ ์๊ฐ์ด ์๊น์ด ์ผ์ด์์ต๋๋ค.
์ด๋ฌํ ์ด์ ๋ก ๋ฒ์ ๋์ ํ๋ฉด์ Release Note ๋ด์ฉ๋ ์ปค์คํ ์ ํ๋ฉด ์ข๊ฒ ๋ค๋ผ๋ ์๊ฐ์ ํ๊ฒ ๋์์ต๋๋ค.
๊ทธ๋์ ๋ฌด์์ด ํ์ํ๊ฐ?
- ์ฌ์ฉ๊ธฐ์ ์ ๊ด๊ณ์๋ ์๋ํ๋ ๋ฒ์ ๊ด๋ฆฌ
- ๋ฐ๋ก ๊ณต์ ํ๊ธฐ ํธํ Release Note์ ์์ฑ
๐ ๊ธฐ์กด๋ฐฉ์
ํ๋ก ํธ์๋๋ YYYY-MM-DD-hhmm
ํ์์ผ๋ก ์๊ฐ์ tag๋ก ์ฌ์ฉํ๊ณ ์์์ต๋๋ค.
์๊ฐํ์์ tag๋ ์ ๋ํฌํ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ด์ ์ ๋ฒ์ ์ ๋ํด์ ๋ชฐ๋ผ๋ ๋๋ ์ฅ์ ์ด ์์์ต๋๋ค.
โ๏ธํ์ง๋ง ํ์ฌ ๋ฒ์ tag์ ๋ฏธ๋ ๋ฒ์ tag์ ๋ํ ์ถ์ธก์ด ์๋๋ ๊ฒ์ด ๋จ์ ์ด์์ต๋๋ค. (๋ ์ง, ์๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ค์ ๋์๋ก ๋๊ปด์ก์ต๋๋ค.)
๋ฐฑ์๋๋ Semantic Version ํ์์ tag๋ฅผ ์ฌ์ฉํ๊ณ ์์์ต๋๋ค.
tag ์์ฑ์ ์๋์ผ๋ก ํ์๊ธฐ์, ์ค์๋ก ๊ฑด๋๋ฐ๋ ๋ฒ์ ์ด ๋ฐ์ํ๊ธฐ๋ ํ์ต๋๋ค. ๐คญ
๋ฒ์ ์์๋ฅผ ์ ์งํค๊ธฐ ์ํด์๋ ์ด์ tag๊ฐ ๋ฌด์์ธ์ง ์ฒดํฌ๊ฐ ํ์ํ์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉดโฆ โ์ฐ๋ฆฌ์ ์น์ ์ผ๊ด์ฑ์๋ ๋ฒ์ ๊ด๋ฆฌ๊ฐ ๋๊ณ ์๋๊ฐ?โ ์ ๋ํ ๊ณ ๋ฏผ์ด ๋๊ธฐ ์์ํ์ต๋๋ค.
๐ฏ ๋ชฉํ
- Consistency : ์ฌ์ฉ๊ธฐ์ ์ ๋ฌด๊ดํ (javascript, python ๋ฑ) ๋ฒ์ ๋ ๋ฐฉ์
- Automatic : ์๋๋ฒ์ ๋์์ ์๋์ผ๋ก ๋ฒ์ ๋์ผ๋ก์ ๋ณ๊ฒฝ์ด ํ์
- Easy : ๋ฐฐํฌํ์ ์ ๊ด๋ถ์ ๋ฐ ๊ฐ๋ฐ์๋ค์๊ฒ ๋ฐ๋ก ๊ณต์ ํ ์ ์๋ Release Note
Github Action์ ์ฌ์ฉํ์ฌ ์๋ฒ ๋ฐฐํฌ๋ฅผ ํ๊ณ ์๊ธฐ ๋๋ฌธ์, Github Action์ ์ฌ์ฉํ์ฌ Release Note๋ฅผ ์์ฑํด๋ณด๊ธฐ๋ก ํ์ต๋๋ค.
Action์ workflow(*.yml)ํ์ผ์์๋ shell script๋ฅผ ์คํํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ github-script๋ฅผ ์ฌ์ฉํ๋ฉด javascript๋ก ์คํ์ด ๊ฐ๋ฅํฉ๋๋ค.
typescript๋ก ๊ฐ๋ฐํ๊ธฐ
๋น ๋ฅธ ๊ฐ๋ฐ์ ์ํด์๋ javascript๋ง ์ฌ์ฉํด๋ ๋์ง๋ง, ์๋ฌด๋๋ ์ค์ํ๊ธฐ ์ฌ์ด javascript๋ง์ผ๋ก๋ ๋ถ์กฑํ๋ค๊ณ ์๊ฐ๋์์ต๋๋ค.
๊ทธ๋์ typescript๋ก ๊ฐ๋ฐํ ์ ์๋๋ก webpack, typescript๋ฅผ ์ค์นํ์ต๋๋ค.
๐ป ํ๋ก์ ํธ Setup
script ์ถ๊ฐ
- build ์คํฌ๋ฆฝํธ: package.json์์ ๊ธฐ์กด build file ์ญ์ ๋ฐ webpack ์คํ
npm ํจํค์ง ์ค์น
- Ocktokit์ Github API๋ฅผ ์ฌ์ฉํ ์ ์๋ ํจํค์ง์
๋๋ค.
์ ๋ Octokit์ type์ ์ฌ์ฉํ๊ธฐ ์ํด์ ์ค์นํ์์ต๋๋ค. (github-script์ด Octokit์ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ฅ๊ตฌํ์ ์ํด์ ํ์ํ์ง๋ ์์์ต๋๋ค.)
์ด๋ค ์์๋ก ๋ง๋ค๋ฉด ๋ ๊น?
๋
ธ๋์์ญ : Github API ๋ฅผ ์๋ฏธํฉ๋๋ค.
ํ๋์์ญ: ์ผ๋ฐ ํจ์๋ฅผ ์๋ฏธํฉ๋๋ค.
Example โ Functional Code
๊ธ์ ๊ฐ๋ ์ฑ์ ์ํด์ ์ค์ ์ฝ๋์์ ์ผ๋ถ ์ฝ๋(๋ด์ฉ ์ดํด์ ๊ผญ ํ์ํ์ง ์์ ์ฝ๋, tryโฆcatch๋ฌธ, console, ์์ธ์ฒ๋ฆฌ)๋ ์ ์ธํ๊ณ , ์ฝ๊ธฐ ์ฝ๋๋ก ๋ณํํ์์ต๋๋ค.
ํ์ ์ ์
์ฝ๋์์ ์ฌ์ฉํ๋ Type์ ๋๋ค. (๊ธฐ๋ฅ์ ์ํฅ์ ์ฃผ๋ ๋ถ๋ถ์ด ์๋๊ณ ์๋์์ฑ์ ์ํด์ ์ถ๊ฐํ type์ด๋ฏ๋ก ์ค๋ช ์ ์ฃผ์์ผ๋ก ๋์ ํ๊ฒ ์ต๋๋ค.)
Release Note ์์ฑ ํจ์
createRelease ๋ 2๊ฐ์ง ์ผ์ ํฉ๋๋ค.
- ์ ๊ท ๋ฒ์ ์์ฑ : generateNewTagFromLatestRelease๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ท tag๋ฅผ ์์ฑํฉ๋๋ค.
- Release Note ์์ฑ : creator ํจ์๋ Github์ Release Note๋ฅผ ์์ฑํฉ๋๋ค.
์ ๊ท tag ์์ฑํจ์
generateNewTagFromLatestRelease : ์ ๊ท tag(๋ฒ์ )์ ์์ฑํฉ๋๋ค.
์ ๊ท tag๋ฅผ ์์ฑํ ๋๋ input์ด ํ์ํฉ๋๋ค.
input ์ ์ด๋ค๋ฒ์ ์ผ๋ก ์
๊ทธ๋ ์ด๋๋ฅผ ํ ์ง ๊ฒฐ์ ํ๊ฒ ๋์์ค๋๋ค.
github-script์ context.payload์๋ Action์ workflow์์ ์ ํํ input์ ๋ฐ์ ์ ์์ต๋๋ค.
(์ด๋ป๊ฒ workflow์ input์ ๋ฐ๋์ง๋ ์๋์ <Example โ Action Code> ํํธ์์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.)
๋ง์ฝ input์ผ๋ก ๋ฐ์ ๋ณ์๊ฐ์ด(upgradeVersionType)์ผ๋ก ๋ฒ์ ํ์์ด ๊ฒฐ์ ๋ฉ๋๋ค.
- major : ๊ฐ์ฅ์์ ์ซ์๋ฅผ ์ฆ๊ฐ ๋ฐ ๋๋จธ์ง๋ 0์ผ๋ก ๋ณ๊ฒฝ
- minor : ์ค๊ฐ ์ซ์๋ฅผ ์ฆ๊ฐ ๋ฐ ๋ง์ง๋ง ์ซ์๋ฅผ 0์ผ๋ก ๋ณ๊ฒฝ
- patch : ๋ง์ง๋ง ์ซ์๋ฅผ ์ฆ๊ฐ์ํด
Release Note ์ปจํ ์ธ ์์ฑํจ์
generateReleaseNoteContent : Release Note์ ๋ฃ์ ๋ด์ฉ์ ์์ฑํฉ๋๋ค.
getPR์ ๊ฐ PR์์ ํ์ํ ์ ๋ณด(Title, PR Number, Asana URL)๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
์๋์์ฑ๋ ๋ด์ฉ์ ํ์์ ์ฐธ๊ณ ํด๋ณด๋ฉด url์ pull ๋ค์์๋ pr๋ฒํธ๋ฅผ ๊ฐ์ ธ์ค๊ณ , PR์ ๋ด์ฉ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
(์ฐธ๊ณ . ์ ํฌ ์ปค๋จธ์ค(ํ์, ์ฃผ๋ฌธ) ์ค์ฟผ๋์์๋ PR์ ๋ด์ฉ์ Asana URL์ ๋ฃ์ต๋๋ค.)
Asana URL์ด ์๋ ๊ฒฝ์ฐ๋ ์ ๋ชฉ๊ณผ PR๋ฒํธ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. (URL ํ์์ด ์๋ ๊ฒฝ์ฐ๋ โAsana link๊ฐ ์์ต๋๋ค.โ)
โ Release Note์ ์์ฑ
์ด๋ ๊ฒ ์์ฑ๋ Release Note๋ ๋ฐ๋ก slack ์ฑ๋์ ๊ณต์ ๋ ์ ์์ต๋๋ค. ๐จโ๐ฆโ๐ฆ
์ ๋ฆฌ๋ Release Note ๋ด์ฉ์ ๋ฐํ์ผ๋ก ๋น๊ฐ๋ฐ ๋ถ์์์๋ ์์ฌ๋ URL๋ก ๋ฐฐํฌ๋ด์ฉ์ ํ์ธํ ์ ์๊ณ , ๊ฐ๋ฐ์๋ PR ๋งํฌ๋ฅผ ํตํด์ ์ฝ๋ํ์ธ์ ํ ์ ์์ต๋๋ค.
Example โ Action Code
ํํซ๋ชฐ์ Action์์ Release Note๋ฅผ ๋ง๋ค์ด๋ด๋ ์์ ์ ์ํํ๊ธฐ ์ํด์๋ javascript ๋ฅผ ์ง์ ์คํํ ์ ์๋ github-script๋ฅผ ์ฌ์ฉํ๋๊ฒ์ด ํธํฉ๋๋ค.
workflow ์คํ์กฐ๊ฑด (on)
- ์๋์คํ โ workflow_dispatch
- generateNewTagFromLatestRelease์์ ์ฌ์ฉํ inputs๊ฐ์ ์ฌ๊ธฐ์์ ํ์ธํ ์ ์์ต๋๋ค.
- ๊ธฐ๋ณธ๊ฐ์ patch ํด์ฃผ์์ต๋๋ค.
workflow์ ์์ (job)
create-release๋ผ๋ job์ ๋ง๋ค์์ต๋๋ค. job์๋ 3๊ฐ์ง step์ด ์์ต๋๋ค.
Install NPM(npm ์ค์น)
- ์์์ ์์ฑํ๊ณ ๋ฐฐํฌํ ์คํฌ๋ฆฝํธ๋ฅผ ์ค์นํฉ๋๋ค.
Print Current Version(ํ์ฌ ๋ฒ์ ํ์)
- ํ์ฌ ์ฌ์ฉํ๋ ์คํฌ๋ฆฝํธ์ ๋ฒ์ ์ ํ์ํฉ๋๋ค. ์คํฌ๋ฆฝํธ๋ฅผ ๋ณ๋์ repo๋ก ๊ด๋ฆฌํ๋ ์ด์ ๋ 2๊ฐ์ง๊ฐ ์์ต๋๋ค.
- ์ฌ๋ฌ repo์์ ๊ณตํต์ผ๋ก ์ฌ์ฉ
- ํญ์ ์ต์ ๋ฒ์ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉ (ํ๋ก์ ํธ ๋ด์์ ์์ ํ๋ฉด ํ๋ก์ ํธ์ ์๊ด์๋ commit์ ๋ง๋ค๊ณ ๋ฐฐํฌํด์ผํฉ๋๋ค.)
Create Release(์คํฌ๋ฆฝํธ ์คํ)
- github-script๋ ๊ธฐ๋ณธ์ ์ผ๋ก github, context object๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๊ฒ์ ๋๊ฒจ์ ์ฌ์ฉํ๊ฒ์ด ์คํฌ๋ฆฝํธ ์ฝ๋์ GithubScriptInput ํ์ ์ ๋๋ค.
๐ ๋ง๋ฌด๋ฆฌํ๋ฉฐ
๐ฅฐ ์ด๋ค๊ฒ์ด ์ข์์ก๋?
๋ฒ์ ๋์ ์๋์ผ๋ก ํ๊ฒ ๋๋ฉด์ ํ์คํ tag ์์ฑ์ ๋ํ ๋ถ๋ด์ด ์ฌ๋ผ์ก์ต๋๋ค. ์ง์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์๊ธฐ ๋๋ฌธ์ ํ์ํ๋ค๋ฉด ์ํ๋๋๋ก ๋ฒ์ ๋ ๋ฐฉ๋ฒ์ ์์ ํ ์ ์์ต๋๋ค.
github action์ผ๋ก ์คํํ๊ธฐ ๋๋ฌธ์, ํ๋ก์ ํธ์ ์ฌ์ฉ๊ธฐ์ ์ ์๊ด์์ด git์ tag๋ก ๋ฒ์ ๋์ด ๊ฐ๋ฅํ๊ฒ ๋์์ต๋๋ค.
๐ค ๋ ๊ณ ๋ฏผํด์ผํ ๋ด์ฉ
<ํ
์คํธ์ฝ๋์ ๋ถ์ฌ>
ํ์ฌ ๋ฒ์ ๋ ์คํฌ๋ฆฝํธ์์๋ ํ
์คํธ ์ฝ๋๊ฐ ์์ต๋๋ค.
ํ
์คํธ ์ฝ๋๊ฐ ์์ผ๋ฏ๋ก ๋ฆฌํฉํ ๋ง์ ํ๊ธฐ๊ฐ ์ฝ์ง ์์ต๋๋ค. ํ
์คํธ์ฉ repo๋ฅผ ๋ง๋ค์ด์ ์คํํด๋ณด๋ฉด ๋์ง๋ง ๊ฝค๋ ๋นํจ์จ์ ์ธ ๋ฐฉ๋ฒ์
๋๋ค.
ํ
์คํธ ์ฝ๋๋ฅผ ์ ์ฉํ๊ธฐ ์ํด์๋ ํ์ฌ ํจ์๋ค์ ํ
์คํธ ์ ์ฉ์ด ๊ฐ๋ฅํ ์ฝ๋๋ก ๋ณ๊ฒฝํด์ผํฉ๋๋ค. ์ฒ์๋ถํฐ ํ
์คํธ ์ฝ๋๋ฅผ ๋ฃ์๋ค๋ฉด ๋ ์ข์์๊ฒ ๊ฐ์ต๋๋ค.
<ํ๋ก์ ํธ๋ด์ ๋ฒ์ ํ์ ๋ถ๊ฐ>
git tag๋ก ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ํ๊ธฐ ๋๋ฌธ์, git์ด ์๋ ํ๊ฒฝ์์๋ (ํ๋ก์ ํธ ์์ค์ฝ๋๋ง ์๋ ์ํฉ) ๋ฒ์ ์ ์ ์๊ฐ ์์ต๋๋ค.
github API๋ก Latest Release ๋ฅผ ์กฐํํ๋ฉด ๋์ง๋ง, ์ด ๋ฐฉ์์ ํญ์ token์ด ํ์ํฉ๋๋ค. ๋ฐ๋ผ์ ํ๋ก์ ํธ๋ด์ ํ์ฌ ๋ฒ์ ์ ์ ์ฅํ ์ ์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋ํ ๊ณ ๋ฏผ๋ ํ์ํฉ๋๋ค.
์ฝ์ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
Reference
- semantic version : https://semver.org/
github-script : https://github.com/actions/github-script#actionsgithub-script
Octokit ๋ฌธ์ : https://octokit.github.io/rest.js/v18
written by Steven (Sungjin Cho)
email: sj_cho@fitpet.co.kr