Skip to content

CI portable runner and release topology

Executable owner: blueflyio/gitlab_components (base-runner, minimal-ci / BRANCH_TOPOLOGY_GUARD, related shared components). This rule: estate law for consumers. Do not re-implement in project YAML.

Portable compute

  1. Include gitlab_components/base-runner (or a shared component that already extends it).
  2. Portable build/test/validate jobs use tags: [$BUILD_RUNNER_TAG] via .base-runner / .portable-runner.
  3. Group CI/CD variable BUILD_RUNNER_TAG is the only portable switch:
  4. NORMAL: saas-linux-small-amd64
  5. OVERFLOW: bluefly-overflow
  6. Forbidden in consumer .gitlab-ci.yml for portable jobs:
  7. hard-coded bluefly-generic
  8. hard-coded saas-linux-small-amd64 / oracle-docker as a “temporary” pin
  9. tags: [] on a local .base that strips the shared runner contract
  10. Deploy-only tags stay on deploy templates (.oracle-deploy-runner, .nas-deploy-runner). Never use them to dodge a dead portable runner.

Proven defect class: consumer pin to offline bluefly-generic stranded required jobs while SaaS (BUILD_RUNNER_TAG) was healthy.

MR / branch topology

Valid development flow:

feature/*  →  release/v0.1.x  →  main

Invalid without an ancestry-recovery merge tip:

feature/* → main
chore/* / fix/* → main
main → release/v0.1.x

Release-cut ancestry (conflicted release → main recovery) must keep a two-parent tip:

  • M^1 already on release/v0.1.x
  • M^2 records main
  • origin/main must not be an ancestor of M^1

A linear commit on top of a good merge fails BRANCH_TOPOLOGY_GUARD (no ^2). Rebuild the tip as a merge; do not weaken the guard globally.

Consumer CI

Consumer pipelines are thin includes of gitlab_components only. Shared failures fix once in gitlab_components. Project-local runner overrides and duplicate job YAML are defects.