mando-cli ran its first-ever GitLab pipelines today, after the project’s ci_config_path setting was cleared. Windows builds were dropped entirely and a single long-lived release branch flow replaced the previous shape.
For Agents
This is the GitLab pipeline for the mando-cli repo. It is distinct from the GitHub-Actions mirror in mando-cli-github-build-mirror and from the Rust service pipeline in Mando CI-CD.
Why nothing ever ran before
The GitLab project had a non-default ci_config_path pointing at a location with no pipeline definition, so pushes produced no pipelines at all. Clearing it made .gitlab-ci.yml take effect and the first pipelines ran.
Diagnostic
“The
.gitlab-ci.ymlis committed but no pipeline is created and no error is shown” almost always means a stale project-levelci_config_path(Settings → CI/CD → General pipelines), not a syntax problem.
Windows builds removed
Windows build jobs were removed entirely from mando-cli. (Compare Mando CI-CD, where the mando service still keeps container.win.*.Dockerfile variants and a PyMando Win Dev job.)
Single long-lived release branch flow
One long-lived release branch, with a clean split of responsibility:
| Branch | Does |
|---|---|
release | mints the tag, creates the GitLab release, and moves the latest pointer |
main | builds and publishes versioned packages only — no tag, no release, no latest |
So main is continuously publishing versioned artifacts, and promotion to “the release” is a single merge into release.
First release status — SHIPPED
v0.4.0 released (2026-08-05 evening)
Tag
v0.4.0+2734905610, full pipeline green end to end: Version → musl builds → Publish +latest→ Release. The MR !5 approval block below is resolved.
Historical: author cannot self-approve here
A group-level approval rule applies, and the author cannot satisfy it from the CLI — the approval has to come from another group member through the UI. No CI change unblocks this; it needs a human approver.
Two reusable GitLab CI gotchas from the Release job
The Release job failed once before the green run. Both causes generalize well beyond mando-cli.
dependencies: silently overrides needs: for artifact download
The Version job broadcasts PACKAGE_VERSION via artifacts: reports: dotenv. The Release job had both a needs: list and a dependencies: list. dependencies: wins for artifact fetching, so the Version job’s dotenv never arrived and the job ran with an empty tag=.
Rule
If a job declares
dependencies:, that list — notneeds:— decides which artifacts (including dotenv reports) are downloaded. Either omitdependencies:entirely and letneeds:do both jobs, or make suredependencies:names every artifact-producing upstream job. A dotenv var arriving empty with no error is the signature.
This is the same dotenv-broadcast pattern documented in bess-os-ci-components (python-setup exporting PROJECT_VERSION to downstream jobs) — the pattern works only when the download list is right.
Markdown backticks in release descriptions get shell-evaluated
release-cli runs inside a busybox wrapper, so backticks in a release description are treated as command substitution by the shell before release-cli ever sees them.
Rule
Keep GitLab release notes plain text — no backticks, no shell metacharacters. Code formatting in a release description is not worth the substitution hazard.
Related
- mando-cli-github-build-mirror — the GitHub-Actions build pipeline and GitLab Package Registry publishing this replaces/complements.
- Mando CI-CD — the mando service pipeline (still Windows-carrying, hand-rolled).
- bess-os-ci-components — the shared component library the Python-side repos consume; mando-cli does not.
- mando-e2e-rebase-2026-08-05 — same-day mando-side rebase work.
- mando-repos-history-rewrite-2026-08-05 — the attribution-free rewrite of
main/release/4 tags that this release was cut from. - mando-cli-e2e-live-green-2026-08-05 — same-day E2E green run and MR !6.
- bess-os-ci-components — the dotenv-broadcast pattern the Release job’s
dependencies:bug broke. - mando-cli — tool overview.