Skip to content

feat(ci): promote a nightly fill to a draft tests release - #31

Merged
spencer-tb merged 6 commits into
spencer-tb:ci/nightly-fillfrom
danceratopz:ci/promote-nightly
Jul 15, 2026
Merged

feat(ci): promote a nightly fill to a draft tests release#31
spencer-tb merged 6 commits into
spencer-tb:ci/nightly-fillfrom
danceratopz:ci/promote-nightly

Conversation

@danceratopz

Copy link
Copy Markdown

🗒️ Description

This makes the "cutting tests@ releases directly from the nightly artifact" follow-up from ethereum#3100 concrete: a new promote_nightly.yaml workflow turns a nightly fill into a draft tests@<version> release without refilling. Since the nightly fills the mainnet tests feature through the exact release pipeline, its fixtures_tests artifact is already release-shaped; promotion downloads it and mirrors the release job's gh release create invocation, targeting the exact commit the nightly built, so publishing the draft creates the tag on that commit. The job runs in minutes on a hosted runner; nothing is filled.

gh workflow run promote_nightly.yaml -f version=vX.Y.Z
# or promote a specific nightly run instead of the newest one:
gh workflow run promote_nightly.yaml -f version=vX.Y.Z -f run_id=<run-id>

By default the newest scheduled run with a live fixtures_tests artifact is promoted: skip-runs upload no artifacts and expired fills cannot be downloaded, so both are passed over; run_id promotes a specific run instead. Validation lives in a standalone, unit-tested promote_nightly.py, deliberately self-contained rather than sharing helpers with check_new_commits.py so the two workflows stay decoupled. It fails fast when:

  • the version is not vX.Y.Z or does not exceed the newest existing tests@ tag;
  • no nightly run with a live fixtures_tests artifact exists (past the five-day retention: dispatch a full release instead);
  • the promoted commit is not an ancestor of the branch head.

Commits that landed after the promoted nightly are listed in the run's step summary as not included, so the releaser can choose between promoting and dispatching a fresh full release.

Commits, in order:

  • feat(ci): The workflow, the resolution/validation script with its unit tests (10 new cases on the existing fake-gh harness), and a new docs section in docs/dev/releasing_tests.md.
  • docs(ci): Unwrap docs/dev/releasing_tests.md and correct the tag-timing wording: gh release create --draft only stores the tag name and target commit as draft metadata, and the git tag is created when the draft is published. This applies to the existing manual release flow too, so a mispicked version can be fixed by editing the draft, with no stray tag to delete.

Notes, flagging for visibility:

  • Drafts do not reserve their tag name, so two parallel promotions of the same version would silently coexist as separate drafts; a promote-nightly concurrency group serializes promotions to prevent this.
  • Like the nightly cron path, promotion cannot be exercised in PR CI; it is worth one dispatch validation run on a fork before relying on it.

🔗 Related Issues or PRs

Targets the head branch of ethereum#3100, implementing the "cutting tests@ releases directly from the nightly artifact" follow-up listed there.

✅ Checklist

  • All: Ran fast static checks to avoid unnecessary CI fails, see also Code Standards and Verifying Changes:
    just static
  • All: PR title have the form <type>(<area>):, where <type> and <area> come from an approrpriate C-<type>, respectively A-<area>, label. The title should match the a target squash commit message.
  • All: Considered updating the online docs in the ./docs/ directory.

Cute Animal Picture

ready for promotion

Scheduled nightly runs of `release_fixtures.yaml` already build the
mainnet `tests` feature into a release-shaped `fixtures_tests`
artifact but never tag or draft anything. Add a `promote_nightly.yaml`
workflow that turns the newest such artifact (or an explicit `run_id`)
into a draft `tests@<version>` release without refilling: it downloads
the nightly tarball, then mirrors the release job's `gh release
create` invocation, targeting the exact commit the nightly built so
publishing the draft creates the tag on that commit. The job runs in
minutes on a hosted runner.

The validation lives in (and is unit-tested via) a standalone
`promote_nightly.py`, deliberately self-contained rather than sharing
helpers with `check_new_commits.py`: the version must be `vX.Y.Z` and
greater than the newest existing `tests@` tag, the promoted run must
be a successful scheduled run with a live `fixtures_tests` artifact,
and the promoted commit must be an ancestor of the branch head.
Commits that landed after the nightly are listed in the step summary
as not included, so the releaser can choose between promoting and
dispatching a fresh full release.
Unwrap the hard-wrapped prose so one paragraph or list item is one
line, matching the rest of the repo's markdown docs.

Also correct the tag-timing wording: the page said the workflow
creates the git tag and then drafts the release, but `gh release
create --draft` only stores the tag name and target commit as draft
metadata; the tag is created when the draft is published. This means
an unpublished draft (a mispicked version, for example) can be edited
or deleted without leaving a stray tag behind.
spencer-tb and others added 4 commits July 15, 2026 14:52
The cached path accepts a skipped `build` in the release job's
condition, but a failed `setup` also leaves `build` skipped: under
`always()` a cached dispatch whose resolve step failed would start
the release job with empty setup outputs and die at the artifact
download (no draft is ever created, but the run ends with a red
release job instead of a skipped one). Require `setup` to have
succeeded explicitly.

@spencer-tb spencer-tb left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lets go!!

@spencer-tb
spencer-tb merged commit 62adf10 into spencer-tb:ci/nightly-fill Jul 15, 2026
9 of 19 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants