Husky๋ Git hook์ ์ฝ๊ฒ ์ค์ ํ ์ ์๋๋ก ๋์์ฃผ๋ ๋๊ตฌ์์.
๋ณดํต pre-commit, commit-msg, pre-push ๋ฑ Git์ ํน์ ์์ ์ ์๋์ผ๋ก ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๊ฒ ํด์ค์.
์๋ฅผ ๋ค์ด:

npm install --save-dev husky
npx husky init
์ค์นํ๋ฉด package.json์ prepare ์คํฌ๋ฆฝํธ์ "husky"๊ฐ ์ถ๊ฐ๋ผ์:
"scripts": {
"prepare": "husky"
},
.husky ํด๋๊ฐ ์๊ธฐ๊ณ , .husky/pre-commit ํ์ผ๋ ํจ๊ป ์๊ฒจ์ (npm test ์คํ ์ฝ๋ ํฌํจ).
.husky/pre-commit ํ์ผ์ ์คํ ๊ถํ์ ์ค์.Husky ํ ํ์ผ์ ์ค์ ๋ก '์คํ๋๋ ์คํฌ๋ฆฝํธ'์ด๊ธฐ ๋๋ฌธ์, ์ด์์ฒด์ ์์ "์คํ ๊ฐ๋ฅํ ํ์ผ"๋ก ์ธ์์ํค๋ ๊ถํ ์ค์ ์ด ํ์ํด์.
chmod +x .husky/pre-commit
Prettier, Stylelint ๊ด๋ จ ์ํ๊ณ์๋ ๊ธฐ์ฌํ๊ณ ์๋ ๊ฐ๋ฐ์๊ฐ ๋ง๋ค์์ด์.
Git staging ์์ญ(= ์ปค๋ฐํ ํ์ผ๋ก ์ ํ๋ ์ํ)์ ์ฌ๋ผ๊ฐ ํ์ผ๋ง ๋์์ผ๋ก lint๋ ํฌ๋งท์ ์ ์ฉํ ์ ์์ด์.
์ ์ฒด ํ๋ก์ ํธ๋ฅผ ๊ฒ์ฌํ์ง ์์์ ์๋๋ ๋น ๋ฅด๊ณ , ๊ผญ ์ปค๋ฐํ ํ์ผ๋ง ๊ฒ์ฌํ๋ ํจ์จ์ ์ด๊ธฐ ๋๋ฌธ์ Husky์ pre-commit ํ
๊ณผ ํจ๊ป ์ฌ์ฉํด์.
npm install --save-dev lint-staged
.husky/pre-commit์ lint-staged ์คํ ์ฝ๋๋ฅผ ๋ฃ์ด์ค์.echo 'npx lint-staged' > .husky/pre-commit
package.json์ ์ค์ ๋ ์ถ๊ฐํด์ค์."lint-staged": {
"**/*.{js,ts,tsx}": [
"prettier --write",
"eslint --fix"
]
}
semantic-release, standard-version ๊ฐ์ ๋ฆด๋ฆฌ์ฆ ์๋ํ ๋๊ตฌ๋ ํจ๊ป ๊ด๋ฆฌํ๋ Conventional Changelog ํ์์ ๋ง๋ ์ปค๋ฐ ๋ฉ์์ง ๊ฒ์ฌ ๋๊ตฌ ํจํค์ง์์.
์ปค๋ฐ ๋ฉ์์ง๋ฅผ ๊ฒ์ฌํด์ ์ ํด์ง ๊ท์น์ ๋ง์ง ์์ผ๋ฉด ์ปค๋ฐ์ ๋ง๊ธฐ ๋๋ฌธ์ ํ ํ๋ก์ ํธ์์ ์ปค๋ฐ ๋ฉ์์ง ๊ท์น์ ํต์ผํ๊ธฐ ์ํด ์ฌ์ฉํด์.
husky์ commit-msg ํ ๊ณผ ํจ๊ป ์ฐ๊ฒฐํด์ ์ฌ์ฉํด์.
npm install --save-dev @commitlint/cli @commitlint/config-conventional
.commitlintrc.json ํ์ผ์ ์์ฑํ์ฌ "@commitlint/config-conventional" ๊ท์น์ ๋ถ๋ฌ์์ ์ ์ฉํด์.
echo '{ "extends": ["@commitlint/config-conventional"] }' > .commitlintrc.json
echo 'npx --no -- commitlint --edit "$1"' > .husky/commit-msg
chmod +x .husky/commit-msg
์ปค๋ฐ ๋ฉ์์ง๋ฅผ ์
๋ ฅํ ๋๋ง๋ค, ํฐ๋ฏธ๋์ ๋ฉ์์ง ๊ฐ์ด๋๋ฅผ ์ถ๋ ฅํด์ค์.
๋งค๋ฒ ํท๊ฐ๋ฆฌ์ง ์๋๋ก ๋์์ฃผ๋ ์ด๋ณด์ ์ ์ฉ ์์ ์ฅ์น์์.
#!/bin/sh
GREEN=$(tput setaf 2)
BLUE=$(tput setaf 4)
RED=$(tput setaf 1)
BOLD=$(tput bold)
RESET=$(tput sgr0)
echo "
${BOLD}${BLUE}๐ ์ปค๋ฐ ๋ฉ์์ง ๊ฐ์ด๋${RESET}
${GREEN}ํ์${RESET}: <type>: <message> [#์ด์๋ฒํธ]
${GREEN}์์${RESET}:
${BLUE}feat${RESET}: ํ์๊ฐ์
๊ธฐ๋ฅ ์ถ๊ฐ
${BLUE}fix${RESET}: ๋ก๊ทธ์ธ ์ค๋ฅ ์์ #123
${BLUE}docs${RESET}: README ์
๋ฐ์ดํธ
${BOLD}โ
commitlint ๊ฒ์ฌ ๊ท์น ์์ฝ:${RESET}
- ${BOLD}<type>${RESET}์ ๋ฐ๋์ ์์ด์ผ ํ๊ณ , ${BLUE}feat, fix, docs${RESET} ๋ฑ์ผ๋ก ์์ํด์ผ ํด์.
- ${BOLD}<message(subject)>${RESET}๋ ์๋ฌธ์๋ก ์์ํด์ผ ํ๊ณ , ๋ง์นจํ(.)๋ก ๋๋๋ฉด ์ ๋ผ์.
- ์์ ๋น๊ต:
${GREEN}fix: login ์ค๋ฅ ์์ ${RESET} โ โ
${RED}Fix: Login ์ค๋ฅ ์์ .${RESET} โ โ
์ฌ์ฉ ๊ฐ๋ฅํ type ๋ชฉ๋ก:
${BLUE}feat${RESET} ์๋ก์ด ๊ธฐ๋ฅ
${BLUE}fix${RESET} ๋ฒ๊ทธ ์์
${BLUE}docs${RESET} ๋ฌธ์ ๊ด๋ จ ๋ณ๊ฒฝ
${BLUE}style${RESET} ์ฝ๋ ํฌ๋งทํ
(์ธ๋ฏธ์ฝ๋ก , ๋ค์ฌ์ฐ๊ธฐ ๋ฑ)
${BLUE}refactor${RESET} ๋ฆฌํฉํ ๋ง (๊ธฐ๋ฅ ๋ณํ ์์)
${BLUE}test${RESET} ํ
์คํธ ์ถ๊ฐ/์์
${BLUE}chore${RESET} ๊ธฐํ ์ค์ , ํจํค์ง ๋ณ๊ฒฝ
${BLUE}WIP${RESET} ์์
์ค์ธ ์ปค๋ฐ (Work in Progress)
${GREEN}TIP:${RESET} ๊ด๋ จ๋ ์ด์๊ฐ ์๋ค๋ฉด ๋ฉ์์ง ๋์ ${BOLD}#123${RESET}์ฒ๋ผ ์ ์ด์ฃผ์ธ์.
"
chmod +x .husky/prepare-commit-msg