suyeonme

[Git] 모노레포 환경에서 Husky로 Git Hook 설정하기(commitlint) 본문

프로그래밍👩🏻‍💻/Git

[Git] 모노레포 환경에서 Husky로 Git Hook 설정하기(commitlint)

suyeonme 2024. 5. 16. 14:18

commitlint로 Commit 컨벤션 적용하기

규모가 큰 팀에서 협업시, 커밋 컨벤션을 따르면 커밋의 일관성을 지킬 수 있다. 대표적으로 다음과 같은 커밋 컨벤션을 사용한다.

feat(AppController): Format response
feat: Format response

 

lintcommit을 이용해서 작성한 commit이 컨벤션을 지켰는지 검사해보자!

 

(1) 라이브러리 설치

# husky 설치
pnpm add --save-dev husky
pnpm exec husky init

# commitlint 패키지 다운로드
pnpm install --save-dev @commitlint/config-conventional @commitlint/cli

# commitlint.config.js 파일 생성
echo "export default { extends: ['@commitlint/config-conventional'] };" > commitlint.config.js

commitlint.config.js에서 SyntaxError: Unexpected token 'export'에러가 나는경우, 아래와 같이 수정한다.

# 수정 전
export default { extends: ['@commitlint/config-conventional'] };

# 수정 후
module.exports = { extends: ["@commitlint/config-conventional"] };

(2) commit-msg 훅 스크립트 작성

아래 명령어는 .husky/commit-msg 파일을 추가한 뒤, commitlint 패키지를 실행한다.

# commit-msg 훅 스크립트 작성
echo "pnpm dlx commitlint --edit \$1" > .husky/commit-msg

(3) 작성한 훅이 정상적으로 동작하는지 확인

아래 명령어는 최근 두 커밋 메세지를 검사한다.

pnpm exec commitlint --from HEAD~1 --to HEAD --verbose

이전에 작성한 커밋이 있다면 해당 커밋이 출력된다.

최근 커밋 출력

(4) 변경 사항을 add한 뒤, 커밋 메세지 작성

컨벤션에 맞지않는 커밋을 작성한 경우

Commit 실패

 

컨벤션에 맞는 커밋을 작성한 경우

Commit 성공

 


모노레포에서 적용하는 경우

나의 경우, 아래의 디렉터리 구조를 가진 모노레포에 적용하였다. commitlint.config.js는 husky가 설치된 디렉터리에 추가한다.

만약 전체 워크스페이스에 Git hook을 적용해야한다면 루트에 husky를 적용해야한다. 이 경우 config-pnpm-scopes를 참고해볼 수 있을 것 같다.

 

.
├── packages/
│   ├── frontend
│   └── backend/
│       ├── src
│       ├── .eslintrc.js
│       ├── .prettierrc
│       ├── .commitlint.config.js 
│       └── package.json <--- Husky 설치!
├── package.json
├── pnpm-workspace.yaml
└── pnpm-workspace.lock.yaml
└── .git

 

동일하게 commit-msg를 적용한 뒤, 커밋을 시도하자 Please add rules to your commitlint.config.js 에러가 발생했다.

 

commitlint 에러 발생

이 경우, commit-msg 파일에서 git이 설치된 경로를 잡아주면 정상적으로 동작한다.

#!/usr/bin/env sh

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

cd packages/backend # 추가!

pnpm dlx commitlint --edit $1
Comments