feat: the release re-arms main — the -dev bump folds into the release act
Operator decision: the post-release bump PR is ceremony debris — a derivable one-liner with no judgment for a review to add. After tag + publish, the same job computes X.Y.(Z+1)-dev and pushes it to main directly (a GITHUB_TOKEN push fires no workflows, so no recursion and no red run); if branch protection refuses, the step opens the bump PR itself, loudly. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
44717863a1
commit
053e12d51e
2 changed files with 37 additions and 0 deletions
31
.github/workflows/release.yml
vendored
31
.github/workflows/release.yml
vendored
|
|
@ -197,3 +197,34 @@ jobs:
|
||||||
gh release create "$ver" --verify-tag \
|
gh release create "$ver" --verify-tag \
|
||||||
--title "$ver" --notes-file "$RUNNER_TEMP/notes.md" \
|
--title "$ver" --notes-file "$RUNNER_TEMP/notes.md" \
|
||||||
-R "$GITHUB_REPOSITORY"
|
-R "$GITHUB_REPOSITORY"
|
||||||
|
# The post-release bump, folded into the release act (#47 followup —
|
||||||
|
# operator decision: a mechanical one-liner deserves no PR of its
|
||||||
|
# own). X.Y.(Z+1)-dev is arithmetic, not judgment: derived, committed
|
||||||
|
# straight to main with this job's token. A GITHUB_TOKEN push fires
|
||||||
|
# no workflows (anti-recursion), so the bump triggers neither this
|
||||||
|
# door nor a red run; and should branch protection ever refuse the
|
||||||
|
# direct push, the step opens the bump PR itself and says so, loudly,
|
||||||
|
# instead of leaving main armed to impersonate the release.
|
||||||
|
- name: bump main to the next -dev — the release re-arms main itself
|
||||||
|
if: steps.decide.outputs.ceremony == 'yes'
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
run: |
|
||||||
|
ver="$(cat VERSION)"
|
||||||
|
next="$(printf '%s' "$ver" | awk -F. '{ printf "%s.%s.%s-dev", $1, $2, $3 + 1 }')"
|
||||||
|
git config user.name "github-actions[bot]"
|
||||||
|
git config user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
|
git fetch origin main
|
||||||
|
git checkout -B main origin/main
|
||||||
|
printf '%s\n' "$next" > VERSION
|
||||||
|
git add VERSION
|
||||||
|
git commit -m "chore: bump main to $next — a dev install must not impersonate $ver"
|
||||||
|
if ! git push origin main; then
|
||||||
|
echo "direct push refused (branch protection?) — opening the bump PR instead" >&2
|
||||||
|
git checkout -b "chore/bump-$next"
|
||||||
|
git push origin "chore/bump-$next"
|
||||||
|
gh pr create -R "$GITHUB_REPOSITORY" --head "chore/bump-$next" \
|
||||||
|
--title "chore: bump main to $next" \
|
||||||
|
--body "The post-release re-arm, opened by release.yml because the direct push was refused. One file, one line." \
|
||||||
|
--label release
|
||||||
|
fi
|
||||||
|
|
|
||||||
|
|
@ -179,6 +179,12 @@ check "release.yml: the merge job API-creates the tag itself" 0 "" \
|
||||||
mjob_has "git/refs"
|
mjob_has "git/refs"
|
||||||
# shellcheck disable=SC2016 # the $-string is a literal in the target file
|
# shellcheck disable=SC2016 # the $-string is a literal in the target file
|
||||||
check "release.yml: ...at the pushed main head (github.sha = the merge commit)" 0 "" mjob_has 'sha="$MERGE_SHA"'
|
check "release.yml: ...at the pushed main head (github.sha = the merge commit)" 0 "" mjob_has 'sha="$MERGE_SHA"'
|
||||||
|
# The release re-arms main itself: the post-release -dev bump is arithmetic,
|
||||||
|
# not judgment, so it rides the same job — direct push, PR fallback.
|
||||||
|
check "release.yml: the release bumps main to the next -dev itself" 0 "" \
|
||||||
|
grep -qF "bump main to the next -dev" "$RY"
|
||||||
|
check "release.yml: ...with a PR fallback when the direct push is refused" 0 "" \
|
||||||
|
grep -qF "opening the bump PR instead" "$RY"
|
||||||
check "release.yml: ...and publishes in the SAME job" 0 "" \
|
check "release.yml: ...and publishes in the SAME job" 0 "" \
|
||||||
mjob_has "gh release create"
|
mjob_has "gh release create"
|
||||||
# Ordering, the marker-then-box idiom again: the last assert's refusal must
|
# Ordering, the marker-then-box idiom again: the last assert's refusal must
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue