Commit Graph
50 Commits
Author SHA1 Message Date
kevinveenbirkenbachandClaude Opus 5.5 b055eece05 feat(ci): keep GitHub-hosted runner labels current through the updater
The workflows pin `runs-on: ubuntu-NN.NN`, so no job moves to a new Ubuntu
release behind our back, but nothing raised the pin either. A sixth job of
`🔄 Update versions` closes that: `utils/update/runner.py` reads the image
table of actions/runner-images, takes the newest x64 Ubuntu label whose
image carries no preview or beta badge, and raises every older bare
`runs-on: ubuntu-NN.NN` to it; arch-suffixed labels stay untouched. The job
opens the change as one PR over `.github/workflows`, so its CI run tests
the new image before it reaches main.

This commit carries the updater's first result: every job now runs on
ubuntu-26.04 (49 `runs-on`).

actionlint 1.7.12, the newest release, does not know `ubuntu-26.04` yet
(rhysd/actionlint#682, fix proposed in rhysd/actionlint#743), so
`.github/actionlint.yaml` declares the label until a release knows it.

act maps each `ubuntu-NN.NN` label the workflows use to the local platform
image, derived from `.github/workflows`, instead of a fixed list that did
not know ubuntu-26.04.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-19 16:56:52 +02:00
kevinveenbirkenbachandClaude Opus 5.5 52ad8549e0 fix(ci): pin GitHub-hosted runners to ubuntu-24.04
`ubuntu-latest` moved from ubuntu-24.04 to ubuntu-26.04 on its own
schedule, in the middle of run 39166850273, and every job that landed on
the new image met a different OS: sudo-rs instead of sudo, no ip_tables
loaded, and now the NFS probe-write of svc-storage-nfs-client failing on
26.04 swarm nodes. The same branch went red without a code change.

Every `runs-on` now names `ubuntu-24.04`. GitHub still rebuilds that image
weekly, so patches and tool updates keep arriving; only the release jump
becomes a deliberate change of the label. The CodeQL job drops its dead
swift/macos-latest branch, since no swift language is in its matrix. act
already maps ubuntu-24.04 to the local platform image.

A lint rejects any job whose `runs-on` contains a `*-latest` label.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-19 15:57:12 +02:00
kevinveenbirkenbachandClaude Opus 5 bf25eb2fc7 refactor(ci): fetch the diff baseline instead of mirroring main
The sync job force-pushed the source repository's main onto this one so that
`origin/main` would mean "upstream main" for the three consumers that diff
against it. Carrying .github/workflows/** in that push is what GitHub refuses
for an App token, and `workflows` is not a GITHUB_TOKEN permission scope, so the
job needed an app installation that may write workflow files. Run 37169357364
showed the fork has no such secret at all.

Nothing reads the pushed branch. push_ci_policy.sh, affected_roles.sh and
new_roles.sh each fetch `origin main` into their own runner's clone before
reading it, and no caller queries the branch through the API. Pointing those
fetches at the configured source repository gives the same baseline read-only:
no push, no credential, no app permission to widen.

baseline_remote.sh resolves where that baseline comes from and keeps the
normalization and the disabled-value list in one place: `origin` for the source
repository itself, for a disabled sync and for a local clone without
GITHUB_REPOSITORY, and the upstream fetch URL otherwise. The fetches now carry
an explicit `main:refs/remotes/origin/main` refspec, which a URL needs and a
remote name tolerates.

The release guard keeps fetching `origin`: it asks whether a tag commit sits on
this repository's own main, which is a different question from the diff
baseline.

Removed: the sync-main job, its `needs` edge, main_from_repository.sh and the
directory that held it.

test_diff_affected_roles.py copies only the script under test into its fixture,
so it needed the new helper too. It also inherited the full environment, and a
GITHUB_REPOSITORY present in CI would have sent the fixture's baseline fetch to
the real upstream instead of its own bare remote: three of its five cases fail
that way, and the run takes 24s instead of 0.3s because it goes to the network.
The variable is now dropped alongside BASH_ENV.

Verified by running the helper in all four contexts and affected_roles.sh from
an empty refs/remotes/origin/main in a scratch clone as the fork, as the source
repository and locally; each populated the ref and completed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-10-04 05:44:45 +02:00
kevinveenbirkenbachandClaude Opus 5.5 9281a17195 ci(push): let a release push on main supersede the running run and deploy every chunk
A push to main whose head commit starts with "Release version " (the subject pkgmgr writes for every release) now cancels the main run in progress, so the release starts at once instead of queueing behind it. Every other push to main still leaves the running pipeline alone.

When the pushed main commit carries a vX.Y.Z tag, the orchestrator runs with chunk_gate false: every chunk deploys and reports, and a failed chunk still turns the run red, so release-guard and release-version stay skipped.

entry-cancel-superseded.yml mirrors the new rule behind its push guard, parenthesised so && does not bind the release clause; the mirror test composes the expected rule the same way.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-03 19:57:30 +02:00
kevinveenbirkenbachandClaude Opus 5 653dc632e4 refactor(ci): key cancellation on the ref, not a variable
CI_CANCEL_IN_PROGRESS gated whether a new run cancels the one before it, and it had to be remembered per repository: unset upstream meant cancel, set to false meant do not, and a fork inherited neither. Cancellation now follows the ref. Every branch but main supersedes its own runs; main never does, because a half-finished pipeline on the default branch is worse than a queued one.

call-orchestrator.yml compares github.ref rather than github.ref_name: a called workflow inherits the caller's ref, which is refs/pull/<n>/merge for a pull_request caller. The manual entry workflow keeps overriding the rule through force_cancel_in_progress.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-25 16:29:10 +02:00
kevinveenbirkenbachandClaude Opus 5 66bde6af40 feat(ci): spread distro and filesystem per row
A run-wide draw proved one distribution and said nothing about the other four, while reporting green. Both are matrix-row axes now, assigned by the same deterministic rotation mode and tor already use, so one sweep exercises every distribution and every filesystem.

The two read the row's position like an odometer, the distro as the low digit. Turning both on the position directly covers only n of the n x m pairs whenever the pools are the same length, and no sweep unlocks it.

Both are part of a row's identity: glyphs in the job label, columns in the plan table, shards in the artifact name. Both are selectable through %distro and /filesystem, and a retrigger replays the distro off a failed title. It leaves the filesystem out, because a title states the kind the matrix assigned and a deploy may have fallen back from it.

A row's filesystem is a preference unless a human names it, on the run or in a token. Reading the matrix's own narrowing as a demand would fail rows for every transient condition the applying step is built to tolerate.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-20 14:23:29 +02:00
kevinveenbirkenbachandClaude Opus 5 8c5fc6cd22 fix(ci): scope workflow tokens to the jobs that need them
Every write scope sat at workflow level, so it reached each job in the file: entry-push-latest handed contents, packages, actions, security-events and issues write to all eight of its jobs, and call-orchestrator to all twenty-four, including every deploy and test job of the 134-job runs. The scopes now sit on the jobs that push, release or upload SARIF.

call-test-workspace, -install-make and -install-pkgmgr declared actions: write with no consumer at all, while passing the raw GITHUB_TOKEN into containers that start from mutable public tags and mount the docker socket. cron-cleanup-stale gave packages: write over the whole namespace to two jobs running third-party JavaScript that never touch a registry.

Eight single-job workflows are deliberately left alone: their one job needs the scope, so moving it produces an identical effective token while risking a job block that silently replaces contents: read. A check across every uses: edge confirms no callee now declares more than its caller grants.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 12:16:43 +02:00
kevinveenbirkenbachandClaude Opus 5 71888d86af refactor(ci): prefix workflows by trigger
The workflow directory mixed entry points, reusable stages and scheduled jobs into one flat list sorted by topic, so the first question about any file - what starts it - was the one the name did not answer. Every workflow now carries one of three prefixes, derived from its on: block: cron- for a schedule trigger, call- for one only reachable through workflow_call, entry- for everything a repository event or a human starts. Scheduled workflows additionally carry an alarm clock as the first character of their name.

Two lints keep it that way. One derives the expected prefix from the triggers and compares it against the file name; it flagged all 17 offenders before the rename and none after. The other resolves every .github/workflows/<file> string in the repository against the directory, which is what a rename silently breaks in Markdown links, Python constants and shell API URLs alike.

Renaming pulled 69 pre-existing comments into the comment lint's changed-file scope. The vendored CodeQL template got the nocheck marker its scorecard sibling already carried, two workflow headers moved above name: where they count as file headers, and the remaining banners were deleted.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-07 17:05:51 +02:00
kevinveenbirkenbachandClaude Fable 5 65d2aa028e feat(ci): emoji entry names and a symbol-framed manual run title
The three CI entry workflows drop the "⚡ CI:" prefix for one emoji each -
🕹️ Manual, 🔀 Pull Request, 📤 Push - completing the trigger triad by symbol.
The manual run-name loses its prose prefix and separator dots; the segments now
frame themselves: 🕹️ for the dispatch, 🐧 before the distro sweep, ⭐ for the
priority line, 🎯 for a verbatim whitelist, 🔀 for diff derivation.

  before: Manual CI triggered: debian arch; web-app-x ⭐; diff-derived (origin/main)
  after:  🕹️ 🐧 debian arch ⭐ web-app-x 🔀 diff (origin/main)

Dropping the dots removes the fixed literal after inputs.distros that
utils/github/run_name.py cut the distro list at - the list is itself
space-separated, and the next segment starts with a branch-dependent emoji.
value_from_title therefore derives the terminator dynamically when the framing
literal is whitespace-only: _openings_after collects what any later template
segment can render first (the leading literal of each quoted string in later
expressions, format placeholders stripped, plus later inter-expression
literals) and cuts at the earliest occurrence. The SPOT property holds: the
openings are read from the workflow's own run-name, so a future emoji change
flows into the parser without touching it.

Titles from before this change no longer match the template and yield '' - the
documented unknown-title behaviour, so a retrigger of a pre-rename run falls
back to the workflow's distro default instead of guessing.

The dispatch CLI is unaffected (it targets entry-manual.yml by file name), job
names and the orchestrator are untouched, and no workflow_run trigger
references the old names. Required status checks configured against the old
workflow names in repository settings are the one surface this repo cannot
see - re-check them after the rename lands.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-04 13:27:34 +02:00
kevinveenbirkenbachandClaude Opus 4.8 8b58b67121 feat(ci): open or append a per-role issue when a role deploy fails on main
On a main run, report-main-failures parses the failed deploy jobs, downloads
each role's rescue-diagnostics artifact, and opens a 'CI failure: <role>' issue
(label ci-failure) carrying the run link, the artifact names, and the decisive
rescue excerpt inline. An existing open issue for the role gets a comment
instead. Mode emojis are resolved through the symbol glossary, not hardcoded.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 20:01:32 +02:00
kevinveenbirkenbachandClaude Opus 4.8 6b71d3e8bb feat(ci): deploy branch-new roles first on the push priority line
A push resolves the application roles that exist under roles/ locally but
not at origin/main and passes them as the orchestrator priority line, so
brand-new roles deploy and gate ahead of the regular matrix. The resolver
is stdlib-only (git ls-tree plus an application_id line scan) so it runs
on a bare runner without installing the resolver stack, and yields an
empty set when the baseline ref cannot be resolved.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 20:01:32 +02:00
kevinveenbirkenbach 831dee3942 Merge branch 'main' into feature/swarm-nfs
# Conflicts:
#	.github/workflows/cleanup-stale.yml
#	.github/workflows/delete-branch.yml
#	.github/workflows/entry-pull-request-cancel.yml
#	.github/workflows/entry-pull-request-change.yml
#	.github/workflows/entry-push-latest.yml
#	.github/workflows/images-build-ci.yml
#	.github/workflows/images-mirror-all.yml
#	.github/workflows/images-mirror-cleanup.yml
#	.github/workflows/images-mirror-missing.yml
#	.github/workflows/lint-ansible.yml
#	.github/workflows/lint-docker.yml
#	.github/workflows/lint-javascript.yml
#	.github/workflows/lint-makefile.yml
#	.github/workflows/lint-markdown.yml
#	.github/workflows/lint-packages.yml
#	.github/workflows/lint-playwright.yml
#	.github/workflows/lint-python.yml
#	.github/workflows/lint-shell.yml
#	.github/workflows/release-highest.yml
#	.github/workflows/release-version.yml
#	.github/workflows/security-codeql.yml
#	.github/workflows/security-scorecard.yml
#	.github/workflows/test-code-external.yml
#	.github/workflows/test-code-integration.yml
#	.github/workflows/test-code-lint.yml
#	.github/workflows/test-code-unit.yml
#	.github/workflows/test-deploy-local.yml
#	.github/workflows/test-deploy-universal.yml
#	.github/workflows/test-deploy-workstation.yml
#	.github/workflows/test-dns.yml
#	.github/workflows/test-environment.yml
#	.github/workflows/test-install-make.yml
#	.github/workflows/test-install-pkgmgr.yml
#	.github/workflows/update.yml
2026-07-09 17:39:12 +02:00
dependabot[bot] bdd920fd85 chore(deps): bump actions/checkout from 4.2.2 to 7.0.0
Bumps [actions/checkout](https://github.com/actions/checkout) from 4.2.2 to 7.0.0.
- [Release notes](https://github.com/actions/checkout/releases)
- [Commits](https://github.com/actions/checkout/compare/v4.2.2...v7)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-09 02:07:38 +00:00
kevinveenbirkenbachandClaude Opus 4.8 cddb0dc59b feat(lint): require emoji-prefixed task/step/job names + convert existing
Add tests/lint/repository/test_name_emoji_and_length.py: every Ansible task
name and GitHub Actions workflow/job/step name must start with an emoji (first
char not 0-9/A-Za-z) and be <= 80 chars.

- emit emoji names at the source: cli/build/include generator now writes
  "🔧 setup <app>" / "🚿 flush handlers after <app>" so generated
  tasks/groups/*-roles.yml satisfy the convention too
- convert existing task/step/job/workflow names to emoji-prefixed, choosing a
  task-fitting icon per action (📦 install, ✅ ensure, 🔍 probe, 🥾 bootstrap,
  🚀 deploy, 🧩 service-module load, ⬇️ checkout, 📂 include-routines, ...)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 22:45:06 +02:00
kevinveenbirkenbachandClaude Opus 4.8 f3fcaa8004 feat(ci): sync main from source repository before CI scope discovery
entry-push-latest.yml gains a sync-main job that force-pushes the current repository's main from a source repo (default infinito-nexus/core) before CI policy and deploy discovery derive scope from origin/main. The source is configurable and can be disabled via CI_SYNC_MAIN_SOURCE_REPOSITORY; the same-repository case and disabled values skip the sync.

The sync-main checkout uses fetch-depth: 0 and the push is --force to avoid shallow-update and non-fast-forward rejections. Docs warn that main is force-overwritten and must not be used as a working branch on synced repositories.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 18:32:29 +02:00
dependabot[bot] 95bba0a358 chore(deps): bump actions/checkout from 6 to 7
Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-19 01:25:02 +00:00
kevinveenbirkenbachandClaude Opus 4.7 a561aa76b5 ci(push): skip push CI when an open PR already covers the branch
push_ci_policy.sh now hard-fails on missing GH_TOKEN/GITHUB_REPOSITORY
and, for non-main branches, calls gh pr list to detect whether the
push is already covered by an open pull request. If so, emits
should_run=false (skip_reason=pr-ci-covers-this-push) so the push
workflow exits cleanly and the pull_request workflow handles the
actual CI run.

To absorb the bot's push -> gh-pr-create latency on update/* and
alert-autofix-* branches, the PR check retries up to 10x with 2s
sleeps before falling through to a real CI run. Human branches
(feature/**, hotfix/**, fix/**, chore/**) check once with no delay.

entry-push-latest.yml's run-policy step now forwards GH_TOKEN so the
gh call works against the repo.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 21:06:34 +02:00
kevinveenbirkenbachandClaude Opus 4.7 f9147e4486 refactor(scripts/github): split helpers into responsibility subfolders
Group the shell helpers under scripts/github/ into five subfolders
that match how the workflow files consume them:

  runner/   host-runner hygiene (disk, swap, Docker daemon, diagnostics)
  cancel/   run cancellation on PR-close and branch-delete events
  resolve/  derivation of workflow inputs and outputs from repo state
  update/   scheduled Update: Versions pipeline
  release/  release-time gates

Drop the now-redundant subfolder prefix from each filename, e.g.
dump_runner_state.sh becomes dump_state.sh and cancel_pull_request_runs.sh
becomes pull_request_runs.sh. Each subfolder carries a README that
describes its scope per documentation.md rules; the top-level README
points at the subfolders without inventorying files.

Propagate the new paths through ten workflow files, three docs
(workflow.md, pipeline.md, secrets.md), and two tests. Fix a real
runtime bug in enlarge_swap.sh, which still referenced the
pre-rename dump_runner_state.sh path. Extend the inline-block-size
lint hint to describe the new subfolder convention.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 00:50:26 +02:00
kevinveenbirkenbachandClaude Opus 4.7 f3845323f1 test(lint): cap inline literal script blocks at 12 logical lines + extract offenders
Add tests/lint/repository/test_inline_script_block_size.py: scans
roles/, tasks/, playbooks/ and .github/ YAML for literal block scalars
(`|` / `|-` / `|+`) following the keys `shell`, `command`, `script`,
`raw` (Ansible) and `run` (GitHub Actions). Counts logical lines —
trailing-`\` continuations collapse to one line, blank lines are
ignored — and fails when a block exceeds 12.

FOLDED scalars (`>` / `>-` / `>+`) are exempt: they are one shell
statement after YAML folding, even if they span many source lines for
readability.

The walk goes through `utils.cache.files.iter_project_files(...)` per
`docs/agents/action/testing.md` so the shared project-tree cache is
reused across the lint suite.

The fail message tells the author exactly how to fix: Ansible tasks
get the built-in `script:` module (collapses the task to one line);
GitHub Actions workflows extract into `scripts/github/<name>.sh` and
call it via `run: bash scripts/github/<name>.sh` (or
`_helpers/scripts/github/<name>.sh` when the workflow checks out the
repo into `_helpers/`).

Extract the pre-existing literal-block offenders so the new lint
ships green:

  Ansible (script: module, file under <role>/files/)
    web-app-friendica   sync_addon.sh
    web-app-fider       create_admin_user.sh
    web-app-fider       configure_oidc_provider.sh
    web-app-mediawiki   install_or_update.sh
    web-app-mediawiki   composer_install_extension.sh
    web-app-xwiki       debug_superadmin.sh

  GitHub Actions (scripts/github/)
    pick_distro.sh
    guard_release.sh
    resolve_release_inputs.sh
    disk_pressure_report.sh

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 20:42:44 +02:00
kevinveenbirkenbach 41b48f2385 ci(push): add update branch trigger 2026-04-26 15:42:19 +02:00
kevinveenbirkenbachandClaude Opus 4.7 433a4138dd feat(ci): recognize chore branch prefix
Treat chore/** branches like feature/fix/etc. for CI: trigger the
push pipeline on chore/** pushes and accept chore as a valid PR
branch prefix in full scope. This unblocks the chore/update-* PRs
that update.yml creates automatically, which previously failed
branch-prefix validation and never triggered the push pipeline.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-18 17:11:28 +02:00
kevinveenbirkenbachandClaude Opus 4.7 4f2dd95fe9 feat(ci): add CI_RUN_ON_MAIN gate, reorg actions docs
Add repository variable CI_RUN_ON_MAIN that gates whether pushes to
main trigger CI. When unset (default), pushes to main skip CI;
set to 'true' to enable. Pushes to other branches are unaffected.

Reorganize GitHub Actions docs into a dedicated tools/github/actions/
directory and consolidate every CI repository variable in a single
SPOT (configuration.md). Move actions.md to actions/workflows.md and
branch/configuration.md to actions/configuration.md, then update
every cross-reference. Trim README files to scope-only per
docs/contributing/artefact/files/docs/readme_md.md.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-18 16:31:52 +02:00
kevinveenbirkenbachandClaude Sonnet 4.6 5cebe3ea63 feat(ci): add CI_CANCEL_IN_PROGRESS variable and restructure branch docs
- Use vars.CI_CANCEL_IN_PROGRESS in entry-push-latest.yml so cancellation
  can be disabled per-repo without changing workflow code
- Move docs/contributing/tools/github/branch.md into branch/ subdirectory
  as security.md; add configuration.md for CI repository variables and
  README.md as directory index
- Fix all cross-references in SECURITY.md, pipeline.md, branch.md,
  pull-request.md, workflow.md, and repository.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 22:18:02 +02:00
kevinveenbirkenbachandClaude Sonnet 4.6 ebdb55dfcc ci(push): enable cancel-in-progress for push workflow
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 21:40:09 +02:00
Environment TestandClaude Sonnet 4.6 afd332bb4e feat(ci): trigger orchestrator on alert-autofix-* branches
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 07:41:48 +02:00
Environment TestandClaude Sonnet 4.6 0a147718a4 fix(workflows): quote workflow names to fix YAML syntax error
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 20:12:12 +02:00
Environment TestandClaude Sonnet 4.6 9fd133368d chore(workflows): rename all GitHub Actions workflows with emoji schema
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 20:10:21 +02:00
kevinveenbirkenbachandClaude Sonnet 4.6 2fa58ecd7f fix(ci): set actions: write in all entry and orchestrator workflows
Required so cancel-on-failure jobs in reusable workflows can call
the GitHub API to cancel the run. Permissions propagate down the
workflow_call chain and must be write at every level.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-29 18:07:14 +02:00
kevinveenbirkenbach cfbe1dc3e6 Handle branch-creation CI based on main ancestry 2026-03-21 11:25:24 +01:00
kevinveenbirkenbach edfd891eff chore: rename master references to main 2026-03-17 15:59:23 +01:00
kevinveenbirkenbach 2f74257019 Also test fix branches 2026-02-11 19:19:05 +01:00
kevinveenbirkenbach c6ba2f2e41 ci: skip branch-creation runs and drive release logic by commit tags
- Skip CI on branch creation pushes (github.event.created)
- Detect version tags directly on the commit (v*)
- Expose is_version and version_tag as workflow outputs
- Drive release guard and release jobs by commit tag state instead of tag-push events
- Pass resolved version tag explicitly to release workflow

https://chatgpt.com/share/698b0398-4f54-800f-86c4-91260bc2a628
2026-02-10 11:08:13 +01:00
kevinveenbirkenbach 74a036c9f2 ci: checkout repository in pick-distro job to enable tag detection
Ensure the pick-distro job has a git context so `git tag --points-at`
works correctly and no longer fails with "not a git repository".

https://chatgpt.com/share/69898844-3374-800f-8f45-d5d73b847326
2026-02-09 08:09:51 +01:00
kevinveenbirkenbach 53cd0fc4b4 ci: run full distro matrix when pushed commit has version tag
Detect v* tags pointing at GITHUB_SHA instead of relying on tag push events.
This ensures that branch pushes with a version-tagged commit trigger all distros,
while regular commits still run on a single randomly selected distro.

https://chatgpt.com/share/69890da6-da90-800f-916c-b788eadaf6a1
2026-02-08 23:26:41 +01:00
kevinveenbirkenbach 8db2cab9a1 ci: restrict push workflow to main, master, feature/* and hotfix/*
https://chatgpt.com/share/6988ceca-008c-800f-a329-66cf49d69d7d
2026-02-08 18:58:18 +01:00
kevinveenbirkenbach 2b10766886 Remove tag trigger from push workflow
Drop the v* tag trigger so the CI pipeline runs only on branch pushes.
This prevents duplicate workflow executions when pushing a branch and
a version tag together and aligns the workflow with the new release
process where tags are detected on HEAD during the branch push.

https://chatgpt.com/share/6988bef0-1a0c-800f-93df-7a6c1bdc0331
2026-02-08 17:56:13 +01:00
kevinveenbirkenbach 7808e6297c Optimized names 2026-02-08 12:02:45 +01:00
kevinveenbirkenbach 9cce47d1ca Normalize GitHub Actions job names
- Add explicit job names where missing
- Standardize all job titles to Emoji + imperative + object format
- Improve CI readability and consistency across workflows
- No functional changes to job logic or execution order

https://chatgpt.com/share/6988695a-be4c-800f-85ba-5e67e5fef3e0
2026-02-08 11:45:42 +01:00
kevinveenbirkenbach 24e504982d Optimized name 2026-02-08 11:16:55 +01:00
kevinveenbirkenbach 17ebdb62dd ci: allow release workflow to request required permissions
- grant contents:write and actions:read in entry workflow
- fix startup failure when calling release-version.yml

https://chatgpt.com/share/6988607b-3330-800f-9d3b-4fc06fab5d56
2026-02-08 11:14:51 +01:00
kevinveenbirkenbach 2d1f1d94e5 ci: simplify image build and tag version releases correctly
- Build a single CI image per distro (remove slim/full variants)
- Retag CI images to version/latest without rebuild
- Trigger version releases only for v* tags on master
- Remove redundant image existence/rebuild logic
- Align promote-stable and retag scripts with single-image flow

https://chatgpt.com/share/6988607b-3330-800f-9d3b-4fc06fab5d56
2026-02-08 11:07:37 +01:00
kevinveenbirkenbach 36a5b2e8b1 ci: select all distros on version tags, random one on branches
- Change pick-distro job to output space-separated distros list
- Run CI on all supported distros for semantic version tags (vX.Y.Z)
- Keep random single-distro execution for branch pushes
- Rename output from `distro` to `distros` for clarity and consistency

https://chatgpt.com/share/69885691-fac0-800f-9399-71e62145e4f5
2026-02-08 10:25:29 +01:00
kevinveenbirkenbach f188fac7bf ci: replace distro shuffle with single random distro selection
- select exactly one random distro per push
- pass single distro to ci-orchestrator
- add clear CI job names with emojis

https://chatgpt.com/share/69823c91-fccc-800f-ae3e-ad50a85f3fe5
2026-02-03 19:37:32 +01:00
kevinveenbirkenbach 308326ae75 ci(push): shuffle distro order for push pipeline
- Add a shuffle-distros job to randomize distro execution order
- Pass shuffled distros to ci-orchestrator instead of hardcoded arch
- Improve load distribution across arch, debian, ubuntu, fedora, centos
- Keep concurrency semantics unchanged

https://chatgpt.com/share/69820309-ac04-800f-b4ae-d2eba93c956d
2026-02-03 15:15:24 +01:00
kevinveenbirkenbach 7092caf7fb ci(concurrency): isolate CI concurrency per repo and branch
Previously all CI entry workflows shared a single global
concurrency group, blocking parallel runs across branches.
This scopes concurrency to repository + branch.

https://chatgpt.com/share/6981bad4-e1cc-800f-bef9-15f10ff6f7e5
2026-02-03 10:07:15 +01:00
kevinveenbirkenbach 26cde20899 Test DNS for all distros 2026-01-16 14:38:22 +01:00
kevinveenbirkenbach 22bd1e37f9 ci: add per-ref concurrency to CI workflows and simplify push trigger
Configure build-ci-images and code-analyses to use per-ref concurrency groups
to avoid global serialization while still preventing duplicate runs per ref.

Also remove redundant tag ignore rules from the push workflow.

https://chatgpt.com/share/69691ebf-a380-800f-80fc-bd44d59e90dd
2026-01-15 18:17:42 +01:00
kevinveenbirkenbach 40f039551f ci: default distro matrix in code-analyses and keep push fast on arch
- Set default distros for workflow_call in code-analyses
- Remove redundant distro overrides from PR and nightly entries
- Require distros input in build-ci-images and rely on orchestrator default

https://chatgpt.com/share/696909c1-781c-800f-b52d-d9f967e9698c
2026-01-15 16:45:54 +01:00
kevinveenbirkenbach 42a7f529d1 ci: make distros configurable per entry workflow and enforce via workflow_call
- Add `distros` input to code-analyses orchestrator and forward it to build and deploy workflows
- Enforce distros via required workflow_call inputs in test-deploy-* workflows
- Restrict push and pull-request entries to arch only
- Run nightly workflows on full distro matrix
- Align nightly release cron to 00:00 UTC
2026-01-15 16:33:46 +01:00
kevinveenbirkenbach 7332cdf4fc ci(workflows): split release logic and add nightly release check
- Rename CI entry workflows to "entry-*" (push, PR, nightly)
- Replace monolithic ci-version workflow with reusable release-version workflow
- Add entry-push-version wrapper (tag push + manual dispatch)
- Add nightly job that triggers release workflow for missing version images
- Enable GHCR login for manifest-based existence checks

https://chatgpt.com/share/6967cff2-1584-800f-a2d3-1ef7a824f62f
2026-01-14 19:48:36 +01:00