Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
90f0fc3
fix(hooks): run only the checked root hook config
gaborbernat Oct 25, 2026
6f37f2f
fix(hooks): prove tagged revisions before builds
gaborbernat Oct 25, 2026
f094b32
fix(release): check tag ancestry before hooks
gaborbernat Oct 25, 2026
50c7f0f
fix(hooks): reject non-Python hook dependencies
gaborbernat Oct 25, 2026
3e073b0
fix(marketplace): accept retries after reconciling
gaborbernat Oct 25, 2026
174dfc5
test(marketplace): cover unidentified deployments
gaborbernat Oct 25, 2026
8c6a25a
fix(mise): check the binary digest before it runs
gaborbernat Oct 25, 2026
f7668af
fix(mise): keep line endings and reject null digests
gaborbernat Oct 25, 2026
055984f
fix(lock): require normalized dependency groups
gaborbernat Oct 25, 2026
172cad6
fix(lock): report a non-table producer setting
gaborbernat Oct 25, 2026
c0e3a4e
style: format round 13 fixes
gaborbernat Oct 25, 2026
2692172
fix(hooks): let humans add cooled managed pins
gaborbernat Oct 25, 2026
a20ac72
fix(lock): accept the upgraded resolver pin
gaborbernat Oct 25, 2026
dfb0635
fix(lock): pin uv from the resolver group only
gaborbernat Oct 25, 2026
1101041
fix(news): check the lock when workflows change
gaborbernat Oct 25, 2026
e920d8e
test(news): cover primary lock edits and removal
gaborbernat Oct 25, 2026
a135c0f
fix(hooks): recheck after earlier heads mature
gaborbernat Oct 25, 2026
5573523
fix(hooks): explain an invalid cooldown minimum
gaborbernat Oct 25, 2026
f211eb7
test(hooks): require the App on the updater branch
gaborbernat Oct 25, 2026
495e6f4
test(hooks): give the frozen hook test a unique name
gaborbernat Oct 25, 2026
df1a6e5
feat(lock)!: drop the Nab primary lock path
gaborbernat Oct 25, 2026
e58e7d9
perf(lock): install Nab only when a step needs it
gaborbernat Oct 25, 2026
8d32650
refactor(lock)!: detect the resolver upgrade repo
gaborbernat Oct 25, 2026
efbdbe5
refactor(notes)!: write notes to a fixed path
gaborbernat Oct 25, 2026
a9e48f9
refactor(release)!: read the patch from a fixed path
gaborbernat Oct 25, 2026
4768364
refactor(pypi): inline the listing wait
gaborbernat Oct 25, 2026
4b3d58a
refactor(lock): drop checks the parser already makes
gaborbernat Oct 25, 2026
3df4112
test(lock): bound the local tool exemption
gaborbernat Oct 25, 2026
5abe719
test(pypi): match the missing directory error
gaborbernat Oct 25, 2026
687923d
perf(lock): skip checks repeated on the same lock
gaborbernat Oct 25, 2026
adc7bb2
refactor(release): share the tagged source check
gaborbernat Oct 25, 2026
5fd0697
refactor(release): share the local tool install
gaborbernat Oct 25, 2026
954c165
build: drop the unused Nab policy table
gaborbernat Oct 25, 2026
6bfe4f6
test(marketplace): check the job run against None
gaborbernat Oct 25, 2026
95804dc
test: measure the test suite at full coverage
gaborbernat Oct 25, 2026
f244f53
test: autospec network and platform mocks
gaborbernat Oct 25, 2026
6eb9760
test: drop tests that restate workflow YAML
gaborbernat Oct 25, 2026
769c2b9
test(release): check the tag list given to tags
gaborbernat Oct 25, 2026
7536922
docs(changelog): note the 3.0.1 caller permissions
gaborbernat Oct 25, 2026
a01fd0f
docs: describe the round 13 release changes
gaborbernat Oct 25, 2026
c573c63
refactor(release): expose the local tool like locked ones
gaborbernat Oct 25, 2026
7304ef8
refactor(lock)!: rename the cutoff patch check
gaborbernat Oct 25, 2026
585d1e3
refactor: tighten round 13 code and tests
gaborbernat Oct 25, 2026
522211e
refactor(tools): inline single-use constants
gaborbernat Oct 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 3 additions & 18 deletions .github/workflows/check.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,7 @@ jobs:
groups: release-check
venv: .release-tools
- name: Check repository formatting
env:
UV_EXCLUDE_NEWER: 7 days
UV_NO_CONFIG: "1"
UV_NO_SOURCES: "1"
run: |
unset UV_CONFIG_FILE UV_INDEX UV_INDEX_URL UV_DEFAULT_INDEX UV_EXTRA_INDEX_URL
unset UV_FIND_LINKS UV_EXCLUDE_NEWER_PACKAGE
unset UV_INSECURE_HOST UV_SYSTEM_CERTS SSL_CERT_FILE SSL_CERT_DIR
prek run --all-files
run: tools/cooled_prek.sh run --all-files
shell:
runs-on: ubuntu-26.04
permissions:
Expand Down Expand Up @@ -74,14 +66,7 @@ jobs:
groups: release-shell
venv: .release-tools
- name: Check inline shell
env:
UV_EXCLUDE_NEWER: 7 days
UV_NO_CONFIG: "1"
UV_NO_SOURCES: "1"
run: |
unset UV_CONFIG_FILE UV_INDEX UV_INDEX_URL UV_DEFAULT_INDEX UV_EXTRA_INDEX_URL
unset UV_FIND_LINKS UV_EXCLUDE_NEWER_PACKAGE
unset UV_INSECURE_HOST UV_SYSTEM_CERTS SSL_CERT_FILE SSL_CERT_DIR
set -euo pipefail
script_dir=./inline-shell-check
mkdir "$script_dir"
Expand All @@ -96,8 +81,8 @@ jobs:
index=$((index + 1))
done <"$RUNNER_TEMP/run-blocks"
done
prek run shellcheck --files "$script_dir"/*.sh
prek run shfmt --files "$script_dir"/*.sh
tools/cooled_prek.sh run shellcheck --files "$script_dir"/*.sh
tools/cooled_prek.sh run shfmt --files "$script_dir"/*.sh
test:
runs-on: ubuntu-26.04
permissions:
Expand Down
40 changes: 7 additions & 33 deletions .github/workflows/prepare-towncrier-release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -110,24 +110,12 @@ jobs:
unset UV_CONFIG_FILE UV_INDEX UV_INDEX_URL UV_DEFAULT_INDEX UV_EXTRA_INDEX_URL
unset UV_FIND_LINKS UV_EXCLUDE_NEWER_PACKAGE
unset UV_INSECURE_HOST UV_SYSTEM_CERTS SSL_CERT_FILE SSL_CERT_DIR
prek install-hooks
prek install-hooks --config .pre-commit-config.yaml
background: true
- name: Build local release tool wheel
- uses: $/install-local-release-creator
if: inputs.local-tool-source
env:
BUILD_CONSTRAINTS: ${{ steps.tools.outputs.build-constraints }}
run: |
uv build --wheel --build-constraints "$BUILD_CONSTRAINTS" \
--require-build-hashes --out-dir "$RUNNER_TEMP/local-tool-dist" .
- name: Install local release tool wheel
if: inputs.local-tool-source
run: uv pip install --python .venv/bin/python --no-deps "$RUNNER_TEMP/local-tool-dist/"*.whl
- name: Expose local release command
if: inputs.local-tool-source
run: |
mkdir -p "$RUNNER_TEMP/local-release-cli"
ln -s "$GITHUB_WORKSPACE/.venv/bin/release-creator" "$RUNNER_TEMP/local-release-cli/release-creator"
echo "$RUNNER_TEMP/local-release-cli" >>"$GITHUB_PATH"
with:
build-constraints: ${{ steps.tools.outputs.build-constraints }}
- id: prepare
name: Build changelog
uses: $/prepare-towncrier
Expand Down Expand Up @@ -170,22 +158,10 @@ jobs:
groups: release-validate${{ inputs.local-tool-source && ' project-runtime' || '' }}
venv: .venv
local-tool-source: ${{ inputs.local-tool-source }}
- name: Build local release tool wheel
- uses: $/install-local-release-creator
if: inputs.local-tool-source
env:
BUILD_CONSTRAINTS: ${{ steps.tools.outputs.build-constraints }}
run: |
uv build --wheel --build-constraints "$BUILD_CONSTRAINTS" \
--require-build-hashes --out-dir "$RUNNER_TEMP/local-tool-dist" .
- name: Install local release tool wheel
if: inputs.local-tool-source
run: uv pip install --python .venv/bin/python --no-deps "$RUNNER_TEMP/local-tool-dist/"*.whl
- name: Expose local release command
if: inputs.local-tool-source
run: |
mkdir -p "$RUNNER_TEMP/local-release-cli"
ln -s "$GITHUB_WORKSPACE/.venv/bin/release-creator" "$RUNNER_TEMP/local-release-cli/release-creator"
echo "$RUNNER_TEMP/local-release-cli" >>"$GITHUB_PATH"
with:
build-constraints: ${{ steps.tools.outputs.build-constraints }}
- id: config
uses: $/read-towncrier-config
- name: Verify selected release version
Expand All @@ -210,7 +186,6 @@ jobs:
- uses: $/validate-release-patch
with:
version: ${{ needs.assemble.outputs.version }}
patch: ${{ runner.temp }}/release-patch/release.patch
push:
needs: [assemble, validate]
runs-on: ubuntu-26.04
Expand All @@ -231,7 +206,6 @@ jobs:
- uses: $/validate-release-patch
with:
version: ${{ needs.assemble.outputs.version }}
patch: ${{ runner.temp }}/release-patch/release.patch
checks: "false"
- id: repository
name: Select the current repository
Expand Down
20 changes: 1 addition & 19 deletions .github/workflows/release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,24 +24,7 @@ jobs:
version: latest-known
python-version: "3.15"
enable-cache: false
- uses: $/refresh-release-lock
with:
mode: check
- uses: $/install-locked-tools
with:
groups: release-check
venv: .venv
- uses: $/verify-frozen-hooks
- name: Check tagged source
env:
UV_EXCLUDE_NEWER: 7 days
UV_NO_CONFIG: "1"
UV_NO_SOURCES: "1"
run: |
unset UV_CONFIG_FILE UV_INDEX UV_INDEX_URL UV_DEFAULT_INDEX UV_EXTRA_INDEX_URL
unset UV_FIND_LINKS UV_EXCLUDE_NEWER_PACKAGE
unset UV_INSECURE_HOST UV_SYSTEM_CERTS SSL_CERT_FILE SSL_CERT_DIR
.venv/bin/prek run --all-files
- uses: $/check-tagged-source
source:
runs-on: ubuntu-26.04
permissions:
Expand Down Expand Up @@ -130,7 +113,6 @@ jobs:
previous: ${{ needs.source.outputs.previous }}
changelog: CHANGELOG.md
generated-notes: ${{ runner.temp }}/generated-notes.md
output: ${{ runner.temp }}/release-notes.md
- id: artifact
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
Expand Down
3 changes: 0 additions & 3 deletions .github/workflows/update-tools.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,6 @@ jobs:
secrets:
RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
with:
upgrade-resolver: true
lock-groups: >-
build lock-tools lock-reader release-notes release-resolver release-news release-prepare release-validate release-check release-attestations release-shell release-hooks release-hook-check
commit-message: "🔧 build: refresh release tool lock"
pull-request-title: "🔧 build: refresh release tool lock"
pull-request-body: "Refresh the locked tools used by release preparation and CI."
12 changes: 1 addition & 11 deletions .github/workflows/upgrade-release-tools.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,6 @@ name: Upgrade release tools
on:
workflow_call:
inputs:
lock-groups:
description: Legacy Nab dependency groups; ignored for full project locks
default: ""
type: string
additional-lock:
description: Optional secondary pylock basename for a separate build matrix
type: string
Expand All @@ -30,10 +26,6 @@ on:
description: Space-separated implementations for the secondary lock
type: string
default: ""
upgrade-resolver:
description: Upgrade this repository's exact shared uv resolver pin with its lock
type: boolean
default: false
keep-uv-lock:
description: Refresh and check uv.lock alongside pylock.toml
type: boolean
Expand Down Expand Up @@ -77,14 +69,12 @@ jobs:
- id: lock
uses: $/refresh-release-lock
with:
lock-groups: ${{ inputs.lock-groups }}
additional-lock: ${{ inputs.additional-lock }}
additional-lock-groups: ${{ inputs.additional-lock-groups }}
additional-lock-selection: ${{ inputs.additional-lock-selection }}
additional-matrix-python: ${{ inputs.additional-matrix-python }}
additional-matrix-platforms: ${{ inputs.additional-matrix-platforms }}
additional-matrix-implementations: ${{ inputs.additional-matrix-implementations }}
upgrade-resolver: ${{ inputs.upgrade-resolver }}
keep-uv-lock: ${{ inputs.keep-uv-lock }}
- id: upload
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
Expand Down Expand Up @@ -219,7 +209,7 @@ jobs:
exit 1
fi
done <"$RUNNER_TEMP/dependency-modes"
- uses: $/verify-nab-cutoff-patch
- uses: $/verify-cutoff-patch
- name: Commit refreshed tools
env:
COMMIT_MESSAGE: ${{ inputs.commit-message }}
Expand Down
18 changes: 1 addition & 17 deletions .github/workflows/validate-python-release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -62,31 +62,15 @@ jobs:
version: latest-known
python-version: "3.15"
enable-cache: false
- uses: $/refresh-release-lock
- uses: $/check-tagged-source
with:
mode: check
keep-uv-lock: ${{ inputs.keep-uv-lock }}
additional-lock: ${{ inputs.additional-lock }}
additional-lock-groups: ${{ inputs.additional-lock-groups }}
additional-lock-selection: ${{ inputs.additional-lock-selection }}
additional-matrix-python: ${{ inputs.additional-matrix-python }}
additional-matrix-platforms: ${{ inputs.additional-matrix-platforms }}
additional-matrix-implementations: ${{ inputs.additional-matrix-implementations }}
- uses: $/install-locked-tools
with:
groups: release-check
venv: ${{ runner.temp }}/release-tools
- uses: $/verify-frozen-hooks
- name: Run tagged source checks
env:
UV_EXCLUDE_NEWER: 7 days
UV_NO_CONFIG: "1"
UV_NO_SOURCES: "1"
run: |
unset UV_CONFIG_FILE UV_INDEX UV_INDEX_URL UV_DEFAULT_INDEX UV_EXTRA_INDEX_URL
unset UV_FIND_LINKS UV_EXCLUDE_NEWER_PACKAGE
unset UV_INSECURE_HOST UV_SYSTEM_CERTS SSL_CERT_FILE SSL_CERT_DIR
"$RUNNER_TEMP/release-tools/bin/prek" run --all-files
constraints:
runs-on: ubuntu-26.04
outputs:
Expand Down
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,14 @@
match the fork repository, branch, commit, and workflow, and occur after the PR opened
([#15](https://github.com/tox-dev/github-workflows/pull/15)) by [@gaborbernat](https://github.com/gaborbernat).

<a name="release-3-0-1-breaking-changes"></a>

### Breaking changes

- The tagged `source-check` job of `validate-python-release` requests `actions: read` and `pull-requests: read` and
checks out full history for the hook age check. A caller whose `build` job grants only `contents: read` fails at
startup; grant all three. This entry was added after the release, which shipped without it.

<a name="release-3-0-1-security"></a>

### Security
Expand Down
Loading
Loading