AdaCore: Build Software that Matters
I Stock 1409408343
Apr 09, 2026

Escaping the Haystack: CI/CD for Embedded Systems

How fast feedback loops, smart abstraction, and disciplined pipelines change the way embedded software teams work and ship.

Watch the video, or read the summary in the text below:

Most embedded software teams are stuck in a loop they didn't choose: write code, wait for hardware, flash firmware, debug, repeat. Sometimes across weeks. It feels like the cost of doing business in a hardware-dependent world. But it doesn't have to be this way.

The core question worth asking: what would it take for embedded development to feel as fast and confident as modern web development? The answer involves engineering discipline, smart infrastructure, and a deliberate shift in how your team thinks about feedback.

The Haystack Effect Is Costing You More Than You Think

When feedback cycles stretch to weeks, something negative happens. A developer who introduced a subtle bug on Tuesday gets notified the following Friday, by which point they've moved on to three other things. Reconstructing the context is slow, frustrating, and expensive.

This is the haystack effect. The bug exists, but finding it means digging through everything that's happened since it was introduced. The longer the delay, the bigger the haystack.

The fix isn't a faster CI server; it's moving feedback closer to the developer. 

Per-developer feedback loops, where tests run in the engineer's own workspace before anything hits a shared pipeline, prevent errors from compounding into technical debt that takes sprints to unwind.

Let’s face it, a CI report that surfaces a defect three weeks after the commit isn't a safety net. It's a postmortem.

Four Investments That Actually Move the Needle

There's no single lever to pull. Functional CI/CD for embedded systems requires coordinated investment across four areas, and most teams underinvest in at least one of them.

Tooling and infrastructure - Reproducible build environments that every developer on the team can trust, regardless of their local machine setup.

Automation - Git-triggered pipelines that run quality checks without manual intervention. If someone has to remember to kick off the build, it won't get kicked off.

Compute - Cloud or containerized runners that scale with the team. Queued builds that make developers wait are feedback loops in name only.

Software design - Abstraction layers that decouple business logic from hardware-specific code.

That last point is the one most often deprioritized, and the most consequential. By deliberately separating business logic from hardware dependencies, teams can run integration tests on host machines using stubbed hardware. That means a full suite of system-level tests can run in a CI pipeline without a physical device in the loop. For teams managing hardware availability constraints, this is a schedule multiplier.

A Healthy Pipeline Does More Than Build

A well-designed CI/CD pipeline for embedded software isn't just a compilation check. It enforces a layered set of quality gates automatically on every commit:

  • Coding standards enforcement
  • Unit test execution
  • Static code analysis
  • Security analysis

Pipelines should be containerized so developers never have to debug local toolchain configurations while writing software. And someone needs to own the pipeline. Teams that assign dedicated infrastructure ownership, rather than spreading that responsibility across the development team, free their engineers to focus on the product rather than maintaining the build environment.

For teams earlier in the journey, open-source tooling is a legitimate starting point. The fundamentals are achievable before any commercial investment.

Metrics Should Reach the People Doing the Work

Measuring pipeline health matters, but only if the data goes to the right audience. Test coverage, code complexity, and pass/fail trends should be visible to engineers, not confined to a management dashboard. Developers who can see their own metrics are in a position to improve them. Developers who can't are flying blind.

One important note of caution here. Resist the pull to manage teams through proxy metrics like lines of code or commit count. When you optimize for the metric, behavior shifts to match, but the underlying quality doesn't. The goal is software that works, not numbers that look like it does!

The Litmus Test: How Long Does It Take a New Hire to Ship?

Here's a benchmark worth applying to your own team: how long does it take a new engineer to make a trivial code change and get it merged?

  • Under one hour: your process is working.
  • Half a day: acceptable, but worth examining.
  • Longer than that: your onboarding and your pipeline both need attention.

This single question cuts through complexity. It exercises the entire development experience at once: environment setup, toolchain clarity, review workflows, and pipeline speed. A new developer who can contribute something small on day one is a reliable signal that the underlying system is healthy.

If you can't answer this question confidently, that's worth raising before your next planning cycle.

Author

Mark Hermeling

Headshot
Head of Technical Marketing, AdaCore

Mark has over 25 years’ experience in software development tools for high-integrity, secure, embedded and real-time systems across automotive, aerospace, defence and industrial domains. As Head of Technical Marketing at AdaCore, he links technical capabilities to business value and is a regular author and speaker on on topics ranging from the software development lifecycle, DevSecOps to formal methods and software verification.

Blog_

Latest Blog Posts