diff --git a/.buildkite/hooks/.gitkeep b/.buildkite/hooks/.gitkeep new file mode 100644 index 0000000..5085652 --- /dev/null +++ b/.buildkite/hooks/.gitkeep @@ -0,0 +1 @@ +# Folder required for tests diff --git a/README.md b/README.md index a29ba09..fc0e2a6 100644 --- a/README.md +++ b/README.md @@ -28,5 +28,14 @@ Target file to zip the cache. Defaults to a hashed name in `/tmp` ### `load_settings` If non-empty, will load s3 optimized configuration +### Hooks +Hooks can be disabled by setting `BUILDKITE_PLUGIN_S3_CACHE_HOOKS` to any value + +#### pre-cache +Loads pre-cache hooks from `${BUILDKITE_BUILD_CHECKOUT_PATH}/.buildkite/hooks/pre-cache` + +#### post-cache +Loads post-cache hooks from `${BUILDKITE_BUILD_CHECKOUT_PATH}/.buildkite/hooks/post-cache` + ## License MIT (see [LICENSE](LICENSE)) diff --git a/VERSION b/VERSION index 795460f..79127d8 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v1.1.0 +v1.2.0 diff --git a/docker-compose.yml b/docker-compose.yml index 0d4b1ec..32a43d3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,7 @@ -version: '2' +version: "2" services: tests: image: buildkite/plugin-tester volumes: - ".:/plugin:ro" + - "./tests/hooks:/plugin/.buildkite/hooks:ro" diff --git a/hooks/post-checkout b/hooks/post-checkout index a83c463..2e88a3f 100755 --- a/hooks/post-checkout +++ b/hooks/post-checkout @@ -32,6 +32,11 @@ if [[ "${#paths[@]}" -gt 0 ]]; then echo "--- :compression: Uncompressing cache with tar" tar -xzf "${CACHE_FILE}" + + if [[ -z "${BUILDKITE_PLUGIN_S3_CACHE_HOOKS:-}" && -f "${BUILDKITE_BUILD_CHECKOUT_PATH}/.buildkite/hooks/post-cache" ]]; then + echo "Running post-cache hook" + "${BUILDKITE_BUILD_CHECKOUT_PATH}/.buildkite/hooks/post-cache" + fi else echo "No cache found in ${S3_PATH}" fi diff --git a/hooks/post-command b/hooks/post-command index d17117a..12ef48b 100755 --- a/hooks/post-command +++ b/hooks/post-command @@ -11,6 +11,12 @@ DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" mapfile -t paths < <(plugin_read_list DIRECTORIES) if [ ${#paths[@]} -gt 0 ]; then + + if [[ -z "${BUILDKITE_PLUGIN_S3_CACHE_HOOKS:-}" && -f "$BUILDKITE_BUILD_CHECKOUT_PATH/.buildkite/hooks/pre-cache" ]]; then + echo "Running pre-cache hook" + "$BUILDKITE_BUILD_CHECKOUT_PATH/.buildkite/hooks/pre-cache" + fi + echo "--- :compression: Compressing cache with tar" # Filter existing paths shopt -s extglob diff --git a/tests/command.bats b/tests/command.bats index 42f1075..27e1d74 100644 --- a/tests/command.bats +++ b/tests/command.bats @@ -13,6 +13,7 @@ load '/usr/local/lib/bats/load.bash' export BUILDKITE_PLUGIN_S3_CACHE_BUCKET="test" export BUILDKITE_PLUGIN_S3_CACHE_DIRECTORIES="./cache" export BUILDKITE_LABEL="This test build" + export BUILDKITE_BUILD_CHECKOUT_PATH="$PWD" stub aws \ "s3 ls s3://test/test/master/48ff2c8af2cb1b7b760080c23e4e1c92be6ee3cefef0ad8866d1d45b4485b195.tar.gz : echo 48ff2c8af2cb1b7b760080c23e4e1c92be6ee3cefef0ad8866d1d45b4485b195.tar.gz" \ @@ -38,6 +39,7 @@ load '/usr/local/lib/bats/load.bash' export BUILDKITE_PLUGIN_S3_CACHE_DIRECTORIES="tests/" export BUILDKITE_LABEL="This test build" export BUILDKITE_PLUGIN_S3_CACHE_FILE="/tmp/cache.tar.gz" + export BUILDKITE_BUILD_CHECKOUT_PATH="$PWD" stub tar \ "-zcf : touch /tmp/cache.tar.gz" diff --git a/tests/hooks.bats b/tests/hooks.bats new file mode 100644 index 0000000..14beaf9 --- /dev/null +++ b/tests/hooks.bats @@ -0,0 +1,89 @@ +#!/usr/bin/env bats + +load '/usr/local/lib/bats/load.bash' + +# Uncomment to enable stub debug output: +# export AWS_STUB_DEBUG=/dev/tty +# export TAR_STUB_DEBUG=/dev/tty + +@test "Pre-cache hooks" { + export BUILDKITE_PLUGIN_S3_CACHE_LOAD_SETTINGS="" + export BUILDKITE_PIPELINE_SLUG="test" + export BUILDKITE_BRANCH=master + export BUILDKITE_PLUGIN_S3_CACHE_BUCKET="test" + export BUILDKITE_PLUGIN_S3_CACHE_DIRECTORIES="tests/" + export BUILDKITE_LABEL="This test build" + export BUILDKITE_PLUGIN_S3_CACHE_FILE="/tmp/cache.tar.gz" + export BUILDKITE_BUILD_CHECKOUT_PATH="$PWD" + + stub tar \ + "-zcf : touch /tmp/cache.tar.gz" + + stub aws \ + "s3 cp /tmp/cache.tar.gz s3://test/test/master/48ff2c8af2cb1b7b760080c23e4e1c92be6ee3cefef0ad8866d1d45b4485b195.tar.gz : " + + run "$PWD/hooks/post-command" + + assert_success + assert_output --partial "Running pre-cache hook" + assert_output --partial "Im pre-cache" + assert_output --partial "Compressing cache with tar" + assert_output --partial "Uploading cache to" + unstub tar + unstub aws +} + +@test "Post-cache hooks" { + export BUILDKITE_PLUGIN_S3_CACHE_LOAD_SETTINGS="" + export BUILDKITE_PIPELINE_SLUG="test" + export BUILDKITE_BRANCH=master + export BUILDKITE_PLUGIN_S3_CACHE_BUCKET="test" + export BUILDKITE_PLUGIN_S3_CACHE_DIRECTORIES="./cache" + export BUILDKITE_LABEL="This test build" + export BUILDKITE_BUILD_CHECKOUT_PATH="$PWD" + + stub aws \ + "s3 ls s3://test/test/master/48ff2c8af2cb1b7b760080c23e4e1c92be6ee3cefef0ad8866d1d45b4485b195.tar.gz : echo 48ff2c8af2cb1b7b760080c23e4e1c92be6ee3cefef0ad8866d1d45b4485b195.tar.gz" \ + "s3 ls s3://test/test/master/48ff2c8af2cb1b7b760080c23e4e1c92be6ee3cefef0ad8866d1d45b4485b195.tar.gz : echo 48ff2c8af2cb1b7b760080c23e4e1c92be6ee3cefef0ad8866d1d45b4485b195.tar.gz" \ + "s3 cp s3://test/test/master/48ff2c8af2cb1b7b760080c23e4e1c92be6ee3cefef0ad8866d1d45b4485b195.tar.gz /tmp/48ff2c8af2cb1b7b760080c23e4e1c92be6ee3cefef0ad8866d1d45b4485b195.tar.gz : " + stub tar \ + "-xzf : " + + run "$PWD/hooks/post-checkout" + + assert_success + assert_output --partial "Downloading cache from" + assert_output --partial "Uncompressing cache" + assert_output --partial "Running post-cache hook" + assert_output --partial "Im post-cache" + unstub aws + unstub tar +} + +@test "Cache hooks disable" { + export BUILDKITE_PLUGIN_S3_CACHE_LOAD_SETTINGS="" + export BUILDKITE_PIPELINE_SLUG="test" + export BUILDKITE_BRANCH=master + export BUILDKITE_PLUGIN_S3_CACHE_BUCKET="test" + export BUILDKITE_PLUGIN_S3_CACHE_DIRECTORIES="./cache" + export BUILDKITE_LABEL="This test build" + export BUILDKITE_BUILD_CHECKOUT_PATH="$PWD" + export BUILDKITE_PLUGIN_S3_CACHE_HOOKS="asd" + + stub aws \ + "s3 ls s3://test/test/master/48ff2c8af2cb1b7b760080c23e4e1c92be6ee3cefef0ad8866d1d45b4485b195.tar.gz : echo 48ff2c8af2cb1b7b760080c23e4e1c92be6ee3cefef0ad8866d1d45b4485b195.tar.gz" \ + "s3 ls s3://test/test/master/48ff2c8af2cb1b7b760080c23e4e1c92be6ee3cefef0ad8866d1d45b4485b195.tar.gz : echo 48ff2c8af2cb1b7b760080c23e4e1c92be6ee3cefef0ad8866d1d45b4485b195.tar.gz" \ + "s3 cp s3://test/test/master/48ff2c8af2cb1b7b760080c23e4e1c92be6ee3cefef0ad8866d1d45b4485b195.tar.gz /tmp/48ff2c8af2cb1b7b760080c23e4e1c92be6ee3cefef0ad8866d1d45b4485b195.tar.gz : " + stub tar \ + "-xzf : " + + run "$PWD/hooks/post-checkout" + + assert_success + assert_output --partial "Downloading cache from" + assert_output --partial "Uncompressing cache" + refute_output --partial "Running post-cache hook" + refute_output --partial "Im post-cache" + unstub aws + unstub tar +} diff --git a/tests/hooks/post-cache b/tests/hooks/post-cache new file mode 100755 index 0000000..8d8b55a --- /dev/null +++ b/tests/hooks/post-cache @@ -0,0 +1,4 @@ +#!/bin/bash +set -euo pipefail + +echo "Im post-cache" diff --git a/tests/hooks/pre-cache b/tests/hooks/pre-cache new file mode 100755 index 0000000..b2a4f1f --- /dev/null +++ b/tests/hooks/pre-cache @@ -0,0 +1,4 @@ +#!/bin/bash +set -euo pipefail + +echo "Im pre-cache"