| name | deploy |
| description | Use when releasing a new version of naverworks โ runs preflight checks, creates and pushes a SemVer tag, and verifies the GitHub Actions release workflow that builds artifacts and publishes npm packages. Triggers on "๋ฐฐํฌ", "๋ฆด๋ฆฌ์ค", "deploy", "release", "/deploy". If you only need to inspect or create tags, use version. If you only need local binaries, use build. |
naverworks ์๋ ๋ฐฐํฌ
์ด ์ ์ฅ์๋ v* ํ๊ทธ๊ฐ ์๊ฒฉ์ push๋๋ฉด GitHub Actions๊ฐ ํฌ๋ก์ค ํ๋ซํผ ๋น๋, GitHub Release ์์ฑ, npm publish๋ฅผ ์ํํ๋ค. ์ด ์คํฌ์ ๊ทธ ์ ๋จ๊ณ ๊ฒ์ฆ๊ณผ ํ๊ทธ push, ๊ฐ๋ฅํ ๋ฒ์์ ์ฌํ ๊ฒ์ฆ์ ์๋์ผ๋ก ์ํํ๋ค.
์
์ถ๋ ฅ ๊ณ์ฝ
์
๋ ฅ
| ์
๋ ฅ | ํ์ ์ฌ๋ถ | ์ค๋ช
|
|---|
version | ์ ํ | ๋ฆด๋ฆฌ์คํ SemVer (0.1.1 ํ์). ์์ผ๋ฉด ์ฌ์ฉ์์๊ฒ ๋ฌป๋๋ค |
์ถ๋ ฅ
| ํ๋ | ์ค๋ช
|
|---|
tag | ์์ฑ/ํธ์ํ ํ๊ทธ (v<version>) |
preflight | go mod tidy, go test, go vet, git status ๊ฒฐ๊ณผ |
push_status | ์๊ฒฉ push ์ฌ๋ถ |
release_status | GitHub Release ํ์ธ ๊ฒฐ๊ณผ |
npm_status | npm ํจํค์ง ๋ฒ์ ํ์ธ ๊ฒฐ๊ณผ |
์ฑ๊ณต ๊ธฐ์ค
- ํ๊ทธ push ์ ๊ฒ์ฆ์ด ๋ชจ๋ ํต๊ณผํ๋ค.
git push origin v<VERSION>๊น์ง ์ฑ๊ณตํ๋ค.
gh๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉด GitHub Release ๋๋ ์ํฌํ๋ก ์ํ๋ฅผ ํ์ธํด์ ๋ณด๊ณ ํ๋ค.
์คํ ๊ท์น
- ๋ชจ๋ ๋จ๊ณ๋ฅผ ์ง์ Bash๋ก ์คํํ๋ค.
- ๊ฐ ๋ช
๋ น์ ๊ฐ๋ณ๋ก ์คํํ๊ณ ์ข
๋ฃ ์ฝ๋๋ฅผ ํ์ธํ๋ค.
- ์ฌ์ฉ์ ์
๋ ฅ์ด ํ์ํ ๊ฒ์ ๋ฒ์ ๋ฒํธ์ ํ๊ทธ push ์น์ธ๋ฟ์ด๋ค.
- ์๊ฒฉ ํ๊ทธ push๋ GitHub Actions Release ์ํฌํ๋ก๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ฏ๋ก ๋ฐ๋์ ์ฌ์ฉ์ ํ์ธ ํ ์คํํ๋ค.
- ํ๊ทธ push ์ดํ์๋ workflow๊ฐ ์ธ๋ถ์์ ์งํ๋๋ฏ๋ก, npm unpublish ๊ฐ์ ํ๊ดด์ ๋กค๋ฐฑ์ ์๋ ์ํํ์ง ์๋๋ค.
์ ์ฐจ
Phase 0: ๋ฒ์ ํ์ธ
์ฌ์ฉ์๊ฐ ์ธ์๋ก ๋ฒ์ ์ ์ ๊ณตํ์ผ๋ฉด ์ฌ์ฉํ๋ค. ์์ผ๋ฉด ๋ฌป๋๋ค:
- SemVer ํ์ (์:
0.1.0)
v ์ ๋์ฌ๋ ์๋์ผ๋ก ๋ถ์ธ๋ค
Phase 1: ์ฌ์ ๊ฒ์ฆ
์๋๋ฅผ ๊ฐ๋ณ ๋ช
๋ น์ผ๋ก ์์๋๋ก ์คํํ๋ค. ํ๋๋ผ๋ ์คํจํ๋ฉด ํ๊ทธ๋ฅผ ๋ง๋ค์ง ์๊ณ ์ฆ์ ์ค๋จํ๋ค.
go mod tidy
git diff --exit-code go.mod go.sum
โ ์ข
๋ฃ ์ฝ๋ != 0์ด๋ฉด go.mod/go.sum์ด ๋ณ๊ฒฝ๋์์ต๋๋ค. ๋จผ์ ๊ฒํ ํ ์ปค๋ฐํ์ธ์๋ก ์ค๋จ
go test ./... -count=1
go vet ./...
git status --porcelain
โ ์ถ๋ ฅ์ด ์์ผ๋ฉด ์ํน ํธ๋ฆฌ๊ฐ cleanํ์ง ์์ต๋๋ค๋ก ์ค๋จ
๊ฐ๊ฒฐํ ๋ณด๊ณ ์์:
โ go mod tidy โ ๋ณ๊ฒฝ ์์
โ go test โ PASS
โ go vet โ ์ด์ ์์
โ git status โ clean
Phase 2: ๋ก์ปฌ ํ๊ทธ ์์ฑ
์ฌ์ฉ์์๊ฒ ํ์ธ: v<VERSION> ํ๊ทธ๋ฅผ ์์ฑํฉ๋๋ค. ์งํํ ๊น์?
์น์ธ ํ:
git tag v<VERSION>
Phase 3: ์๊ฒฉ ํ๊ทธ push
์ฌ์ฉ์์๊ฒ ํ์ธ: v<VERSION> ํ๊ทธ๋ฅผ pushํ๋ฉด GitHub Actions Release ์ํฌํ๋ก๊ฐ ์์๋ฉ๋๋ค. ์งํํ ๊น์?
์น์ธ ํ:
git push origin v<VERSION>
Phase 4: ๋ฆด๋ฆฌ์ค ๊ฒ์ฆ
gh๊ฐ ์ค์น๋์ด ์๊ณ ์ธ์ฆ๋์ด ์์ผ๋ฉด ์๋๋ฅผ ์ฌ์ฉํด ๊ฒ์ฆํ๋ค.
์ค์น ์ฌ๋ถ:
command -v gh
์ธ์ฆ ์ฌ๋ถ:
gh auth status
Release ํ์ธ:
gh release view v<VERSION>
โ ์ฆ์ ๋ณด์ด์ง ์์ผ๋ฉด 10์ด ๊ฐ๊ฒฉ์ผ๋ก ๋ช ์ฐจ๋ก ์ฌ์๋ํ๊ณ , ์ฌ์ ํ ์์ผ๋ฉด "์ํฌํ๋ก ์งํ ์ค์ผ ์ ์์"์ผ๋ก ๋ณด๊ณ
npm ํ์ธ:
6๊ฐ ํจํค์ง ๋ฒ์ ์ด <VERSION>๊ณผ ๋ชจ๋ ์ผ์นํ๋์ง ๊ฒ์ฆํ๋ค. ํ๋๋ผ๋ ์ผ์นํ์ง ์์ผ๋ฉด workflow๊ฐ ๋ถ๋ถ ์ฑ๊ณตํ์์ ์๋ฏธํ๋ฏ๋ก ์คํจ๋ก ๋ณด๊ณ ํ๋ค.
TARGET=<VERSION>
FAIL_COUNT=0
LOOKUP_FAIL=0
NPM_ERR=$(mktemp)
trap 'rm -f "$NPM_ERR"' EXIT
for pkg in naverworks \
@physics91org/linux-x64 @physics91org/linux-arm64 \
@physics91org/darwin-x64 @physics91org/darwin-arm64 \
@physics91org/win32-x64; do
if v=$(npm --loglevel=error view "$pkg" version 2>"$NPM_ERR"); then
if [ "$v" = "$TARGET" ]; then
printf "โ %-32s %s\n" "$pkg" "$v"
else
printf "โ %-32s %s (expected %s)\n" "$pkg" "$v" "$TARGET"
FAIL_COUNT=$((FAIL_COUNT+1))
fi
else
err=$(cat "$NPM_ERR")
case "$err" in
*E404*|*"404 Not Found"*)
printf "โ %-32s not published (expected %s)\n" "$pkg" "$TARGET"
FAIL_COUNT=$((FAIL_COUNT+1))
;;
*)
printf "! %-32s lookup failed: %s\n" "$pkg" "$err"
LOOKUP_FAIL=$((LOOKUP_FAIL+1))
;;
esac
fi
done
์ํ ํ์ ์ ์๋ ์ฐ์ ์์๋ฅผ ๋ฐ๋ฅธ๋ค (์ฒซ ๋ฒ์งธ๋ก ๋งค์นญ๋๋ ํญ๋ชฉ ํ๋๋ง ๋ณด๊ณ ). ํ์ ์คํจ(FAIL_COUNT)์ ์กฐํ ์คํจ(LOOKUP_FAIL)๊ฐ ๋์์ ๋ฐ์ํ๋ฉด ๋ ๋ค ํ์ํ๋ค:
FAIL_COUNT>0 && LOOKUP_FAIL>0: npm_status: partial_with_verification_failures โ <FAIL_COUNT>๊ฐ ์คํจ, <LOOKUP_FAIL>๊ฐ ์กฐํ ์คํจ. ํ์ ์คํจ์ ์กฐํ ์คํจ๊ฐ ์์ฌ ์์ผ๋ฏ๋ก ํธ๋ฌ๋ธ์ํ
์น์
์ฐธ์กฐ ํ ๋ ์ ํ์ ๊ฐ๊ฐ ์ฒ๋ฆฌํ๋ค.
FAIL_COUNT>0: npm_status: partial โ <FAIL_COUNT>๊ฐ ์คํจ. ์ผ๋ถ ํจํค์ง๊ฐ ๋ฏธ๊ฒ์(E404) ๋๋ ๋ฒ์ ๋ถ์ผ์น โ ํธ๋ฌ๋ธ์ํ
์น์
์ฐธ์กฐ ์๋ด.
LOOKUP_FAIL>0: npm_status: verification_failed โ <LOOKUP_FAIL>๊ฐ ์กฐํ ์คํจ. ๋ ์ง์คํธ๋ฆฌ/๋คํธ์ํฌ/์ธ์ฆ ๋ฌธ์ ์ด๋ฏ๋ก publish ์ฑ๊ณต ์ฌ๋ถ์ ๋ฌด๊ด โ ์ฌํ์ธ ํ์.
- ๊ทธ ์ธ:
npm_status: 6๊ฐ ํจํค์ง @<VERSION> ํ์ธ ์๋ฃ.
gh๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉด ํ๊ทธ push ์๋ฃ๊น์ง๋ง ํ์ ๋ณด๊ณ ํ๊ณ , Release/npm ๊ฒ์ฆ์ ์๋ต ์ฌ์ ๋ฅผ ํจ๊ป ๋ณด๊ณ ํ๋ค.
์ต์ข
๋ณด๊ณ
Release ํ์ธ ์ฑ๊ณต ์:
๋ฐฐํฌ ์์ ์๋ฃ: v<VERSION>
push_status: pushed
GitHub Release: https://github.com/physics91/naverworks-cli/releases/tag/v<VERSION>
npm: naverworks@<VERSION> ๋ฐ ํ๋ซํผ ํจํค์ง ํ์ธ ์๋ฃ
์ํฌํ๋ก๋ง ์์ ํ์ธํ ๊ฒฝ์ฐ:
๋ฐฐํฌ ์์ ์๋ฃ: v<VERSION>
push_status: pushed
release_status: GitHub Actions Release ์ํฌํ๋ก ์์๋จ
npm_status: ์์ง ํ์ธ๋์ง ์์
์คํจ ์ ๋์
- ํ๊ทธ push ์ ์คํจ: ํ์ํ๋ฉด ๋ก์ปฌ ํ๊ทธ๋ง ์ญ์ ํ๋ค.
git tag -d v<VERSION>
- ํ๊ทธ push ํ ์คํจ: workflow๊ฐ ์ด๋ฏธ Release ์์ฑ ๋๋ npm publish๋ฅผ ์์ํ์ ์ ์์ผ๋ฏ๋ก ์๋ ๋กค๋ฐฑํ์ง ์๋๋ค.
- ํ๊ทธ push ํ์๋ ๊ฐ์ ๋ฒ์ ์ ์ฌ์ฌ์ฉํ์ง ๋ชปํ ์ ์์ผ๋, ์ค์ ๊ฒ์ ์ํ๋ฅผ ํ์ธํ ๋ค ์ ๋ฒ์ ์ผ๋ก ์ฌ์๋ํ ์ง ๊ฒฐ์ ํ๋ค.
ํธ๋ฌ๋ธ์ํ
npm publish๊ฐ ENEEDAUTH, OIDC token exchange error - package not found, goreleaser already_exists ๋ฑ์ผ๋ก ์คํจํ ๊ฒฝ์ฐ references/oidc-troubleshooting.md๋ฅผ ์ฐธ์กฐํ๋ค. ์ฆ์๋ณ ์์ธ, ๋๋ฒ๊น
๋จ๊ณ(--loglevel=verbose, npm trust list, OIDC JWT claim ๋คํ), ํ์ ์ ์ ์กฐ๊ฑด ์ฒดํฌ๋ฆฌ์คํธ๋ฅผ ํฌํจํ๋ค.