일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- deletion
- 알고리즘
- red-black tree
- 백준
- '0'
- Heap
- list
- 예제
- STL
- 구현
- Critical_Path_Analysis
- sstream
- 자료구조
- 13305
- c++
- Articulation_Point
- Biconnected_Component
- qsort
- function_template
- data_structure
- 총정리
- class_template
- Pair
- singly Linked List
- 문법
- 5397
- Algorithm
- connected_component
- template
- sort
- Today
- Total
- Today
- Total
- 방명록
어제의 나보다 성장한 오늘의 나
Husky를 활용한 Git hooks 설정과 작동원리 본문
도입 배경
현재 개발 중인 우리 서비스는 배포를 진행할 때 github action을 통해 빌드를 진행 하는 데 그 때 불용 코드나 오류가 있으면 빌드가 실패한다. 그 이유는 코드 퀄리티를 위해 빌드 실행 시 함께 진행되는 타입스크립트 컴파일에서 linting을 진행하도록 설정했기 때문이다. 그래서 우리 개발팀은 배포 전에 반드시 로컬에서 사전에 빌드 테스트를 해봐야 하는데 사람들이 이를 종종 까먹고 github에 업로드 하여 배포 때 계속 실패하게 되는 이슈가 있었다. 이를 해결하기 위해 husky를 도입 해보기로 하였다.
husky란?
Ultra-fast modern native git hooks Automatically lint your commit messages, code, and run tests upon committing or pushing.
쉽게 말해서 Git Hooks를 사용하기 편하게 해주는 도구라고 볼 수 있다.
Git hooks는 무엇일까?
특정 이벤트가 발생했을 때 git에서 특정 스크립트를 실행하도록 하는 것이다. 쉽게 말해 커밋, 푸쉬, 머지 등이 발생했을 때 쉘이나 perl 스크립트와 같은 실행 가능 파일을 실행 시켜 특정 작업을 수행 하는 것이다.
참고로 기본 훅 디렉토리는 .git/hooks에 위치해 있고 관련 설정 파일은 .git/config 이다.
설정을 추가하고 원하는 훅을 형식에 맞게 작성하여 hooks 디렉터리에 넣어 훅을 트리거링 하여 사용하는 방식이다.
Git hooks 종류
git hooks에는 클라이언트 훅과 서버 훅이 있다.
1) 클라이언트 훅
commit, rebase, merge, push 등 작업자의 환경(로컬 환경)에서 발생하는 이벤트 전/후 실행 되는 훅이다.
2) 서버 훅
Git Repository 측에서 발생하는 훅이다. 중앙 관리가 가능하므로 서버 관리자라면 서버 훅이 좀 더 유용하게 사용될 수 있다.
우리는 git hooks 중 클라이언트 훅을 사용하여 빌드 테스트를 자동화하여 작업자의 실수를 줄이고자 했다.
그 과정에서 husky를 통해 간편하게 설정하였다.
Husky 사용
pnpm을 사용했기에 pnpm을 기준으로 작성하였다.
1. 설치
pnpm add --save-dev husky
2. 간편 설정
pnpm exec husky init
3. 원하는 훅 설정
pre-commit과 pre-push 중 고민을 했었으나 pre-commit으로 하게 되면 불필요한 빌드 작동 때문에 생산성을 오히려 저하 시킬 것이라 판단되어 pre-push를 선택하였음.
.husky/pre-push
#!/bin/bash
pnpm build
이제 설정이 끝났다! 예상대로 push 명령어를 실행하면 먼저 빌드가 자동 실행되고 실패 시 push가 진행 되지 않는다!
Husky 작동원리
사용하기 간편한 건 알겠는데 대체 어떻게 작동하는 걸까??
앞서 말했듯이 git hooks를 사용하려면 .git/hooks에 훅을 추가해야 한다.
근데 해당 디렉토리에는 추가된 훅이 없는 데 왜 작동을 하는 걸까??
아래의 명령어 때문이다.
pnpm exec husky init
해당 init을 진행하면 다음과 같은 일들이 일어난다.
husky init (recommended) The init command simplifies setting up husky in a project. It creates a pre-commit script in .husky/ and updates the prepare script in package.json. Modifications can be made later to suit your workflow.
husky init을 실행하면 .husky 폴더가 생기고 스크립트 샘플들이 나타난다. 이곳에서 스크립트를 정의하여 사용한다. 그리고 .husky 폴더를 git hooks 폴더로 인식하기 위해 git hooks 설정 파일인 .git/config에 코드가 추가 되었다.
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
hooksPath = .husky/_ -> 추가 됨
그래서 husky 폴더를 git hooks 관련 디렉토리로 인지할 수 있게 된 것이다.
근데 알다시피 .git/config는 git에 무시되서 깃허브에 올라가지 않는다.
그럼 다른 협업 개발자들도 husky를 사용하려면 husky init 명령어를 해줘야 하는 걸까??
그렇지 않다.
그것은 prepare script 때문이다.
위의 설명에 따르면 husky init 후 package.json에 prepare script도 추가된다.
"scripts": {
...
"prepare": "husky" -> 추가 됨
},
npm 공식문서
https://docs.npmjs.com/cli/v8/using-npm/scripts
npm 공식 문서에 따르면 prepare 스크립트는 로컬에서의 npm insall이 발생하면 작동한다.
즉, 다른 사람들은 그저 허스키가 설치된 레포지토리를 받고 npm install을 해주면 관련 라이브러리 설치 이후 prepare에 설정된 husky가 작동하고 이를 통해 본인 로컬 환경의 .git/config에 hooksPath = .husky/_ 가 자동으로 추가되는 것이다.
그렇기 때문에 협업하는 사람들은 git hooks를 따로 추가하지 않더라도 husky가 알아서 다 설정해주기 때문에 git hooks를 간편하게 사용이 가능한 것이다.
husky는 간편해서 어떤 식으로 작동하는 지 몰라도 쉽게 사용할 수 있다. 그렇지만 작동 원리를 공부하면서 git hooks에 대해 더 깊게 알 수 있었기에 공유를 위해 포스팅을 남긴다.
'개발 환경 설정' 카테고리의 다른 글
[ 개발 환경 ] 웹서버에 파일 업로드 하기 (FileZila , Vscode) (0) | 2022.12.30 |
---|---|
[Dothome] 닷홈 (dothome) 무료 호스팅 서비스 이용 방법 (0) | 2022.12.30 |