파일 훅
Offering: GitLab Self-Managed
GitLab 소스 코드를 수정하지 않고 사용자 정의 통합을 도입하려면 사용자 정의 파일 훅을 사용합니다. 파일 훅은 각 이벤트에서 실행됩니다. 파일 훅은 GitLab 서버의 파일 시스템에 구성되어야 합니다. 자체 파일 훅을 작성하고 지원하는 대신 GitLab 소스 코드에 직접 변경을 가하고 업스트림에 기여할 수 있습니다.
GitLab 소스 코드를 수정하지 않고 사용자 정의 통합을 도입하려면 사용자 정의 파일 훅을 사용합니다.
파일 훅은 각 이벤트에서 실행됩니다. 파일 훅의 코드에서 이벤트 또는 프로젝트를 필터링할 수 있으며 필요한 만큼 많은 파일 훅을 만들 수 있습니다. 각 파일 훅은 이벤트 발생 시 GitLab에 의해 비동기적으로 트리거됩니다. 이벤트 목록은 시스템 훅 및 웹훅 문서를 참조하세요.
파일 훅은 GitLab 서버의 파일 시스템에 구성되어야 합니다. GitLab 서버 관리자만 이러한 작업을 완료할 수 있습니다. 파일 시스템 액세스가 없는 경우 시스템 훅 또는 웹훅을 옵션으로 탐색하세요.
자체 파일 훅을 작성하고 지원하는 대신 GitLab 소스 코드에 직접 변경을 가하고 업스트림에 기여할 수 있습니다. 이렇게 하면 기능이 버전 간에 유지되고 테스트에 의해 커버됨을 보장할 수 있습니다.
사용자 정의 파일 훅 설정#
파일 훅은 file_hooks 디렉토리에 있어야 합니다. 하위 디렉토리는 무시됩니다.
file_hooks 아래의 example 디렉토리에서 예제를 찾을 수 있습니다.
사용자 정의 훅을 설정하려면:
-
Sidekiq 컴포넌트를 실행하는 GitLab 서버에서 플러그인 디렉토리를 찾습니다. 소스에서 컴파일한 설치의 경우 경로는 일반적으로
/home/git/gitlab/file_hooks/입니다. Linux 패키지 설치의 경우 경로는 일반적으로/opt/gitlab/embedded/service/gitlab-rails/file_hooks입니다.여러 서버를 사용하는 구성의 경우, 훅 파일이 각 GitLab 애플리케이션(Rails) 및 Sidekiq 서버에 존재해야 합니다.
-
file_hooks디렉토리 안에 공백이나 특수 문자가 없는 이름으로 파일을 만듭니다. -
훅 파일을 실행 가능하게 만들고 Git 사용자가 소유하도록 합니다.
-
파일 훅이 예상대로 기능하도록 코드를 작성합니다. 어떤 언어로도 가능하며 파일 맨 위의 'shebang'이 언어 유형을 올바르게 반영하도록 합니다. 예를 들어 스크립트가 Ruby인 경우 shebang은 아마
#!/usr/bin/env ruby일 것입니다. -
파일 훅에 대한 데이터는
STDIN에 JSON으로 제공됩니다. 시스템 훅과 정확히 동일합니다.
파일 훅 코드가 올바르게 구현된 경우, 훅은 적절한 시점에 실행됩니다. 파일 훅 파일 목록은 각 이벤트에 대해 업데이트됩니다. 새 파일 훅을 적용하기 위해 GitLab을 다시 시작할 필요가 없습니다.
파일 훅이 비제로 종료 코드로 실행되거나 실행에 실패하면 다음에 메시지가 기록됩니다:
- 소스에서 컴파일한 설치의 경우
log/file_hook.log. - Linux 패키지 설치의 경우
gitlab-rails/file_hook.log.
이 파일은 파일 훅이 비제로 종료 코드로 종료된 경우에만 생성됩니다.
파일 훅이 실행될 때 시작된 각 FileHookWorker에 대해 Sidekiq 로그 gitlab/sidekiq/current에 항목이 추가됩니다.
이 항목에는 이벤트 및 실행된 스크립트에 대한 세부 정보가 포함됩니다.
파일 훅 예제#
이 예제는 project_create 이벤트에만 응답하며,
GitLab 인스턴스가 새 프로젝트가 생성되었음을 관리자에게 알립니다.
#!/opt/gitlab/embedded/bin/ruby
# By using the embedded ruby version we eliminate the possibility that our chosen language
# would be unavailable from
require 'json'
require 'mail'
# The incoming variables are in JSON format so we need to parse it first.
ARGS = JSON.parse($stdin.read)
# We only want to trigger this file hook on the event project_create
return unless ARGS['event_name'] == 'project_create'
# We will inform our admins of our gitlab instance that a new project is created
Mail.deliver do
from 'info@gitlab_instance.com'
to 'admin@gitlab_instance.com'
subject "new project " + ARGS['name']
body ARGS['owner_name'] + 'created project ' + ARGS['name']
end
유효성 검사 예제#
자체 파일 훅을 작성하는 것은 까다로울 수 있으며, 시스템을 변경하지 않고 확인할 수 있으면 더 쉽습니다. Rake 태스크가 제공되므로 프로덕션에서 사용하기 전에 스테이징 환경에서 파일 훅을 테스트하는 데 사용할 수 있습니다. Rake 태스크는 샘플 데이터를 사용하여 각 파일 훅을 실행합니다. 출력은 시스템이 파일 훅을 인식하는지, 오류 없이 실행되었는지 확인하기에 충분해야 합니다.
# Omnibus installations
sudo gitlab-rake file_hooks:validate
# Installations from source
cd /home/git/gitlab
bundle exec rake file_hooks:validate RAILS_ENV=production
출력 예시:
Validating file hooks from /file_hooks directory
* /home/git/gitlab/file_hooks/save_to_file.clj succeed (zero exit code)
* /home/git/gitlab/file_hooks/save_to_file.rb failure (non-zero exit code)
