Releasing the CPM Lab
All CPM Lab repositories are released together with one version number, e.g. 0.4.0, by the release pipeline of
the lab workspace ros2-workspace-lab. Nothing has to be merged or tagged by hand.
What a Release Covers
Repository |
Released as |
|---|---|
Components (the submodules of the lab workspace) |
Tag and GitLab release with the changelog entries of their packages |
|
Tag; its tag pipeline builds the extensions, uploads the |
|
Submodules pointed to the released components, tag and GitLab release with its changelog entry |
|
Submodules pointed to the released components and tag; its tag pipeline builds the Debian packages for ROS2
Humble and Jazzy ( |
|
Tag once the apt server serves the new packages; their tag pipelines build and smoke-test the images with the released packages and create the GitLab releases, see Docker Images |
Every repository goes through the same steps: the merge request dev → main is merged, main is checked to
have exactly the files of the merged dev commit, and that dev commit is tagged. The tag is therefore reachable
from dev and main.
Before a Release
While developing, add every change to a Forthcoming section at the top of the CHANGELOG.rst of the package
you changed, and to the Forthcoming section of the CHANGELOG.rst of the lab workspace (and of the vehicle
workspace if you changed it):
Forthcoming
-----------
* Add the lane change maneuver to the example planner
0.3.0 (2026-10-02)
------------------
* ...
The release renames Forthcoming to <version> (<date>) and sets the version of every package.xml.
Packages without changes since the last release get the entry * No changes. A package that changed but has no
Forthcoming section stops the release.
The Lichtblick extensions are versioned separately: set the version of every extension to the release version before
the release, e.g. for 0.4.0 in the lichtblick repository:
for d in extensions/*/; do (cd "$d" && npm version 0.4.0 --no-git-tag-version); done
The release does not check this; a wrong version only fails the check-extension-versions job of the Lichtblick tag
pipeline, after the tag exists.
Lichtblick Release and File Names
What |
Format |
Example |
|---|---|---|
Release tag |
|
|
Extension |
the release version |
|
Extension |
|
|
Extension |
lower case with underscores; new extensions start with |
|
|
|
|
Package registry |
|
|
The GitLab release of lichtblick links the .foxe files of the package registry. After the release, copy them
into assets/ of the documentation, see Maintaining the Documentation.
Releasing
Make sure all changes are merged into
devin every repository and thedevpipelines are green. The pipelines of desktop and simulation may fail if they need packages of the new release; they are rerun after the packages are published.In GitLab, open the lab workspace
ros2-workspace-lab, Build → Pipelines → Run pipeline ondev.Set
RELEASE_VERSION(e.g.0.4.0) andDRY_RUNtotrueand run the pipeline. Thereleasejob only checks every repository and lists what it would do, or all problems that block the release.Fix the problems, then run the pipeline again with
DRY_RUNset tofalse.
The release job then:
Checks every repository:
devpipeline green, merge requestdev→mainmergeable,mainhas no changes thatdevlacks, changelogs complete, and every submodule of the vehicle workspace is a component of the lab workspace. If anything is wrong, it lists all problems and changes nothing.Finalizes the changelogs and
package.xmlversions ondev.Merges and tags the components and
lichtblick.Points the submodules of the vehicle workspace and the lab workspace to the released component commits, then merges and tags both. It waits for the
devpipeline of the lab workspace, which builds all packages, so the job can take a while.
The tag pipeline of the lab workspace builds and publishes the Debian packages. When the apt server serves them, its
wait_for_apt and release_images jobs merge and tag desktop and simulation.
If a step fails, fix the reported problem and run the pipeline again, or retry the failed job. Finished steps are skipped, and tags are never moved.
Tip
A common blocker is a change on main that dev does not have, e.g. a hotfix. Merge main into dev
first, then start the release again.
Setup
The release needs the masked, protected CI/CD variable RELEASE_TOKEN in the lab workspace: a group access token
of CPM/Project/Lab with the Maintainer role and the api scope. In every released repository, dev and the
version tags (*.*.*) must be protected, Maintainers must be allowed to push to dev and merge into main, the
merge method must be Merge commit, and merge requests into main must not require approvals.
The release job is defined in .gitlab-ci.yml of the lab workspace and runs ci/release.py; its tests are in
ci/test_release.py. The documentation is not part of the release; update it afterwards, see
Maintaining the Documentation.