History
Git server hooks (not to be confused with system hooks or file hooks) run custom logic on the GitLab server. You can use them to run Git-related tasks such as:
Git server hooks use pre-receive
, post-receive
, and update
Git server-side hooks.
GitLab administrators configure server hooks using the gitaly
command, which also:
If you don’t have access to the gitaly
command, alternatives to server hooks include:
Geo doesn’t replicate server hooks to secondary nodes.
Set server hooks for a repositoryHistory
hooks set
command replaces direct file system access. Existing Git hooks don’t need migrating for the hooks set
command.Prerequisites:
/var/opt/gitlab/gitaly/config.toml
on Linux package instances), and the repository relative path for the repository.To set server hooks for a repository:
Create tarball containing custom hooks:
Write the code to make the server hook function as expected. Git server hooks can be in any programming language. Ensure the shebang at the top reflects the language type. For example, if the script is in Ruby the shebang is probably #!/usr/bin/env ruby
.
pre-receive
server hook, the filename should be pre-receive
with no extension.pre-receive
server hook, the directory name should be pre-receive.d
. Put the files for the hook in that directory.Ensure the server hook files are executable and do not match the backup file pattern (*~
). The server hooks be in a custom_hooks
directory that is at the root of the tarball.
Create the custom hooks archive with the tar command. For example, tar -cf custom_hooks.tar custom_hooks
.
Run the hooks set
subcommand with required options to set the Git hooks for the repository. For example, cat custom_hooks.tar | sudo -u git -- /opt/gitlab/embedded/bin/gitaly hooks set --storage <storage> --repository <relative path> --config <config path>
.
--config
flag.stdin
. For example, cat custom_hooks.tar | sudo -u git -- /opt/gitlab/embedded/bin/gitaly hooks set --storage <storage> --repository <relative path> --config <config path>
.If you are using Gitaly Cluster (Praefect), you must run hooks set
subcommand on all Gitaly nodes. For more information, see Server hooks on a Gitaly Cluster (Praefect).
If you implemented the server hook code correctly, it should execute when the Git hook is next triggered.
To create server hooks for a repository:
/var/opt/gitlab/git-data/repositories/<group>/<project>.git
./home/git/repositories/<group>/<project>.git
.custom_hooks
.custom_hooks
directory:
pre-receive
server hook, the filename should be pre-receive
with no extension.pre-receive
server hook, the directory name should be pre-receive.d
. Put the files for the hook in that directory.#!/usr/bin/env ruby
.*~
).If the server hook code is properly implemented, it should execute when the Git hook is next triggered.
Server hooks on a Gitaly Cluster (Praefect)If you use Gitaly Cluster (Praefect), an individual repository may be replicated to multiple Gitaly storages in Praefect. Consequentially, the hook scripts must be copied to every Gitaly node that has a replica of the repository. To accomplish this, follow the same steps for setting custom repository hooks for the applicable version and repeat for each storage.
The location to copy the scripts to depends on where repositories are stored. New repositories are created using Praefect-generated replica paths, which are not the hashed storage path. The replica path can be identified by querying the Praefect repository metadata using -relative-path
to specify the expected GitLab hashed storage path.
To create a Git hook that applies to all repositories, set a global server hook. Global server hooks also apply to:
<id>.wiki.git
.<id>.design.git
.Before creating a global server hook, you must choose a directory for it.
For Linux package installations, the directory is set in gitlab.rb
under gitaly['configuration'][:hooks][:custom_hooks_dir]
. You can either:
/var/opt/gitlab/gitaly/custom_hooks
directory by uncommenting it.For self-compiled installations:
gitaly/config.toml
under the [hooks]
section. However, GitLab honors the custom_hooks_dir
value in gitlab-shell/config.yml
if the value in gitaly/config.toml
is blank or non-existent./home/git/gitlab-shell/hooks
.To create a global server hook for all repositories:
pre-receive
server hook, the directory name should be pre-receive.d
.#!/usr/bin/env ruby
.*~
).If the server hook code is properly implemented, it should execute when the Git hook is next triggered. Hooks are executed in alphabetical order by filename in the hook type subdirectories.
Remove server hooks for a repositoryHistory
hooks set
command replaces direct file system access.Prerequisites:
To remove server hooks, pass an empty tarball to hook set
to indicate that the repository should contain no hooks. For example:
cat empty_hooks.tar | sudo -u git -- /opt/gitlab/embedded/bin/gitaly hooks set --storage <storage> --repository <relative path> --config <config path>
To remove server hooks:
custom_hooks
directory.GitLab can execute server hooks in a chain. GitLab searches for and executes server hooks in the following order:
<project>.git/custom_hooks/<hook_name>
: Per-project hooks. This location is kept for backwards compatibility.<project>.git/custom_hooks/<hook_name>.d/*
: Location for per-project hooks.<custom_hooks_dir>/<hook_name>.d/*
: Location for all executable global hook files except editor backup files.Within a server hooks directory, hooks:
You can pass any environment variable to server hooks, but you should only rely on supported environment variables.
The following GitLab environment variables are supported for all server hooks:
Environment variable DescriptionGL_ID
GitLab identifier of user or SSH key that initiated the push. For example, user-2234
or key-4
. GL_PROJECT_PATH
GitLab project path. GL_PROTOCOL
Protocol used for this change. One of: http
(Git push
using HTTP), ssh
(Git push
using SSH), or web
(all other actions). GL_REPOSITORY
project-<id>
where id
is the ID of the project. GL_USERNAME
GitLab username of the user that initiated the push.
The following Git environment variables are supported for pre-receive
and post-receive
server hooks:
You can have custom error messages appear in the GitLab UI when a commit is declined or an error occurs during the Git hook. To display a custom error message, your script must:
stdout
or stderr
.GL-HOOK-ERR:
with no characters appearing before the prefix.For example:
#!/bin/sh
echo "GL-HOOK-ERR: My custom error message.";
exit 1
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4