From d3dc6830d8425f818468ecffd3881bc4fc951baa Mon Sep 17 00:00:00 2001 From: Elliot Saba Date: Mon, 14 Jun 2021 10:06:41 -0700 Subject: [PATCH 1/2] Don't overwrite `BUILDKITE_METAHOOK_HOOKS_PATH` If we have multiple `metahook` instances, let's not generate multiple temporary directories; instead just create one (and only dump the environment variables once). This fixed an issue with multiple `metahook` instances in a pipeline of mine. --- hooks/environment | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/hooks/environment b/hooks/environment index 8542e59..34770e6 100644 --- a/hooks/environment +++ b/hooks/environment @@ -1,9 +1,11 @@ #!/usr/bin/env bash set -euo pipefail -BUILDKITE_METAHOOK_HOOKS_PATH="$(mktemp -d)" -export BUILDKITE_METAHOOK_HOOKS_PATH -env | sort | grep "BUILDKITE_PLUGIN_METAHOOK" | uniq >"${BUILDKITE_METAHOOK_HOOKS_PATH}/vars" +# If users add multiple `metahook` instances, we'll just store our `vars` in the same directory. +if [[ ! -v "BUILDKITE_METAHOOK_HOOKS_PATH" ]]; then + export BUILDKITE_METAHOOK_HOOKS_PATH="$(mktemp -d)" + env | sort | grep "BUILDKITE_PLUGIN_METAHOOK" | uniq >"${BUILDKITE_METAHOOK_HOOKS_PATH}/vars" +fi if grep -E 'BUILDKITE_PLUGIN_METAHOOK_.+(\.BAT|\.CMD)=' "${BUILDKITE_METAHOOK_HOOKS_PATH}/vars"; then echo "Sorry, we had to remove Windows Batch file support in 0.4.0." From 96495eb7e28be82b3090fc3e2cae5a4b12b7bf40 Mon Sep 17 00:00:00 2001 From: Elliot Saba Date: Mon, 14 Jun 2021 17:47:19 +0000 Subject: [PATCH 2/2] Shard `vars` file between multiple plugin configurations By hashing the `BUILDKITE_PLUGIN_CONFIGURATION` envvar, we can effectively disambiguate multiple instances of the `metahook` plugin within a single pipeline. This allows us to seprate the `vars` file, as it otherwise can get confused if you have multiple invocations of the plugin that each use different hooks. --- hooks/environment | 9 +++++++-- hooks/pre-exit | 6 +++++- hooks/run-hook.sh | 4 +++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/hooks/environment b/hooks/environment index 34770e6..3421811 100644 --- a/hooks/environment +++ b/hooks/environment @@ -2,12 +2,17 @@ set -euo pipefail # If users add multiple `metahook` instances, we'll just store our `vars` in the same directory. +# We store the `vars` in a file that is namespaced by a hash of the plugin configuration, which +# allows us to avoid having multiple metahook instances clobber eachother. if [[ ! -v "BUILDKITE_METAHOOK_HOOKS_PATH" ]]; then export BUILDKITE_METAHOOK_HOOKS_PATH="$(mktemp -d)" - env | sort | grep "BUILDKITE_PLUGIN_METAHOOK" | uniq >"${BUILDKITE_METAHOOK_HOOKS_PATH}/vars" fi -if grep -E 'BUILDKITE_PLUGIN_METAHOOK_.+(\.BAT|\.CMD)=' "${BUILDKITE_METAHOOK_HOOKS_PATH}/vars"; then +PLUGIN_CONFIG_HASH=$(cksum <<<"${BUILDKITE_PLUGIN_CONFIGURATION}" | awk '{ print $1 }') +VARS_FILENAME="vars-${PLUGIN_CONFIG_HASH}" +env | sort | grep "BUILDKITE_PLUGIN_METAHOOK" | uniq >"${BUILDKITE_METAHOOK_HOOKS_PATH}/${VARS_FILENAME}" + +if grep -E 'BUILDKITE_PLUGIN_METAHOOK_.+(\.BAT|\.CMD)=' "${BUILDKITE_METAHOOK_HOOKS_PATH}/${VARS_FILENAME}"; then echo "Sorry, we had to remove Windows Batch file support in 0.4.0." echo "Please refer to https://github.com/improbable-eng/metahook-buildkite-plugin/tree/master/changelog.md#0.4.0" echo "" diff --git a/hooks/pre-exit b/hooks/pre-exit index 43d28cf..3646606 100755 --- a/hooks/pre-exit +++ b/hooks/pre-exit @@ -1,8 +1,12 @@ #!/usr/bin/env bash set -euo pipefail +PLUGIN_CONFIG_HASH=$(cksum <<<"${BUILDKITE_PLUGIN_CONFIGURATION}" | awk '{ print $1 }') +VARS_FILENAME="vars-${PLUGIN_CONFIG_HASH}" cleanup() { - rm -rf "${BUILDKITE_METAHOOK_HOOKS_PATH}" + # Delete our `vars` directory, then if the directory itself is empty, delete that too + rm -rf "${BUILDKITE_METAHOOK_HOOKS_PATH}/${VARS_FILENAME}" + rmdir "${BUILDKITE_METAHOOK_HOOKS_PATH}" 2>/dev/null || true } trap cleanup EXIT diff --git a/hooks/run-hook.sh b/hooks/run-hook.sh index 2857e8f..b1bc03f 100755 --- a/hooks/run-hook.sh +++ b/hooks/run-hook.sh @@ -5,7 +5,9 @@ hook_name="${1:?1st arg needs to be hook name}" upperd="$(echo "${hook_name}" | tr "[:lower:]" "[:upper:]" | sed "s:-:_:")" var_name="BUILDKITE_PLUGIN_METAHOOK_${upperd}" -if grep -q "${var_name}" <"${BUILDKITE_METAHOOK_HOOKS_PATH}/vars"; then +PLUGIN_CONFIG_HASH=$(cksum <<<"${BUILDKITE_PLUGIN_CONFIGURATION}" | awk '{ print $1 }') +VARS_FILENAME="vars-${PLUGIN_CONFIG_HASH}" +if grep -q "${var_name}" <"${BUILDKITE_METAHOOK_HOOKS_PATH}/${VARS_FILENAME}"; then hook_file="${BUILDKITE_METAHOOK_HOOKS_PATH}/${hook_name}" echo "#\!/usr/bin/env bash" >"${hook_file}"