Buildkite Agent Hooks

Every agent installer comes with a hooks directory which can be used to override and extend the built-in agent behavior. For example, you could create an agent checkout hook which speeds up a fresh git clone on a new build machine, an agent environment hook which exports secret API keys as environment variables, or a repository pre-command hook which sets up repository-specific environment variables.

Types of hooks

There are three types of hooks:

  • Agent hooks - these exist on the agent’s machine, and are run for every job on any pipeline.
  • Repository hooks - these exist in your pipeline repository’s .buildkite/hooks directory.
  • Plugin hooks - these are provided by any plugins you've defined in your pipeline.yml.

Agent hooks

Each agent installer comes with a hooks directory containing a set of sample hooks. You can find the location of your agent hooks directory in your platform’s installation documentation.

To get started with agent hooks copy the relevant example script and remove the .sample file extension.

Repository hooks

Repository hooks allow you to execute repository-specific scripts. Repository hooks live alongside your repository’s source code under the directory .buildkite/hooks.

To get started, create a shell script in .buildkite/hooks named post-checkout. It will be sourced and run every build, after the Agent checks your repository out. You can also use one of the other available Repository hooks, according to when you want your custom script to run.

Plugin hooks

Plugin hooks allow plugins you’ve defined in your Pipeline to override default behavior.

See the plugin documentation for how to implement plugin hooks.

Available hooks

The following is a complete list of available hooks, and the order in which they are called:

Hook Order Description
environment Agent, Plugin Runs before all other hooks. Useful for exposing secret keys and adding strict checks.
pre-checkout Agent, Plugin Runs before checkout.
checkout Plugin, Agent Overrides the default git checkout behavior.
Note: As of Agent v3.15.0, if multiple checkout hooks are found, only the first will be run.
post-checkout Agent, Repository, Plugin Runs after checkout.
pre-command Agent, Repository, Plugin Runs before the build command.
command Plugin, Repository, Agent Overrides the default command running behavior. If multiple command hooks are found, only the first will be run.
post-command Agent, Repository, Plugin Runs after the command.
pre-artifact Agent, Repository, Plugin Runs before artifacts are uploaded, if an artifact upload pattern was defined for the job.
post-artifact Agent, Repository, Plugin Runs after artifacts have been uploaded, if an artifact upload pattern was defined for the job.
pre-exit Agent, Repository, Plugin Runs before the job finishes. Useful for performing cleanup tasks.
agent-shutdown Agent Runs when each agent shuts down, and prints output only to the agent log. Useful for performing cleanup tasks for the entire agent, outside of the job lifecycle.

Creating hook scripts

Hooks are shell scripts you can use to run commands and export environment variables. Hooks have access to all the standard Buildkite environment variables.

Hooks are copied to $TMPDIR directory and sourced by the default shell on the Agent that is running the build, which has a few implications:

  • $BASH_SOURCE contains the location the hook is sourced from
  • $0 contains the location of the copy of the script that is running from $TMPDIR
  • the shebang line of the hook script has no effect

To write hooks in another programming language, you need to call them from within the shell script, and explicitly pass any Buildkite environment variables you need to the script when you call it.

The following is an example of a custom environment hook which exports a GitHub API key for the pipeline’s release build step:

set -eu
echo '--- :house_with_garden: Setting up the environment'


Hooks on Windows

Agents running Windows require hook files to have either:

An example of a windows environment.bat hook:

ECHO "--- :house_with_garden: Setting up the environment"