The project · CI/CD · Docker · Jenkins · GitHub Actions

Embedded DevOps, Engineered

Your firmware builds on your machine, on your day, with your cable plugged in. The project: build the machine that builds it, a real CI/CD pipeline around the occupancy-sensor product from Course 1 (supplied as a finished snapshot). A pinned Docker toolchain, a Jenkins pipeline that tests, signs and ships every commit, and a hardware-in-the-loop rig where CI touches real silicon. The guided lessons are the vehicle; the pipeline is what you keep.

11 chapters 28 to 33 hours Intermediate Built on the Zigbee course's product
Get the course. US$79 Preview chapter 1

Preview build: the full course is readable here; checkout opens at launch.

A working laptop with a code editor open on the screen
The problem

"Works on my machine" is not a build system

The usual way

  • One senior engineer's laptop is the release process, and it just went on holiday
  • "Which SDK version built this binary?": archaeology, every field failure
  • Tests run when someone remembers; signing happens by hand, at midnight
  • A broken commit is discovered at integration. Weeks after it landed

This course

  • The toolchain is a pinned Docker image. The same bytes build everywhere, provably
  • Every commit is built, tested and gated by a pipeline that lives with the product
  • The pipeline signs what it ships, from a credential store, never a key on a laptop
  • Releases assemble themselves from a git tag, manifest and checksums included
What you build

One product, one pipeline

The pipeline wraps the occupancy sensor from Zigbee, Engineered: the same nRF52840 firmware, the same signed OTA packages. You containerise its toolchain, stand up Jenkins in Docker, grow the pipeline stage by stage (build → test → sign → release), finish with hardware-in-the-loop flashing on a native agent, then translate the whole thing to GitHub Actions and compare the two homes honestly.

The pipeline takes shape

Checkout, containerised build, archived artifacts. (Chapter 5)

new commit found

container removed;
build/ remains in the workspace

any step exits non-zero

Commit pushed to GitHub

Jenkins polls the repo
(every ~2 min — see next section)

Checkout from SCM
ON: the Jenkins agent's workspace
Fetch Jenkinsfile, check out the commit

Stage: Build firmware
INSIDE: a container started from
toolchain:1.0.0-ncs3.4.1
workspace mounted at the same path,
NCS workspace mounted at /ws

west build — pristine, sysbuild,
nrf52840dk/nrf52840
outputs written to $WORKSPACE/build

Stage: Archive
ON: an ordinary agent (agent any)
— no container

Five artifacts copied to the build's
record, each fingerprinted

Build: SUCCESS (green)
artifacts downloadable from
the build's page

Build stage FAILED (red)
Archive stage never runs

Build: FAILURE (red)
no artifacts attached —
evidence lives in the console log

The test pyramid, on a chip

Host tests, gates, and what runs where. (Chapter 6)

HARDWARE-IN-THE-LOOP — Chapter 10
the real DK, the real sensor, a robot flashes and interrogates
FEW tests · minutes each · catches what only silicon can

SIMULATED INTEGRATION
whole subsystems composed on native_sim
SOME tests · seconds each · catches wiring between units

HOST UNIT TESTS — this chapter
one pure module, fed bytes from arrays
MANY tests · milliseconds each · catches logic errors

GATES — this chapter
format check + static analysis: nothing runs at all
EVERY commit · seconds · catches style drift and a class of bugs

CI touches real silicon

The HIL agent: flash, boot, assert over serial. (Chapter 10)

The desk — the rig is furniture, not a laptop accessory

USB — program + reset
(nrfutil device)

USB serial, 115200
(pyserial)

UART — sensor frames

assigns the HIL stage
to label 'hil' only

all earlier stages run elsewhere:
build agents, inside the toolchain image

Rig machine (Linux)
Jenkins agent process, label: hil
1 executor · venv: pytest + pyserial
nrfutil (native, in PATH)

nRF52840 DK
permanently attached by USB
J-Link: flashing path
CDC ACM: serial console /dev/ttyACM0

HLK-LD2410
UART, as wired in Course 1

Jenkins controller
(Docker Compose, Ch 4)

Read chapter 1 free in this preview
Watch it move

Real animations from inside the lessons

A pipeline is a thing that moves. Stages run, gates stop the line, image layers stack. The lessons animate those flows and hand you the controls. These three are the actual chapter animations, untouched: press play, or step through them frame by frame.

Animated diagram

The pipeline flows, and a red stage stops the line

build #7, the first fully green pipelineCheckout✓Build✓Archive✓5 artifacts filedthe Jenkinsfile lives in the repo. The pipeline is code
a broken commit landsCheckout✓Buildrunning…Archivewaitingmain.c:92:2: error: #error Deliberate Chapter 1 failure…
red means stop, nothing ships from a failed stageCheckout✓Build✗ failedArchivewaitingskipped: earlier failurethe pipeline is a referee, not a cheerleader
fix, push, greenCheckout✓Build✓Archive✓red caught it in minutes, at the cheapest moment

Animated diagram

Layers: the stack is the cache

one Dockerfile, five layers: built bottom-upapp sourcechanges every commitwest workspace + moduleschanges rarelyZephyr run-test requirementspinnedNCS toolchain + SDKthe slow layerbase OSpinnedDockerfileFROM baseinstall toolchainrun-test reqswest init + updateCOPY app source
one Dockerfile, five layers: built bottom-upapp sourcechanges every commitwest workspace + moduleschanges rarelyZephyr run-test requirementspinnedNCS toolchain + SDKthe slow layerbase OSpinnedDockerfileFROM baseinstall toolchainrun-test reqswest init + updateCOPY app source
one Dockerfile, five layers: built bottom-upapp sourceCACHE HIT ✓west workspace + modulesCACHE HIT ✓Zephyr run-test requirementsCACHE HIT ✓NCS toolchain + SDKCACHE HIT ✓base OSpinnedDockerfileFROM baseinstall toolchainrun-test reqswest init + updateCOPY app source
one Dockerfile, five layers: built bottom-upapp sourceCACHE HIT ✓west workspace + modulesCACHE HIT ✓Zephyr run-test requirementsCACHE HIT ✓NCS toolchain + SDKCACHE HIT ✓base OSpinnedDockerfileFROM baseinstall toolchainrun-test reqswest init + updateCOPY app source

Animated diagram

Sign in the pipeline; verify like an enemy

the key shows up for work; it does not move inzephyr.binunsigned🔑 credential storemcuboot-product-keyimgtool signheader + signature
signed, then verified, before archive, every timezephyr.signed.binheader 1.3.1+5 · signature in trailerimgtool verify: three ways this can go:
verdict 1 of 3: the honest image✓ Image was correctly validatedarchive proceeds: manifest, artifacts, the lot
verdict 2 of 3: the wrong key✗ No signature found for the given keydifferent failure, different fix: check the credential, not the code
verdict 3 of 3: one byte different✗ Image has an invalid hashtrust, then verify, then archive, in that order, always

Curriculum

Chapter by chapter

Eleven chapters, one growing pipeline. Total: about 28 to 33 hours of building, depending on your pace. Chapter 1 starts with the ideas (what embedded DevOps is, what it buys an embedded team, and why learning it early compounds for a whole career), before any tooling appears.

1

Why embedded CI is different, and the baseline you will automate

What embedded DevOps actually is, what it buys an embedded team, and why learning it early compounds, then the manual baseline: one firmware build, done by hand and measured, that every later chapter automates.

~1½ to 2 h
2

Docker for embedded engineers

Docker from an embedded angle: images, containers, volumes and Compose, with the toolchain treated as a deliverable, not a workstation accident.

~2½ to 3 h
3

The pinned toolchain image, production grade

The pinned toolchain image, production grade: layered, reproducible, and byte-checked against the host build, including the honest +8-byte exception and how it was proven innocent.

~2½ to 3 h
4

Jenkins, standing it up the Docker way

Jenkins stood up the Docker way: a pinned controller, a frozen 70-plugin set, and configuration that survives restarts because it lives in files, not clicks.

~2 to 2½ h
5

Your first declarative pipeline: CI builds the firmware

Your first declarative pipeline: checkout, build inside the image, archive the artifacts, a Jenkinsfile that lives with the product and answers to code review.

~2 to 2½ h
6

The test pyramid on a chip: automated tests and gates

The test pyramid on a chip: refactor the LD2410 parser into a host-testable unit, Twister on native_sim/64, and quality gates that can actually stop a line.

~3½ to 4 h
7

Build matrix, versioning, and artifacts that mean something

Versioning that means something: one git truth stamped into BOTH version knobs, a build matrix, and a manifest that lists every artifact the run produced.

~2½ to 3 h
8

Secrets and signing: the pipeline signs what it ships

Secrets and signing: the product key lives in the credential store, the pipeline signs what it ships, and imgtool verification proves it. Wrong key and corrupt image included.

~3 to 3½ h
9

Release pipelines: tag it and it ships

Release pipelines: tag it and it ships. The bundle assembles itself (signed images, the .zigbee OTA package, manifest, checksums) behind an approval gate.

~2½ to 3 h
10

Hardware-in-the-loop: CI touches real silicon

Hardware-in-the-loop: a native Linux agent with real silicon. Flash, boot, and assert over the serial transcript. CI touches the product itself.

~3½ to 4 h
11

The same pipeline, in GitHub Actions

The same pipeline in GitHub Actions: the Jenkinsfile translated stage for stage, GHCR for the image, and an honest comparison of the two homes.

~2½ to 3 h
What's inside

Everything is a deliverable

  • 11 hands-on labs: every lab run and verified in the course's own build environment before publication, and the build log is quoted in the course. Steps that need physical hardware or a hosted account (the Chapter 10 flash, the Chapter 11 release publish) are written as exact desk procedures in the lessons, labeled as such, for your own desk pass
  • 90 quiz questions with full answer keys: self-check cards, graded as you go
  • 20 diagrams. Pipeline flows, the test pyramid, the HIL rig, the release path
  • A real product repo: the Course 1 firmware, its Jenkinsfile, its tests and its release tooling, growing chapter by chapter
  • Reproducibility, measured: byte-level comparisons of host vs container builds, including the one honest exception and why it happens
  • Stretch exercises. Break the pipeline on purpose, extend it, prove you understood
Embedded DevOps, Engineered
US$79 one-time
  • All 11 chapters, labs, quizzes and diagrams
  • Lifetime access in the online player, nothing to install, read anywhere
  • The full product + pipeline repo layout
  • Email support from the instructor
  • Free updates to the course
Get the course

Placeholder price for this preview build. Secure checkout opens at launch; the refund policy (14 days, no questions) will apply from day one.

Before you start

You do not need Course 1 first: the product repo supplied with this course contains the finished Course 1 firmware snapshot, and the pipeline is built around that snapshot. Course 1 is recommended background; if you built the product yourself there, yours is the same code. You need a machine that runs Docker, and a free GitHub account for Chapter 11. Jenkins, Docker and every other tool in the course is free. The only paid item at launch is your own domain, if you want one.

Owner perks

What owners get

Buying the course is the start, not the whole deal. This is what's included with it, and the headline is a human being on the other end of an email.

Headline perk

Lifetime email support

Pipeline red at midnight, or a gate you don't trust? Email your question about the course to [email protected] and a working engineer answers, within 1 to 2 working days. Support covers questions about the course material and its labs. It is not general consulting, and it does not extend to debugging projects unrelated to the course. For as long as you own the course: no support tiers, no expiry, no ticket bot.

Animated diagrams

The moving parts (stages flowing, gates stopping the line, image layers stacking, a signature being checked), are taught as animations you play, pause and step through.

90 quiz questions, with answer keys

Every chapter ends in a self-check quiz with full answers, so you find the gaps while they're still cheap to fix.

The troubleshooting appendix

When it breaks. The field guide to the failures this build actually produces: symptom, cause, fix. Kept open beside the labs, it earns its place in the first week.

Exercise-by-exercise code

One real product repo (the firmware, its Jenkinsfile, its tests and its release tooling), growing a verified step at a time, chapter by chapter.

Coming soon

More perks on the way

Owning a course here will keep getting better. More owner perks are in the works, and when they land, owners get them, free.

Course FAQ

Before you ask

Do I need Course 1 first?

No. The pipeline is built around the occupancy-sensor product, and a finished snapshot of that firmware is supplied in this course's own repo, so you can start here. Course 1 is recommended background: it explains how the firmware was built. The DevOps concepts themselves are taught from zero.

Which tools, exactly?

Docker and Docker Compose from Chapter 2, Jenkins 2.580.1 LTS (pinned, run in Docker) as the anchor, Twister for tests, imgtool for signing, and GitHub Actions + GHCR for the final translation. Everything is free tooling; no paid CI minutes are required to follow along.

Does the hardware-in-the-loop chapter need the desk kit?

Yes. Chapter 10 flashes a real nRF52840 DK from a Jenkins agent. Everything up to the physical flash is verified in the course's own build log; the flash itself is a desk step with exact expected output, like Course 1's hardware checks.

How long do I have access?

Access doesn't expire. Buy once, build at your pace, come back whenever, including course updates.