쉘(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 같은 명령어를 실행할 수 있다.
'기타' 카테고리의 다른 글
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 |