1. Resources
  2. /
  3. Plugins
  4. /
  5. a8c-ci-toolkit-buildkite-plugin

CI Toolkit Buildkite Plugin

A library of commonly used commands for your CI builds.

Example

For a directory structure that looks like:

my-project/
├── node_modules/
├── package.json
├── package-lock.json

Add the following to your pipeline.yml:

steps:
  - command: |
      # To persist the cache
      save_cache node_modules/ $(hash_file package-lock.json)

      # To restore the cache, if present
      restore_cache $(hash_file package-lock.json)

    plugins:
      - automattic/a8c-ci-toolkit#7.0.0:
          bucket: a8c-ci-cache # optional

Don’t forget to verify what the latest release is and use that value instead of 7.0.0.

Configuration

bucket (Optional, string)

The name of the S3 bucket to fallback to if the CACHE_BUCKET_NAME environment variable is not set in the CI host. Used by save_cache and restore_cache.

Using the commands inside a Docker container

The commands are made available by adding this plugin’s bin/ directory to the $PATH of the CI job. A step that runs its command inside a container — via the docker plugin, say — doesn’t get them, because the plugin’s files live on the agent host rather than in the image.

For those steps, this plugin exports $A8C_CI_TOOLKIT_PLUGIN_DIR, the absolute path to its own checkout on the host. Mount that into the container and put its bin/ on the $PATH there:

steps:
  - command: |
      export PATH="$$PATH:/a8c-ci-toolkit/bin"

      checkout_release_branch "$RELEASE_VERSION"
    plugins:
      - automattic/a8c-ci-toolkit#7.0.0
      - docker#v5.13.0:
          image: node:22-bookworm
          expand-volume-vars: true
          volumes:
            - "$$A8C_CI_TOOLKIT_PLUGIN_DIR:/a8c-ci-toolkit:ro"

Three things make that work:

  • Listing this plugin alongside docker. Every plugin’s environment hook runs before any plugin’s command hook, so the variable is exported before the docker plugin assembles its docker run arguments — whichever order the two are listed in.
  • expand-volume-vars: true, without which the docker plugin passes the volumes entry through verbatim instead of interpolating the variable.
  • The $$ in both $$A8C_CI_TOOLKIT_PLUGIN_DIR and $$PATH. A single $ is resolved when the pipeline is uploaded, where neither variable has a value yet; $$ defers it to when the job runs. Note that this is only needed if you write that line directly in the .yml; if instead your command: calls a dedicated .sh script you can do export PATH=$PATH:/a8c-ci-toolkit/bin in that .sh file instead of in the .yml and avoid the need for the $$ escape.

Only the commands whose dependencies the image provides will work, of course — checkout_release_branch needs bash and git inside the container, for instance.

Developing

To run the linter and tests:

make lint
make test

Contributing

  1. Fork the repo
  2. Make the changes
  3. Run the tests
  4. Commit and push your changes
  5. Send a pull request

Releasing

  1. Make a PR to update references of the version number in this README.md and to update the CHANGELOG.md according to the <!-- instructions --> to prepare it for a new release.
  2. Merge the PR
  3. Create a new GitHub Release, named after the new version number, and pasting the content of the CHANGELOG.md section corresponding to the new version as description. This will have the side effect of creating a git tag too, which is all we need for the new version to be available.

The plugins listed on this webpage are provided for informational purposes only. They have not undergone any formal security review or assessment. While we strive to provide useful resources, we cannot guarantee the safety, reliability, or integrity of these plugins. Users are strongly advised to conduct their own security evaluations before downloading, installing, or using any plugin. By using these plugins, you acknowledge and accept any risks associated with their use. We disclaim any liability for any harm or damages arising from the use of the plugins listed.

You deserve better CI.

Get started for free with a full month of our all-access trial.

Buildkite Pipelines

Platform

  1. Pipelines
  2. Public pipelines
  3. Test Engine
  4. Package Registries
  5. Mobile Delivery Cloud
  6. Pricing

Hosting options

  1. Self-hosted agents
  2. Mac hosted agents
  3. Linux hosted agents

Resources

  1. Docs
  2. Blog
  3. Changelog
  4. Example pipelines
  5. Plugins
  6. Webinars
  7. Case studies
  8. Events
  9. Migration Services

Company

  1. About
  2. Careers
  3. Press
  4. Security
  5. Brand assets
  6. Contact

Solutions

  1. Replace Jenkins
  2. Workflows for MLOps
  3. Testing at scale
  4. Monorepo mojo
  5. Bazel orchestration

Compare

  1. Buildkite vs GitHub Actions
  2. Buildkite vs Jenkins
  3. Buildkite vs CircleCI
  4. Buildkite vs Harness
  5. Buildkite vs CloudBees
  6. Buildkite vs Blacksmith
  7. Buildkite vs Depot

Legal

  1. Terms of Service
  2. Acceptable Use Policy
  3. Privacy Policy
  4. Subprocessors
  5. Service Level Agreement
  6. Supplier Code of Conduct
  7. Modern Slavery Statement

Support

  1. System status
  2. Forum
© Buildkite Pty Ltd 2026