Common questions about LabVIEW CI setup, configuration, and operation. Want the deep, implementation-level details instead? Read the full Documentation.
This FAQ answers common practical questions. For a thorough, implementation-level reference — how the runners are built, how the worker containers launch headless LabVIEW, how VIPM dependencies are baked in, the report data contracts, the catalog model, the security boundaries, and how to extend or adapt the stack — read the full Documentation.
It is written for expert LabVIEW developers who need to evaluate, extend, or adapt the pipeline.
LabVIEW CI is a portable, repository-agnostic CI/CD pipeline for LabVIEW projects. It provides:
It's driven entirely by a catalog so the configurator UI and installer stay in sync — new capabilities are just a one-entry change.
Click ➕ Apply to New Repo from the dashboard. This will:
You review and merge the PR to activate the pipeline.
Yes! Click ⚙ Configure Workers from the dashboard to change:
Configure opens a pull request with your changes — review and merge to apply.
Worker containers are Docker images that bundle your project's dependencies (VIPM packages, etc.) with LabVIEW. They ensure that every CI run uses exactly the same environment.
From Configure, you can:
VI Analyzer, Mass Compile, and VIDiff run inside the container you select.
Short answer: a fresh container is created for each action, each revision, and each platform — started when that action begins and destroyed the moment it finishes (docker run --rm). A container is not created per file, and it is never reused across actions or across revisions. This keeps every run clean, isolated, and reproducible.
What that means in practice:
The one exception — VI Browser snapshots. The snapshot renderer deliberately starts a single, long-lived container and keeps it warm, rendering many commits through it via docker exec (no per-VI or per-commit container churn), then tears it down when the job ends. Snapshots are content-addressed by VI content, so each unique VI is rendered exactly once — ever — and reused across commits instead of being re-rendered.
What you can change:
base forces the bare NI image for that action.--rm container. GitHub-hosted runners start from a clean VM every job.There is no setting to make a single container persist across actions or across revisions — that isolation is intentional. The VI Browser snapshot renderer is the one place that reuses a warm container within a job, and it avoids repeat work across revisions by content hash rather than by keeping containers alive.
Stored in the GitHub Container Registry (GHCR, ghcr.io) as a package attached to your repository. The "Build LabVIEW CI Image" workflow builds your worker image and pushes it with the built-in GITHUB_TOKEN, so the image lives under your own account — for example ghcr.io/<owner>/<repo>-labview (and, if VI Browser 2.0 renders are enabled, ghcr.io/<owner>/<repo>-toimages). The image inherits your repository's visibility, and you can view or delete it under your repo's Packages. The NI base layer it builds on (nationalinstruments/labview) is pulled from NI's public registry — nothing is stored on the tooling author's servers.
Run on the GitHub Actions runner that executes the workflow job, never on NI's or the tooling author's infrastructure. For each job the runner:
GITHUB_TOKEN), or from NI's registry for the base image.docker run --rm), so nothing persists between runs.Windows container jobs run on a windows-2022 runner and Linux jobs on ubuntu-latest — either GitHub-hosted (the default) or a self-hosted runner you provide. In short: the images are your own packages on GitHub, and everything executes inside your own GitHub Actions environment, under your account's minutes and limits.
The dashboard shows an "Update available" badge when a new version of LabVIEW CI is released. Click Update now to:
Merge the PR to get the new features and improvements.
LabVIEW CI supports:
You choose which platforms your pipeline targets during setup or from Configure.
LabVIEW CI itself is free and open-source. Running CI on GitHub costs:
You can lower the max concurrent runners to stay within quota. Keep in mind that GitHub's concurrency limit — how many jobs run at once (Free 20, Pro 40, Team 60, Enterprise 500) — is per account and shared across all your repositories, not per repo, and routine submissions and tooling upgrades draw from that same pool. That's why the per-repo runner cap defaults to a conservative value.
A runner is the machine that actually executes a GitHub Actions workflow job. When a run is triggered, GitHub hands the job to a runner, which checks out your code, runs each step in order, and — for LabVIEW CI — pulls and runs the worker container that does the compile, analysis, diff, or test. One job runs on one runner.
There are two kinds:
windows-2022 for Windows jobs, ubuntu-latest for Linux — and wipes the moment the job finishes. There is nothing to install or maintain. They are free on public repositories and draw from your GitHub Actions minutes on private ones.Because the worker container runs on the runner, choosing a runner is how you choose where your CI executes. You pick GitHub-hosted or a self-hosted runner label during setup or from ⚙ Configure Workers. Note that GitHub caps how many jobs — and therefore runners — can run at once per account (see the cost question above), which is why LabVIEW CI has a max concurrent runners setting.
Yes. When setting up or configuring your pipeline, specify custom runner labels if you've registered them with your GitHub organization or repository.
Custom runners are useful if you have:
See your GitHub Actions settings to register custom runners.
The dashboard shows results for every commit. If CI fails on a commit:
Protecting your main branch (requiring CI to pass before merge) prevents broken commits from landing.
The Clients page lists the public repositories found to be running this LabVIEW CI stack. We want to be fully transparent about how that list is built, because it is gathered automatically.
Discovery is deliberately pull-based: the source repository finds its own clients by querying GitHub's public search index. Your repository is never modified, never has to "phone home," and there is no shared secret, tracking pixel, or telemetry call involved. A scheduled workflow in the source repository (discover-clients.yml, which you can also trigger by hand with the Scan for clients button) looks for three public signals that an install necessarily leaves behind:
labview-ci repository topic — added to a client repository at install time. This is the primary, most reliable signal, because GitHub indexes repository topics as structured metadata.source.repo value in a client's .github/labview-ci/catalog.json.uses: reference back to this repository inside a client's .github/workflows/ files.Every candidate is then verified before it is listed: the repository must be public, must not be a fork, and its catalog must actually point back to this repository (or it must reference this stack from a workflow). Coincidental text matches in unrelated repositories are dropped, so the count reflects real installs.
Privacy. GitHub's search index only covers public repositories, and each candidate is additionally checked to be non-private. Private repositories are never discovered or listed — a deliberate property, since the Clients page itself is public. Only information GitHub already exposes publicly is shown: the repository name and owner, its installed tooling version, when it was last updated, and links to its dashboard and repository.
The scan runs about once a day, so a brand-new install can take up to a day — plus GitHub's own search-index lag — to appear; Scan for clients triggers it on demand. The workflow runs only in the source repository, so a fork or a vendored copy never scans on anyone else's behalf.
LabVIEW CI is open-source on GitHub:
github.com/elijah286/LabVIEW-CI-with-Containers
You can: