규도자 개발 블로그

Git Hook 알아보기 + pre-commit설정으로 테스트코드 경고날리기 본문

DevOps/Git

Git Hook 알아보기 + pre-commit설정으로 테스트코드 경고날리기

규도자 (gyudoza) 2022. 1. 1. 13:31

깃훅은 깃에서 특정 동작을 줬을 때 정해진 시점에 스크립트를 실행하게 하는 것이다. 어떤 깃훅이 만들어져있나 궁금하면 자신이 로컬에 받아둔 아무 깃 프로젝트에 들어가서 .git/hooks/ 내부에 어떤 파일들이 있는지 보면 된다.

간단하게 스샷으로 보자면 이렇게 있다. 각 스크립트가 정확히 어떤 시점에 실행되는지는 이곳을 참조하면 된다. 뭐 암튼 파일 이름에서 유추할 수 있듯이 .sample이라는 suffix만 지워주면 각 훅의 시점에 작성된 스크립트가 실행된다. 한 예로 이번 포스팅에서 다뤄볼 pre-commit.sample파일을 수정해서 precommit기능을 사용해보자.

 

문저 이렇게 파일을 복사하고
텍스트에디터로 아무 문구나 추가해보자. 문법에서도 알 수 있다시피 git hook파일은 쉘스크립트로 작성돼있다.
다음에 대충 임의로 파일을 만들어 내용을 써놓은 뒤에 커밋을 해보면

이렇게 내가 hook에 써놨던 echo부분이 실행되면서 커밋이 진행되는 걸 알 수 있다.

 

 

뭐 대충 git hook은 이렇게 작성해서 쓰는 것이고 나는 이것을 어떻게 활용하고 있으냐, 바로 commit하기 전에 내가 개발하면서 삽입해놓은 테스트코드나 디버그용 코드를 제거하는 데 사용한다. pytest로 테스트코드를 작성한 뒤에 테스트가 통과되면 commit하는 방향도 있겠지만 사실 모든 케이스에서 pytest가 완벽한 대안이 되는 것은 아니기 때문에 실제 작동 코드 중간중간에 날짜를 변경해보는 코드라던가, 다른 사람의 인증정보를 가지고 하는 코드라던가 혹은 내가 개발할 때 잠깐 보기 위해 터미널에 찍어보는 코드라던가 하는 게 끼어있을 수 있는데 간혹가다가 그것이 commit내역에 끼게 될 수가 있다. 그것을 방지하기에 좋은 방법이다.

 

위에서 수정해봤던 pre-commit파일에 이 내용을 끼워넣자.

disallowed="word1 word2"

git diff --cached --name-status | while read x file; do
        if [ "$x" == 'D' ]; then continue; fi
        for word in $disallowed
        do
            if egrep $word $file ; then
                echo "ERROR: Disallowed expression \"${word}\" in file: ${file}"
                exit 1
            fi
        done
done || exit $?

직관적으로 파악할 수 있다시피 저 disallowed에 원치 않는 단어들을 넣어두면 된다. 이 코드의 출처는 스택오버플로우이다. 이렇게 금지단어들을 추가해놨으니 한번 파일에 금지단어를 추가하고 커밋을 해보자.

 

난 이렇게 주석이 word1이라는 단어를 추가하고 커밋해보려한다.

 

짠, 이렇게 금지된 단어가 포함돼있다고 하면서 커밋되지 않는다. 여기까지 왔으면 어떻게 활용해야할지 감이 올 것이다. 테스트코드 혹은 배포 전에 지워야 하는 코드 시작과 끝 혹은 그 주변에 자신이 정해둔 특정 문자열을 삽입해두고 pre-commit에 그 단어를 등록해두기만 하면 된다. 나는 회사에서 쓰는 내 닉네임+test를 주석에 박아넣는다. 그렇게 내가 로컬에서 테스트한 코드가 실수로라도 배포될 일은 없게 된다. 전에는 항상 git status로 변경된 파일이 무엇인지 본 다음에 IDE에서 지원하는 코드 변경이력 등등으로 일일히 검사한 뒤에 commit을 하곤 했었는데 몇번 놓친 적이 있어서 그냥 테스트나 디버그코드를 삽입하기 전에 이렇게 특정 키워드를 같이 삽입하는 방향으로 선회하니까 일일히 검사할 필요도 없을 뿐더러 테스트코드를 심는 실수를 저지를 일도 없어져서 애용하고 있다.

 

 

이것 말고도 commit전에 lint나 flake8을 이용해서 코딩컨벤션을 지켰는지 검사하거나 새로운 규칙을 만들어서 commit message convention을 검사하거나 다양한 용도로 사용할 수 있다.

 

 

Comments