ReactMasters / study

스터디 기록
1 stars 0 forks source link

11월 2주차 git hook, husky, commitlint #30

Open JeGwan opened 2 years ago

JeGwan commented 2 years ago

Git hook 이란

참고 : https://git-scm.com/book/ko/v2/Git%EB%A7%9E%EC%B6%A4-Git-Hooks

Git 이 설치해주는 기본 훅

실제로 pre-commit.sample 에 가면 어떤 스크립트들이 미리 쓰여져 있는데 이건 나중에 다뤄보겠음.

이번엔 보다 단순한 pre-commit 이라는 스크립트를 다뤄보겠음.

#!/bin/sh
# husky

# Created by Husky v4.3.8 (https://github.com/typicode/husky#readme)
#   At: 2021-7-6 2:56:50 ├F10: AM┤
#   From: /Users/one/Project/cspro/cspro-user/node_modules/husky (https://github.com/typicode/husky#readme)

. "$(dirname "$0")/husky.sh"

잠깐 알고갈만한 linux 명령어 두가지

한마디로

test.sh 파일

#!/bin/sh
dirPath=`dirname $0`
echo $dirPath

실행

sh ./test.sh
# .
sh /Users/one/Project/test.sh
# /Users/one/Project

실제로 ./.git/hooks/pre-commit에 무언가 작성해보자

# pre-commit 파일
echo "[${GIT_AUTHOR_NAME}]님 commit을 시작합니다 👋"
git commit -m "some commit"

# stdout
[오제관]님 commit을 시작합니다 👋

이렇게 하면 커밋할 때마다 깃으로 설정된 작성자 이름과 함께 웰컴 메시지를 출력할 수 있다.

pre-commit hook

prepare-commit-msg hook

Git 이 설치해주는 기본 훅의 한계

husky

허스키는 git hook을 레포 자체에 저장 & 핸들링하기 편하게 하기 위해 등장.

설치

npx husky-init && npm install       # npm
npx husky-init && yarn              # Yarn 1
yarn dlx husky-init --yarn2 && yarn # Yarn 2

v0 에서는 git hook에 대한 설정을 자바스크립트 파일 또는 package.json의 husky 필드에서 설정할 수 있었는데 지금은 .husky/ 디렉토리의 개별 파일로 관리되고 있다.

두개의 문제가 있었다.

참고 : https://blog.typicode.com/husky-git-hooks-javascript-config/

2016년 git 2.9가 core.hooksPath를 소개 되면서 이제 꼭 .git/hooks 디렉토리에 깃훅 스크립트를 추가할 필요가 없게 되었음. 이를 바탕으로 허스키가 새롭게 구성됨

이제부턴 새로운 깃훅을 추가할 때 다음과 같이 husky 를 통해 생성할 수 있음.

npx husky add .husky/pre-commit "yarn test"

여튼 한번 설치 해주면 이제 .husky 밑에 깃훅의 이름으로 스크립트를 생성해두면 된다.

이제 커밋 전 커밋 메시지를 린트해보자!

commitlint

팀마다 커밋 메시지 컨벤션이 있다.

유명한 커밋 컨벤션들은 아래와 같다.

나는 개인 레포에서 유다시티 커밋 컨벤션을 쓰는데 이유는 깃모지는 너무 타입이 많아서 외우기 쉽지 않고 유다시티는 오로지 7가지 커밋 타입으로 기억하기 쉬워서이다.

설치

https://commitlint.js.org

닥스에서는 글로벌로 설치하는데 나는 레포에 데브 디펜던시로 명시하는 것을 선호한다.(협업하는 구성원들에게도 설치되게)

# 패키지 설치
yarn add -D @commitlint/cli @commitlint/config-conventional

# config 파일 만들기
echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.js

이후 commitlint.config.js에서 설정해주면 된다.

설정은 했으니 이제 허스키를 통해 커밋을 할때 실행되는 깃훅에 커밋린트가 실행되게 하자.

yarn husky add .husky/commit-msg 'yarn commitlint --edit $1'

이제 커밋을 하면 다음과 같이 실행된다

그리고 config 파일에서 기본적으로 컨벤셔널 커밋 컨벤션을 익스텐즈하고 있기 때문에 해당 룰이 적용되어있다.

type(scope?): subject
body?
footer?

나만의 커스텀 룰을 만드려면 extends를 없애고 처음부터 만들어도 될 것 같은데 여기선 건너뛴다. 컨벤셔널 커밋을 override 하여 룰을 만들어보자.

rules 참고 : https://commitlint.js.org/#/reference-rules

설정파일에 rules라는 필드를 달고 그 밑에 약속된 키들을 사용하여 룰을 정의할 수 있다. 각 룰은 배열 형태로 다음을 담는다.

const Configuration = {
  rules: {
    '약속된-룰-이름': [level, applicable, value],
  },
}
//  level:0|1|2 => 0은 룰을 끈다, 1은 경고 메시지, 2는 에러메시지를 띄운다.
//  applicable:'always'|'never' => always는 항상 적용, never는 적용하지 않음.
//  value: 해당 규칙을 위한 값들

나는 다음 룰들을 추가했다.

const Configuration = {
  rules: {
    'subject-case': [2, 'always', 'sentence-case'],
    'type-enum': [
      2,
      'always',
      ['feat', 'fix', 'docs', 'style', 'refactor', 'test', 'chore'],
    ],
  },
}

이제 테스트를 해보자

git commit -m "otherType: Add feature"
# ✖   type must be lower-case [type-case]
# ✖   type must be one of [feat, fix, docs, style, refactor, test, chore] [type-enum]
git commit -m "fix: add feature"
# ✖   subject must be sentence-case [subject-case]

잘 잘동된다~! 에러메시지까지 커스터마이징 하고 싶은데 아직 방법이 없는듯 하다.