fix: guard tag release publication
Some checks failed
CI / test (pull_request) Failing after 41s
CI / release-exercise (pull_request) Successful in 13s
CI / self-guards (pull_request) Successful in 7s
CI / action-exercise (pull_request) Successful in 6s
CI / docs-sync-exercise (pull_request) Successful in 6s
labels / labels (pull_request) Successful in 8s
Refs guard / refs-not-closing (pull_request) Successful in 6s
Some checks failed
CI / test (pull_request) Failing after 41s
CI / release-exercise (pull_request) Successful in 13s
CI / self-guards (pull_request) Successful in 7s
CI / action-exercise (pull_request) Successful in 6s
CI / docs-sync-exercise (pull_request) Successful in 6s
labels / labels (pull_request) Successful in 8s
Refs guard / refs-not-closing (pull_request) Successful in 6s
This commit is contained in:
parent
c4315c2cfa
commit
734676ab7d
2 changed files with 46 additions and 0 deletions
16
.github/workflows/release.yml
vendored
16
.github/workflows/release.yml
vendored
|
|
@ -363,6 +363,22 @@ jobs:
|
||||||
fi
|
fi
|
||||||
changelog_section CHANGELOG.md "$VER" > "$RUNNER_TEMP/notes.md"
|
changelog_section CHANGELOG.md "$VER" > "$RUNNER_TEMP/notes.md"
|
||||||
cat "$RUNNER_TEMP/notes.md"
|
cat "$RUNNER_TEMP/notes.md"
|
||||||
|
- name: no published release may exist
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
VER: ${{ steps.assert.outputs.ver }}
|
||||||
|
run: |
|
||||||
|
# shellcheck source=/dev/null
|
||||||
|
. "$CEREMONY_DIR/lib/forge.sh"
|
||||||
|
forge_select ""
|
||||||
|
if ! exists="$(forge_release_exists "$VER")"; then
|
||||||
|
echo "could not read whether release '$VER' exists — refusing rather than assuming it does not (#191)." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ "$exists" = yes ]; then
|
||||||
|
echo "release '$VER' already exists — refusing to re-release, creating nothing." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
- name: artifact hook — the consumer's own release-artifact action
|
- name: artifact hook — the consumer's own release-artifact action
|
||||||
# After the tag exists (it fired this door), before the publish —
|
# After the tag exists (it fired this door), before the publish —
|
||||||
# the same contract as the merge door's twin step.
|
# the same contract as the merge door's twin step.
|
||||||
|
|
|
||||||
|
|
@ -1185,6 +1185,36 @@ release_read 200 '{"id":41,"tag_name":"1.2.3","draft":false}'
|
||||||
forge_release_create 1.2.3 1.2.3 "$TMP/notes.md" >/dev/null 2>&1
|
forge_release_create 1.2.3 1.2.3 "$TMP/notes.md" >/dev/null 2>&1
|
||||||
check "a published same-tag release is never deleted" 1 "" grep -q '^DELETE ' "$WRITES"
|
check "a published same-tag release is never deleted" 1 "" grep -q '^DELETE ' "$WRITES"
|
||||||
|
|
||||||
|
# The tag door's published-release guard is extracted and executed, like the
|
||||||
|
# other workflow-shell contracts in this repository. The tag itself is this
|
||||||
|
# door's premise, so only a published release refuses; adding the merge door's
|
||||||
|
# ls-remote half here would destroy the documented delete-and-re-push recovery.
|
||||||
|
TAG_GUARD="$TMP/tag-release-guard.sh"
|
||||||
|
{
|
||||||
|
printf '%s\n' '#!/usr/bin/env bash' 'set -e'
|
||||||
|
yq -r '.jobs.release-on-tag.steps[] | select(.name == "no published release may exist") | .run' \
|
||||||
|
"$ROOT/.github/workflows/release.yml"
|
||||||
|
} >"$TAG_GUARD"
|
||||||
|
chmod +x "$TAG_GUARD"
|
||||||
|
mkdir -p "$TMP/tag-guard-lib/lib"
|
||||||
|
printf '%s\n' \
|
||||||
|
'forge_select() { :; }' \
|
||||||
|
'forge_release_exists() { case "$RELEASE_EXISTS" in error) return 1 ;; *) echo "$RELEASE_EXISTS" ;; esac; }' \
|
||||||
|
>"$TMP/tag-guard-lib/lib/forge.sh"
|
||||||
|
|
||||||
|
tag_guard_extracted() { [ "$(wc -l <"$TAG_GUARD")" -ge 8 ]; }
|
||||||
|
run_tag_guard() {
|
||||||
|
CEREMONY_DIR="$TMP/tag-guard-lib" VER=1.2.3 RELEASE_EXISTS="$1" "$TAG_GUARD"
|
||||||
|
}
|
||||||
|
tag_door_has_no_tag_exists_guard() {
|
||||||
|
! yq -r '.jobs.release-on-tag.steps[].run // ""' "$ROOT/.github/workflows/release.yml" | grep -q 'ls-remote'
|
||||||
|
}
|
||||||
|
check "the tag door's published-release guard is extracted" 0 "" tag_guard_extracted
|
||||||
|
check "the tag door refuses an existing published release" 1 "release '1.2.3' already exists" run_tag_guard yes
|
||||||
|
check "the tag door proceeds when no published release exists" 0 "" run_tag_guard no
|
||||||
|
check "the tag door refuses when release state is unreadable" 1 "refusing rather than assuming" run_tag_guard error
|
||||||
|
check "the tag door carries no tag-exists guard" 0 "" tag_door_has_no_tag_exists_guard
|
||||||
|
|
||||||
# --- the github twins address their own paths ----------------------------
|
# --- the github twins address their own paths ----------------------------
|
||||||
. "$ROOT/lib/forge-github.sh"
|
. "$ROOT/lib/forge-github.sh"
|
||||||
GITHUB_REPOSITORY=o/r
|
GITHUB_REPOSITORY=o/r
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue