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