Skip to content

Builds

You pushed a commit, or pressed Build, and a build appeared. This page covers what actually ran, what came out of it, and where to read the result.

A build is one dispatch of the deploy workflow in the project's mirror repository. The mirror lives in a platform-owned org: your source is checked out into the runner, and every Actions minute burns there, never in your repository.

What a build produces

Each enabled browser carries its own installCommand, buildCommand and outputDirectory, and each emits its own artifacts:

ArtifactContents
<browser>-extension.zipThe packed extension
<browser>.jsonBuild metadata
<browser>.integrity.jsonThe integrity record, see Integrity

The enabled browsers are chrome, edge and firefox. Builds also emit executables per browser. Safari artifacts come from the store lane, not from the build dispatch.

What starts a build

Four triggers exist: console, webhook, release, api. Only console counts as attended. Unattended builds are the paid boundary, see Plans and limits.

Push and PR webhooks are debounced 75 seconds. Every trigger resolves to one of three dispatch decisions: dispatch, debounce, drop-duplicate.

Concurrency is keyed per ref with cancel-in-progress. A new push cancels the older build on the same ref instead of billing both.

Reading a build

RouteReturns
GET /api/projects/{id}/buildsThe build list
GET /api/projects/{id}/builds/{buildId}One build
GET /api/projects/{id}/builds/{buildId}/artifactsIts artifacts
GET /api/projects/{id}/builds/{buildId}/logsLogs, streamed from the CI jobs and grouped by browser
GET /api/projects/{id}/builds/{buildId}/integrity/{browser}The integrity record for one browser
GET /api/projects/{id}/usageBuild usage
GET /api/projects/{id}/builds/live-statusLive status of in-flight builds

Environments and rebuilds

Every build is stamped with the environment it compiled in: staging by default, production when the trigger asks for it. Promotion checks the stamp against the target channel, see Promote gates.

Rebuilding a commit whose artifacts a live channel serves is refused with 409 REBUILD_REPLACES_LIVE_ARTIFACT. Pass force: true to overwrite anyway. A rebuild that takes a staging build to production is recognized as an upgrade and passes without force.

When it fails

  • Pushed, nothing built. A push within 75 seconds of the previous one is decided debounce or drop-duplicate, not dispatch. Wait it out, or dispatch from the console or the API.
  • Build cancelled. A newer push on the same ref cancelled it. The newer build has the ref; only one is billed.
  • Webhook or API trigger refused. Unattended builds sit behind the paid boundary. See Plans and limits.
  • 409 REBUILD_REPLACES_LIVE_ARTIFACT. A live channel serves the artifacts you are about to replace. Build a new commit, or pass force: true if replacing them is the point.

Next

Extension.dev is built on the Extension.js framework. Privacy · Terms · Cookies