ESLint, Prettier, Testing โฆ
์์ ์์ ํ ๋ชจ๋ ๋๊ตฌ ๋๋ ๊ท์น์ ์ฝ๋๋ฅผ ์์ฑํ๊ฑฐ๋ ํ์
์ ํ๋๋ฐ ์์ด ํต์ผ์ฑ, ๊ฐ๋
์ฑ, ์์ ์ฑ ๋ฑ์ ๋์ผ ์ ์๋ ์์ฃผ ์ ์ฉํ ๊ท์น๋ค์ด๋ค.
์ด๋ฌํ ๊ท์น๋ค์ ๊ฐ์ง๊ณ ๊ฐ๋ฐ์ ์งํํ๊ฒ ๋๋ฉด ์ถํ์ ๋ฐ์ํ๊ฒ ๋ ์ ์ง, ๋ณด์์ ๋น์ฉ์ ์ค์ฌ์ค ์ ์๋ค.
ํ์ง๋ง ๋ง๋ง ๋ฒ์ง๋ฅด๋ฅดํ๊ฒ ํ๊ณ ์ ์ ์ ์ํ ๊ท์น๋ค์ ์งํค์ง ์์ผ๋ฉด ๋ง์งฑ ๋๋ฃจ๋ฌต์ด๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋๋ก ํ๋ ๊ฒ์ด ๋ฐ๋ก Git Hooks๋ค.
์๋ฌด๋ฆฌ ์งํค๋ ค๊ณ ๋
ธ๋ ฅํด๋ ์ธ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ ์ ์๋ Human Error๊น์ง ๋ชจ๋ ์ก์๋ด๊ธฐ์๋ ๋ถ๊ฐ๋ฅํ๋ค. ๊ทธ๋์ Git hooks๋ฅผ ํตํด ์ด๋ฌํ ๊ท์น๋ค์ ๊ฐ์ ํ๋ฉด์ย ๋ฌด์กฐ๊ฑด ์ง์ผ์ง๋ ๊ท์น์ ๋ง๋๋ ๊ฒ์ด๋ค.
Git Hooks
Git Hook์ด๋ Git๊ณผ ๊ด๋ จ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ํน์ ํ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ๊ธฐ๋ฅ์ด๋ค. ํฌ๊ฒ ํด๋ผ์ด์ธํธ ํ
๊ณผ ์๋ฒ ํ
์ผ๋ก ๋๋๋๋ฐ ํด๋ผ์ด์ธํธ ํ
์ commit, push, merge ๋ฑ์ด ๋ฐ์ํ๊ธฐ ์ ์ ์คํํ๋ ํ
์ด๊ณ ์๋ฒ ํ
์ remote repository๋ก push๊ฐ ๋ฐ์ํ์ ๋ ์คํํ๋ ํ
์ด๋ค.
ํด๋ผ์ด์ธํธ ํ
ย ์ย ์ปค๋ฐ ์ํฌํ๋ก ํ
,ย ์ด๋ฉ์ผ ์ํฌํ๋ก ํ
, ๊ทธ๋ฆฌ๊ณ ย ๊ธฐํ ํ
ย ์ผ๋ก ๋ถ๋ฅํ ์ ์๋ค.
์ปค๋ฐ ์ํฌํ๋ก ํ
ย ์ย git commitย ๋ช
๋ น์ผ๋ก ์ปค๋ฐ์ ํ ๋ ์คํํ๋ ํ
์ด๊ณ ย ์ด๋ฉ์ผ ์ํฌํ๋ก ํ
ย ์ย git amย ๋ช
๋ น์ผ๋ก ์ด๋ฉ์ผ์ ํตํด patch ํ์ผ์ ์ ์ฉํ ๋ ์คํํ๋ ํ
์ด๋ค.ย ๊ธฐํ ํ
ย ์ rebase, merge, push ์ ๊ฐ์ ์ด๋ฒคํธ๋ฅผ ์คํํ ๋ ์คํํ๋ ํ
์ ํฌํจํ๋ค.
๋ถ๋ฅ | ํ
| ์ค๋ช
|
์ปค๋ฐ์ํฌํ๋ก ํ
| pre-commit | commit ์ ์คํํ๊ธฐ ์ ์ ์คํ |
prepare-commit-msg | commit ๋ฉ์์ง๋ฅผ ์์ฑํ๊ณ ํธ์ง๊ธฐ๋ฅผ ์คํํ๊ธฐ ์ ์ ์คํ | |
commit-msg | commit ๋ฉ์์ง๋ฅผ ์์ฑํ ํ commit ์ ์ต์ข
์๋ฃํ๊ธฐ ์ ์ ์คํ | |
post-commit | commit ์ ์๋ฃํ ํ ์คํ | |
์ด๋ฉ์ผ์ํฌํ๋ก ํ
| applypatch-msg | git am ๋ช
๋ น ์คํ ์ ๊ฐ์ฅ ๋จผ์ ์คํ |
pre-applypatch | patch ์ ์ฉ ํ ์คํํ๋ฉฐ, patch ๋ฅผ ์ค๋จ์ํฌ ์ ์์ | |
post-applypatch | git am ๋ช
๋ น์์ ๋ง์ง๋ง์ผ๋ก ์คํํ๋ฉฐ, patch ๋ฅผ ์ค๋จ์ํฌ ์ ์์ | |
๊ธฐํ ํ
| pre-rebase | Rebase ํ๊ธฐ ์ ์ ์คํ |
post-rewrite | git commit โamend, git rebase ์ ๊ฐ์ด ์ปค๋ฐ์ ๋ณ๊ฒฝํ๋ ๋ช
๋ น์ ์คํํ ํ ์คํ | |
post-merge | Merge ๊ฐ ๋๋๊ณ ๋์ ์คํ | |
pre-push | git push ๋ช
๋ น ์คํ ์ ๋์ํ๋ฉฐ ๋ฆฌ๋ชจํธ ์ ๋ณด๋ฅผ ์
๋ฐ์ดํธ ํ๊ณ ๋ ํ ๋ฆฌ๋ชจํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ธฐ ์ ์ ์คํ. push ๋ฅผ ์ค๋จ์ํฌ ์ ์์ |
pre-commit
๋ณดํต pre-commit hook์ ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ ๊ฐ๋ค. ์ปค๋ฐํ ๋ ๊ฐ์ฅ ๋จผ์ ํธ์ถ๋๋ hook์ผ๋ก, git์ผ๋ก ์ปค๋ฐ์ ๋จ๊ธธ ๋ ๋ง๋ค ํน์ ์์
์ ์๋์ผ๋ก ์คํํ๋ ๊ฒ์ ๋ชฉ์ ์ผ๋ก ํ๋ค.
black, isort, flake8 ๋ฑ ๊ฐ๋
์ฑ๊ณผ ์ฝ๋ ํ๋ฆฌํฐ๋ฅผ ๋์ฌ์ฃผ๋ tool์ ์๋ํ์์ผ์ฃผ๋ tool์ด๋ค.
pre-push๋ ์์ฃผ ์ฌ์ฉ๋๋ค.
Husky
๋ง์ฝ ๋ชจ๋ ๊ด๋ฆฌ๋ฅผ ์ํด npm์ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด, husky๋ฅผ ํ์ฉํด์ git hook๊ด๋ฆฌ๋ฅผ ํ ์ ์๋ค.
huskyhooks๋ฅผ ํตํ pre-push ์ฌ์ฉ ์์
#!/bin/sh
FORBIDDEN_HTTPS_URL="https://github.com/gabia/git-hooks-study.git" # insert your remote url (https)
FORBIDDEN_SSH_URL="git@github.com:gabia/git-hooks-study.git" # insert your remote url (ssh)
FORBIDDEN_REF="refs/heads/master" # insert branch ref
ARR_GIT_PARAMS=($(echo $HUSKY_GIT_PARAMS))
ARR_GIT_STDIN=($(echo $HUSKY_GIT_STDIN))
remote=${ARR_GIT_PARAMS[0]}
url=${ARR_GIT_PARAMS[1]}
local_ref=${ARR_GIT_STDIN[0]}
local_sha=${ARR_GIT_STDIN[1]}
remote_ref=${ARR_GIT_STDIN[2]}
remote_sha=${ARR_GIT_STDIN[3]}
if [ "$url" != "$FORBIDDEN_HTTPS_URL" -a "$url" != "$FORBIDDEN_SSH_URL" ]
then
exit 0 # Forked Project ์์๋ ์ ํํ์ง ์์
fi
if [ "$remote_ref" == "$FORBIDDEN_REF" ]
then
echo "DO NOT PUSH it master"
exit 1 # ๊ธ์ง๋ ref ๋ก push ๋ฅผ ์คํํ๋ฉด ์๋ฌ
fi
exit 0
Bash
๋ณต์ฌ
๊ทธ๋ฆฌ๊ณ ย .huskyrcย ํ์ผ์์ย pre-pushย ํ
์ด ์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋๋ก ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
{
"hooks": {
"pre-commit": "echo 'Hello World!",
"pre-push": "./huskyhooks/pre-push"
}
}
Bash
๋ณต์ฌ