RESOURCES / FAQ
Frequently Asked
Questions
Everything you need to know about WarpBuild, CI runners, build performance, infrastructure, integrations, pricing, and more.
462 FAQs across 20 topics
Find your next answer.Getting Started with WarpBuild
Your first build, account setup, and the basics.
What is WarpBuild?
Does WarpBuild replace GitHub Actions?
How do I get started with WarpBuild?
Do I need a GitHub organization?
Can I install WarpBuild directly from GitHub Marketplace?
Can one GitHub organization connect to multiple WarpBuild workspaces?
Why is my GitHub app installation waiting for approval?
Where can I copy a runner label?
Can an AI agent help me set up WarpBuild?
CI Runners
Choose the right environment for your workflows.
How Much Disk Space Do GitHub Actions Runners Have?
Do GitHub Actions Runners Keep State Between Jobs?
Do GitHub Actions Runners Store My Source Code?
Is Visual Studio Preinstalled on Windows Runners?
Which platforms does WarpBuild support?
Can I use GPU runners on WarpBuild?
Can I use spot instances on WarpBuild Cloud?
How do I make a self-hosted runner ephemeral?
Configure the runner agent with the --ephemeral flag, so the agent accepts one job and then deregisters and exits. The second half is up to whatever created the machine: a controller or provisioning script has to delete the virtual machine or container after the agent exits, otherwise the disk survives for the next agent that starts on that host.
Do ephemeral runners lose my dependency cache?
The machine's disk goes away with the machine, so anything warm has to be restored on purpose. The usual mechanisms are actions/cache for dependency directories, artifacts for files a later job needs, a prebuilt image that already contains the toolchain, or a runner that boots from saved disk state captured on an earlier run.
Why does every job repeat the same setup steps on ephemeral runners?
What is ephemeral storage?
Ephemeral storage is disk space whose contents are bound to the lifetime of the compute that owns it. When the instance, container, or pod goes away, the data on that disk goes with it. AWS documents instance store volumes this way, Docker documents the writable container layer this way, and Kubernetes documents emptyDir volumes this way.
Is ephemeral storage the same as a temporary directory?
A temporary directory such as /tmp is a path convention inside one filesystem, and the operating system or a cleanup job decides when its contents are removed. Ephemeral storage describes the durability of the whole volume, so a file in a home directory on an ephemeral disk disappears at the same moment as a file in /tmp on that disk.
What does a GitHub Actions runner actually do?
What is a runner image in GitHub Actions?
How is a runner image different from a Docker image?
Why did a tool version change without any workflow edit?
Runner images are versioned and republished on a cadence, and a job runs on whichever build is current when it starts. A workflow that requests a runtime by major version inherits the patch version the image happens to carry, so an image rollout can move it between two runs of the same commit.
What is a runner label in GitHub Actions?
Does a runner label change what a machine can do?
Can one job request more than one runner label?
What is a runner pool in GitHub Actions?
A runner pool is the set of machines that can accept a job carrying a given label, together with the policy that decides when machines are created and when they are retired. Workflow YAML never names a pool. A job names labels, and the pool is whatever set of online runners advertises those labels when the job is queued.
Is a runner pool the same as a runner group?
What is a self-hosted runner in GitHub Actions?
How does a self-hosted runner connect to GitHub?
The agent opens an outbound HTTPS long poll to GitHub and waits for a job message on that connection. Nothing dials the machine from the internet, so a runner works inside a private subnet behind a firewall that allows outbound traffic only, and it can reach private services that a machine outside your network cannot.
What do I have to operate myself when I run self-hosted runners?
Provisioning the machines, building and patching the image the jobs run on, scaling the fleet up and down against queue depth, deciding the isolation boundary between jobs, and decommissioning machines so a deregistered runner leaves nothing running. GitHub operates none of that for a self-hosted runner.
Can self-hosted runners run jobs from public repositories?
What is a vCPU?
A vCPU is one virtual processor a cloud instance exposes to the guest operating system, appearing as a single entry in the processor list the guest schedules work onto. On most x86 instances one vCPU is one hardware thread of a physical core, so a 4 vCPU machine is commonly 2 cores running 2 threads each.
Is a vCPU the same as a physical CPU core?
Usually not on x86. AWS documents each thread of an SMT-capable core as a vCPU, so an m5.xlarge with 2 cores and 2 threads per core reports 4 vCPUs. On Arm hardware the mapping is one to one: AWS Graviton instance types default to 1 thread per core, and Compute Engine documents one thread per core for Arm processors.
Why does my build tool spawn more workers than the runner has vCPUs?
Most tools size their worker pool from the processor list they read at startup. A cgroup CPU quota limits how much CPU time the process receives without shortening that list, so a tool can read the host's processors and start one worker per entry while the job holds a much smaller share. Pin the worker count with a flag instead.
How Do I Detect an Undersized Runner?
How Do I Forecast Runner Spend?
Forecast runner spend by taking the billed minutes on each runner label from the last full month, applying that label's per-minute rate, and multiplying by a growth factor drawn from planned job count. Scale by job count rather than by headcount, because the bill has no seat term to grow.
What Happens to Runner Disks After a Job?
The disk is destroyed with the job. Each WarpBuild runner has its own encrypted storage volume that is created on demand and destroyed after each build, and the virtual machine that carried it is destroyed on the same schedule and never handed to a second job, both stated in the runner security documentation.
GitHub Actions
Workflow syntax, triggers, permissions, and job orchestration.
How Do I Export GitHub Actions Job Data to CSV?
What is artifact retention?
Artifact retention is the period a CI platform keeps uploaded build artifacts before deleting them. The window is set per repository and can be narrowed per upload. On GitHub Actions the default is 90 days, and when the window closes the artifact is deleted and its download link stops resolving.
What is a build matrix in GitHub Actions?
A build matrix is the strategy.matrix block on a job. Each key names a variable and holds a list of values, and the workflow expands that one job definition into a separate job for every combination of those values. Nine combinations become nine independent jobs, each with its own runner, its own workspace, and its own log.
How many jobs does a matrix create?
Why do matrix jobs queue instead of all starting at once?
Expansion and execution are separate steps. The matrix creates every job immediately, then each job waits for an online runner that advertises every label in its runs-on key. A matrix wider than the number of eligible runners runs in waves, so wall clock time tracks available capacity instead of matrix width.
What makes an action composite rather than JavaScript or Docker?
The runs.using value in action.yml. A composite action sets runs.using to composite and supplies runs.steps, a list of workflow steps. A JavaScript action sets runs.using to a Node.js runtime such as node20 or node24 and points runs.main at a script file. A Docker container action sets runs.using to docker and points runs.image at a Dockerfile or a registry image.
Do composite action steps need a shell key?
What does the concurrency group name control?
Does a concurrency group make jobs start sooner?
What does the environment key do in a job?
Does an environment secret override a repository secret with the same name?
What happens if a workflow names an environment that does not exist?
What is fail-fast in a GitHub Actions matrix?
Does fail-fast default to true or false?
When should a matrix set fail-fast to false?
When the value of the run is the full list of failures rather than the earliest one. Cross platform matrices, version compatibility matrices, and sharded test suites all fit, because a single leg cancelling the others hides how many combinations are broken and forces one run per fix.
What is the GITHUB_TOKEN in GitHub Actions?
GitHub creates a GITHUB_TOKEN secret at the start of each workflow job. It is a GitHub App installation access token for the GitHub Actions app installed on the repository, its permissions are limited to the repository that contains the workflow, and steps read it as secrets.GITHUB_TOKEN or through the github.token context.
When does the GITHUB_TOKEN expire?
Do several steps in one job overwrite each other's summaries?
What is the default timeout for a GitHub Actions job?
Does a job timeout include the time a job spends waiting for a runner?
Can a step have a shorter timeout than the job that contains it?
Yes, and that is the useful pattern. A step level timeout-minutes kills the step process at its own limit while the job level value stays as a backstop for everything else. The step maximum is 360 minutes on both GitHub-hosted and self-hosted runners, and both keys take positive integers only.
Why does a one line change trigger the whole pipeline in a monorepo?
What is the difference between a reusable workflow and a composite action?
Can a reusable workflow live in a different repository?
Why are the caller's environment variables missing inside the reusable workflow?
What is a runner group in GitHub Actions?
A runner group is a container defined on the GitHub side that holds a set of runners and carries an access policy. The policy decides which repositories may send jobs to those runners, and optionally which workflow files, branches, tags, and commit SHAs may claim them. Every runner registered at the organization or enterprise level belongs to exactly one group.
Do runner groups apply to repository-level runners?
Groups are an organization and enterprise concept. A runner registered against a single repository is already scoped to that repository, so there is no group policy to apply. Once a runner is registered at the organization or enterprise level, it lands in a group, and the group's access policy decides which repositories can reach it.
How does a workflow target a specific runner group?
Use the object form of runs-on with a group key, for example runs-on with group set to production-runners and labels set to [linux, x64]. GitHub first narrows the candidate runners to that group, then applies the usual label subset match inside it. A job that names no group is eligible for any group the repository can reach.
Why does a job stay queued when a runner group excludes the repository?
What does runs-on mean in GitHub Actions?
runs-on is the key inside a job that selects which runner executes that job. It holds a label, a list of labels the runner must all carry, or an object naming a runner group plus labels to filter inside it. GitHub routes the queued job to an online runner that advertises everything the key asked for.
What does workflow_dispatch do?
What is a workflow event in GitHub Actions?
Can one workflow respond to more than one event?
Yes. The on key accepts a list or a mapping of several events, and each one can carry its own filters. A workflow can declare push, pull_request, schedule, and workflow_dispatch together. Every run still has exactly one triggering event, so steps that need to behave differently branch on github.event_name.
Where do I see which event started a run?
The run summary page names the event, and inside a job the value is available as github.event_name. The full webhook payload for that event sits in the github.event object, so a step can read github.event.pull_request.number or github.event.head_commit.message without calling the API.
Where does a permissions block go in a workflow file?
What happens when a workflow has no permissions block?
The run uses the default configured for the repository, or the organization value when an administrator has pinned it. GitHub documents two choices for that default: permissive, which grants write access on most scopes, and restricted, which grants read access on contents and packages.
How Do I Attach Build Provenance to an Image?
How Do I Authenticate to a Private Registry?
How Do I Authenticate to AWS With OIDC?
How Do I Build a Rust Binary for Multiple Targets?
How Do I Build and Push in One GitHub Actions Step?
How Do I Cancel In-Progress Runs on a New Push?
Declare a concurrency group keyed on the ref and set cancel-in-progress: true, so the newest push takes the lane and the run already going is cancelled. The two keys live at the top level of the workflow file and are documented in GitHub's concurrency syntax reference, checked on 2026-08-13.
How Do I Generate an SBOM During a Build?
How Do I Limit a Workflow to One Run at a Time?
Declare a concurrency block at the workflow level with a fixed group name and leave cancel-in-progress off, which is its default. Runs in that group then serialize: the run already in progress finishes, and a run that arrives while it is going parks in a pending state instead of starting alongside it, per GitHub's workflow syntax reference.
How Do I Publish a Package From a Workflow?
Publish from a job that runs only on a release event, authenticate with a credential scoped to the target registry, and ship the artifact the test job already built. The publish job downloads that artifact instead of rebuilding it, so the bytes that passed the test suite are the bytes that reach the registry.
How Do I Push a Manifest List from GitHub Actions?
How Do I Reuse a Workflow Across Repositories?
Publish the shared logic once as a reusable workflow: a file in .github/workflows on the host repository with on: workflow_call, declaring the inputs and secrets it needs. Every other repository then calls it from a job with uses: OWNER/REPO/.github/workflows/FILE.yml@REF, passing those inputs and secrets explicitly and pinning REF to a tag.
How Do I Run a Job Only When Files Change?
Two mechanisms cover this, and the right one depends on how many projects a single workflow serves. Put a paths filter on the trigger when the workflow belongs to one project, and run a short change detection job whose outputs feed if conditions on the other jobs when one workflow serves several.
How Do I Run a Workflow Manually?
How Do I Run Browser Tests Headless in GitHub Actions?
How Do I Run Database Services in GitHub Actions?
How Do I Run Go Race Detector Tests in GitHub Actions?
How Do I Run Jobs on a Schedule?
How Do I Run PowerShell Scripts in GitHub Actions?
Set the shell on the step with shell: pwsh and let the script exit non-zero when the work fails. GitHub Actions runs pwsh by default on Windows runners and bash -e by default on Linux and macOS runners, and the pwsh and powershell keywords start two different interpreters, so a run block that leaves the shell unset behaves differently depending on which runner picked the job up.
How Do I Set a Timeout on a Job?
Set timeout-minutes on the job as a backstop, then set a tighter timeout-minutes on any step that can block: a service wait, a network fetch, an integration suite. With neither key present GitHub applies a default of 360 minutes, so one hung step holds a runner for six hours and bills every minute of it.
How Do I Skip a Workflow for a Commit?
How Do I Stop a Workflow From Blocking Deploys?
How Do I Use include and exclude in a Matrix?
In a GitHub Actions matrix, exclude removes combinations from the product and include either merges extra keys into combinations that already exist or appends combinations the product never produced. GitHub applies every exclude entry first and every include entry afterwards, which is why an include entry can add back a combination that exclude just dropped.
How Do I Write a Composite Action?
How Do I Write a GitHub Actions Job Summary?
How Many GitHub Actions Jobs Can Run at Once?
How Many Jobs Can a Matrix Fan Out To?
A single matrix generates at most 256 jobs per workflow run, and a definition whose product lands above that fails the run before any job starts. Two other numbers usually bind first: how many matching runners are available behind your runs-on label, and what the fan-out bills in runner minutes.
Linux Runners
Ubuntu, x86-64, ARM64, and native builds.
Which Ubuntu releases can I select on WarpBuild?
Does WarpBuild offer Linux on Apple Silicon?
Why is the working directory different on Ubuntu ARM64?
Can I still select Ubuntu 22.04 ARM64 runners?
How do I tell whether an EC2 instance type uses Graviton?
Is Graviton the same thing as ARM64?
Graviton is one implementation of the ARM64 architecture. ARM64, which the Linux kernel reports as aarch64, is the instruction set, and Graviton is the processor family AWS builds to run it. A binary or container image produced for linux/arm64 runs on a Graviton instance and on other ARM64 machines as well.
Do I have to rebuild container images to run on Graviton?
Yes, when the current image contains only a linux/amd64 manifest. A Graviton instance has no x86-64 translation layer, so an amd64-only image fails at startup with an exec format error. The fix is a linux/arm64 build, published either as an arm64 image or as one entry in a manifest list that also carries the amd64 image.
What does /dev/kvm actually do?
It is the entry point to the kernel's virtualization interface. A process opens the device, issues KVM_CREATE_VM and KVM_CREATE_VCPU to get file descriptors for a virtual machine and its virtual CPUs, then calls KVM_RUN to execute guest instructions on the physical CPU through the hardware virtualization extensions.
Why is /dev/kvm missing inside a GitHub Actions job?
A hosted runner is itself a virtual machine, so the device appears in the guest only when the layer underneath exposes the CPU virtualization extensions to that guest. That is nested virtualization. Without it the kvm modules have no hardware to program, the device node is never created, and an open call returns ENOENT.
What is the difference between KVM and QEMU?
KVM is a kernel interface that runs same architecture guest code directly on the host CPU. QEMU is a user space program that emulates machines and devices, and it can either translate foreign architecture instructions in software or hand same architecture guest code to KVM for hardware acceleration.
What is a local SSD on a cloud instance?
How do I get a local SSD on a GitHub Actions runner?
What is nested virtualization?
Nested virtualization is running a virtual machine inside a machine that is already a virtual machine. The outer hypervisor has to expose the host CPU's hardware virtualization extensions to its guest, so that the guest kernel can act as a hypervisor for a second layer of virtual machines.
How do I tell whether a GitHub Actions runner supports nested virtualization?
Run ls -l /dev/kvm in a step on a Linux runner. A missing device means the outer hypervisor kept the virtualization extensions to itself. A device that exists with crw-rw---- root:kvm permissions means the extensions are exposed and the job user still needs group access before it can open the device.
Why does an Android emulator job get slow instead of failing?
The android-emulator-runner action probes /dev/kvm before it launches. When the probe fails it logs a ProbeKVM line, disables Linux hardware acceleration, and starts the emulator with -accel off, so the job keeps running under software emulation and finishes much later than usual.
What is QEMU emulation in a Docker build?
It is user mode emulation of a foreign processor architecture. QEMU translates the guest instructions of every binary inside the target rootfs into host instructions and forwards the guest syscalls to the host kernel, so an x64 machine can execute the aarch64 binaries in an arm64 base image.
How does the kernel know to hand a binary to QEMU?
Through binfmt_misc, a Linux kernel feature that maps the magic bytes at the start of a file to an interpreter. Registering an aarch64 entry writes a file under /proc/sys/fs/binfmt_misc naming the aarch64 ELF magic and the qemu-aarch64 binary, and the kernel routes matching binaries there instead of failing with exec format error.
Which build steps get slower under QEMU emulation?
The steps that execute guest binaries and burn CPU: compilers, linkers, minifiers, package managers that build from source, and tests run during the image build. Docker's multi-platform documentation states that emulation with QEMU can be much slower than native builds, especially for compute heavy tasks like compilation and compression or decompression.
Can GitHub Actions Run an Android Emulator?
Yes. GitHub Actions runs an Android emulator on Linux x86-64 runners, and the emulator runs with hardware acceleration whenever the runner exposes /dev/kvm to the job. On WarpBuild cloud runners you enable that by appending ;nested-virtualization.enabled=true to the runs-on label, then adding the documented KVM udev permission step before the emulator action.
Can GitHub Actions Run on ARM64?
Can I Build 32-bit ARM Targets on ARM64 Runners?
Can ARM64 and x64 Jobs Run in One Workflow?
How Do I Run ARM64 Integration Tests?
macOS Runners
Apple Silicon, Xcode, signing, and simulator workflows.
Which macOS versions are available on WarpBuild?
What hardware powers WarpBuild macOS runners?
How much memory do WarpBuild macOS runners have?
Can macOS use region-specific cloud infrastructure?
Does macOS have the same concurrency policy as Linux?
Where can I check installed Xcode and simulator versions?
Why does a signature need a timestamp?
Is code signing the same as notarization?
No. Signing is a local operation that attaches a signature using a key you hold. Notarization on Apple platforms is a separate submission to Apple's service, which scans the already signed build and returns a ticket. A build can be signed and still be refused by Gatekeeper if it was never notarized.
What is a provisioning profile?
A provisioning profile is a property list wrapped in a Cryptographic Message Syntax signature and signed by Apple. It binds an application identifier to the certificates allowed to sign that application, to a device list or a distribution method, and to an expiration date, and it carries the allowlist of entitlements the signed code may claim.
What is the difference between a signing certificate and a provisioning profile?
A signing certificate binds an identity to a public key; the corresponding private key creates signatures. An Apple provisioning profile authorizes particular app identifiers, signing identities, entitlements, and distribution conditions. Building a signed app requires compatible signing material and profiles.
Where does a GitHub Actions job install a provisioning profile?
Into the profile directory of the Xcode the job selects. Xcode 16 and later read ~/Library/Developer/Xcode/UserData/Provisioning Profiles, and earlier toolchains read ~/Library/MobileDevice/Provisioning Profiles. The profile is stored base64 encoded in a repository or environment secret and decoded into that directory before xcodebuild archive runs.
What is a simulator runtime?
Why did my simulator tests change behavior with no code change?
A destination written with OS=latest resolves to the newest runtime installed on the machine at the moment the job runs. When an image update adds a newer runtime, the same commit starts testing against a different operating system build, which moves API behavior, permission prompts, and locale defaults.
Can GitHub Actions Build iOS Apps Without a Mac?
Can Android and iOS Builds Share One Workflow?
Yes. runs-on is declared on each job rather than on the workflow, so one file can hold an Android job on a Linux runner and an iOS job on a macOS runner. WarpBuild provides Linux x64, Linux ARM64, macOS, and Windows runners, so both legs select a warp- label and the pair runs in parallel from the same trigger.
Can You Run Docker on macOS GitHub Actions Runners?
Do GitHub Actions Runners Support macOS?
Yes. GitHub Actions runs macOS jobs on ARM64 macOS runners, and moving a job onto one is a single runs-on change to a label such as warp-macos-15-arm64-6x, which provisions 6 vCPU with 14GB of memory and a 120GB SSD at $0.08 per minute. WarpBuild provides Linux x64, Linux ARM64, macOS, and Windows runners, and the macOS line is ARM64 only.
Is Xcode Preinstalled on macOS Runners?
How Do I Select an Xcode Version in GitHub Actions?
Selecting an Xcode version in GitHub Actions is two decisions. Pick the runner image that carries the Xcode version you want, because the image decides which toolchains exist on disk, then point the job at that toolchain by setting DEVELOPER_DIR at job level or running sudo xcode-select -s on the bundle path, and print xcodebuild -version as the first step so the log records which toolchain compiled the build.
Windows Runners
Windows Server images, tooling, and .NET builds.
Does WarpBuild Cache support Windows runners?
Which Windows versions are available on WarpBuild?
What does the Windows latest label select?
Can I use a 2-vCPU Windows runner?
Can GitHub Actions Run Windows Builds?
Yes. GitHub Actions runs Windows builds on x86-64 Windows runners, and moving a job onto one is a single line change to runs-on: point it at a Windows label such as warp-windows-latest-x64-8x and the steps execute on a Windows Server machine with MSBuild, Visual Studio, and the rest of the standard Windows toolchain already installed.
Can I Still Build on Windows Server 2022?
Yes. Windows Server 2022 is a current image in the WarpBuild catalog: warp-windows-latest-x64-<size> resolves to Windows Server 2022 today and warp-windows-2022-x64-<size> is the dated alias for the same machines. Windows Server 2025 ships beside it on its own labels, and the preinstalled software documentation publishes the Windows Server 2022 x86-64 tooling list for teams mapping a pipeline across the two.
Can I Run Unit Tests in Parallel on Windows Runners?
Do Windows Runners Support Nested Virtualization?
No. Nested virtualization is documented for cloud Linux x86-64 runners through the nested-virtualization.enabled=true dynamic label, Windows runners are recorded as unsupported in the support matrix, and that matrix is what to read before you design a workflow around /dev/kvm, because an unsupported label is accepted and ignored rather than rejected, so the job starts and the KVM-dependent step is what breaks.
How Do I Install Windows SDK Components in a Job?
What Is the Smallest Windows Runner Size?
The smallest Windows GitHub Actions runner size available on WarpBuild is 4 vCPU with 16GB of memory and 256GB of SSD storage, at $0.016 per minute. The 2 vCPU Windows tier was removed on June 8, 2026, so warp-windows-latest-x64-4x and its Windows Server 2025 equivalents are the entry shapes on every Windows image family (changelog).
Docker Builders
Remote builders, container images, and multi-platform builds.
How do I create a WarpBuild Docker builder profile?
Can I use WarpBuild Docker builders from another CI provider?
Do Docker builders require an API key on WarpBuild runners?
Do I need cache-to and cache-from with WarpBuild Docker builders?
How long does a Docker builder keep its cache?
Will concurrent Docker builds immediately see each other’s new layers?
Does my CI runner size determine the remote builder size?
Are auto-scaling Docker builders generally available?
How should I size a builder for parallel builds?
Why is my WarpBuild Docker builder timing out?
Why does a multi-platform build report exec format error?
What is a base image in a Dockerfile?
Does every Dockerfile have exactly one base image?
Why does a base image update invalidate the rest of the build cache?
What is the difference between BuildKit and Buildx?
BuildKit is the engine that executes a build: it turns the Dockerfile into a graph, schedules the steps, and owns the cache. Buildx is the client-side CLI that decides which BuildKit instance receives the build, creates and lists builders, and passes flags such as platforms and cache backends to the engine.
How do I tell whether a build used BuildKit?
Docker Engine 23.0 and later run docker build through BuildKit by default, and the giveaway is the grouped step output with per-step timings instead of a flat stream of intermediate container IDs. On older engines the legacy builder ran unless DOCKER_BUILDKIT=1 was set in the environment.
Do I need to install Docker Buildx separately?
What is the difference between docker build and docker buildx build?
Why does a multi-platform build fail on the default builder?
What does a container registry actually store?
Two kinds of object. Blobs are opaque byte streams named by their sha256 digest, and they hold the layer tarballs and the image config JSON. Manifests are small JSON documents that list the config blob and the layer blobs belonging to one image, in order, with a media type and a size for each.
What is the difference between a tag and a digest?
Why does a workflow have to log in to a registry on every run?
Registry credentials live in the client's config.json or in a credential helper on the machine running the pull. A workflow job that starts on a fresh machine has an empty config, so the login step runs again to exchange credentials for a short lived bearer token scoped to the repository and the action requested.
Which file does docker buildx bake read?
By default bake looks in the working directory for docker-bake.hcl, docker-bake.json, their.override variants, and Compose files such as compose.yaml or docker-compose.yml, since a Compose file is a valid bake definition. Passing -f names the file explicitly, and repeating -f merges several files into one definition.
How is bake different from running docker build twice?
Two docker build commands carry their context, Dockerfile, tags, build args, and cache flags on the command line, and each one is a separate invocation. Bake keeps those fields in a file as named targets, and one invocation resolves the file, expands the requested targets or group, and sends them to the same builder together.
How do I override a bake value without editing the file?
A variable block reads its value from the environment, so exporting TAG=abc123 before the command changes every expression that references it. The --set flag overrides target attributes directly with a target pattern, as in --set *.platform=linux/amd64, and --print renders the resolved definition as JSON without building anything.
Is the IMAGE ID from docker images the same as the digest?
No. The IMAGE ID column shows the digest of the image config blob, which is computed locally when the image is built. The registry digest is computed over the manifest document that lists the config and the layers. The two values are different hashes of different documents, and only the manifest digest works in a pull reference.
Does a digest still work for a multi-platform image?
Yes. A multi-platform build publishes an image index that lists one manifest per platform, and the index itself has a digest. A client pulling that index digest reads the platform entries and fetches the manifest matching its own architecture, so one digest covers every platform in the build.
What is the difference between a manifest list and an image index?
They are the same idea in two formats. A Docker manifest list carries the media type application/vnd.docker.distribution.manifest.list.v2+json and an OCI image index carries application/vnd.oci.image.index.v1+json. Both hold a list of per architecture manifests with a platform block on each entry, and registries and clients accept either.
How does a client know which architecture to pull?
The client requests the tag with an Accept header listing the manifest media types it understands. When the registry returns an index, the client compares its own operating system and CPU architecture against the platform block of each entry and fetches the matching manifest by digest. Passing --platform to docker pull or docker run overrides that choice.
Why does my manifest list contain unknown/unknown entries?
Which stage becomes the image when no target is passed?
Can COPY --from read from an image instead of a stage in the file?
What is the difference between provenance and an SBOM?
Provenance describes how an artifact was produced: the source repository and commit, the builder identity, the workflow file, and the parameters that run was given. An SBOM describes what is inside the artifact: the packages and versions assembled into it. They are separate documents with separate predicate types, and a build can publish both against the same digest.
Does a provenance attestation prove the build is safe?
No. The statement records what the build system observed, and verification answers who signed it and whether the subject digest matches the artifact in hand. Whether the recorded source, builder, and parameters are acceptable is a policy decision the verifier makes after the signature checks out.
Where is the attestation stored if it is not inside the image?
The signed statement is a separate document referenced by the artifact digest. It can be pushed to the same OCI registry as a referrer of the image manifest, kept in the build platform's own attestation store and fetched by digest at verification time, or written next to a released binary as a file.
Can GitHub Actions Build Multi Architecture Images?
Can I Build ARM64 Images on an x64 Runner?
Can I Run Docker Compose in GitHub Actions?
Can I Use Podman Instead of Docker in GitHub Actions?
Do ARM64 Runners Support Docker Buildx?
Do Remote Docker Builders Support Multi Platform Builds?
Does Caching Work Inside a Container Job?
How Do I Cache Docker Layers in GitHub Actions?
To cache Docker layers in GitHub Actions, either point the build at a remote Docker builder whose layer cache lives on the builder's own disk and outlives the job, or, if the build stays on the runner, configure a Buildx cache backend that exports layers to a registry or cache service and imports them on the next run.
How Do I Keep a Docker Layer Cache Across Pull Requests?
How Do I Reduce Docker Image Pull Time in GitHub Actions?
How Do I Use Docker Bake in GitHub Actions?
Build Caching
Cache keys, dependencies, layers, and faster repeat builds.
How Do I Cache Go Modules in GitHub Actions?
How Do I Cache Gradle Builds in GitHub Actions?
How Do I Cache Maven Dependencies?
How Do I Cache node_modules in GitHub Actions?
How Do I Clear a GitHub Actions Cache?
How do I switch from actions/cache to WarpBuild Cache?
What does lookup-only do in the WarpBuild cache action?
Can a missing WarpBuild cache fail the workflow?
Can I save and restore a cache in separate steps?
Why does a cache restore report zstd version: null?
What is an artifact cache?
An artifact cache is a store of dependencies or build outputs written under a key, so that a later run can restore those files instead of producing them again. A run computes the key, asks the store for a matching entry, and either restores the files or does the work and writes a new entry.
What is the difference between a cache and an artifact?
What is the difference between an exact cache hit and a partial restore?
Why did a cache key that hit yesterday miss today?
What is cache eviction?
Cache eviction is the removal of entries from a cache store so the store stays inside its budget. Two triggers cover most implementations: capacity pressure, where a new write does not fit under the size ceiling, and age, where an entry that has gone unread for a set window is deleted. The usual removal order is least recently used first.
What is the difference between eviction and expiration?
Why did my GitHub Actions cache disappear without the key changing?
What counts as a cache hit?
What makes a good cache key?
A key that changes exactly when the cached contents should change. The common shape puts the runner platform first, then the ecosystem and its version, then a hash of the lockfile that determines what gets installed. Shorter prefixes of the same string go in restore-keys as fallbacks.
Does changing the cache key delete the old entry?
What decides the scope of a GitHub Actions cache entry?
Can one feature branch read a cache written by another feature branch?
What is a compiler cache?
How is a compiler cache different from an incremental build?
Does a compiler cache work in GitHub Actions?
What invalidates a Docker layer cache?
Where is the Docker layer cache stored?
In one of three places, and a single build can read from more than one. Layers can sit in the local store on the build machine, in a container registry as cache manifests and blobs written by a cache export, or on a dedicated builder that keeps its own layer store between builds and serves every client that connects to it.
Is a Docker layer cache the same as a dependency cache?
No. A layer cache stores built image layers keyed by the inputs of each Dockerfile instruction. A dependency or artifact cache stores files, such as a package manager directory, under a key the workflow computes itself. They have different keys, different lifetimes, and different restore paths.
What is the difference between an incremental build and a cached build?
Is an incremental build safe for a release artifact?
What is the difference between inline cache and a registry cache export?
Why does my multi-stage build still rebuild with inline cache?
How do I turn inline cache on in a Docker build?
With Buildx, pass cache-to type=inline on a build that pushes an image, then import it on the next build with cache-from type=registry pointed at that image reference. With docker build on an engine running BuildKit, the equivalent is the build argument BUILDKIT_INLINE_CACHE set to 1.
Where does a registry cache actually live?
Why does my registry cache export fail with the default builder?
What does mode=max change?
What is the difference between a remote build cache and a dependency cache?
Does a remote build cache work across branches and machines?
Yes, that is the property the word remote carries. The key is derived from the inputs of a unit of work rather than from a branch name or a machine identity, so a branch that touches one package hits the cache for every package it did not touch, and a laptop can reuse an entry a build server wrote.
What is a warm cache?
A warm cache is a cache that already holds the entries a run needs, so the run restores them and skips the work that produced them. Warmth is measured per lookup: a cache is warm for a run when the key that run computes finds a matching entry in a store the run is allowed to read.
What makes a cache cold?
How do you keep a cache warm across runs?
Keep the key stable, keep the scope shared, and keep the entry in use. Derive the key from inputs that change when the cached content changes, such as a lockfile hash, rather than from a commit SHA or a timestamp. Write the entry on the default branch so every branch created from it can fall back to that copy.
Do Caches Carry Across Branches?
Do GitHub Actions Caches Work Across Architectures?
How Do I Cache Bundler Gems?
Cache vendor/bundle and key the entry on a hash of Gemfile.lock plus the Ruby version and the runner platform. Point bundler at that same directory first with bundle config set --local path vendor/bundle, so the cache path and the install path are one directory, and run bundle install in deployment mode so a Gemfile.lock that no longer matches the Gemfile fails the job instead of resolving new versions on the runner.
How Do I Cache Cargo Dependencies?
How Do I Cache CocoaPods in GitHub Actions?
Cache three paths and derive the key from Podfile.lock: the Pods directory in the checkout, ~/Library/Caches/CocoaPods, and ~/.cocoapods/repos. Then run pod install --deployment so a lockfile that no longer matches the Podfile stops the job instead of resolving new versions in the background.
How Do I Cache Composer Dependencies?
Cache the directory that composer config cache-files-dir prints, and key the entry on a hash of composer.lock. With that entry restored, composer install --prefer-dist --no-interaction copies distribution archives off the runner disk instead of fetching one archive per package from Packagist and the git hosts behind it, which turns the install step into a local copy rather than a set of downloads.
How Do I Cache pip Dependencies in GitHub Actions?
Caching pip dependencies in GitHub Actions takes one input, because caching is off by default on the Python setup action and a workflow that never sets it re-downloads every package on every run. Set cache to pip, pipenv, or poetry, and point cache-dependency-path at the requirements or lock file whose contents should invalidate the entry.
How Do I Cache uv or Poetry Environments?
How Do I Cache Yarn Berry Installs?
Cache the folder that yarn config get cacheFolder prints, key it on the hash of yarn.lock, and run yarn install --immutable so a lockfile that drifts fails the job rather than rewriting itself. A zero-install repository needs no cache step at all, because its package archives are committed to .yarn/cache and arrive with actions/checkout.
How Long Do GitHub Actions Caches Last?
What Are restore-keys in GitHub Actions?
restore-keys is an ordered list of key prefixes the cache action falls back to when the primary key finds no entry. The action walks the list top to bottom, and the first prefix that matches at least one stored entry restores the most recently created of those entries, so a job whose lockfile just changed still starts from the previous run's dependency tree instead of an empty directory.
Snapshots
Save prepared environments and reuse their disk state.
Which WarpBuild runners support snapshots?
What is the difference between snapshot.enabled and snapshot.key?
Does the /tmp directory survive a runner snapshot?
How can a job detect that it booted from a snapshot?
Should I remove credentials before saving a snapshot?
What are the default snapshot save timeout and failure behavior?
Does a VM snapshot include the contents of memory?
Why does a job still reinstall dependencies after booting from a snapshot?
Can I Keep a Database Warm Between Jobs?
Yes, on WarpBuild Cloud Ubuntu runners. Seed the database once, capture the machine with the WarpBuilds/snapshot-save action after the data is loaded, and later jobs that request the same snapshot alias boot with the data directory already on disk, so they start the database process and run tests instead of importing the dump again.
Can I Snapshot a Runner on a Feature Branch?
Yes. Snapshot behavior is requested by a label on the job, so any branch can boot from a snapshot or write one, and the two documented shapes are a clean snapshot published on the default branch that feature branches read with snapshot.key=<alias>, or an incremental alias that the branch refreshes on every push.
Do Snapshot Runners Replace the Cache?
Do Snapshot Runners Work on macOS?
No. Snapshot runners are documented for Linux x64 and Linux ARM64 runners, and macOS runners are listed as an unsupported platform, so an Xcode job cannot boot from a saved machine image. A macOS job keeps warm state the other way, by caching the directories that hold compiled output and resolved packages.
How Are Snapshot Storage Costs Billed?
How Long Do Runner Snapshots Last?
Runner snapshots are temporary and are deleted after 15 days, per the snapshot runners documentation. An alias that no workflow rewrites inside that window stops resolving, and the next job that requests it boots from the base image and runs normally, so an expiry costs a slow job rather than a failed one.
What Are Snapshot Runners?
A snapshot runner is a GitHub Actions runner that boots from a saved image of a previous run's virtual machine instead of from a clean base image, so the packages, dependency directories, container images, and build outputs an earlier run left on disk are already present when the first step executes.
Bring Your Own Cloud (BYOC)
Managed runners in your AWS, GCP, or Azure account.
Can BYOC Runners Reach Internal Services?
Does BYOC Support Windows Runners?
How Do I Tag Runner Resources for Cost Allocation?
What are the three steps to configure BYOC?
What is a WarpBuild stack?
Can I import existing infrastructure on every BYOC cloud?
Can I run macOS inside my BYOC account?
Where do I configure the BYOC standby pool?
Can standby disks use spot instances?
What happens when no standby disk is available?
What does BYOC stand for?
BYOC stands for bring your own cloud. It describes a deployment model where a vendor operates the control plane for a service while the compute, storage, and network resources that do the work are created inside the customer's own cloud account, under the customer's ownership and on the customer's cloud invoice.
How is BYOC different from self-hosted?
Both place the workload in infrastructure the customer owns. They differ in who operates it. Under self-hosted, the customer runs the orchestration, the scaling policy, the image builds, and the upgrades. Under BYOC, the vendor's control plane performs those operations remotely through a scoped role the customer grants.
Who pays the cloud bill under BYOC?
Does BYOC give the vendor access to my cloud account?
It gives the vendor a scoped identity, typically an IAM role, a service account, or a managed identity, with permissions limited to the resource types the service manages. The customer defines the trust relationship and the permission set, can audit every API call in the cloud provider's own audit log, and revokes access by removing the role.
What is an IAM instance profile?
What is the difference between an IAM role and an instance profile?
The role carries the permissions policy and the trust policy. The instance profile is the wrapper that lets EC2 pass that role to a machine. An instance profile holds at most one role, and the console creates a profile with the same name as the role, which is why the two are often confused.
Why does attaching an instance profile fail with a PassRole error?
The identity launching or modifying the instance needs iam:PassRole on the role inside the profile. Handing a role to a machine is a privilege escalation path, so AWS requires that grant separately from ec2:RunInstances, usually scoped with a condition on iam:PassedToService equal to ec2.amazonaws.com.
What is the difference between IMDSv1 and IMDSv2?
Why does a container on the instance fail to read instance metadata?
IMDSv2 token responses carry an IP time-to-live, called the response hop limit, that defaults to 1. A packet leaving the instance for a container on a bridge network crosses one hop, so the token response expires before it arrives. Raising the hop limit to 2 lets containers reach the service, and leaving it at 1 keeps metadata inside the instance.
What does the metadata service return that a build might need?
The instance identity fields (instance id, instance type, region, availability zone, private and public IPv4 addresses) and, when a role is attached to the instance, temporary credentials under /latest/meta-data/iam/security-credentials/. Cloud SDKs read that credential path automatically as the last step of their default credential chain.
What is a cloud instance type?
An instance type is a catalog entry a cloud provider publishes under a name such as m6id.2xlarge or c4a-standard-4-lssd. The name maps to a fixed shape: a vCPU count, a memory size, the storage physically attached to the machine, and a network bandwidth ceiling. Every instance launched with that name gets the same shape.
Do two instance types with the same vCPU count run a build at the same speed?
Does the instance type decide the disk a GitHub Actions job writes to?
Partly. The instance type decides whether the machine has an instance store device at all, because only names carrying the matching suffix include one. The boot volume behind the work directory is a separate launch setting with its own size, type, and performance, so two machines of the same instance type can still present different disks to a job.
What is a spot instance?
Which GitHub Actions jobs are safe to run on spot instances?
What is fallback instance selection and why does it matter on spot?
Fallback instance selection lets a runner configuration name several acceptable instance types instead of one, so the launcher can pick whichever type has capacity at that moment. Spot availability is per pool, meaning per instance type, per zone, so a single pinned type can leave jobs queued while a near identical type nearby has capacity.
Does a standby disk cost money while nothing is running on it?
Can GitHub Actions Runners Run in My Own Cloud Account?
Can I Attach an IAM Role to a BYOC Runner?
Can I Restrict Outbound Traffic From Runners?
Can I Run BYOC in More Than One Region?
Can BYOC Runners Run in a Private Subnet?
Yes. WarpBuild BYOC runners launch in private subnets when you enable static IPs on the custom runner configuration, and the placement works as long as the route tables and the security group let each instance reach the destinations the runner needs. Those destinations and the network shape around them are listed in the AWS BYOC configuration prerequisites.
Can I Use My Existing VPC With BYOC Runners?
Yes. On AWS you create the BYOC stack in import mode, which takes an existing VPC, subnets, and security group as inputs instead of having the CloudFormation template provision them, and the import works once that network meets the prerequisites in the AWS BYOC configuration guide.
Do BYOC Runners Need a NAT Gateway?
Does BYOC Support Custom VM Images?
Does BYOC on GCP Support Local SSD?
Yes. GCP BYOC runners support Local SSD, and the mount is automatic: when the Compute Engine machine types on a runner configuration ship bundled Local SSDs, such as the -lssd machine types, WarpBuild detects the NVMe devices during boot, formats them, and mounts them to the runner work directory on Linux images.
How Does BYOC Billing Work?
What Gets Created in My Cloud Account?
What Permissions Does BYOC Need in My AWS Account?
AWS BYOC uses an IAM role created during cloud connection. The configuration guide lists permissions for runner lifecycle, networking, storage, and stack management. Review the actual CloudFormation policy with your cloud administrators rather than granting a blanket administrator role.
Performance and Scaling
Concurrency, right-sizing, and shorter feedback loops.
Do I Need to Rewrite My Workflow for Faster Runners?
How Do I Choose a GitHub Actions Runner Size?
How Fast Does a Runner Start After Queueing?
Which WarpBuild runners support unlimited concurrency?
What makes a runner an autoscaling runner?
Its capacity follows the job queue. A queue signal reports that jobs are waiting, a provisioning step boots machines and registers them with the labels the workflow asks for, and a teardown rule removes them once the work is done. GitHub's self-hosted runners reference describes autoscaling as dynamically adjusting the number of self-hosted runners based on demand.
Why does GitHub recommend ephemeral runners for autoscaling?
Because an ephemeral runner accepts exactly one job and then deregisters, so job completion and capacity release are the same event. GitHub's self-hosted runners reference recommends autoscaling with ephemeral runners and advises against autoscaling persistent runners, since a persistent runner can be assigned a job while it is shutting down.
What happens when the autoscaler is too slow?
The job waits. GitHub does not fail a job that has no matching runner online; it stays queued until a runner carrying every requested label comes online, and GitHub's Actions limits page documents a 24 hour job queue time after which the job is automatically cancelled. A scaling gap therefore reads as a slow queue rather than an error.
Is a cold start the same thing as queue time?
Do ephemeral runners always pay a cold start?
Every job on an ephemeral runner starts on a machine with no history, so the full window is there by default. What shortens it is state that arrives with the machine rather than state left behind by an earlier job: a prebuilt image, a restored cache, a disk captured on an earlier run, or a machine that was booted before the job was queued.
What is a concurrency limit in GitHub Actions?
A concurrency limit is a ceiling on how many jobs are allowed to run at the same time. Three separate ceilings carry that name: the concurrency key written into a workflow, the concurrent job allowance attached to the account plan, and the number of runners available to accept jobs for a given runs-on label.
Does the concurrency key limit how many jobs run in parallel?
Is a concurrency limit the same thing as queue time?
Queue time is the symptom and a concurrency limit is one of its causes. Queue time is the gap between the moment a job is queued and the moment a runner starts it, and that gap grows whenever a ceiling holds the job back, whenever no runner matches the labels, or whenever the fleet is busy.
What is queue time in GitHub Actions?
What is the difference between remote execution and remote caching?
Which build tools support remote execution?
The Remote Execution API repository lists Bazel, Buck2, BuildStream, Justbuild, Pants, Please, Recc, Reclient, and Siso as clients that distribute builds to workers through it, read on 2026-08-13. Support is per tool: the tool has to model its work as discrete actions with declared inputs before it can send one anywhere.
What still runs on the local machine under remote execution?
What is a good CPU utilization number for a GitHub Actions job?
Why is my job slow when CPU utilization is low?
Low CPU utilization means the bottleneck lives somewhere else. The usual candidates are a single-threaded step that can only occupy one core, a step waiting on network transfer such as a dependency download or an image pull, and a step waiting on disk throughput. Memory pressure produces the same shape once swapping starts.
What is a task graph in a build tool?
Why does a task graph skip tasks?
What is the difference between test sharding and running tests in parallel?
Parallel workers run several test processes on one machine and share its checkout, its installed dependencies, and its vCPU budget. Sharding splits the suite across separate machines, so each shard pays its own setup cost and the ceiling is the number of jobs that can run at once rather than the size of one machine. Large suites usually use both.
What happens when one shard fails?
With fail-fast set to false the remaining shards keep running, so one run reports every failure in the suite instead of stopping at the first. The merge job needs if always() so it still collects artifacts from failed shards, otherwise the merged report is skipped whenever a shard is red.
What is a warm pool?
A warm pool is capacity prepared before anything asks for it. Machines are provisioned ahead of demand and held part way or all the way through the startup path, so an arriving job attaches to a machine that has already booted rather than waiting for one to be created, booted, and registered.
What happens when the warm pool is empty?
The request falls back to cold provisioning. A fresh machine is created, booted, and registered, and the job runs on it as usual, so the pool changes when a job starts rather than whether it starts. The visible signature is a Set up job step that takes far longer on some runs than others.
Do Runner Groups Limit Concurrency?
No. A runner group is an access boundary around a set of self-hosted runners: it decides which repositories may use them and, on GitHub Enterprise, which workflow paths, branches, tags, and commit SHAs may claim them, and no field in that access list holds a parallel job count, so adding or removing a group changes who may run while leaving the number of simultaneous jobs alone.
How Do I See CPU and Memory Usage for a Job?
CPU and memory for a GitHub Actions job come from an agent running on the runner machine: the WarpBuild agent emits system metrics in OpenTelemetry format over port 33931, and the observability Usage view draws those metrics against the same job's GitHub Actions log timeline so a spike and the step that caused it sit on one screen.
What Happens When Two Workflows Share a Concurrency Group?
They serialize against each other. A concurrency group is a lane across the repository rather than a setting scoped to one workflow file, so when two workflows resolve the same group string, GitHub allows one run in that lane at a time and parks the other as pending, per the concurrency reference in the workflow syntax docs.
Security and Compliance
Isolation, credentials, access controls, and security evidence.
How does WarpBuild isolate runner workloads?
What is WarpBuild’s policy on build secrets?
Where can I request WarpBuild’s SOC 2 report?
What separates an audit log from an application log?
Which GitHub Actions changes appear in an organization audit log?
Configuration and permission changes rather than job output. Adding or removing a self-hosted runner, moving a runner between runner groups, changing Actions settings for a repository, and changing who can administer those settings all produce entries. What a job printed lives in the workflow run logs instead, under a separate retention setting.
Can a workflow read the audit log through the REST API?
How long does a GitHub App installation token last?
One hour. The app signs a JSON Web Token with its private key, exchanges that for an installation access token, and the installation token expires 60 minutes later. The JWT itself has to expire within 10 minutes of issue, so both credentials in the chain are short lived by design.
What permissions does a GitHub App need to manage self-hosted runners?
Read on repository Metadata, read on repository Actions so it can receive the workflow_job webhook and read run state, read and write on repository Administration to manage repository level runners, and read and write on the organization Self-hosted runners permission for organization level runners and runner groups. Repository Contents is not part of that set.
What is OIDC token exchange in GitHub Actions?
A job asks GitHub's OpenID Connect provider for a signed identity token that describes the repository, branch, and workflow it is running from. It sends that token to a cloud provider, which validates the signature and compares the claims against a trust policy, then returns temporary credentials. No long lived cloud key is stored in the repository.
How is the exchange restricted to one branch?
What is a personal access token?
A personal access token is a credential created by an individual user that authenticates API and Git requests as that user. It is presented as a bearer credential in place of a password, and every request it makes runs under the permissions of the account that created it, narrowed by the scopes or permissions chosen at creation.
What is the difference between a classic and a fine-grained personal access token?
Should a GitHub Actions workflow use a personal access token?
How long does a runner registration token last?
One hour. GitHub's REST reference for self-hosted runners states that the token expires after one hour, which applies to the repository, organization, and enterprise endpoints alike. A token minted at 09:00 is useless at 10:01, so registration scripts fetch a fresh token at the moment a machine boots.
Where does a runner registration token come from?
GitHub mints it. The web UI prints a fresh token into the setup commands under Settings, Actions, Runners, and the same token is available from the REST API at POST /repos/{owner}/{repo}/actions/runners/registration-token, POST /orgs/{org}/actions/runners/registration-token, or the enterprise equivalent. Minting one requires admin permission at that scope.
Does the runner keep using the registration token after setup?
What is the difference between an SBOM and a vulnerability scan?
An SBOM is the inventory: the components, their versions, and the identifiers that name them. A vulnerability scan is a join between that inventory and an advisory database, performed at scan time. The same SBOM produces different findings a month later, because the advisory data moved while the artifact stayed the same.
Does an SBOM need to be signed?
An unsigned SBOM is a JSON file that anyone with write access to the release can replace. Signing it, or publishing it as an attestation bound to the artifact digest, gives a consumer something to verify: that this document describes this exact artifact and was produced by the identity it claims.
Can I Restrict Which Repositories Use My Runners?
How Do I Set Permissions for GITHUB_TOKEN?
Declare a permissions block at workflow level holding the minimum scopes every job needs, usually contents: read, then widen it with a job level block inside the single job that needs more. Both levels use the same map of scope name to read, write, or none, documented in GitHub's workflow syntax reference, checked on 2026-08-13.
Networking
Private services, Tailscale, subnets, and outbound access.
How do I enable the Tailscale networking addon?
Can different jobs use different tailnets?
What happens if the Tailscale addon cannot connect?
Does the networking addon support Windows and macOS?
Can I combine Tailscale networking with snapshots?
Which Tailscale arguments does WarpBuild manage?
Is a Tailscale OIDC Client ID a secret?
What does a custom image need for the networking addon?
What is a NAT gateway in simple terms?
What is the difference between a NAT gateway and an internet gateway?
An internet gateway allows connections in both directions, so an instance behind one can be reached from the internet if it holds a public address and a security group permits it. A NAT gateway allows outbound connections only and carries a per gigabyte data processing charge that an internet gateway does not.
Why does a NAT gateway show up on the cloud bill?
What is a security group in cloud networking?
A security group is a stateful firewall attached to the network interface of a cloud instance. It holds two lists of allow rules, one for inbound traffic and one for outbound traffic, and each rule names a protocol, a port range, and a source or destination such as a CIDR block or another security group.
What is the difference between a security group and a network ACL?
A security group attaches to a network interface, carries allow rules only, evaluates every rule as one set, and is stateful. A network ACL attaches to a subnet, carries both allow and deny rules, evaluates them in rule-number order until one matches, and is stateless, so return traffic needs its own rule covering the ephemeral port range.
Can a GitHub Actions runner work with no inbound security group rules?
What is a subnet in a cloud network?
A subnet is a range of IP addresses carved out of a larger virtual network. Every machine launched into it takes an address from that range, and the routes attached to the subnet decide where traffic leaving those machines is allowed to go. AWS scopes a subnet to a single Availability Zone, while Google Cloud subnets are regional.
What is the difference between a public subnet and a private subnet?
The difference is one route. AWS documents a public subnet as one whose route table has a direct route to an internet gateway, and a private subnet as one without that route, where resources need a NAT device to reach the public internet. Nothing about the address range itself changes.
How many IP addresses does a subnet need for GitHub Actions runners?
What is a VPC in plain terms?
What is the difference between a VPC and a subnet?
The VPC holds the whole address range and the routing configuration. A subnet is one block of that range with its own route table, and on AWS a subnet lives in exactly one Availability Zone. Machines are placed in subnets rather than in the VPC directly, so subnet choice decides the zone and the default route a machine gets.
Why would build machines run inside a VPC?
Because the services a build step needs often have no public address. A machine in the same VPC reaches an internal package registry or a database endpoint directly over the private range, which leaves both services unpublished and removes the proxy that would otherwise sit in front of them.
Observability and Debugging
Metrics, logs, reports, and investigating a running job.
Where can I see runner right-sizing recommendations?
Why is telemetry missing for a short job?
Can I export telemetry to my own monitoring backend?
Can I export telemetry without storing it in WarpBuild?
When does a telemetry export configuration change take effect?
Which resource measurements are available for runner diagnostics?
Where are WarpBuild’s cost and performance reports?
Why are CPU and memory columns blank in Jobs reports?
Which percentiles can I compare in Jobs reports?
What does p95 build duration mean?
How is a flaky test different from a broken test?
How many times should I re-run a test to confirm it is flaky?
Enough repetitions that the expected number of failures is at least a few, which is repetitions multiplied by the estimated flake rate. Thirty repetitions of a test that fails 5 percent of the time come back all green only about 21 percent of the time, so thirty attempts catch that test roughly four times in five.
What is OpenTelemetry in one sentence?
What is the difference between OpenTelemetry and a monitoring backend?
OpenTelemetry covers production and transport: how a process records a span or a measurement, what the attributes are called, and how the data reaches a receiver over OTLP. Storage, indexing, querying, dashboards, and alerting belong to whichever backend accepts the data, and swapping that backend is an endpoint change rather than a reinstrumentation project.
Can GitHub Actions jobs emit OpenTelemetry data?
Pricing and Billing
Understand usage, infrastructure costs, and your bill.
How Do I See Cost per Runner Label?
Can I pay for WarpBuild through AWS Marketplace?
Are free credits available with AWS Marketplace billing?
Why can AWS Marketplace costs differ from the WarpBuild dashboard?
What are egress costs?
Is inbound data charged as well?
Do I Pay a Seat Fee for GitHub Actions Runners?
Do I Pay for Both the Runner and the Builder?
Do Public Repositories Pay for Runners?
A public repository pays nothing for minutes on standard GitHub-hosted runners, and it pays the machine supplier for everything else. WarpBuild runners can be enabled for public repositories with the documented setup, and the security considerations for pull requests from forks are documented alongside it on the same page.
How Do I Estimate My GitHub Actions Bill?
How Is a Remote Docker Builder Billed?
How Much Do GitHub Actions Runners Cost?
Are ARM64 GitHub Actions Runners Cheaper Than x64?
Is It Cheaper to Run Fewer, Larger Runners?
What Does GitHub Actions Cache Storage Cost?
Cache for GitHub Actions has two price components on WarpBuild hosted runners: $0.20 per GB-month of storage and $0.0001 per cache write, restore, or list operation. Both components are free on BYOC runners, where add-ons are included and the compute is billed by your own cloud account.
Integrations and APIs
API access, MCP, automation, and infrastructure as code.
How do I create a WarpBuild API key?
Which product scopes can an API key have?
How do I authenticate a WarpBuild API request?
What does the WarpBuild Terraform provider support?
Do I need an API key for agent-assisted onboarding?
What is an MCP server?
An MCP server is a program that implements the Model Context Protocol and offers three kinds of capability to an AI application: tools the model can call, resources the application can read, and prompt templates a user can pick. The application discovers what a server offers by asking it, so no integration code is written for that one pairing.
Does the language model connect to the server itself?
Can AI Agents Run GitHub Actions Jobs?
Enterprise Infrastructure
Deployment choices, data residency, and enterprise requirements.
Can I Keep Builds in the EU Only?
Does the standard github.com app work on my GitHub Enterprise host?
What is a control plane in simple terms?
What is the difference between a control plane and a data plane?
Where is the data plane in a GitHub Actions workflow?
The runner is the data plane. GitHub queues the job and matches the labels in runs-on, and the runner machine performs the checkout, compiles the code, holds the secrets in the step environment, and writes the artifacts. The runs-on line is where the boundary between the two planes appears in the workflow file.
What is data residency in plain terms?
Data residency is the requirement that a named set of data is stored and processed inside a defined geography, such as a country, an economic area, or a single cloud region. A complete requirement names three things: the data in scope, the geography, and the operations covered, which usually means storage at rest, processing, and backups.
Is data residency the same as data sovereignty?
What data does a GitHub Actions run actually produce?
Seven classes show up in most reviews: the source checkout on the runner disk, dependency and build caches, uploaded artifacts, container images pushed to a registry, job logs, the secret values delivered into the job environment, and run metadata such as queue records and timings.
Does encryption satisfy a data residency requirement?
Usually no. Encryption is a confidentiality control that limits who can read data; residency is a location control that limits where data sits and where it is processed. Encrypted data stored outside the required geography is still stored outside it. Encryption and key custody matter to the neighboring sovereignty question, because whoever holds the keys can produce plaintext.
What is single sign-on?
Single sign-on is an arrangement where one system, the identity provider, authenticates a user once and then asserts that identity to other applications. Each application trusts a signed statement from the identity provider instead of storing a password for that person, and it still applies its own authorization rules once it knows who the user is.
What is the difference between SAML 2.0 and OIDC?
Does single sign-on remove access everywhere when someone leaves?
It removes the sign-in path. A disabled account in the identity provider can no longer complete a challenge, so no new session starts in any connected application. Sessions already open and credentials issued outside the browser flow, such as personal access tokens, survive until a provisioning protocol such as SCIM or a manual step revokes them.
Where Do GitHub Actions Runners Run?
How do I discuss region-specific infrastructure with WarpBuild?
Migration and Setup
Move workflows, validate results, and roll back safely.
Can I migrate a single job first?
How do I roll back a runner migration?
What Changes When a Workflow Moves to ARM64?
Select an ARM64 runs-on label, then check every architecture-specific binary, native dependency, and container image. Validate working-directory assumptions and separate compiled-output caches by architecture. A label change selects hardware but does not make x64-only tools ARM64-compatible.
Troubleshooting
Find the cause of queued jobs, cache misses, and build failures.
Why is an installed WarpBuild app not picking up my repository’s jobs?
Why does a custom-image job receive a shutdown signal?
How do I enable Dependabot on a custom runner?
Why is my GitHub Actions job stuck in the queue with no logs?
How Do I Debug a Failed GitHub Actions Job?
How Do I Reproduce a CI Failure Locally?
How Do I Retry a Failed Step in GitHub Actions?
Why Are My GitHub Actions Builds Slow?
Why Do Python Tests Run Slower in CI?
Why Does Cargo Rebuild Everything in GitHub Actions?
A fresh runner starts without Cargo’s target directory unless it is restored. Even after restoration, changed toolchains, features, compiler flags, or other inputs can invalidate fingerprints. Inspect Cargo’s rebuild diagnostics and key the cache for the relevant toolchain and platform.
Why Does Docker Build Run Out of Disk?
Why Does My GitHub Actions Cache Miss Every Run?
Why Does My Job Show High IO Wait?
Why Is My Cache Restore Slow?
Why Is My Docker Build Slow in GitHub Actions?
Why Is My GitHub Actions Bill So High?
Comparisons and Alternatives
Evaluate runner options against your team's requirements.
What does Actions Runner Controller actually do?
It runs inside a Kubernetes cluster, watches custom resources in the actions.github.com API group, and keeps a set of self-hosted GitHub Actions runners registered as pods. A listener pod per runner scale set holds an outbound long poll to the GitHub Actions Service, and each assigned job gets one ephemeral runner pod that is deleted when the job finishes.
How does a workflow target an ARC runner scale set?
By the name the scale set was installed under. The Helm installation name becomes the label the scale set registers with, so a release installed as arc-runner-set is reached by runs-on: arc-runner-set. Setting runnerScaleSetLabels adds further labels, and a job then names them the way it names any other self-hosted runner labels.
How does ARC decide how many runners to run?
The listener creates one ephemeral runner per assigned job, bounded by the minRunners and maxRunners values in the scale set chart. Both are static Helm values, so changing them is a redeploy, and GitHub's documentation states that ARC does not support scheduled maximum and minimum configurations and suggests a cron job to update the configuration on a schedule.
Can I Mix GitHub-Hosted and Managed Runners?
GitHub-Hosted vs Self-Hosted Runners
What should I compare when choosing a runner provider?
LET’S TALK
Still have questions?
Talk to the WarpBuild team about your CI infrastructure, runner requirements, or implementation questions.