- 리포지터리에 서버 후크 설정하기
- 모든 리포지터리에 대한 전역 서버 후크 생성
- 리포지터리의 서버 후크 제거
- 체인된 서버 후크
- 서버 후크에서 사용 가능한 환경 변수
- 커스텀 오류 메시지
Git 서버 후크
- GitLab 12.8에서 도입되어 사용자 지정 후크를 대체했습니다.
- GitLab 15.6에서 서버 후크를 Git 서버 후크로 이름을 변경했습니다.
Git 서버 후크(server hooks)는 시스템 후크나 파일 후크와 혼동해서는 안 되며, GitLab 서버에서 사용자 정의 로직을 실행합니다. 이를 사용하여 다음과 같은 Git 관련 작업을 수행할 수 있습니다:
- 특정 커밋 정책 강제
- 리포지터리 상태에 따라 작업 수행
Git 서버 후크는 pre-receive
, post-receive
, update
와 같은 Git 서버 측 후크를 사용합니다.
GitLab 관리자는 gitaly
명령을 사용하여 서버 후크를 구성하며, 이 명령은 다음을 제공합니다:
- Gitaly 서버를 시작하는 데 사용됨
- 여러 하위 명령을 제공함
- Gitaly gRPC API에 연결함
만일 gitaly
명령에 액세스할 수 없는 경우 서버 후크 대체로는 다음과 같은 것들이 있습니다:
- Webhooks
- GitLab CI/CD
- Push rules - 사용자 구성 가능한 Git 후크 인터페이스
Geo는 서버 후크를 보조 노드로 복제하지 않습니다.
리포지터리에 서버 후크 설정하기
- GitLab 15.11에서 도입된
hooks set
명령은 직접 파일 시스템 액세스를 대체합니다. 기존 Git 후크는hooks set
명령에 대한 마이그레이션이 필요하지 않습니다.
준비 절차:
-
리포지터리 이름, Gitaly 구성 파일 경로(리눅스 패키지 인스턴스의 기본값은
/var/opt/gitlab/gitaly/config.toml
), 리포지터리 상대 경로가 필요합니다.
리포지터리에 서버 후크를 설정하려면:
- 서버 후크 기능을 올바르게 작동하도록 하는 코드를 작성하세요. Git 서버 후크는 어떤 프로그래밍 언어든 가능합니다.
shebang이 해당 언어 유형을 반영하도록 합니다. 예를 들어, 스크립트가 루비인 경우 shebang은 아마도
#!/usr/bin/env ruby
일 것입니다.- 단일 서버 후크를 생성하려면 후크 유형과 일치하는 이름의 파일을 생성하세요. 예를 들어
pre-receive
서버 후크의 경우 파일 이름은 확장명이 없는pre-receive
여야 합니다. - 여러 서버 후크를 생성하려면 후크 유형과 일치하는 디렉터리를 생성하세요. 예를 들어
pre-receive
서버 후크의 경우 디렉터리 이름은pre-receive.d
여야 합니다. 해당 디렉터리에 후크용 파일을 넣으세요.
- 단일 서버 후크를 생성하려면 후크 유형과 일치하는 이름의 파일을 생성하세요. 예를 들어
- 서버 후크 파일이 실행 가능한지 확인하고 백업 파일 패턴(
*~
)과 일치하지 않도록 합니다. 서버 후크는 tarball 루트에 있는custom_hooks
디렉터리에 있어야 합니다. - tar 명령을 사용하여 사용자 정의 후크 아카이브를 만드세요. 예를 들어,
tar -cf custom_hooks.tar custom_hooks
입니다. - 필요한 옵션과 함께
hooks set
하위 명령을 실행하여 리포지터리의 Git 후크를 설정하세요. 예를 들어,cat custom_hooks.tar | sudo /opt/gitlab/embedded/bin/gitaly hooks set --storage <storage> --repository <relative path> --config <config path>
입니다.- 노드에 연결하려면 유효한 Gitaly 구성 파일 경로가
--config
플래그에 제공되어야 합니다. - 사용자 정의 후크 tarball을
stdin
을 통해 전달해야 합니다. 예를 들어,cat custom_hooks.tar | sudo /opt/gitlab/embedded/bin/gitaly hooks set --storage <storage> --repository <relative path> --config <config path>
입니다.
- 노드에 연결하려면 유효한 Gitaly 구성 파일 경로가
- Gitaly 클러스터를 사용하는 경우, 모든 Gitaly 노드에서
hooks set
하위 명령을 실행해야 합니다. 자세한 내용은 Gitaly 클러스터의 서버 후크를 참조하세요.
서버 후크 코드를 올바르게 구현했다면, Git 후크가 다음에 트리거될 때 실행될 것입니다.
리포지터리에 서버 후크를 생성하려면:
- 왼쪽 사이드바에서 가장 아래에 있는 관리 영역(Admin Area)을 선택하세요.
- 개요 > 프로젝트로 이동하여 서버 후크를 추가하려는 프로젝트를 선택하세요.
- 나타나는 페이지에서 상대 경로의 값을 찾으세요. 이 경로는 서버 후크가 위치해야 하는 곳입니다.
- 만약 해시된 리포지터리를 사용하는 경우, 상대 경로 해석에 대한 정보는 해시된 리포지터리 경로 번역를 참조하세요.
- 만약 해시된 리포지터리를 사용하지 않는 경우:
- 리눅스 패키지 설치의 경우, 경로는 보통
/var/opt/gitlab/git-data/repositories/<group>/<project>.git
입니다. - 사용자 컴파일 설치의 경우, 경로는 보통
/home/git/repositories/<group>/<project>.git
입니다.
- 리눅스 패키지 설치의 경우, 경로는 보통
- 파일 시스템에서 정확한 위치에
custom_hooks
라는 새 디렉터리를 만드세요. - 새
custom_hooks
디렉터리에서:- 단일 서버 후크를 생성하려면 후크 유형과 일치하는 이름의 파일을 생성하세요. 예를 들어,
pre-receive
서버 후크의 경우 파일 이름은 확장명이 없는pre-receive
여야 합니다. - 여러 서버 후크를 생성하려면 후크 유형과 일치하는 디렉터리를 생성하세요. 예를 들어
pre-receive
서버 후크의 경우 디렉터리 이름은pre-receive.d
여야 합니다. 해당 디렉터리에 후크용 파일을 넣으세요.
- 단일 서버 후크를 생성하려면 후크 유형과 일치하는 이름의 파일을 생성하세요. 예를 들어,
- 서버 후크 파일을 실행 가능하도록 설정하고 Git 사용자가 소유하도록 합니다.
- 서버 후크 기능을 올바르게 작동하도록 하는 코드를 작성하세요. Git 서버 후크는 어떤 프로그래밍 언어든 가능합니다. shebang이 해당 언어 유형을 반영하도록 합니다. 예를 들어, 스크립트가 루비인 경우 shebang은 아마도
#!/usr/bin/env ruby
일 것입니다. - 백업 파일 패턴(
*~
)과 일치하지 않도록 합니다. - Gitaly 클러스터를 사용하는 경우, 모든 Gitaly 노드에서 이 프로세스를 반복해야 합니다. 자세한 내용은 Gitaly 클러스터의 서버 후크를 참조하세요.
만약 서버 후크 코드를 올바르게 구현했다면, Git 후크가 다음에 트리거될 때 실행될 것입니다.
Gitaly 클러스터의 서버 후크
만약 Gitaly 클러스터를 사용한다면, 개별 리포지터리는 Praefect에서 여러 Gitaly 스토리지로 복제될 수 있습니다. 따라서 후크 스크립트는 해당 리포지터리의 레플리카를 가진 모든 Gitaly 노드로 복사해야 합니다. 이를 위해 해당되는 버전에 대한 사용자 정의 리포지터리 후크 설정 단계를 반복하세요.
스크립트를 복사해야 하는 위치는 리포지터리가 저장되는 곳에 따라 다릅니다:
- GitLab 15.2 및 이전 버전에서 Gitaly 클러스터는 GitLab 애플리케이션에서 보고한 해시 리포지터리 경로를 사용합니다.
- GitLab 15.3 및 그 이후 버전에서는 새로운 리포지터리는 Praefect에서 생성된 레플리카 경로를 사용하며, 이는 해시 리포지터리 경로가 아닙니다. 레플리카 경로는 Praefect 리포지터리 메타데이터를 쿼리하여 식별할 수 있으며, 이때
-relative-path
를 사용하여 기대하는 GitLab 해시 리포지터리 경로를 지정합니다.
모든 리포지터리에 대한 전역 서버 후크 생성
모든 리포지터리에 적용되는 Git 후크를 만들려면 전역 서버 후크를 설정하세요. 전역 서버 후크는 또한 다음에도 적용됩니다:
-
프로젝트 및 그룹 위키 리포지터리. 그들의 리포지터리 디렉터리 이름은
<id>.wiki.git
형식입니다. - 프로젝트 하위의 디자인 관리 리포지터리. 그들의 리포지터리 디렉터리 이름은
<id>.design.git
형식입니다.
서버 후크 디렉터리 선택
전역 서버 후크를 생성하기 전에, 해당 후크를 위한 디렉터리를 선택해야 합니다.
리눅스 패키지 설치의 경우, 디렉터리는 gitlab.rb
의 gitaly['configuration'][:hooks][:custom_hooks_dir]
에서 설정됩니다. 다음 중 하나를 선택할 수 있습니다:
- 기본 제안을 사용하여
/var/opt/gitlab/gitaly/custom_hooks
디렉터리를 주석 처리 해제합니다. - 자체 설정을 추가합니다.
자체 컴파일 설치의 경우:
- 디렉터리는 구성 파일에 설정됩니다. 구성 파일의 위치는 GitLab 버전에 따라 달라집니다:
- GitLab 13.1 이상의 경우, 디렉터리는
gitaly/config.toml
의[hooks]
섹션에 설정됩니다. 그러나, 만약gitaly/config.toml
의 값이 비어있거나 존재하지 않으면, GitLab은gitlab-shell/config.yml
의custom_hooks_dir
값을 적용합니다. - GitLab 13.0 이하의 경우, 디렉터리는
gitlab-shell/config.yml
에 설정됩니다.
- GitLab 13.1 이상의 경우, 디렉터리는
- 기본 디렉터리는
/home/git/gitlab-shell/hooks
입니다.
전역 서버 후크 생성
모든 리포지터리에 대한 전역 서버 후크를 만들려면 다음을 수행하세요:
- GitLab 서버에서 구성된 전역 서버 후크 디렉터리로 이동합니다.
- 구성된 전역 서버 후크 디렉터리에서, 후크 타입과 일치하는 후크를 대상으로한 디렉터리를 생성합니다. 예를 들어,
pre-receive
서버 후크의 경우 디렉터리 이름은pre-receive.d
여아 합니다. - 이 새로운 디렉터리 안에 서버 후크를 추가합니다. Git 서버 후크는 임의의 프로그래밍 언어로 작성될 수 있습니다. 상위단에 있는 shebang이 언어 유형을 반영하도록 합니다. 예를 들어, 스크립트가 루비로 작성되었다면 shebang는 아마도
#!/usr/bin/env ruby
일 것입니다. - 후크 파일을 실행 가능하게 만들고, Git 사용자 소유이며, 백업 파일 패턴(
*~
)과 일치하지 않도록 합니다.
서버 후크 코드가 올바르게 구현된 경우, Git 후크가 다음에 트리거될 때 실행될 것입니다. 후크는 후크 타입 하위 디렉터리의 파일 이름별로 알파벳 순서대로 실행됩니다.
리포지터리의 서버 후크 제거
- GitLab 15.11에서 도입되었음,
hooks set
명령어가 직접적인 파일 시스템 접근을 대체합니다.
전제 조건:
- 리포지터리의 리포지터리 이름과 상대 경로.
서버 후크를 제거하려면, 빈 tarball을 hook set
에 전달하여 해당 리포지터리에 후크가 없어야 함을 나타내세요. 예를 들어:
cat empty_hooks.tar | sudo /opt/gitlab/embedded/bin/gitaly hooks set --storage <storage> --repository <relative path> --config <config path>`.
서버 후크를 제거하려면:
- 디스크에 있는 리포지터리의 위치로 이동합니다.
-
custom_hooks
디렉터리에서 서버 후크를 삭제합니다.
체인된 서버 후크
GitLab은 서버 후크를 체인으로 실행할 수 있습니다. GitLab은 다음과 같은 순서로 서버 후크를 검색하고 실행합니다:
- 내장된 GitLab 서버 후크. 이러한 서버 후크는 사용자에 의해 사용자 정의될 수 없습니다.
-
<project>.git/custom_hooks/<hook_name>
: 프로젝트별 후크. 이 위치는 하위 호환성을 유지하기 위해 유지됩니다. -
<project>.git/custom_hooks/<hook_name>.d/*
: 프로젝트별 후크를 위한 위치입니다. -
<custom_hooks_dir>/<hook_name>.d/*
: 편집기 백업 파일 외의 모든 실행 가능한 전역 후크 파일을 위한 위치입니다.
서버 후크 디렉터리 내에서 후크는:
- 알파벳 순서대로 실행됩니다.
- 후크가 0이 아닌 값으로 종료되면 후크는 실행을 중지합니다.
서버 후크에서 사용 가능한 환경 변수
서버 후크에는 모든 환경 변수를 전달할 수 있지만, 지원되는 환경 변수에만 의존해야 합니다.
다음 GitLab 환경 변수는 모든 서버 후크에서 지원됩니다:
환경 변수 | 설명 |
---|---|
GL_ID
| 푸시를 시작한 사용자 또는 SSH 키의 GitLab 식별자입니다. 예: user-2234 또는 key-4 .
|
GL_PROJECT_PATH
| (GitLab 13.2 이상) GitLab 프로젝트 경로입니다. |
GL_PROTOCOL
| (GitLab 13.2 이상) 이 변경에 사용된 프로토콜입니다. http (HTTP를 사용한 Git push ), ssh (SSH를 사용한 Git push ), 또는 web (다른 모든 동작) 중 하나입니다.
|
GL_REPOSITORY
| 프로젝트 id 입니다. id 는 프로젝트의 ID입니다.
|
GL_USERNAME
| 푸시를 시작한 사용자의 GitLab 사용자 이름입니다. |
다음 Git 환경 변수는 pre-receive
및 post-receive
서버 후크에서 지원됩니다:
환경 변수 | 설명 |
---|---|
GIT_ALTERNATE_OBJECT_DIRECTORIES
| 격리 환경에서 대체 객체 디렉터리입니다. Git receive-pack 설명서 참조.
|
GIT_OBJECT_DIRECTORY
| 격리 환경에서의 GitLab 프로젝트 경로입니다. Git receive-pack 설명서 참조.
|
GIT_PUSH_OPTION_COUNT
|
push 옵션의 수입니다. Git pre-receive 설명서 참조.
|
GIT_PUSH_OPTION_<i>
|
i 가 0 부터 GIT_PUSH_OPTION_COUNT - 1 까지인 경우의 push 옵션의 값입니다. Git pre-receive 설명서 참조.
|
커스텀 오류 메시지
GitLab UI에 커밋이 거부되거나 Git 후크 실행 중 오류가 발생할 때 사용자 정의 오류 메시지를 표시할 수 있습니다. 사용자 정의 오류 메시지를 표시하려면 스크립트는 다음과 같아야 합니다.
- 사용자 정의 오류 메시지를 스크립트의
stdout
또는stderr
로 보냅니다. - 각 메시지 앞에
GL-HOOK-ERR:
을 붙입니다. 이 접두사 앞에는 어떤 문자도 나타나면 안 됩니다.
예를 들어:
#!/bin/sh
echo "GL-HOOK-ERR: 내 커스텀 오류 메시지.";
exit 1