Skip to content

ci: move remaining workflows off the persistent self-hosted runner - #3268

Merged
myasnikovdaniil merged 2 commits into
mainfrom
ci/decommission-self-hosted-runner
Jul 9, 2026
Merged

ci: move remaining workflows off the persistent self-hosted runner#3268
myasnikovdaniil merged 2 commits into
mainfrom
ci/decommission-self-hosted-runner

Conversation

@kvaps

@kvaps Andrei Kvapil (kvaps) commented Jul 9, 2026

Copy link
Copy Markdown
Member

What this PR does

Completes the last step of #2937 — no workflow depends on the persistent self-hosted runner anymore, so it can be decommissioned. PR builds, the main cache warmer, nightly, promote-rc, and pull-requests-release already run on the ephemeral pool; this PR moves the stragglers:

  • tags.yaml / prepare-release moves to the large ephemeral shape (same as the main cache warmer). Release builds now warm-start from the shared mode=max build cache in OCIR (written by build-main.yaml on every push to main) while still pushing images to GHCR. Cache manifests are registry-portable, and a missing cache ref degrades harmlessly into a cold build. Without this wiring, every tag build on an ephemeral runner would start 100% cold — the persistent runner used to warm-start from local buildkit state.
  • tags.yaml / generate-changelog and update-website-docs, backport.yaml, update-releasenotes.yaml move to GitHub-hosted runners: these jobs only need git and the GitHub API, no docker or repo toolchain.
  • pull-requests.yaml: the debug label no longer reroutes jobs to the self-hosted runner — that path would queue forever once the runner is gone. The label still gates the SSH breakpoint on e2e failure, which works from ephemeral runners (the breakpoint connects out to the rendezvous server).
  • flux-shard-operator was the last image built with the stale inline/:latest cache pattern (always cold since refactor(build): standardize image tagging to fix concurrent PR push conflicts #2711); it now uses the shared cache-args registry cache like every other image.

Operational notes for the actual decommission:

  • The breakpoint rendezvous server (BREAKPOINT_ENDPOINT) is separate infrastructure — if it happens to live on the same host as the runner, it needs a new home before the host is retired.
  • tags.yaml now uses the OCIR_USER/OCIR_TOKEN secrets on tag events (already used there by nightly.yaml and release-e2e before it).

Screenshots

Not applicable — CI-only change.

Release note

ci: all CI jobs now run on ephemeral or GitHub-hosted runners; release tag builds warm-start from the shared registry build cache

Summary by CodeRabbit

  • Chores
    • Updated multiple GitHub Actions workflows to use more consistent hosted runner environments for checks, PR validation, tagging, backports, and release note updates.
    • Improved tag/release build setup for ephemeral runners, including optional build toolchain setup and container registry authentication.
    • Enhanced image build caching for the shard operator to improve packaging efficiency.
  • Bug Fixes
    • Removed label-driven runner switching in pull request checks to make build and test execution more predictable.

@coderabbitai

coderabbitai Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: e274a93c-2312-4c91-ab9f-a04a432534d9

📥 Commits

Reviewing files that changed from the base of the PR and between a6b669e and 814a47f.

📒 Files selected for processing (5)
  • .github/workflows/backport.yaml
  • .github/workflows/pull-requests.yaml
  • .github/workflows/tags.yaml
  • .github/workflows/update-releasenotes.yaml
  • packages/system/flux-shard-operator/Makefile
✅ Files skipped from review due to trivial changes (1)
  • .github/workflows/backport.yaml
🚧 Files skipped from review as they are similar to previous changes (3)
  • .github/workflows/update-releasenotes.yaml
  • packages/system/flux-shard-operator/Makefile
  • .github/workflows/tags.yaml

📝 Walkthrough

Walkthrough

This PR changes CI workflow runner selection across backport, pull-requests, tags, and update-releasenotes workflows, and updates the flux-shard-operator build to use a shared cache helper. The tags release workflow also adds Flux CLI setup and OCIR login for build cache access.

Changes

CI Workflow Runner Migration

Layer / File(s) Summary
Backport workflow runner update
.github/workflows/backport.yaml
Prepare and backport jobs switch from self-hosted to ubuntu-latest with updated comments.
Pull-requests workflow runner fixation
.github/workflows/pull-requests.yaml
Checks, build, build-talos, finalize, and e2e jobs drop the debug-label conditional and always use fixed Oracle VM runner classes.
Tags release workflow runner and build cache changes
.github/workflows/tags.yaml
Prepare-release moves to an ephemeral Oracle VM runner, adds Flux CLI setup and OCIR login for shared build cache access, and generate-changelog/update-website-docs switch to ubuntu-latest.
Update-releasenotes workflow runner update
.github/workflows/update-releasenotes.yaml
Job switches from self-hosted to ubuntu-latest with a comment noting only GitHub API calls are made.

Flux Shard Operator Build Cache

Layer / File(s) Summary
Shared cache-args adoption
packages/system/flux-shard-operator/Makefile
The image build target uses the shared cache-args helper instead of inline cache-from/cache-to flags.

Estimated code review effort: 2 (Simple) | ~12 minutes

Possibly related PRs

  • cozystack/cozystack#2855: Modifies the same flux-shard-operator Makefile buildx cache wiring for warm-start builds.
  • cozystack/cozystack#2948: Also touches pull-requests.yaml runner selection and migrates buildx caching to the shared cache-args mechanism.
  • cozystack/cozystack#2978: Changes pull-request workflow-related logic that interacts with .github/workflows/pull-requests.yaml.

Suggested reviewers: lllamnyp, androndo, IvanHunters, sircthulhu, lexfrei

🚥 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 accurately summarizes the main change: migrating the remaining CI workflows away from the persistent self-hosted runner.
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
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ci/decommission-self-hosted-runner

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.

@github-actions github-actions Bot added area/uncategorized PR auto-labeler could not map title scope to a known area/*; please review size/M This PR changes 30-99 lines, ignoring generated files labels Jul 9, 2026
@kvaps
Andrei Kvapil (kvaps) marked this pull request as ready for review July 9, 2026 18:48
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request finalizes the decommissioning of the persistent self-hosted runner by migrating all remaining CI jobs to ephemeral or GitHub-hosted infrastructure. The changes ensure that release builds maintain performance through registry-based cache warm-starts and clean up legacy routing logic in pull request workflows.

Highlights

  • CI Infrastructure Migration: Completed the migration of all remaining CI workflows from the persistent self-hosted runner to ephemeral and GitHub-hosted runners.
  • Release Build Optimization: Updated release tag builds to utilize the shared registry build cache, ensuring warm-start capabilities previously provided by the persistent runner.
  • Flux Shard Operator Build: Modernized the flux-shard-operator image build process by replacing the stale inline cache pattern with the standard shared registry cache arguments.
New Features

🧠 You can now enable Memory (public preview) to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Ignored Files
  • Ignored by pattern: .github/workflows/** (4)
    • .github/workflows/backport.yaml
    • .github/workflows/pull-requests.yaml
    • .github/workflows/tags.yaml
    • .github/workflows/update-releasenotes.yaml
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment Gemini (@gemini-code-assist) Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize the Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counterproductive. You can react with 👍 and 👎 on Gemini (@gemini-code-assist) comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@dosubot dosubot Bot added area/build Issues or PRs related to image build infrastructure, multi-arch support area/ci Issues or PRs related to CI workflows, GitHub Actions, automation area/release Issues or PRs related to release tooling (changelog, backport, release pipeline) kind/cleanup Categorizes issue or PR as related to cleanup of code, process, or technical debt labels Jul 9, 2026

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code Review

This pull request refactors the Makefile for the flux-shard-operator package by replacing the hardcoded Docker buildx caching arguments (--cache-from and --cache-to) with a call to the reusable cache-args helper function. There are no review comments, and I have no feedback to provide.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

flux-shard-operator was the last image built with the pre-#2937 cache
pattern: --cache-from a :latest tag that PR builds no longer publish and
--cache-to type=inline, which never caches multistage builder layers. Use
the shared cache-args macro so it reads (and, on main, writes) the same
mode=max :buildcache ref in CACHE_REGISTRY as every other image.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Andrei Kvapil <andrei.kvapil@aenix.io>
Finishes the runner decommission tracked in #2937. PR builds, the main
cache warmer, nightly, promote-rc and pull-requests-release already run
on the ephemeral pool; this moves the stragglers so no workflow depends
on the persistent runner anymore:

- tags.yaml prepare-release: large ephemeral shape (same as the cache
  warmer), flux CLI bootstrap, and read-only OCIR access so release
  builds warm-start from the shared mode=max build cache while still
  pushing images to GHCR. Without the cache wiring every tag build on
  an ephemeral runner would be 100% cold.
- tags.yaml generate-changelog / update-website-docs, backport.yaml,
  update-releasenotes.yaml: GitHub-hosted runners — these jobs only
  need git and the GitHub API, no docker or repo toolchain.
- pull-requests.yaml: the debug label no longer reroutes jobs to the
  self-hosted runner (that path would queue forever once the runner is
  gone). The label keeps gating the SSH breakpoint on e2e failure,
  which works from ephemeral runners too.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Andrei Kvapil <andrei.kvapil@aenix.io>
@kvaps
Andrei Kvapil (kvaps) force-pushed the ci/decommission-self-hosted-runner branch from a6b669e to 814a47f Compare July 9, 2026 18:51

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

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/tags.yaml:
- Around line 142-149: The “Set up build toolchain” step can silently succeed
when the flux installer download fails because the piped command in the workflow
does not fail fast. Update the shell invocation in this step to enable pipe
failure handling so errors from curl propagate and the job stops immediately,
and keep the existing idempotent flux check intact. If you touch this block,
reference the “Set up build toolchain” step and the command-v- flux / curl |
sudo bash logic to ensure the fix is applied in the right place.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 06e937b5-5764-444c-8de2-788a9be66dcf

📥 Commits

Reviewing files that changed from the base of the PR and between ca93adc and a6b669e.

📒 Files selected for processing (5)
  • .github/workflows/backport.yaml
  • .github/workflows/pull-requests.yaml
  • .github/workflows/tags.yaml
  • .github/workflows/update-releasenotes.yaml
  • packages/system/flux-shard-operator/Makefile

Comment on lines +142 to +149
# Ephemeral runners lack the flux CLI the installer's image-packages step
# shells out to; install if absent (idempotent).
- name: Set up build toolchain
if: steps.check_release.outputs.release_exists == 'false'
run: |
command -v flux >/dev/null \
|| curl -fsSL https://fluxcd.io/install.sh | sudo bash

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Failed flux install can pass silently. The pipeline lacks set -o pipefail, so if curl -fsSL errors (e.g. 404/5xx on the installer), bash receives empty stdin and exits 0. The step succeeds, but flux is not installed and the failure surfaces later as a cryptic make build error instead of failing fast here.

🛡️ Proposed fix
       - name: Set up build toolchain
         if: steps.check_release.outputs.release_exists == 'false'
         run: |
-          command -v flux >/dev/null \
-            || curl -fsSL https://fluxcd.io/install.sh | sudo bash
+          set -euo pipefail
+          command -v flux >/dev/null \
+            || curl -fsSL https://fluxcd.io/install.sh | sudo bash

Separately, curl … | sudo bash pulls an unpinned installer at build time; if reproducibility/supply-chain hardening matters for release builds, consider pinning a flux version or vendoring the installer.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# Ephemeral runners lack the flux CLI the installer's image-packages step
# shells out to; install if absent (idempotent).
- name: Set up build toolchain
if: steps.check_release.outputs.release_exists == 'false'
run: |
command -v flux >/dev/null \
|| curl -fsSL https://fluxcd.io/install.sh | sudo bash
# Ephemeral runners lack the flux CLI the installer's image-packages step
# shells out to; install if absent (idempotent).
- name: Set up build toolchain
if: steps.check_release.outputs.release_exists == 'false'
run: |
set -euo pipefail
command -v flux >/dev/null \
|| curl -fsSL https://fluxcd.io/install.sh | sudo bash
🤖 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/tags.yaml around lines 142 - 149, The “Set up build
toolchain” step can silently succeed when the flux installer download fails
because the piped command in the workflow does not fail fast. Update the shell
invocation in this step to enable pipe failure handling so errors from curl
propagate and the job stops immediately, and keep the existing idempotent flux
check intact. If you touch this block, reference the “Set up build toolchain”
step and the command-v- flux / curl | sudo bash logic to ensure the fix is
applied in the right place.

@myasnikovdaniil
myasnikovdaniil enabled auto-merge July 9, 2026 20:16
@myasnikovdaniil
myasnikovdaniil merged commit 06b17bf into main Jul 9, 2026
45 checks passed
@myasnikovdaniil
myasnikovdaniil deleted the ci/decommission-self-hosted-runner branch July 9, 2026 20:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/build Issues or PRs related to image build infrastructure, multi-arch support area/ci Issues or PRs related to CI workflows, GitHub Actions, automation area/release Issues or PRs related to release tooling (changelog, backport, release pipeline) area/uncategorized PR auto-labeler could not map title scope to a known area/*; please review kind/cleanup Categorizes issue or PR as related to cleanup of code, process, or technical debt size/M This PR changes 30-99 lines, ignoring generated files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants