코드를 변경할 때마다 테스트를 돌리는 것이 귀찮아서 git alias를 활용해 test에 통과하면 자동으로 push를 시키고 그게 아니라면 취소 메세지를 보이게 하는 스크립트를 작성하였다.
작성하다보니 이것 저것 추가로 되면 좋을 것 같아서 코드가 변경되면 자동으로 테스트를 돌리고 테스트가 성공하면 푸시를 하도록 하는 기능과 자동으로 푸시를 하다보니 커밋 메세지를 입력할 수 없어 변경이 일어난 파일의 이름과 추가인지 삭제인지, 수정인지에 대한 내용을 커밋 메세지에 자동으로 추가하도록 하였다.
1. git alias 를 통해 새로운 명령어를 등록
$ git config --global alias.auto-test-push '!auto-test-push.sh'
위처럼 입력하면 git auto-test-push라는 명령어 실행시 auto-test-push.sh라는 쉘 스크립트가 실행됨
2. auto-test-push.sh 생성
# auto-test-push.sh 생성
$ vim auto-test-push.sh
$ chmod 744 auto-test-push.sh
#!/bin/zsh
echo ""
echo ""
echo "#######################################################################################"
echo "#################################### run test #########################################"
echo "#######################################################################################"
echo ""
echo ""
python3 -m pytest --cov=.
if [ "$?" = "0" ]; then
echo ""
echo ""
echo "###################################################################################"
echo "################################# git push ########################################"
echo "###################################################################################"
echo ""
echo ""
message="$1"
if [ $1 = '' ]; then
message="auto commit and push"
fi
git add .
git commit -am "$message"
git push
else
echo ""
echo ""
echo "################################### test fail ####################################"
echo ""
echo ""
exit 1
fi
위 코드에서 python3 -m pytest –cov=. 은 python에서 pytest를 활용한 테스트를 수행하기위한 내용으로 일반적인 상황에서는 주석처리 하면 된다.
그 밑에 if [ “$?” = “0” ]; then은 pytest가 성공했는지를 판단하는 코드이다. $?이 0이 아니라면 테스트가 실패한 경우이므로 push하지 않는다.
3. git auto-test-push 없이 코드가 변경될 때마다 테스트 후 push 실행
watch라는 것을 활용하면 간단하게 구현 할 수 있다.
watch는 모니터링 툴인데 지정된 시간마다 실행하고 싶은 명령어를 실행하여 로그로 남겨 준다.
watch라는 명령어를 쳤을 때 해당 명령어가 동작하지 않는다면
# watch 설치
$ brew install watch
$ watch -n 10 -g -d git status
위의 명령어는 10초마다 git status라는 명령어를 실행하고 그 명령어의 실행 결과가 변경되면 종료하는 명령어이다.
-n 10처럼 숫자를 적어주면 뒤에 적힌 숫자만큼의 시간마다 실행된다.
-d 뒤에는 실행할 명령어를 적어주면 되고, -g의 경우 결과가 이전과 다를 경우 watch를 종료시킨다.
이미 수정된 파일이 있는 상태에서 실행한 후 해당 파일을 다시 수정하는 경우는 반영이 되지 않지만,
실행 전에 로컬과 리모트를 동일하게 만든 이후라면 해당 명령어가 아주 잘 실행된다.
변경된 코드가 있으면 auto-test-push.sh가 실행되는 쉘 스크립트를 작성한다.
$ vim auto-repo-change-check.sh
#!/bin/zsh
watch -n 10 -g -d git status
./auto-test-push.sh
그리고 반복적으로 실행되도록 auto-test-push.sh 젤 아래에도 auto-repo-change-check.sh 실행 코드를 추가한다.
#!/bin/zsh
echo ""
echo ""
echo "#######################################################################################"
echo "#################################### run test #########################################"
echo "#######################################################################################"
echo ""
echo ""
python3 -m pytest --cov=.
if [ "$?" = "0" ]; then
echo ""
echo ""
echo "###################################################################################"
echo "################################# git push ########################################"
echo "###################################################################################"
echo ""
echo ""
message="$1"
if [ $1 = '' ]; then
message="auto commit and push"
fi
git add .
git commit -am "$message"
git push
else
echo ""
echo ""
echo "################################### test fail ####################################"
echo ""
echo ""
exit 1
fi
./auto-repo-change-check.sh # 추가
4. 커밋 메세지 추가
auto-test-push.sh의 경우 처음부터 파라메타로 커밋 메세지를 받을 수 있도록 구성하였는데
auto-repo-change-check.sh로 실행할 경우 커밋 메세지가 “auto commit and push”로 입력되는 문제가 있다.
#!/bin/zsh
watch -n 10 -g -d git status
m="$(git status --short)"
./auto-test-push.sh $m
위처럼 바꾸면 어떤 파일이 수정되었는지 여부는 커밋 메세지에서 확인할 수 있다.
커밋 메세지에는 해당 커밋이 뭘한 것인지를 알 수 있어야 하므로 커밋 메세지 부분을 조금 더 개발하거나 auto-test-push.sh만을 단독으로 사용하기를 권한다.