Git 서버 훅

Tier: Free, Premium, Ultimate Offering: Self-Managed
  • GitLab 15.6에서 서버 훅을 Git 서버 훅으로 이름이 변경되었습니다.

Git 서버 훅(시스템 훅 또는 파일 훅과 혼동해서는 안 됨)은 GitLab 서버에서 사용자 정의 로직을 실행합니다. 이를 사용하여 다음과 같은 Git 관련 작업을 수행할 수 있습니다.

  • 특정 커밋 정책 강제
  • 저장소 상태에 따라 작업 수행

Git 서버 훅은 pre-receive, post-receive, 그리고 update Git 서버 측 후크을 사용합니다.

GitLab 관리자는 gitaly 명령을 사용하여 서버 훅을 구성하며, 이 명령은 또한 다음을 제공합니다.

  • Gitaly 서버를 시작하는 데 사용됨
  • 여러 하위 명령을 제공함
  • Gitaly gRPC API에 연결함

gitaly 명령에 액세스할 수 없는 경우 서버 훅 대체로 다음이 포함됩니다.

Geo는 서버 훅을 보조 노드로 복제하지 않습니다.

저장소에 서버 훅 설정하기

GitLab 15.11 및 해당 버전
  • GitLab 15.11에서 hooks set 명령이 도입되어 기존 Git 후크를 hooks set 명령으로 이전할 필요가 없습니다.

사전 요구 사항:

  • 저장소 이름, Gitaly 구성 파일의 경로 (Linux 패키지 인스턴스의 기본 경로는 /var/opt/gitlab/gitaly/config.toml입니다), 그리고 저장소 상대 경로
  • 훅에 필요한 모든 언어 런타임 및 유틸리티가 Gitaly를 실행하는 각 서버에 설치되어 있어야 함

저장소에 서버 훅을 설정하려면:

  1. 사용자 정의 훅을 포함하는 tar 파일을 만듭니다.
    1. 서버 훅이 예상대로 작동하게 하는 코드를 작성합니다. Git 서버 훅은 어떤 프로그래밍 언어든지 사용할 수 있습니다. 상단에 shebang이 해당 언어 유형을 반영하도록 합니다. 예를 들어, 스크립트가 Ruby로 작성된 경우 shebang은 아마도 #!/usr/bin/env ruby일 것입니다.

      • 단일 서버 훅을 만들려면 해당 후크 유형과 일치하는 이름의 파일을 생성합니다. 예를 들어 pre-receive 서버 훅의 경우 파일 이름은 확장자 없이 pre-receive여야 합니다.
      • 여러 서버 훅을 만들려면 해당 후크 유형과 일치하는 디렉토리를 생성합니다. 예를 들어 pre-receive 서버 훅의 경우 디렉토리 이름은 pre-receive.d여야 합니다. 해당 디렉토리에 후크 파일을 넣습니다.
    2. 서버 훅 파일이 실행 가능하고 백업 파일 패턴(*~)과 일치하지 않도록 합니다. 서버 훅은 tar 파일의 루트에 있는 custom_hooks 디렉토리에 있어야 합니다.
    3. tar 명령을 사용하여 사용자 정의 훅 아카이브를 생성합니다. 예를 들어, tar -cf custom_hooks.tar custom_hooks입니다.
  2. 요구 사항에 맞는 옵션으로 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>입니다.
  3. Gitaly 클러스터를 사용하는 경우 모든 Gitaly 노드에서 hooks set 하위 명령을 실행해야 합니다. 자세한 내용은 Gitaly 클러스터의 서버 훅을 참조하십시오.

서버 훅 코드를 올바르게 구현한 경우 다음에 Git 후크가 다음으로 트리거될 때 실행될 것입니다.

GitLab 15.10 및 해당 버전

저장소에 서버 훅을 생성하려면:

  1. 왼쪽 사이드바에서 가장 아래쪽에 있는 관리자를 선택합니다.
  2. 개요 > 프로젝트로 이동하고 서버 훅을 추가하려는 프로젝트를 선택합니다.
  3. 표시된 페이지에서 상대 경로 값을 찾습니다. 이 경로는 서버 훅을 배치해야 하는 위치입니다.
    • 해시 저장을 사용하는 경우 서버 훅 위치 해석에 대한 정보는 해시 저장 경로 번역을 참조하십시오.
    • 해시 저장을 사용하지 않는 경우:
      • Linux 패키지 설치의 경우 경로는 일반적으로 /var/opt/gitlab/git-data/repositories/<group>/<project>.git입니다.
      • 자체 컴파일 설치의 경우 경로는 일반적으로 /home/git/repositories/<group>/<project>.git입니다.
  4. 파일 시스템에서 올바른 위치에 custom_hooks라는 새 디렉토리를 생성합니다.
  5. custom_hooks 디렉토리에서:
    • 단일 서버 훅을 만들려면 해당 후크 유형과 일치하는 이름의 파일을 생성합니다. 예를 들어, pre-receive 서버 훅의 경우 파일 이름은 확장자 없이 pre-receive여야 합니다.
    • 여러 서버 훅을 만들려면 해당 후크 유형과 일치하는 디렉토리를 생성합니다. 예를 들어 pre-receive 서버 훅의 경우 디렉토리 이름은 pre-receive.d여야 합니다. 해당 디렉토리에 후크 파일을 넣습니다.
  6. 서버 훅 파일을 실행할 수 있도록 만들고 Git 사용자가 소유권을 갖도록합니다.
  7. 서버 훅이 예상대로 작동하게 하는 코드를 작성합니다. Git 서버 훅은 어떤 프로그래밍 언어든지 사용할 수 있습니다. 예상대로 작동하도록 하는 shebang이 해당 언어 유형을 반영하도록합니다. 예를 들어, 스크립트가 Ruby로 작성된 경우 shebang은 아마도 #!/usr/bin/env ruby일 것입니다.
  8. 훅 파일이 백업 파일 패턴(*~)과 일치하지 않도록 합니다.
  9. Gitaly 클러스터를 사용하는 경우 모든 Gitaly 노드에서 이 프로세스를 반복해야 합니다. 자세한 내용은 Gitaly 클러스터의 서버 훅을 참조하십시오.

서버 훅 코드가 올바르게 구현된 경우, Git 후크가 다음에 트리거될 때 실행될 것입니다.

Gitaly 클러스터에서의 서버 후크

만약 Gitaly 클러스터를 사용 중이라면, 개별 저장소는 Praefect의 여러 Gitaly 스토리지에 복제될 수 있습니다. 이에 따라 후크 스크립트는 해당 저장소의 복제본을 가진 각 Gitaly 노드로 복사되어야 합니다. 이를 위해 해당 버전에 대한 사용자 지정 저장소 후크 설정 절차를 반복하고, 각 스토리지에 대해 동일한 단계를 수행하면 됩니다.

스크립트를 복사해야 할 위치는 저장소가 저장되는 위치에 따라 달라집니다:

모든 저장소에 대한 전역 서버 후크 생성

모든 저장소에 적용되는 Git 후크를 만들려면 전역 서버 후크를 설정하세요. 전역 서버 후크는 또한 다음에도 적용됩니다:

  • 프로젝트 및 그룹 위키 저장소. 그들의 저장 디렉토리 이름은 <id>.wiki.git 형식입니다.
  • 프로젝트 내 디자인 관리 저장소. 그들의 저장 디렉토리 이름은 <id>.design.git 형식입니다.

서버 후크 디렉터리 선택

전역 서버 후크를 만들기 전에 디렉터리를 선택해야 합니다.

Linux 패키지 설치의 경우, 디렉터리는 gitlab.rbgitaly['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입니다.

전역 서버 후크 생성

모든 저장소에 대한 전역 서버 후크를 만들려면:

  1. GitLab 서버에서 구성된 전역 서버 후크 디렉터리로 이동합니다.
  2. 구성된 전역 서버 후크 디렉터리에서 해당 후크 유형과 일치하는 디렉터리를 생성합니다. 예를 들어 pre-receive 서버 후크의 경우 디렉터리 이름은 pre-receive.d여야 합니다.
  3. 새로운 디렉터리 안에 서버 후크를 추가합니다. Git 서버 후크는 모든 프로그래밍 언어로 작성할 수 있습니다. 상단에 있는 shebang이 해당 언어 유형을 반영하도록 주의하세요. 예를 들어, 스크립트가 Ruby로 작성되었다면 shebang는 아마도 #!/usr/bin/env ruby일 것입니다.
  4. 후크 파일을 실행 가능하도록 만들고, Git 사용자가 소유하도록 하며, 백업 파일 패턴(*~)과 일치하지 않도록 확인하세요.

만약 서버 후크 코드가 제대로 구현되었다면, 다음에 Git 후크가 트리거될 때 실행될 것입니다. 후크는 후크 유형의 하위 디렉터리에서 파일 이름별로 알파벳순으로 실행됩니다.

저장소의 서버 후크 제거

GitLab 15.11 및 이후

필수 조건:

서버 후크를 제거하려면 빈 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>
GitLab 15.10 및 이전

서버 후크를 제거하려면:

  1. 디스크 상의 저장소 위치로 이동합니다.
  2. 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-receivepost-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> i0부터 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