기타

Git 커밋 상태를 확인하여 배포하는 쉘 스크립트

닥치고개돌 2020. 2. 8. 22:40
728x90

쉘(Shell)은 유닉스 및 유닉스 계열 운영체제의 커맨드라인 인터페이스를 의미하며 리눅스, 맥 OS의 기본 쉘로는 bash가 제공된다.

그리고 쉘에서는 웹 브라우저의 콘솔에서 자바스크립트 코드를 사용할 수 있는 것처럼 쉘 스크립트 코드를 실행할 수 있다. 쉘 스크립트를 사용하면 파일 입출력, 연속적인 명령어 실행, 사용자 인터페이스 구현 등이 가능해진다. 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 같은 명령어를 실행할 수 있다.

 

 

728x90

'기타' 카테고리의 다른 글

CURL 이란? CURL사용법  (0) 2020.02.12
HTTP상태코드의 종류와 의미  (0) 2020.02.10
도메인, DNS, A레코드, CNAME ??  (0) 2020.02.08
SMTP, POP3, IMAP 메일관련 프로토콜 개념  (0) 2019.12.27
슬로우쿼리(slowquery)  (0) 2019.11.28