GitHub Actions
Nebula Commander uses two GitHub Actions workflows: one to build ncclient binaries (and create releases), and one to build and push Docker images.
Build ncclient Binaries
Workflow file: .github/workflows/build-ncclient-binaries.yml
Triggers
- Version tags – Push a tag matching
v*(e.g.v0.1.5) to build all binaries and create a GitHub Release. This is the only trigger that produces a release; there is no trigger on push tomain. - Pull requests – Runs when changes touch
client/binaries/**,client/windows/**,client/ncclient.py,installer/windows/**, or the workflow file itself. - Manual – Use “Run workflow” in the Actions tab (
workflow_dispatch).
Platforms built
| Platform | Artifact name |
|---|---|
| Linux x86_64 | ncclient-linux-amd64 |
| Linux ARM64 | ncclient-linux-arm64 |
| Windows x86_64 | ncclient-windows-amd64.exe |
| macOS Intel | ncclient-macos-amd64 |
| macOS ARM64 (Apple Silicon) | ncclient-macos-arm64 |
Windows ARM64 is not built (GitHub has no Windows ARM64 runners). Linux ARM64 is built in Docker with QEMU on the host runner.
Jobs and outputs
- build – Matrix job: builds the ncclient CLI for each platform. Uploads one artifact per platform.
- build-windows-service – Builds the
NebulaCommanderServicebackground service with PyInstaller (client/windows/build.py). Uploadsncclient-service-windows-amd64.exe. - build-windows-app – Builds the WinUI 3 app with
dotnet publish -c Release -r win-x64(.NET 10) as a self-contained single file. UploadsNebulaCommanderApp-windows-amd64.exe. - build-deb / build-rpm – Tag pushes only. Package the
buildjob’sncclient-linux-amd64binary plus the service and desktop app into three.deband three.rpmpackages (nebula-commander-client,-service,-desktop), plus an arm64 client package fromncclient-linux-arm64(nebula-commander-client-arm64.deb,nebula-commander-client-aarch64.rpm). - build-flatpak – Tag pushes only. Builds the desktop app against the GNOME 51 runtime and uploads
org.beardedtek.NebulaCommander.flatpak. - build-msi – Tag pushes only. Downloads the Windows CLI, app, and service artifacts, copies all three into
installer/windows/redist/, builds the MSI with WiX 5 (Util + UI extensions), and uploadsNebulaCommander-windows-amd64.msi. Any pre-release suffix is stripped from the MSI version, since MSI versions must be purely numeric. - upload-release – Tag pushes only. Downloads all artifacts (CLI, Windows app/service/MSI,
.deb,.rpm, Flatpak), flattens them, generatesSHA256SUMS.txt, and uploads everything to the GitHub Release for that tag. Release is not draft; files can be overwritten. - checksums – Generates checksums for the Actions UI; release gets checksums from the upload-release job.
- summary – Prints build status and notes that release binaries were uploaded when the run was tag-triggered.
Creating a release
- Bump version (e.g. in
client/pyproject.tomlor as appropriate). - Tag and push:
git tag v0.1.5 git push origin v0.1.5 - The workflow builds all platforms, the Windows app and service, the MSI, and the Linux packages, then creates the release and attaches all binaries and SHA256SUMS.
Manual run
In GitHub: Actions → “Build ncclient Binaries” → “Run workflow”. Choose branch and run. Artifacts appear in the run; no release is created unless you ran from a tag.
Build Docker Images
Workflow file: .github/workflows/build-docker-images.yml
Triggers
- After ncclient workflow – Runs when the “Build ncclient Binaries” workflow completes. It runs only if that workflow succeeded. Version is taken from the commit that triggered the binaries workflow: if that commit has a tag
v*, that tag (without thev) is used; otherwise version islatest. - Manual – “Run workflow” in the Actions tab. Version is
latestunless the run is triggered by the binaries workflow.
Images built and pushed
All images are pushed to GitHub Container Registry (ghcr.io):
| Image | Platforms |
|---|---|
ghcr.io/nixrtr/nebula-commander-backend | linux/amd64, linux/arm64 |
ghcr.io/nixrtr/nebula-commander-frontend | linux/amd64, linux/arm64 |
ghcr.io/nixrtr/nebula-commander-keycloak | linux/amd64, linux/arm64 |
Each image is tagged with the version (e.g. 1.2.3) and latest. Build uses Docker Buildx, layer caching (GitHub Actions cache), and the Dockerfiles under docker/. The frontend image is built with DOWNLOAD_BINARIES=1 so it can serve ncclient binaries from the release.
Summary job
A final job prints the version and the full image names with that tag.
Publish Package Repository
File: .github/workflows/publish-package-repo.yml
Rebuilds the signed apt and rpm repository at pkgs.nebulacommander.com (GitHub Pages) that Linux users add to install and update the client, service, and desktop app. See Linux Desktop App.
Triggers
- workflow_run – After “Build ncclient Binaries” completes successfully for a stable
v*tag. Pre-release tags (containing-, e.g.v0.7.0-rc1) are skipped. - workflow_dispatch – Rebuild the repository at any time, e.g. after rotating the signing key.
What it does
- Downloads the
.deb/.rpmassets of the newest 5 stable GitHub Releases that have Linux packages. - Runs
packaging/repo/build_repo.py: lays out an apt repository (deb/, onestablesuite,amd64andarm64) and an rpm repository (rpm/), signsInRelease/Release.gpg, signs each RPM andrepomd.xml, and writesgpg.key, the.sources/.repofiles, and an index page. - Verifies the signatures and deploys the site to GitHub Pages.
The repository has no state of its own; every run regenerates it from the Releases.
Secrets
PACKAGE_SIGNING_KEY– The armored private key used for signing.PACKAGE_SIGNING_KEY_PASSPHRASE– Its passphrase.
Testing workflows locally (act)
You can run the workflows locally with act. Only Linux jobs run in Docker; Windows and macOS jobs do not use real Windows/macOS runners in act. See the repository .github/README.md for setup, usage, and how to simulate a tag push. Release upload and secrets still require GitHub when running with act.