[Git] git client에 python 가상 환경을 이용한 pre commit hook 적용하기

파이썬 개발조직에 입사하게 되었다. git hook을 사용해보지 않았었는데 이곳에서는 CI를 위해서 git hook을 사용하여 커밋명에 prefix를 달고, 커밋 메세지, 파일명 린트 등의 벨리데이션 검사를 진행한다. 검사를 진행하는 스크립트가 파이썬으로 작성되어 있었는데, git client를 사용하면 파이썬 가상 환경 밖에 린트 라이브러리를 설치했어야 했다. 개인적으로 가상 환경 밖에 파이썬 라이브러리를 설치하는 걸 선호하지 않기 때문에, git client를 사용하면서도 가상 환경에서 pre commit을 돌리고 싶었다. 회사에 git client를 사용하시는 분들이 많이 없는지 git client 사용 시에 파이썬 가상 환경을 사용할 수 있는 설정 방법이 없어서 직접 서칭해 봤는데 간단하게 적용할 수 있어 공유하고자 한다.

먼저, 기본적인 pre-commit은 .git/hooks 안에 pre-commit이라는 이름으로 스크립트를 작성한다. 하지만 python 스크립트를 사용하는 경우 가상 환경을 돌린 상태에서 돌려야 하기 때문에 별도의 작업이 필요하다. 간단하니 필요하면 적용해보길 바란다.

여러 pre-commit을 진행하기 위해서 pre-commit.d라는 이름의 디렉토리를 생성한다.

mkdir .git/hooks/pre-commit.d
cd .git/hooks/pre-commit.d

다음으로 pre-commit 스크립트들을 작성할 건데, pre-commit이 동작하는 순서는 문자열 오름차순으로 진행된다.
e.g. 01-pre-commit, 02-pre-commit, 03…

가상 환경을 실행하는 스크립트

# vi 01-pre-commit
source $VIRTUAL_ENV/bin/activate

이후 02-pre-commit 파일을 생성하여 필요한 내용의 스크립트를 작성하고 03 또는 그 이후의 파일에서 가상 환경을 닫는 코드를 집어 넣으면 끝이다.

# vi 03-pre-commit
deactivate

2020-06-25 수정

위의 내용은 완전 잘못 알고 있었다. 일단 pre-commit.d 디렉토리를 자동으로 읽어주는 게 아니라 읽게 해주는 별도의 스크립트를 작성해야 한다. python, bash 등 다양한 언어(?)로 작성할 수 있는데, 이번에는 bash로 작성해 보려고 한다.

먼저, 아래의 스크립트를 .git/hooks/pre-commit에 삽입한다.

#!/bin/bash

cd "$(dirname "$0")/pre-commit.d" 2>/dev/null || exit 0
source $VIRTUAL_ENV_PATH/bin/activate

for hook in *; do
    ./$hook
    RESULT=$?
    if [ $RESULT != 0 ]; then
        echo "pre-commit.d/$hook returned non-zero: $RESULT, abort commit"
        exit $RESULT
    fi
done

exit 0

이후 .git/hooks/pre-commit.d 아래에 01, 02, 03 … 등 이름을 오름차순으로 생성하면 필요한 순서대로 스크립트가 실행된다.

참조


Written by@EHX
Software Developer, Back-End Engineer

GitHubFacebook