Includes
Includes allow you to separate your configuration into multiple files or share configuration between projects.
Includes can be from files, or from a Git repository.
Git repositories designed to be used in this way are referred to as 'bundles'. The bundles page lists some publicly-available bundles you can use in your own projects.
The format for included files is the same as for standard configuration files, but cannot have a project name. Included files can include further files.
Definition
File includes
File includes can be specified in either of these two formats:
Concise format:
include:
- some-include.ymlExpanded format:
include:
- type: file
path: some-include.yml
The path to the included file is relative to the directory containing the configuration file. (For example, if /my-project/dir-a/batect.yml
has an include
for ../dir-b/extra-config.yml
, then /my-project/dir-b/extra-config.yml
will be used.)
Git includes
Git includes must be specified in this format:
include:
- type: git
repo: https://github.com/batect/hello-world-bundle.git
ref: 0.2.0
path: some-bundle.yml # Optional, defaults to 'batect-bundle.yml'
repo
is the URL of the repository, as you would pass togit clone
.ref
is the name of the tag or branch, or commit hash to use.It's highly recommended that you use an immutable tag, as this ensures that you always get the same bundle contents each time.
path
is the path to the configuration file from the repository to include. It is optional and defaults tobatect-bundle.yml
.
The bundles page lists some publicly-available bundles you can use in your own projects.
Only use bundles that you trust, as they can contain arbitrary code that will be executed when you run a task or use a container from a bundle.
Paths in included files
Relative paths in included files such as paths for volume mounts or build directories will be resolved relative to that file's directory.
Use the built-in batect.project_directory
config variable to get the path to the root project directory,
for example:
containers:
my-other-container:
image: alpine:1.2.3
volumes:
- local: <{batect.project_directory}/scripts
container: /code/scripts
Examples
File include
If /my-project/a.yml
contains:
containers:
my-container:
image: alpine:1.2.3
include:
- includes/b.yml
And /my-project/includes/b.yml
contains:
tasks:
my-task:
run:
container: my-container
Then the resulting configuration is as if /my-project/a.yml
was:
containers:
my-container:
image: alpine:1.2.3
tasks:
my-task:
run:
container: my-container
Git include
The following configuration file includes version 0.2.0 of the hello world bundle:
include:
- type: git
repo: https://github.com/batect/hello-world-bundle.git
ref: 0.2.0
This bundle adds a single say-hello
task that can be run just like any other task: ./batect say-hello
.
Building bundles
The following are some tips for building bundles:
Consider building and publishing any Docker images your bundle uses rather than using build_directory
Pulling a pre-built image is generally faster than building an image from a Dockerfile.
It also prevents issues when packages or other external resources are removed.
Do not store state from tasks in the bundle's working copy
Batect clones the repository and checks out the given tag or branch, and shares this working copy between projects to save time and disk space. Storing state in this working copy would mean that different projects could interfere with one another.
Instead, store any state in the project's directory. Use the batect.project_directory
config variable
to get the path to the project's directory. See the paths in included files section above for an example.
Publish immutable tags
Similar to Docker's behaviour when pulling image tags, Batect only checks that it has previously cloned the Git reference (branch name, tag name or commit) - it does not check that the local clone is up-to-date with that reference. Therefore, using an immutable reference such as a tag ensures that everyone using the project gets the exact same version of the bundle.
It is recommended you use semantic versioning when versioning bundles.
Test your bundle
Testing your bundle ensures that it works as expected. The hello world bundle has an example of how to do this.