본문 바로가기

Technical/Development

[GitLab] Server-Side Hook 스크립트(pre-receive) 활용




개요


GitLab 을 위한 Custom Hook은 다음의 3 가지 중 하나로 구현된다(Community Edition 기준).


  • pre-receive: Git 서버가 클라이언트로부터 Push 요청을 받은 즉시 수행되며, 스크립트에서 non-zero 값을 return 하면 Push 요청은 reject 된다. Push 요청에 대한 값은 스크립트 내에서 stdin 스트림 값을 읽어서 사용 가능하다
  • update: pre-receive 와 유사하지만, pre-receive 는 한 번의 Push에 대해 단 한 번 수행되며, update는 각각의 Branch 마다 triggering 되는 점이 다르다. 따라서 여러 Branch에 Push 를 수행하게 되면 특정한 브랜치에 대해서만 reject 되게 처리되게 하고 싶을 떄 사용한다
  • post-receive: Push 에 대한 모든 처리가 완료된 직후에 수행된다. Push 데이터에 대해 stdin 을 참조해서 사용하면 되며,  주로 사용자에게 메일 발송이나 CI 서버로의 triggering 또는 이슈 트래킹 시스템으로 티켓을 업데이트할 때 사용한다


스크립트 pre-receive 구현 및 활용 방법


  • pre-receive-commit-msg-check.py 파일 최종 버전을 GitLab 서버의 /root/custom_hooks_src에 저장해 둔다(백업/확인용, option 사항)
  • pre-receive-commit-msg-check.py 파일 최종 버전을 /root/custom_hooks 에 pre-receive 라는 이름으로 저장하고, chmod a+x pre-receive, chown git.git pre-receive 로 설정한다
  • copy_custom_hooks.sh 스크립트의 target_path_list 에 pre-receive Hook 을 적용할 repository 정보를 등록한다
  • copy_custom_hooks.sh 파일을 적당한 위치에 저장(/root/copy_custom_hooks.sh)해 두고 실행하면 지정된 repository 의 해당 path 로 복사된다(copy_custom_hooks.sh 파일의 내용은 다음과 같다)



  • 본 pre-receive 스크립트의 commit 제약 조건은 다음과 같다

Commit message에 issue-123 또는 issue#123 또는 issue-#123 또는 hotfix 또는 force 가 없으면

Remote 에 Push 시에 오류 발생함(대소문자 구분 없음)


  • pre-receive 의 원본에 해당되는 pre-receive-commit-msg-check.py 스크립트의 내용은 다음고 같으며, GitHub 의 여기에 공개되어 있다




- Barracuda -