This month in Radicle CI, 2026-01

This is a monthly newsletter about the current state of Radicle CI, what has happened recently, and near future plans.

Current status

Radicle CI is in production use. There are several CI nodes, and Lars runs a public one for open source Rust projects at https://callisto.liw.fi/.

After the Ambient release in December, the Ambient adapter for Radicle CI needs a release to allow the new actions to work. CI plans that don't use the new actions work fine.

Links

Office hours

  • Lars holds a weekly office hour for Radicle CI. Alternating weeks at 08 or 17 UTC at https://meet.ffmuc.net/radicleciofficehour (it's Jitsi and you only need a web browser and mic). Each office hour is announce on #radicle-ci on the Radicle Zulip, and on Lars' fediverse account. The office hour is a place where anyone can show up and ask questions about Radicle CI or Radicle or anything related to them. Sometimes Lars or someone else will have a demo or a short talk.

    The next ones are January 23 at 17:00 UTC, and January 30 and 08:00 UTC.

The past month

The end of year holidays happened, and fairly little has happened in Radicle CI development over the past month.

Radicle CI broker version 0.24.0 on 2025-12-09

From NEWS.md:

  • The way cib looks up job COBs for specific commits has been optimized to use a cache. This speeds things up a lot in some circumstances: in one benchmark, creating 100 new runs for a commit went down from 600 seconds to 40.

  • The log messages for a CI run, at the INFO level, are now easier to follow without being familiar with the code base. Especially the decision on whether an event filter should trigger CI to run is logged as one message and contains the whole decision tree as JSON.

  • When it loads the configuration file, cib now checks that a default adapter is set, if the filters field is used. Previously a missing default adapter was only noticed later when starting a CI run. The new behavior exposes problems much earlier.

Ambient CI version 0.11.0 on 2025-12-20

From NEWS.md:

Breaking changes

  • The Rust Cargo related actions now use the cargo-target subdirectory in the workspace cache directory (/ci/cache/cargo-target). This is invisible to all common uses of Rust in Ambient projects, but allows dividing the cache between different kinds of use in the future. This does mean that existing caches become obsolete and should be deleted. That makes this technically a breaking change.

  • Ambient now checks for common problems when it loads the projects file. This is know as "the linter". Currently it checks that an rsync target has been configured if an rsync or rsync2 action is used, that each file downloaded by a http_get action has a unique filename, and that all shell script snippets in shell actions are OK according to the shellcheck program.

    Linting can be prevented by setting lint to false in the configuration. This may be necessary if, say, one of the checks is wrong.

    This is a breaking change because most shell script snippets will be found wanting.

  • The pre- and post-plan now only allow actions that are actually meant for them. Previously both allowed the same set of actions. However, actions like cargo_fetch don't really make sense for post-plan. Now the separation is more strict.

    This is technically a breaking change, but hopefully doesn't actually break anything for anyone. If you have a legitimate use for a pre- or post-plan action that is now not allowed, let us know.

Problems fixed

  • Some portability fixes for NixOS by invoking the Bash shell by name instead of path. NixOS does not put Bash at /bin/bash, so using a full path doesn't work reliably. Using the name should work anywhere.

  • Ambient now checks, when loading the projects file, that the source location for a project is a directory (following symlinks) and gives an error if it is not. This means the problem is found when Ambient starts and not much later when it starts running CI for a specific project. If there are many projects, that might be hours later.

New features added

  • The workspace in the VM is now /ci. The old name /workspace will work indefinitely. The new name is shorter and arguably clearer. The workspace is set up by ambient-execute-plan and so this change does not affect any VM images.

  • There is now a user guide for Ambient, published by CI at https://doc.liw.fi/ambient-ci/userguide.html and included in the deb package at /usr/share/doc/ambient-ci/userguide.html. The user guide contains a description of each action that a project CI plan can use. The guide is woefully lacking, but it's easier to add things to something that exists than starting from an empty directory.

  • The Ambient subplot document is formatted and published at https://doc.liw.fi/ambient-ci/ambient.html. It may be useful for checking how a specific aspect of Ambient is used. The subplot is the test suite that verifies most aspects. That means it's continually run and does not easily get out of date.

  • New action setenv allows setting environment variables for later actions. Using the shell action does not work for this, because each shell forgets any changes to its environment variables when it terminates.

  - action: setenv
    set:
      foo: bar
  • New plan action deb2 and post-plan actions dput2 and rsync2 use subdirectories debian and rsync in the artifacts directory. This means if a project both builds documentation and a deb package, they don't get mixed into the same directory. Instead, documentation goes into /ci/artifacts/rsync and the package into /ci/artifacts/debian.

    The old actions deb, dput, and rsync continue to work as before and use the whole artifacts directory. The new actions were added to avoid changing the existing actions in an incompatible, breaking way. The old actions are not deprecated.

    The runnable plan versions of the old actions have changed. The plan and post-plan actions result in the same runnable plan action. Changes to runnable actions are not currently considered breaking changes in Ambient.

  • In the VM, the git command is now configured by default to have "Ambient CI" as the name for the user and "ambient@example.com" as the email address. This removes the need for each project to do that in their CI plan just to use git.

  • New subcommand ambient state lists the projects in the Ambient state directory (configuration field state) and the sizes of the files and subdirectories they contain. The output looks like this:

  {
    "projects": {
      "dummy": {
        "latest_commit": "09d6a5d81a5001bf210df2bf80e871e3731f6e9f",
        "run_log": 21370,
        "dependencies": 472923464,
        "cache": 2074946410,
        "artifacts": 4096
      },
    },
    "project_count": 6
  }
  • The ambient qemu subcommand has been added to execute a runnable plan in a virtual machine, with or without networking. This is primarily a utility command to help develop Ambient by making it easier to experiment.

  • The configuration file now allows enabling UEFI use for an image. The run and qemu subcommands additionally have a --uefi option for that.

  • The ambient qemu --persist options allows creating a variant of an image. This can be used, for example, to change a generic cloud image from Debian or Arch Linux to boot fast even if the VM has no network access. Together with the optional UEFI support this paves way for using generic images instead of custom images for Ambient. That, in turn, should enable Ambient users to run CI under other operationg systems in the VM. However, Ambient needs further changes to make this convenient.

  • Ambient now gives an error message if a virtual drives is too big. The virtual drives are created before the virtual machine starts. Previously, there was no helpful error message, only an "assert" error that only makes sense to Ambient developers.

  • The exported parts of the Ambient library part now all have documentation. This makes the library usable from other programs, but more importantly, makes it harder for Lars to forget what a type or method is for. Many typo fixes and other changes were made to exported names.

    Note that Ambient is probably not very useful to use as a library. If you use it that way, or would like to, please be in touch and let us know so can try to avoid breaking it for you.

Ambient CI version 0.11.1 on 2016-01-14

From NEWS.md:

Bug fix:

  • Always pass UEFI OVMF firmware file to QEMU, not just when UEFI support is on. The change for optional UEFI support in 0.11.0 broke some uses of Ambient. This change restores functionaliy at least for my own uses.

Future plans

Lars is still getting back up to speed with Radicle CI work and has no concrete plans as yet. Two clear needs are making it easier to set up Radicle CI both on a server and for local use (see rad-ci), and also automate the release process.

New releases of the CI broker, Ambient adapter, and native CI adapter are pending and will happen soon.

The overall goal is to make CI a joy to use with Radicle.

Notes

If you have an open source Rust project and want to try Radicle and Ambient on callisto, see https://callisto.liw.fi/callisto/ for instructions.

Quotes

No quotes yet, but please suggest something for the next issue.