DEV Community

Cover image for Custom Gitlab Hooks
Alex M. Schapelle for Otomato

Posted on

Custom Gitlab Hooks

Welcome dear reader, My name is Silent-Mobius, also known as Alex M. Schapelle.
Today we'll cover controversial topic of custom hooks on the git SCM server, mainly on GitLab-CI, and howto create them.
Before we dwell onto subject, Let us address the existing wisdom:

  • Today, special type of events can be a triggered with built-in tools called web-hooks.
  • For custom conditioning of web-hooks, via web UI, currently is not possible.
  • If one insists, it can be automated, to use web-hook to trigger, custom service that will activate your custom hooks, yet it is somewhat trouble some.

What are these custom hooks, you speak of ?

Simple put, a script or a piece of software that perform tasks of check, order or conditioning of your remote requests.

Git natively supports hooks that are executed on different actions. Examples of server-side git hooks include pre-receive, post-receive, and update. See Git SCM Server-Side Hooks for more information about each hook type.

When it comes to GitLab, as of gitlab-shell version 2.2.0 (which requires GitLab 7.5+), GitLab administrators can add custom git hooks to any GitLab project.
>Note: Custom git hooks must be configured on the filesystem of the GitLab server. Only GitLab server administrators will be able to complete these tasks

What would be the cases, one might need custom hooks ?

The cases, where using web-hooks only triggers the pipelines in development environment, but there is no possibility to condition or run specific commands from gitlab notification, thus usage of server side custom hooks are in demand.

Let us dive into setup

git hooks are placed in the repository or project's hooks directory. GitLab creates a symlink from each project's hooks directory to the gitlab-shell hooks directory for ease of maintenance between gitlab-shell upgrades. As such, custom hooks are implemented a little differently. Behavior is exactly the same once the hook is created, though. Follow these steps to set up a custom hook.

  • Pick a project that needs a custom git hook.
  • On the GitLab server, navigate to the project's repository directory. For an installation from source the path is usually /home/git/repositories/<group>/<project>.git. For Omnibus installs the path is usually /var/opt/gitlab/git-data/repositories/<group>/<project>.git.
  • Create a new directory in this location called custom_hooks.
  • Inside the new custom_hooks directory, create a file with a name matching the hook type. For a pre-receive hook the file name should be pre-receive with no extension.
  • Make the hook file executable and make sure it's owned by git.
  • Write the code to make the git hook function as expected. Hooks can be in any language. Ensure the 'shebang' #! at the top properly reflects the language type. For example, if the script is in Bash the shebang will probably be #!/usr/bin/env bash.

That's it! Assuming the hook code is properly implemented the hook will fire as appropriate.

Top comments (0)