Understanding Continuous Integration
Continuous integration and continuous deployment (CI/CD) enable the automation of building, testing, and releasing software. This approach streamlines collaboration between development and operations teams. CI/CD reduces large points of failure by providing immediate feedback on errors or bugs in an update cycle that can be made more efficient and reliable through being smaller and more frequent. Since the 1990s, CI has become a fundamental practice for devops, with CD following suit in the 2010s. At Codethink, we have a storied history of integrating CI/CD into our software development cycle, being early and prominent advocates of its use in the automotive industry. Our latest approach uses a self-hosted GitLab namespace, maintaining our open source ethos and enabling scalability.
Available Tooling for CI/CD
Tooling including Zuul, Jenkins, and GitLab CI offer framework support in the CI/CD process but each have benefits and drawbacks, which must be carefully considered when used for developing software. There is no perfect CI tool out there that will solve the problem for every use case. Often, modifications are required in the tooling to tailor and adapt the process for your project. This can result in unmanageable maintenance costs in the development cycle, which creates frustration, delays, and unwieldy dependency management.
GitLab CI makes local debugging difficult and does not offer a way to test jobs pre-merging. GitLab attempts to be an all-in-one tool and the successive feature creep increasingly makes it harder to manage.
Jenkins CI runs on a system of plugins, which too often are abandonware, increasing security risk and requiring a lot of overhead and dependency mitigation if an upgrade is required. The maintenance and hosting cost can become unreasonable when scaling a project.
Zuul CI still has a smaller uptake. While it is powerful and open source, which provides great project management flexibility, there are limited resources and documentations for its integration into a development workflow at this stage.
REAPI and CI
Remote Execution Application Programming Interface (REAPI) is an open and standardised gRPC-based protocol that enables build tools to offload actions onto remote servers for more efficient execution. REAPI operates on a client-server model where tasks are serialised by the build tool before being executed remotely, returning the output. Caching is added to this process in order to avoid delays from the duplication of task runs.
It has been used as a component part of CI/CD to make reproducible builds faster at scale with tools like Buildstream and Bazel. However, these benefits could be applied further to CI by incorporating REAPI in the CI system itself, rather than just within individual jobs.
By combining REAPI with integration tooling, remote caching could be shared and would produce a near instantaneous result on a job output after it has been run once if the input is exactly the same.
This would improve the efficiency of the integration process.
A common pain point with many existing CI systems is the inability to run jobs outside of the CI workflow. If the CI system is an REAPI client, we can develop a way to submit the same jobs to the REAPI server from outside of the CI itself. This local-first design improves the feedback loop when developing new CI jobs, as well as giving full confidence that a CI job will pass after pushing.
Using REAPI caching within a CI job allows reuse of old results of the same job for a given set of inputs. However, by using REAPI caching as part of the CI system itself we can also cache the job's environment construction, saving time spent fetching the git repository and dependencies.
This combination provides the opportunity for instantaneous CI.
The performance of our CI system's cache could be enhanced with speculative execution of CI jobs across multiple MRs, essentially pre-testing the potential merges to provide instantaneous CI when the target branch of an MR is updated.
Developing Cicada
Advancing from the theoretical application and implications of this variety of CI tooling, Cicada was built as a prototype.
Cicada jobs and pipelines are declared in YAML, then modeled as REAPI Actions to provide caching and offload job scheduling to REAPI server tooling. By using remote execution, the cache can be safely shared between locally invoked runs of Cicada jobs and jobs invoked during a CI run, making the actual CI run provide an almost instantaneous result.
You can read more about the development of Cicada on this blog post. There are real-world applications of this tool, notes on how this could work with Rust, and a list of ideas for future development.
Other Content
- Assessing the reproducibility workflow in freedesktop-sdk
- Deep Dive into Upstream RISC-V Boot Chain
- Porting an Automotive Operating System to RISC-V
- Understanding Codethink's IEC 61508 Mapping for the Eclipse Trustable Software Framework
- Resisting Hyrum's Law with Private Constructors in Python
- FOSDEM 2026
- Building on STPA: How TSF and RAFIA can uncover misbehaviours in complex software integration
- Adding big‑endian support to CVA6 RISC‑V FPGA processor
- Bringing up a new distro for the CVA6 RISC‑V FPGA processor
- Externally verifying Linux deadline scheduling with reproducible embedded Rust
- Engineering Trust: Formulating Continuous Compliance for Open Source
- Why Renting Software Is a Dangerous Game
- Linux vs. QNX in Safety-Critical Systems: A Pragmatic View
- Is Rust ready for safety related applications?
- The open projects rethinking safety culture
- RISC-V Summit Europe 2025: What to Expect from Codethink
- Cyber Resilience Act (CRA): What You Need to Know
- Podcast: Embedded Insiders with John Ellis
- To boldly big-endian where no one has big-endianded before
- How Continuous Testing Helps OEMs Navigate UNECE R155/156
- Codethink’s Insights and Highlights from FOSDEM 2025
- CES 2025 Roundup: Codethink's Highlights from Las Vegas
- FOSDEM 2025: What to Expect from Codethink
- Codethink/Arm White Paper: Arm STLs at Runtime on Linux
- Speed Up Embedded Software Testing with QEMU
- Open Source Summit Europe (OSSEU) 2024
- Watch: Real-time Scheduling Fault Simulation
- Improving systemd’s integration testing infrastructure (part 2)
- Meet the Team: Laurence Urhegyi
- A new way to develop on Linux - Part II
- Shaping the future of GNOME: GUADEC 2024
- Developing a cryptographically secure bootloader for RISC-V in Rust
- Meet the Team: Philip Martin
- Improving systemd’s integration testing infrastructure (part 1)
- A new way to develop on Linux
- RISC-V Summit Europe 2024
- Safety Frontier: A Retrospective on ELISA
- Codethink sponsors Outreachy
- The Linux kernel is a CNA - so what?
- GNOME OS + systemd-sysupdate
- Codethink has achieved ISO 9001:2015 accreditation
- Outreachy internship: Improving end-to-end testing for GNOME
- Lessons learnt from building a distributed system in Rust
- FOSDEM 2024
- QAnvas and QAD: Streamlining UI Testing for Embedded Systems
- Outreachy: Supporting the open source community through mentorship programmes
- Using Git LFS and fast-import together
- Testing in a Box: Streamlining Embedded Systems Testing
- SDV Europe: What Codethink has planned
- How do Hardware Security Modules impact the automotive sector? The final blog in a three part discussion
- How do Hardware Security Modules impact the automotive sector? Part two of a three part discussion
- How do Hardware Security Modules impact the automotive sector? Part one of a three part discussion
- Automated Kernel Testing on RISC-V Hardware
- Automated end-to-end testing for Android Automotive on Hardware
- GUADEC 2023
- Full archive