Please enable JavaScript to view the comments powered by Disqus.

Git 커밋 상태를 확인하기 위한 쉘 스크립트

ashim-d-silva-95242-unsplash photo by Ashim D’Silva (https://unsplash.com/@randomlies)

Git으로 버전 관리를 하고 있지만 CI 도구를 사용하고 있지 않다면, 최소한 앱을 배포하기 전에 커밋을 하고 원격 저장소에 푸시를 해야 한다. 그래야 개발 서버든 운영 서버든 간에 현재 배포된 앱이 어떤 버전인지 일 수 있고 버그 수정도 원만하게 할 수 있기 때문이다. 이런 과정을 추가하면 아무리 버그를 급하게 수정해야 하는 상황이라도 자신의 코드를 한번은 돌아보게 만드는 만드는 효과를 줄 수 있다고 본다. 버전 관리를 하면서도 아무런 의미없는 커밋을 남발해도 된다는 마음을 가진 사람은 드물 테니까 말이다.

쉘 스크립트

쉘(Shell)은 유닉스 및 유닉스 계열 운영체제의 커맨드라인 인터페이스를 의미하며 리눅스, 맥 OS의 기본 쉘로는 bash가 제공된다. 개인적으로는 더 다양한 기능을 제공하는 zshOh My Zsh의 조합을 사용하고 있다.

그리고 쉘에서는 웹 브라우저의 콘솔에서 자바스크립트 코드를 사용할 수 있는 것처럼 쉘 스크립트 코드를 실행할 수 있다. 쉘 스크립트를 사용하면 파일 입출력, 연속적인 명령어 실행, 사용자 인터페이스 구현 등이 가능해진다. Git 저장소의 커밋 및 푸시 여부도 쉘 스크립트 안에서 Git 명령어의 실행을 조합하는 방식으로 구현할 수 있다.

쉘 스크립트를 사용해서 현재 브랜치 정보 확인하기

쉘 스크립트에도 프로그래밍 언어인 만큼 변수를 사용할 수 있다. Git 명령어를 이용해 현재 브랜치의 이름, 현재 작업중인 로컬 브랜치(HEAD)의 커밋 해시 스트링, 그리고 원격 저장소의 커밋 해시 스트링을 저장한다.

# 현재 브랜치 이름을 변수에 할당
BRANCH=$(git rev-parse --abbrev-ref HEAD)

# 현재 브랜치의 최종 커밋의 해시값
HASH=$(git rev-parse HEAD)

# 원격에 업로드된 현재 브랜치의 커밋 해시
REMOTE_HASH=$(git rev-parse --verify origin/$BRANCH)

BRANCH에 현재 브랜치의 이름을 할당한 후 원격 저장소의 커밋 해시를 가져온 후 사용했다. 변수를 사용할 때는 선언할 때와 달리 달러($) 사인을 붙여서 사용해야 한다.

필요한 값을 가져왔으니 이제 조건문을 사용해 배포가 가능한 상황인지 확인하면 된다. 조건문은 if ~ fi로 블록을 형성할 수 있고 then 키워드 후에 조건문을 만족했을 때 실행할 코드를 입력한다. 아래 코드에서는 현재 브랜치가 master 브랜치인지 확인한다.

if [ "$BRANCH" != "master" ]; then
  echo 'master 브랜치에서만 배포 가능합니다.'; # 메시지 출력
  exit; # 스트립트 종료
fi

다음으로는 커밋되지 않은 변경 사항이 있는지 확인해야 한다. 역시 Git 명령어를 사용해야 한다. git status --porcelain 명령어는 저장소의 변경 사항을 아래와 같은 방식으로 간단히 출력한다.

# ?? 기호는 Git index에 추가되지 않은 파일이라는 의미다
?? src/pages/posts/2018-06-12-shellscript-to-check-commit/

만약 변경 사항이 없다면 아무것도 출력되지 않는다. 그래서 문자열이 null이 아니라면 true를 반환하는 -n 키워드를 사용해서 커밋되지 않은 파일이 있는지 확인할 수 있다.

if [ -n "$(git status --porcelain)" ]; then
  echo "배포 전 모든 변경 사항을 커밋해야 합니다.";
  exit;
fi

그리고 마지막으로 현재 브랜치의 커밋과 원격 브랜치의 커밋이 일치하는지 확인한다.

if [ $HASH != $REMOTE_HASH ]; then
  echo "배포 전 모든 커밋을 원격에 푸시해야 합니다."
  exit;
fi

이렇게 확인 과정이 끝났으므로 스크립트의 나머지 부분에서는 실제 배포를 수행하는 npm run deploy 같은 명령어를 실행할 수 있다.


참고자료