Skip to content

feat(release): add alpha releases from pull request branches - #626

Merged
guibeira merged 1 commit into
mainfrom
feat/alpha-worker-releases
Jul 29, 2026
Merged

feat(release): add alpha releases from pull request branches#626
guibeira merged 1 commit into
mainfrom
feat/alpha-worker-releases

Conversation

@guibeira

@guibeira guibeira commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator

What changed

Adds an Alpha Release workflow for publishing a worker from an unmerged pull-request branch.

The workflow checks out an explicit source ref, creates an ephemeral -alpha.N version commit, and pushes only its annotated tag. The existing release pipeline then publishes the artifact as a GitHub prerelease on the experimental registry channel.

The release SOP now documents how to run the workflow with a PR branch or refs/pull/<number>/head.

Why

This enables integration testing of a PR's release artifact without modifying the PR branch, main, latest, or next.

Validation

  • actionlint .github/workflows/alpha-release.yml
  • pytest .github/scripts/tests — 158 passed (containerized)

Summary by CodeRabbit

  • New Features

    • Added a workflow for creating integration-testing alpha releases from a selected feature branch or pull request.
    • Supports choosing the worker module and alpha version bump strategy.
    • Publishes an annotated prerelease tag without modifying the source branch.
  • Documentation

    • Added instructions for creating alpha releases and clarified experimental channel behavior and source-branch restrictions.

@vercel

vercel Bot commented Jul 29, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
workers Ready Ready Preview, Comment Jul 29, 2026 5:15pm
workers-tech-spec Ready Ready Preview, Comment Jul 29, 2026 5:15pm

Request Review

@coderabbitai

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Adds a manually triggered GitHub Actions workflow that creates worker alpha releases from non-main refs, updates and verifies versions, synchronizes Cargo.lock, pushes only an annotated tag, and documents the procedure.

Changes

Worker alpha release

Layer / File(s) Summary
Release inputs and source guard
.github/workflows/alpha-release.yml
Defines manual inputs, worker-specific concurrency, contents write permission, source checkout, and a guard rejecting refs that resolve to main.
Manifest version preparation
.github/workflows/alpha-release.yml
Discovers the worker manifest, calculates and verifies the alpha version, and synchronizes Cargo.lock.
Tag publication and operating procedure
.github/workflows/alpha-release.yml, docs/sops/release.md
Checks for tag collisions, commits version changes, pushes only the annotated tag, and documents the pull-request alpha release process.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Operator
  participant AlphaRelease
  participant Git
  participant GitHub
  Operator->>AlphaRelease: Select source ref, worker, and bump
  AlphaRelease->>Git: Checkout and reject main
  AlphaRelease->>Git: Calculate version and update manifest
  AlphaRelease->>Git: Commit changes and create annotated tag
  AlphaRelease->>GitHub: Push only the alpha tag
Loading

Suggested reviewers: ytallo

Poem

A rabbit taps the release-door bright,
An alpha tag hops into flight.
The branch stays still, the tag goes free,
With experimental carrots for all to see!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: adding alpha releases for pull request branches.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Fix failing CI checks
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/alpha-worker-releases

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@guibeira guibeira added the no-ticket PR deliberately has no Linear ticket (bump/typo/CI-only) label Jul 29, 2026
@github-actions

Copy link
Copy Markdown
Contributor

skill-check — worker

0 verified, 49 skipped (no docs/).

Layer Result
structure
vale
ai
render

Four for four. Nicely done.

@guibeira
guibeira marked this pull request as ready for review July 29, 2026 17:33
@guibeira
guibeira merged commit ac0f750 into main Jul 29, 2026
16 of 18 checks passed

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/alpha-release.yml:
- Around line 97-101: Update the Checkout source ref step to disable persisted
credentials, then explicitly fetch the trusted release tooling and _lib.py from
main before invoking manifest_version.py. Ensure release operations use those
main-sourced scripts rather than files from inputs.source_ref, and configure a
narrowly scoped push token only for the explicit git push of the release tag.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8fe745ca-5f7f-47cc-b842-dc9852363cf9

📥 Commits

Reviewing files that changed from the base of the PR and between 0cba488 and 74ff7c1.

📒 Files selected for processing (2)
  • .github/workflows/alpha-release.yml
  • docs/sops/release.md

Comment on lines +97 to +101
- name: Checkout source ref
uses: actions/checkout@v5
with:
fetch-depth: 0
ref: ${{ inputs.source_ref }}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔒 Security & Privacy | 🔴 Critical | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== locate workflow files =="
fd -a 'alpha-release\.yml$|.*release.*\.ya?ml$|.*workflow.*\.ya?ml$' .github/workflows | sed 's#^\./##'

echo "== relevant workflow excerpt =="
if [ -f .github/workflows/alpha-release.yml ]; then
  nl -ba .github/workflows/alpha-release.yml | sed -n '1,240p'
fi

echo "== search manifest_version.py and _lib.py =="
git ls-files | grep -E '(^|/)manifest_version\.py$|(^|/)_lib\.py$|\.github/scripts/' | sed -n '1,200p'

Repository: iii-hq/workers

Length of output: 416


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== alpha-release.yml excerpt with line numbers =="
python3 - <<'PY'
from pathlib import Path
p = Path('.github/workflows/alpha-release.yml')
for i, line in enumerate(p.read_text().splitlines(), 1):
    if 1 <= i <= 250:
        print(f"{i:4d}\t{line}")
PY

echo "== manifest_version.py candidates =="
git ls-files | grep -E '(^|/)manifest_version\.py$|(^|/)_lib\.py$|(^|/)\.github/scripts/[^/]+$' || true

echo "== all manifest_version.py locations =="
python3 - <<'PY'
from pathlib import Path
import subprocess
files = subprocess.check_output(['git', 'ls-files'], text=True).splitlines()
for f in files:
    if f.endswith('manifest_version.py') or f.endswith('_lib.py'):
        print(f)
PY

Repository: iii-hq/workers

Length of output: 7929


🌐 Web query:

actions/checkout persist-credentials default true README

💡 Result:

The persist-credentials input for the actions/checkout GitHub Action determines whether the authentication token or SSH key used for the checkout is configured in the local git configuration [1][2]. By default, persist-credentials is set to true [1][2]. When enabled, this allows subsequent steps in the same job to execute authenticated git commands using those credentials [3][4]. The action removes these credentials from the local git configuration during the post-job cleanup phase [3][5]. If you wish to prevent these credentials from being stored in the local git configuration, you can set persist-credentials to false [3][6]. This is often recommended for security purposes to ensure that subsequent steps in a workflow cannot access the repository token if they do not require it [7].

Citations:


Do not execute release tooling from the caller-selected ref.

The workflow checks out inputs.source_ref but later runs .github/scripts/manifest_version.py from actions/checkout’s default persisted GITHUB_TOKEN; after that, Git commands can push arbitrary refs before the explicit git push origin "$TAG". Keep checkout credentials disabled for the selected source, fetch the trusted release tooling/_lib.py from main, and use a scoped push token only where the tag is pushed.

🧰 Tools
🪛 zizmor (1.28.0)

[warning] 97-101: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/alpha-release.yml around lines 97 - 101, Update the
Checkout source ref step to disable persisted credentials, then explicitly fetch
the trusted release tooling and _lib.py from main before invoking
manifest_version.py. Ensure release operations use those main-sourced scripts
rather than files from inputs.source_ref, and configure a narrowly scoped push
token only for the explicit git push of the release tag.

Source: Linters/SAST tools

guibeira added a commit that referenced this pull request Jul 30, 2026
* Revert "fix(release): trigger alpha tag publish (#633)"

This reverts commit 45b212f.

* Revert "fix(release): trigger alpha publish pipeline (#632)"

This reverts commit 4f1b339.

* Revert "fix(ci): simplify alpha release inputs (#628)"

This reverts commit 72a6595.

* Revert "feat(release): add alpha releases from pull request branches (#626)"

This reverts commit ac0f750.

* Revert "fix(release): isolate alpha releases (#631)"

This reverts commit 156f5dd.

* Revert "chore(image-resize): bump to v0.1.13-alpha.1"

This reverts commit 0cba488.

* Revert "feat(release): split version suffix from registry channel (#615)"

This reverts commit d0bc06d.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

no-ticket PR deliberately has no Linear ticket (bump/typo/CI-only)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant