Skip to content

Builds ​

The Hub builds your apps for you. Point it at a Git repository (or a registry image) and Pantacor's build runners turn it into a signed pvr export: the container, ready to add to a device's state, for every architecture you ask for. Nothing runs on your machine or your CI runner; they only submit the build and collect the result.

Development preview. Builds run on the stage Hub (https://hub.stage.pantahub.com, API https://api.stage.pantahub.com). Executions are recorded as unbilled development runs; nothing is charged, but your plan's build minutes are enforced (see Limits).

What can be built ​

SourceWhat the runner does
A repository with a DockerfileBuilds the image with BuildKit and packages it as a Pantavisor container.
A repository with a pvpkg.jsonFollows the manifest: its Dockerfile, or a Yocto (kas) or Buildroot recipe that builds the root filesystem, then packages it with the repository's pvpkg/ overlay.
A registry image, pinned by sha256 digestImports the image and packages it.
meta-pantavisor, as an image baseBuilds the BSP, core containers and partition layout of a machine with kas, once per machine and version.
Flashable device imagesCustomises an image base (or a factory image) for one of your signing identities, adds your app builds and an OEM configuration part, and writes one .img.xz per policy.

Preparing a repository explains each repository layout; Flashable device images the image builds.

From a container to a device ​

Builds chain into each other; each step is signed and checked, as a device would check it:

StepBuildGivesSigned with
1. Your appgit or registry build<app>.pvrexport.tgzthe identity's OEM key (<identity>-oem), or pvr's developer key
2. The OEM part (optional)added to an app or image build<identity>/<policy>.config (Hub, join token, …)the identity's platform key
3a. A running devicenone: put the export on ita new revision—
3b. A new deviceimage base → factory → images<identity>-<policy>.img.xz to flashBSP and core containers: the platform key; apps: as built in step 1

Signing identities explains which key signs what and how the device checks it.

Three ways to start a build ​

  • Web UI — the Builds page: start pipelines, follow logs, retry, download exports.
  • pvr — pvr build start|status|logs|download from a terminal or any script.
  • GitHub Actions — a workflow step that submits the build of the pushed commit, streams its log into the job and keeps the exports as workflow artifacts.

All three use the same API and see the same builds: a build started from GitHub shows up on the Builds page, and pvr can download its export.

How a build runs ​

queuedwaits for a runnerfetchpinned commitbuildDockerfile / kas / BRpackagepvr + pvpkg overlaysignpvs keyartifactexport + sha256Ends as succeeded, failed, cancelled or timed_out. The log follows every stage live.
  1. Admission. The request names a source (repository and ref, or image), a project, the architectures and a time limit. The Hub resolves a branch to its commit at once, so the build always uses one exact commit, even if the branch moves while it waits.
  2. Fetch. A runner claims the build and fetches that commit; a private repository with the account's git secret.
  3. Build. In its own BuildKit builder, isolated from other builds: the Dockerfile, or the Yocto/Buildroot recipe.
  4. Package. pvr turns the image into a Pantavisor container and lays the repository's pvpkg/ folder over it.
  5. Sign. The export is signed: with the account's signing key when the build names one, else with pvr's public developer key (details).
  6. Artifact. The export (<app>.pvrexport.tgz) is uploaded to the account's objects with its sha256. Downloads are checked against it.

Pipelines: several architectures at once ​

Ask for several architectures (amd64, arm64, arm32v6) and the build is a pipeline: one build per architecture, run in parallel, each with its own log, export and status. The pipeline succeeds when all of them do.

Statuses ​

StatusMeaning
queuedAdmitted, waiting for a runner.
runningA runner is working on it; the current stage shows next to it.
succeededThe export is ready to download.
failedA stage failed; the log says which and why.
cancelledCancelled by you (or by the workflow that started it).
timed_outIt ran past its time limit.

A finished build can be retried: the same request again, as a new build. A retry of a tag builds the tag's commit, and is refused if the tag has moved since; anything else rebuilds the same commit.

Limits ​

Time limit per architectureGit builds 1 s – 4 h (14400 s); registry images 1 s – 1 h. Yocto and Buildroot need minutes to hours, Dockerfiles usually minutes.
Active builds8 queued or running per account; each architecture of a pipeline counts.
Build minutesCounted per calendar month (UTC) from the measured run time of your builds, each architecture of a pipeline included; the dashboard shows the month's use. Once the month's minutes are used, new builds and retries are refused until the month ends; builds already running finish.
SourcesHTTPS GitHub and GitLab repositories; registry images pinned by sha256 digest.

Versions ​

The export's version comes from pvpkg.json's version. Without one, a build of a tag is versioned with the tag's name (v1.2.0), and any other build with 0.0.0-g<commit>, like git describe. A version in the manifest built from a branch also gets -g<commit> appended.

Next steps ​