Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
220 commits
Select commit Hold shift + click to select a range
70b38f9
build(deps): bump @devcontainers/cli from 0.81.1 to 0.84.0
dependabot[bot] Mar 13, 2026
3db503c
build(deps): bump bats-assert from v2.2.0 to v2.2.4
dependabot[bot] Mar 13, 2026
b862228
ci(deps): bump actions/github-script from 7.1.0 to 8.0.0
dependabot[bot] Mar 13, 2026
50debdc
ci(deps): bump actions/attest-build-provenance from 3.0.0 to 4.1.0
dependabot[bot] Mar 13, 2026
b726361
chore: sync dev with main (conflicts) (#301)
c-vigo Mar 13, 2026
eda87b5
ci(deps): bump actions/download-artifact from 4.3.0 to 8.0.1
dependabot[bot] Mar 13, 2026
d292e0a
ci(deps): bump actions/checkout from 4.3.1 to 6.0.2
dependabot[bot] Mar 13, 2026
348d5d9
ci(deps): bump the actions-minor-patch group across 1 directory with …
dependabot[bot] Mar 13, 2026
037f3ac
chore: add empty unreleased section to CHANGELOG
c-vigo Mar 13, 2026
4c3455d
chore: add empty unreleased section to CHANGELOG (#311)
c-vigo Mar 13, 2026
87867a1
chore: merge dependabot pr 302
c-vigo Mar 13, 2026
2beaf8e
chore: merge dependabot pr 303
c-vigo Mar 13, 2026
a1b9006
chore: merge dependabot pr 305
c-vigo Mar 13, 2026
a219251
chore: merge dependabot pr 306
c-vigo Mar 13, 2026
b380568
chore: merge dependabot pr 307
c-vigo Mar 13, 2026
486c43e
chore: merge dependabot pr 308
c-vigo Mar 13, 2026
e05b29a
chore: merge dependabot pr 309
c-vigo Mar 13, 2026
2c1f4bb
chore: update changelog for dependabot batch
c-vigo Mar 13, 2026
4d1d7ac
chore: consolidate dependabot updates (#312)
c-vigo Mar 13, 2026
5334321
chore: sync issues and PRs
commit-action-bot[bot] Mar 14, 2026
af06db6
ci(deps): bump actions/attest-sbom from 3.0.0 to 4.0.0
dependabot[bot] Mar 16, 2026
c2afaee
ci(deps): bump actions/upload-artifact from 4.6.2 to 7.0.0
dependabot[bot] Mar 16, 2026
13e93b1
ci(deps): bump actions/create-github-app-token from 2.2.1 to 3.0.0
dependabot[bot] Mar 16, 2026
34d7538
ci(deps): bump docker/login-action from 3.7.0 to 4.0.0
dependabot[bot] Mar 16, 2026
7086661
chore: sync issues and PRs
commit-action-bot[bot] Mar 16, 2026
5b5c4e9
chore(ci): merge dependabot PR 314
c-vigo Mar 16, 2026
32badd4
chore(ci): merge dependabot PR 315
c-vigo Mar 16, 2026
f8f045a
chore(ci): merge dependabot PR 316
c-vigo Mar 16, 2026
3e1320b
chore(ci): merge dependabot PR 317
c-vigo Mar 16, 2026
b37094c
chore: update changelog for dependabot batch
c-vigo Mar 16, 2026
381d9da
chore: update just version in test_image.py to 1.47.
c-vigo Mar 16, 2026
763be4a
chore(ci): batch Dependabot workflow updates (#318)
c-vigo Mar 16, 2026
e5a94d4
test(ci): add release workflow regression checks
c-vigo Mar 16, 2026
4c7007f
fix(ci): finalize release docs and refresh release PR body
c-vigo Mar 16, 2026
067c7a2
fix(ci): use exact filename matching in finalize file guard
c-vigo Mar 16, 2026
d1837d0
test(ci): cover release PR body refresh step regression
c-vigo Mar 16, 2026
1bf4c87
docs: align release finalize workflow documentation
c-vigo Mar 16, 2026
44899f3
fix(ci): finalize release docs and refresh release PR body (#319)
c-vigo Mar 16, 2026
e0a7b97
ci(ci): upgrade build-image docker action pins
c-vigo Mar 16, 2026
bcd9fa0
ci(setup): move setup-env default node version to 24
c-vigo Mar 16, 2026
37bd38e
ci(ci): align test composite action pins with node24-ready releases
c-vigo Mar 16, 2026
e2028d3
docs(ci): record node24 action pin migration in changelog
c-vigo Mar 16, 2026
5af58e5
ci: migrate shared GitHub Action pins for Node24 readiness (#322)
c-vigo Mar 16, 2026
7ed1d12
fix(ci): upload scheduled scan image artifact
c-vigo Mar 16, 2026
ddf34dc
ci: fix scheduled security scan artifact handoff (#323)
c-vigo Mar 16, 2026
f4dc1df
ci(ci): add smoke dispatch source metadata
c-vigo Mar 16, 2026
9b0cce8
test(ci): add dispatch metadata regression guards
c-vigo Mar 16, 2026
135fb2d
docs(ci): document smoke dispatch metadata contract
c-vigo Mar 16, 2026
7d9aede
fix(ci): add summary fallback for dispatch tag
c-vigo Mar 16, 2026
2b19bac
ci: add smoke dispatch source metadata contract (#324)
c-vigo Mar 16, 2026
335c0d1
ci(ci): trigger smoke dispatch for final releases
c-vigo Mar 16, 2026
553c81b
ci(ci): clarify smoke dispatch timing in release docs
c-vigo Mar 16, 2026
243e3e0
ci: trigger smoke dispatch for final releases (#325)
c-vigo Mar 16, 2026
1f25c08
ci(ci): remove legacy workspace CI templates and references
c-vigo Mar 16, 2026
26d7ee5
fix(ci): extract image resolver and reuse it in workspace workflows
c-vigo Mar 16, 2026
20590bf
fix(ci): harden image tag parsing and align ci notes
c-vigo Mar 16, 2026
9bb4d64
ci: consolidate workspace CI and reuse image resolver (#328)
c-vigo Mar 16, 2026
00ea919
ci(ci): split release workflow into core extension and publish stages
c-vigo Mar 16, 2026
59a72d3
ci(ci): add prepare release workflow and dispatch helpers
c-vigo Mar 16, 2026
a09a0b7
docs(ci): document downstream release contract and release modes
c-vigo Mar 16, 2026
d2742bb
fix(ci): harden release workflow tag and ref checks
c-vigo Mar 16, 2026
427e3e1
fix(ci): tighten release workflow validation and sync gating
c-vigo Mar 16, 2026
6ebf887
ci: split downstream release workflow into reusable stages (#329)
c-vigo Mar 16, 2026
020de75
ci(ci): enforce downstream smoke-test release gate
c-vigo Mar 16, 2026
3b08bef
ci(ci): add repository-dispatch smoke-test release workflow
c-vigo Mar 16, 2026
5cce75c
docs(ci): document downstream RC prerelease gate flow
c-vigo Mar 16, 2026
a043269
chore: sync issues and PRs
commit-action-bot[bot] Mar 17, 2026
fdc208e
ci(ci): harden workspace dispatch smoke-test runtime
c-vigo Mar 17, 2026
cd5304f
ci(ci): fix RC validation and rollback smoke-test failures
c-vigo Mar 17, 2026
bf58d7c
ci(ci): align smoke-test dispatch template with release gate
c-vigo Mar 17, 2026
ad304d4
ci(ci): remove workspace repository-dispatch workflow
c-vigo Mar 17, 2026
59c8595
docs(ci): split cross-repo gate docs from release docs
c-vigo Mar 17, 2026
9c7177b
ci(ci): enforce release_kind contract and gate timeout
c-vigo Mar 17, 2026
224cb32
ci: enforce downstream release validation gate (#332)
c-vigo Mar 17, 2026
baf7862
test(ci): cover changelog distribution behavior
c-vigo Mar 17, 2026
c5763bf
fix(ci): ship changelog in workspace and smoke deployment
c-vigo Mar 17, 2026
eddb780
docs(ci): add unreleased entry for changelog distribution
c-vigo Mar 17, 2026
0bcefb6
fix(ci): fail smoke installer pipeline on curl errors
c-vigo Mar 17, 2026
e8eb319
docs(ci): fix changelog issue link and resync artifacts
c-vigo Mar 17, 2026
d049e75
fix(ci): ship changelog in workspace and smoke deployment (#334)
c-vigo Mar 17, 2026
c0b6fb7
ci(ci): publish final GitHub Release with notes
c-vigo Mar 17, 2026
e8a795a
ci: publish final GitHub Release with notes (#335)
c-vigo Mar 17, 2026
8666ae4
ci(ci): harden final release gating and publish ordering
c-vigo Mar 17, 2026
6e9f60b
ci(ci): add smoke dispatch concurrency guard
c-vigo Mar 17, 2026
a181632
build(ci): remove duplicate changelog sync entry
c-vigo Mar 17, 2026
7b72631
docs(ci): document release dispatch hardening updates
c-vigo Mar 17, 2026
74e22e7
fix(ci): distinguish downstream gate 404 from API failures
c-vigo Mar 17, 2026
01c35af
fix(ci): rollback when smoke dispatch job fails
c-vigo Mar 17, 2026
fbaa4d2
fix(ci): decouple smoke dispatch failure from destructive rollback
c-vigo Mar 17, 2026
5a8f15c
docs(ci): clarify rollback scope excludes smoke dispatch
c-vigo Mar 17, 2026
447802e
docs(ci): document smoke dispatch failure handling in changelog
c-vigo Mar 17, 2026
ac46cb3
test(ci): update smoke changelog test for single-dest sync
c-vigo Mar 17, 2026
b91ae2e
test(ci): harden smoke changelog ownership assertions
c-vigo Mar 17, 2026
a0b2fd9
fix(ci): retry downstream release lookup on transient API failures
c-vigo Mar 17, 2026
14a01ff
ci: harden release dispatch and publish ordering (#337)
c-vigo Mar 17, 2026
7b6ffac
chore(ci): align create-github-app-token pins and v3 comments
c-vigo Mar 17, 2026
e34b007
chore(ci): align create-github-app-token pin and v3 comments (#339)
c-vigo Mar 17, 2026
3f367f5
ci(ci): scope dispatch permissions and align CI docs
c-vigo Mar 17, 2026
bdb1366
docs(ci): add changelog entry for dispatch permissions hardening
c-vigo Mar 17, 2026
3405b10
ci: scope dispatch permissions and align CI docs (#341)
c-vigo Mar 17, 2026
270fab5
chore: freeze changelog for release 0.3.1
commit-action-bot[bot] Mar 17, 2026
ac161b6
chore: prepare release 0.3.1
commit-action-bot[bot] Mar 17, 2026
1cef549
fix(ci): sync workspace manifest during release finalization
c-vigo Mar 17, 2026
4591cac
fix(ci): sync manifest mirror in prepare-release changelog commits
c-vigo Mar 17, 2026
451b936
fix(ci): sync changelog manifest in release workflows (#344)
c-vigo Mar 17, 2026
3e496ec
fix(ci): harden release workflow retries for network-sensitive steps
c-vigo Mar 17, 2026
53c6477
fix(ci): harden release workflow retries for network-sensitive steps …
c-vigo Mar 17, 2026
b2e9b37
fix(ci): add artifact-metadata permission for release attestations
c-vigo Mar 17, 2026
e4ebc23
docs(ci): add changelog entry for attestation metadata permission
c-vigo Mar 17, 2026
5b37cb4
fix: add artifact-metadata permission for release attestations (#351)
c-vigo Mar 17, 2026
aa04168
fix(ci): normalize smoke-test workspace ownership after installer
c-vigo Mar 17, 2026
aff43df
fix(ci): probe changelog path writability before ownership repair
c-vigo Mar 17, 2026
44c7205
fix(ci): validate changelog source readability in deploy probe
c-vigo Mar 17, 2026
7d4d7eb
fix(ci): normalize smoke-test workspace ownership after installer (#353)
c-vigo Mar 17, 2026
2683cb0
fix(ci): use status-aware smoke-test release lookup
c-vigo Mar 18, 2026
8ff2205
docs(ci): add changelog entry for release lookup fix
c-vigo Mar 18, 2026
3e5b769
fix(ci): fail fast on non-404 release lookup errors
c-vigo Mar 18, 2026
998f6f7
fix(ci): detect missing release via HTTP status
c-vigo Mar 18, 2026
7e8e10a
fix(ci): use status-aware smoke-test release lookup (#356)
c-vigo Mar 18, 2026
466523b
test(vigutils): add red tests for retry cli
c-vigo Mar 18, 2026
13a3550
feat(vigutils): add bounded retry cli command
c-vigo Mar 18, 2026
9b484ab
fix(ci): use retry cli for setup and image pull steps
c-vigo Mar 18, 2026
2ff89ec
fix(ci): harden release and sync workflows with retry
c-vigo Mar 18, 2026
06e4aab
fix(ci): harden workspace release templates with retry
c-vigo Mar 18, 2026
b8b5304
fix(ci): harden smoke-test dispatch retries and image resolution
c-vigo Mar 18, 2026
1d2dce4
docs(ci): record retry cli rollout in workflows
c-vigo Mar 18, 2026
b5e2c7c
fix(ci): validate tag target and release fallback retry
c-vigo Mar 18, 2026
7b6e155
fix(ci): harden sync workflow retry setup and portability
c-vigo Mar 18, 2026
1f5851d
fix(ci): run sync workflows in container image
c-vigo Mar 18, 2026
21764df
fix(ci): add resolve-image action and vig-os config
c-vigo Mar 18, 2026
e93f9b2
fix(ci): retry remote tag checks in push fallback
c-vigo Mar 18, 2026
992ed2f
fix(vigutils): handle command execution errors in retry CLI
c-vigo Mar 18, 2026
64203ef
fix: harden network retries in CI and release workflows (#359)
c-vigo Mar 18, 2026
13924bb
test(ci): add smoke-test dispatch orchestration assertions
c-vigo Mar 18, 2026
e33948a
ci(ci): redesign smoke-test dispatch release orchestration
c-vigo Mar 18, 2026
3660a68
fix(ci): harden smoke-test dispatch review feedback
c-vigo Mar 19, 2026
125d777
chore(ci): add temporary trivy ignore for CVE-2026-33186
c-vigo Mar 19, 2026
aeefa6a
fix(ci): repair root-owned files after smoke-test installer
c-vigo Mar 19, 2026
c478efe
chore: add temporary trivy ignore for CVE-2026-33186 (#362)
c-vigo Mar 19, 2026
9638e9f
chore: merge branch 'release/0.3.1' into feature/358-redesign-smoke-t…
c-vigo Mar 19, 2026
47952c9
ci(ci): redesign smoke-test dispatch release orchestration (#360)
c-vigo Mar 19, 2026
a78a3dc
fix(ci): ensure release retry steps do not require implicit uv
c-vigo Mar 19, 2026
3aa4f4c
fix(ci): centralize release retry helper via setup-env
c-vigo Mar 19, 2026
a67d541
fix(ci): ensure release retry steps do not require implicit uv (#366)
c-vigo Mar 19, 2026
e9ddd3e
fix(ci): decouple sync workflows from devcontainer image
c-vigo Mar 19, 2026
af86e08
fix(ci): remove upstream .vig-os files and document sync decoupling
c-vigo Mar 19, 2026
b85143e
fix(ci): remove obsolete upstream resolve-image action
c-vigo Mar 19, 2026
bcc80c4
fix(ci): decouple workspace sync workflows from upstream templates
c-vigo Mar 19, 2026
47f848f
refactor(ci): remove downstream release contract handshake
c-vigo Mar 19, 2026
80de687
fix(ci): minimize setup-env footprint in sync workflows
c-vigo Mar 19, 2026
51b5a46
fix(ci): decouple upstream sync workflows from ghcr image dependency …
c-vigo Mar 19, 2026
f92dac4
fix(ci): harden setup-env uv sync retry path
c-vigo Mar 19, 2026
2dbafcb
docs(ci): record uv sync crash recovery fix
c-vigo Mar 19, 2026
a318ad1
fix(ci): simplify uv sync retry control flow
c-vigo Mar 19, 2026
298e397
fix(ci): harden setup-env uv sync retry path (#371)
c-vigo Mar 19, 2026
de38bdf
fix(ci): checkout repository before rollback setup-env
c-vigo Mar 19, 2026
1623556
fix(ci): add rollback contents permission for checkout
c-vigo Mar 19, 2026
2aa8e9f
fix(ci): checkout repository before rollback setup-env (#372)
c-vigo Mar 19, 2026
3113bd0
fix(ci): prevent setup-env BASH_ENV self-source recursion
c-vigo Mar 19, 2026
938aa4d
fix(ci): prevent setup-env BASH_ENV self-source recursion (#375)
c-vigo Mar 19, 2026
aed2806
fix(ci): require checkout before smoke-test setup-env
c-vigo Mar 19, 2026
15855ff
fix: require checkout before smoke-test setup-env (#378)
c-vigo Mar 19, 2026
170c8b5
fix(ci): include resolve-image action in sparse checkout
c-vigo Mar 19, 2026
2c06416
fix(ci): include resolve-image action in sparse checkout (#385)
c-vigo Mar 19, 2026
27891c5
fix(ci): set explicit gh repo context in smoke-test dispatch
c-vigo Mar 19, 2026
ffc4e24
fix(ci): set explicit gh repo context in smoke-test dispatch (#387)
c-vigo Mar 20, 2026
d55cab9
fix(ci): harden smoke-test dispatch workflow contract
c-vigo Mar 20, 2026
6e6ebcd
fix(ci): refine smoke-test preflight diagnostics
c-vigo Mar 20, 2026
d145b29
docs(ci): include release_kind in smoke-test dispatch payload comment
c-vigo Mar 20, 2026
a154152
fix: harden smoke-test dispatch workflow contract (#390)
c-vigo Mar 20, 2026
6829b28
test(ci): assert gh workflow preflight uses --yaml with --ref
c-vigo Mar 20, 2026
eac1bb7
fix(ci): make smoke-test preflight compatible with gh ref validation
c-vigo Mar 20, 2026
22a18d6
test(ci): cover release rollback image and workflow hardening
c-vigo Mar 20, 2026
4843449
fix(ci): harden release workflows for smoke-test orchestration
c-vigo Mar 20, 2026
561828d
fix(ci): force bash shell in workspace container jobs
c-vigo Mar 20, 2026
79723e5
fix(ci): harden rollback failure gate for workspace release
c-vigo Mar 20, 2026
898d880
fix(ci): remove dead --yaml preflight error branch
c-vigo Mar 20, 2026
a265a4d
fix(ci): harden smoke-test preflight and release workflow orchestrati…
c-vigo Mar 20, 2026
ea7808e
docs(ci): document RELEASE_APP actions permission for downstream disp…
c-vigo Mar 20, 2026
a5ef886
docs(ci): add release app permission note to changelog
c-vigo Mar 20, 2026
ebf3986
docs(ci): document release app actions permission for downstream disp…
c-vigo Mar 20, 2026
cc4dcdb
fix(ci): require app tokens in downstream release templates
c-vigo Mar 20, 2026
8c851ea
fix(ci): address copilot follow-ups for release token routing
c-vigo Mar 20, 2026
c3f3d93
fix(ci): require app tokens in downstream release templates (#401)
c-vigo Mar 20, 2026
2818418
fix(ci): create sync branch via git push for CI trigger
c-vigo Mar 20, 2026
373e56c
fix(ci): split smoke-test dispatch into two-phase orchestration
c-vigo Mar 20, 2026
54f86b7
test(ci): add phase 2 tests and update phase 1 dispatch assertions
c-vigo Mar 21, 2026
5c3f585
fix(ci): fail on missing release-kind label in phase 2 validation
c-vigo Mar 21, 2026
c8a3ad6
docs: align 0.3.1 smoke-test notes with CHANGELOG sync removal
c-vigo Mar 21, 2026
0a71f72
fix(ci): split smoke-test dispatch into two-phase orchestration (#404)
c-vigo Mar 21, 2026
ec93e79
fix(ci): dispatch CI after sync-main-to-dev PR creation
c-vigo Mar 21, 2026
5864c40
fix(ci): dispatch sync PR CI before auto-merge for all PRs
c-vigo Mar 21, 2026
99efd68
fix(ci): remove post-PR workflow_dispatch CI trigger
c-vigo Mar 21, 2026
60ae67a
fix(ci): remove sync-main-to-dev workflow_dispatch CI trigger (#406)
c-vigo Mar 22, 2026
0c49fe5
fix(ci): retry setup-env uv install on transient download failure
c-vigo Mar 22, 2026
eefc95a
fix(ci): retry setup-env uv install on transient download failure (#411)
c-vigo Mar 22, 2026
c801766
fix(ci): detect sync-main-to-dev conflicts with merge-tree
c-vigo Mar 22, 2026
c2d2e70
fix: sync-main-to-dev conflict detection with merge-tree (#412)
c-vigo Mar 22, 2026
fedb863
fix(ci): smoke-test deploy uses workspace changelog scaffold
c-vigo Mar 23, 2026
71ee226
fix(ci): smoke-test deploy changelog chown and first Changed inject
c-vigo Mar 23, 2026
42d1712
fix(ci): stop injecting deploy line into smoke-test CHANGELOG
c-vigo Mar 23, 2026
aa6b434
fix(ci): smoke-test deploy uses workspace changelog scaffold (#415)
c-vigo Mar 23, 2026
6b7e039
ci(ci): bump the actions-minor-patch group with 4 updates
dependabot[bot] Mar 23, 2026
31dde78
build(deps): bump @devcontainers/cli from 0.84.0 to 0.84.1
dependabot[bot] Mar 23, 2026
21e5876
docs: record dependabot bumps for 0.3.1
c-vigo Mar 23, 2026
59962c0
ci(ci): dependabot actions and devcontainers/cli for release 0.3.1 (#…
c-vigo Mar 23, 2026
8645f3a
test(vigutils): add failing specs for prepare-changelog unprepare
c-vigo Mar 23, 2026
c066372
feat(vigutils): implement prepare-changelog unprepare
c-vigo Mar 23, 2026
0376023
fix(ci): sync smoke-test workspace CHANGELOG via prepare-changelog un…
c-vigo Mar 23, 2026
d831089
fix(ci): remove redundant changelog remap from smoke-test dispatch
c-vigo Mar 23, 2026
d81067b
docs: add CHANGELOG entry for smoke-test prepare-release fix
c-vigo Mar 23, 2026
29ae816
docs(vigutils): document prepare-changelog unprepare
c-vigo Mar 23, 2026
38f2e5b
fix(ci): align bats test with actual workflow changelog validation
c-vigo Mar 23, 2026
ea7d6ce
test: align smoke root CHANGELOG assertions with unprepare
c-vigo Mar 23, 2026
9eb7292
fix: restore smoke-test workspace changelog for prepare-release (#418)
c-vigo Mar 23, 2026
1b5ca5d
fix(ci): merge smoke-test release phase 2 into repository dispatch
c-vigo Mar 23, 2026
bc214ea
fix(ci): align merge-release-pr gh env and drop unused trigger-releas…
c-vigo Mar 23, 2026
8f8b60f
fix(ci): merge smoke-test release phase 2 into repository dispatch (#…
c-vigo Mar 23, 2026
2c73914
fix(ci): harden downstream release validate and rollback context
c-vigo Mar 23, 2026
1076398
fix: harden downstream release validate and rollback context (#422)
c-vigo Mar 23, 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
8 changes: 4 additions & 4 deletions .github/actions/build-image/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ runs:
using: composite
steps:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0

- name: Set up environment
uses: ./.github/actions/setup-env
Expand All @@ -107,7 +107,7 @@ runs:
- name: Extract metadata
id: meta
uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5.10.0
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
with:
images: ${{ inputs.registry }}
tags: |
Expand All @@ -124,7 +124,7 @@ runs:
- name: Build image (tar output)
if: inputs.output-type == 'tar'
uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6
uses: docker/build-push-action@d08e5c354a6adb9ed34480a06d141179aa583294 # v7.0.0
with:
context: ./build
file: ./build/Containerfile
Expand Down Expand Up @@ -174,7 +174,7 @@ runs:

- name: Build image (registry output)
if: inputs.output-type == 'registry'
uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6
uses: docker/build-push-action@d08e5c354a6adb9ed34480a06d141179aa583294 # v7.0.0
with:
context: ./build
file: ./build/Containerfile
Expand Down
167 changes: 153 additions & 14 deletions .github/actions/setup-env/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,19 @@
# - hadolint (for Containerfile linting in pre-commit)
# - BATS + helper libraries (for shell script testing)
#
# IMPORTANT: The caller must checkout the repository before using this action.
# This action does NOT checkout code, allowing callers to control ref, token,
# persist-credentials, and other checkout options.
# IMPORTANT:
# - This action does NOT checkout code, allowing callers to control ref, token,
# persist-credentials, and other checkout options.
# - Checkout is only required for operations that read repository files
# (for example, sync-dependencies or devcontainer CLI version lookup).
#
# Inputs:
# install-python: Install Python (default: true)
# python-version: Python version fallback when pyproject.toml is unavailable (default: '3.12')
# sync-dependencies: Run uv sync to install project deps (default: false)
# install-podman: Install podman (default: false)
# install-node: Install Node.js (default: false)
# node-version: Node.js version (default: '20')
# node-version: Node.js version (default: '24')
# install-devcontainer-cli: Install devcontainer CLI + docker-compose wrapper (default: false)
# install-hadolint: Install hadolint binary (default: false)
# install-taplo: Install taplo TOML linter/formatter (default: false)
Expand All @@ -25,10 +29,15 @@
# uv-version: The version of uv that was installed
#
# Usage:
# # Minimal (Python + uv only)
# # Default (Python + uv only)
# - uses: actions/checkout@v4
# - uses: ./.github/actions/setup-env
#
# # uv only (skip Python setup)
# - uses: ./.github/actions/setup-env
# with:
# install-python: 'false'
#
# # With project dependencies
# - uses: actions/checkout@v4
# - uses: ./.github/actions/setup-env
Expand All @@ -47,6 +56,14 @@ name: 'Setup Environment'
description: 'Set up CI environment with Python, uv, and optional tools (podman, Node.js, devcontainer CLI, hadolint, BATS)'

inputs:
install-python:
description: 'Install Python runtime'
required: false
default: 'true'
python-version:
description: 'Python version fallback when pyproject.toml is unavailable'
required: false
default: '3.12'
sync-dependencies:
description: 'Run uv sync to install project dependencies'
required: false
Expand All @@ -62,7 +79,7 @@ inputs:
node-version:
description: 'Node.js version (when install-node is true)'
required: false
default: '20'
default: '24'
install-devcontainer-cli:
description: 'Install @devcontainers/cli and docker-compose wrapper (requires Node.js)'
required: false
Expand All @@ -87,31 +104,145 @@ inputs:
outputs:
uv-version:
description: 'Version of uv installed'
value: ${{ steps.setup-uv.outputs.uv-version }}
value: ${{ steps.setup-uv-retry.outputs.uv-version || steps.setup-uv.outputs.uv-version }}

runs:
using: composite
steps:
# ── Python ───────────────────────────────────────────────────────────
- name: "Set up Python"
- name: "Set up Python from pyproject"
if: inputs.install-python == 'true' && hashFiles('pyproject.toml') != ''
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
with:
python-version-file: "pyproject.toml"

- name: "Set up Python fallback"
if: inputs.install-python == 'true' && hashFiles('pyproject.toml') == ''
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
with:
python-version: ${{ inputs.python-version }}

# ── uv ─────────────────────────────────────────────────────────────
- name: Install uv
id: setup-uv
continue-on-error: true
uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 # v7
with:
enable-cache: true
# Install a specific version of uv.
version: "0.10.0"

- name: Wait before retrying uv install
if: steps.setup-uv.outcome == 'failure'
shell: bash
run: sleep 15

- name: Install uv (retry)
id: setup-uv-retry
if: steps.setup-uv.outcome == 'failure'
uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 # v7
with:
enable-cache: true
# Install a specific version of uv.
version: "0.10.0"

# ── retry() shell helper ───────────────────────────────────────────
- name: Export retry helper function
shell: bash
run: |
set -euo pipefail
RETRY_HELPER="$RUNNER_TEMP/setup-env-retry.sh"
PREV_BASH_ENV="${BASH_ENV:-}"

cat > "$RETRY_HELPER" <<'EOF'
retry() {
local retries=3
local backoff=1
local max_backoff=60
local rc=1

while [ "$#" -gt 0 ]; do
case "$1" in
--retries)
retries="$2"
shift 2
;;
--backoff)
backoff="$2"
shift 2
;;
--max-backoff)
max_backoff="$2"
shift 2
;;
--)
shift
break
;;
*)
echo "ERROR: Unknown retry option '$1'"
return 2
;;
esac
done

if [ "$#" -eq 0 ]; then
echo "ERROR: retry requires a command after '--'"
return 2
fi

local attempt=1
local current_backoff="$backoff"
while [ "$attempt" -le "$retries" ]; do
if "$@"; then
return 0
fi
rc=$?
if [ "$attempt" -lt "$retries" ]; then
local wait="$current_backoff"
if [ "$wait" -gt "$max_backoff" ]; then
wait="$max_backoff"
fi
echo "Retry $attempt/$retries failed (exit $rc), waiting ${wait}s..."
sleep "$wait"
current_backoff=$((current_backoff * 2))
fi
attempt=$((attempt + 1))
done

echo "ERROR: Command failed after $retries attempts: $*"
return "$rc"
}
export -f retry
EOF

if [ -n "$PREV_BASH_ENV" ] && [ -f "$PREV_BASH_ENV" ] && [ "$PREV_BASH_ENV" != "$RETRY_HELPER" ]; then
{
echo "source \"$PREV_BASH_ENV\""
cat "$RETRY_HELPER"
} > "${RETRY_HELPER}.merged"
mv "${RETRY_HELPER}.merged" "$RETRY_HELPER"
fi

echo "BASH_ENV=$RETRY_HELPER" >> "$GITHUB_ENV"

# ── Python dependencies ───────────────────────────────────────────────
- name: Sync Python dependencies
if: inputs.sync-dependencies == 'true'
shell: bash
run: uv sync --frozen --all-extras
run: |
set -euo pipefail

if uv sync --frozen --all-extras; then
:
else
rc=$?
echo "WARNING: uv sync failed (exit $rc), clearing cache and .venv before retry..."
uv cache clean
rm -rf .venv
echo "Retrying uv sync..."
uv sync --frozen --all-extras
fi

# ── Podman ──────────────────────────────────────────────────────────
- name: Install podman
Expand All @@ -130,7 +261,7 @@ runs:
# Also installed when install-devcontainer-cli is true (npm is required)
- name: Install Node.js
if: inputs.install-node == 'true' || inputs.install-devcontainer-cli == 'true'
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ inputs.node-version }}

Expand Down Expand Up @@ -162,8 +293,10 @@ runs:
BIN_FILE="hadolint-${ARCH}"
SHA_FILE="${BIN_FILE}.sha256"

curl -fsSL "${BASE_URL}/${BIN_FILE}" -o "${BIN_FILE}"
curl -fsSL "${BASE_URL}/${SHA_FILE}" -o "${SHA_FILE}"
retry --retries 3 --backoff 5 --max-backoff 60 -- \
curl -fsSL "${BASE_URL}/${BIN_FILE}" -o "${BIN_FILE}"
retry --retries 3 --backoff 5 --max-backoff 60 -- \
curl -fsSL "${BASE_URL}/${SHA_FILE}" -o "${SHA_FILE}"

EXPECTED_SHA="$(awk '{print $1}' "${SHA_FILE}")"
echo "${EXPECTED_SHA} ${BIN_FILE}" | sha256sum -c -
Expand All @@ -189,11 +322,17 @@ runs:
;;
esac

TAPLO_VERSION="$(curl -fsSL https://api.github.com/repos/tamasfe/taplo/releases/latest | sed -n 's/.*"tag_name": *"\([^"]*\)".*/\1/p')"
TAPLO_VERSION="$(retry --retries 3 --backoff 5 --max-backoff 60 -- \
curl -fsSL https://api.github.com/repos/tamasfe/taplo/releases/latest | sed -n 's/.*"tag_name": *"\([^"]*\)".*/\1/p')"
if [ -z "${TAPLO_VERSION:-}" ]; then
echo "ERROR: Failed to resolve Taplo version from GitHub releases API"
exit 1
fi
BASE_URL="https://github.com/tamasfe/taplo/releases/download/${TAPLO_VERSION}"
BIN_FILE="taplo-linux-${ARCH}.gz"

curl -fsSL "${BASE_URL}/${BIN_FILE}" -o "${BIN_FILE}"
retry --retries 3 --backoff 5 --max-backoff 60 -- \
curl -fsSL "${BASE_URL}/${BIN_FILE}" -o "${BIN_FILE}"
gunzip "${BIN_FILE}"
sudo install -m 0755 "taplo-linux-${ARCH}" /usr/local/bin/taplo
rm -f "taplo-linux-${ARCH}"
Expand Down
19 changes: 3 additions & 16 deletions .github/actions/test-image/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ runs:
using: composite
steps:
- name: Checkout code
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ inputs.ref || github.ref }}

Expand Down Expand Up @@ -125,21 +125,8 @@ runs:
echo "Pulling image: $IMAGE_TAG"

# Retry logic for podman pull (network flakiness)
RETRIES=3
for i in $(seq 1 $RETRIES); do
if podman pull "$IMAGE_TAG"; then
echo "Image pulled successfully"
break
else
if [ $i -lt $RETRIES ]; then
echo "Pull failed, retrying ($i/$RETRIES)..."
sleep 3
else
echo "Pull failed after $RETRIES attempts"
exit 1
fi
fi
done
uv run retry --retries 3 --backoff 3 --max-backoff 3 -- podman pull "$IMAGE_TAG"
echo "Image pulled successfully"

- name: Verify image is available
if: inputs.image-source == 'local'
Expand Down
2 changes: 1 addition & 1 deletion .github/actions/test-integration/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ runs:
using: composite
steps:
- name: Checkout code
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ inputs.ref || github.ref }}

Expand Down
6 changes: 3 additions & 3 deletions .github/actions/test-project/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ runs:
using: composite
steps:
- name: Checkout code
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Set up test environment
uses: ./.github/actions/setup-env
Expand All @@ -51,7 +51,7 @@ runs:

- name: Cache pre-commit hooks
if: inputs.suite == 'all' || inputs.suite == 'lint'
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
with:
path: ~/.cache/pre-commit
key: pre-commit-${{ runner.os }}-${{ hashFiles('.pre-commit-config.yaml') }}
Expand Down Expand Up @@ -147,7 +147,7 @@ runs:

- name: Upload coverage report
if: always() && inputs.suite == 'all'
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: coverage-report
path: coverage.xml
Expand Down
Loading
Loading