Runners
3 min read

Semaphore vs BuildPulse runners: the same pipeline for 27% to 38% less per build

Semaphore lets a job run on a machine you bring, for a fee of $0.0025 a minute. We ran three real builds 10 times each to see whether a BuildPulse machine plus that fee beats Semaphore's own f1-standard-4. It does: 27% to 38% less per build.

BuildPulse Team

October 15, 2026

38%

less per build at most, 27% at least, fee included

12%

faster on the Node install, build and tests

64

vCPU at the top; Semaphore x86 stops at 4

$0.0025

Semaphore's own fee a minute, counted in every number here

Semaphore has one of the simpler pricing models in CI: pick a machine, pay by the minute. For x86 work the biggest machine on offer is f1-standard-4, 4 vCPU at $0.015 a minute.

Semaphore also lets a job run on a machine you bring, through a self-hosted agent. Pipelines, promotions, secrets and test reports stay in Semaphore. Only the machine changes, and Semaphore charges $0.0025 a minute for every job that runs that way.

That fee makes the question interesting. A BuildPulse x64-4x minute is $0.008, so with Semaphore's cut on top it is $0.0105. Is that still a better deal than Semaphore's own machine once real builds run on it?

To find out, we ran three pinned open-source builds 10 times each on f1-standard-4 and on a BuildPulse x64-4x, both 4 vCPU, in production on October 12, 2026. They are the same workloads behind our GitHub Actions benchmark, and the Semaphore pipeline, the script that writes it and every run's time are in github.com/buildpulse/runner-benchmarks.

The race

Median job times, straight from Semaphore's own job timer, replayed side by side and kept in proportion. The badge shows how much sooner BuildPulse finished:

Median job time, replayed to scale

Docker image build hugo's own Dockerfile, no cache

4% faster

Semaphore f1-standard-4

138.5 s

BuildPulse x64-4x

133.5 s

Node install, build and tests vuejs/core, pinned

12% faster

Semaphore f1-standard-4

51.5 s

BuildPulse x64-4x

45.5 s

Those medians come straight out of Semaphore. This is the same run in Semaphore's own workflow view, five of the ten rounds:

Semaphore · workflow view

Semaphore workflow graph: blocks bp-4x-r1 to r5 on the top row and sem-4x-r1 to r5 on the bottom row, each with node, go and docker build job times
Rounds 1 to 5 in Semaphore: BuildPulse x64-4x on the top row, f1-standard-4 on the bottom.

Node finished 12% faster and Docker 4% faster on BuildPulse. The bigger difference is the price.

A BuildPulse minute costs 30% less than an f1-standard-4 minute, even after Semaphore's fee. Add the build times above and one build costs 27% to 38% less, with the fee counted in full on every minute. In dollars, every $100 of Docker builds on f1-standard-4 is about $67 on BuildPulse. Node builds come to $62, and Go compiles $73.

Slide it to your own volume:

Your month

5,000 builds a month

Semaphore f1-standard-4

$173

BuildPulse x64-4x

$117

A year on BuildPulse

$676kept, 33% of the bill

and 7 fewer hours of builds every month.

Median benchmark time at each side's list price per minute, before any free allowance.

When 4 vCPU stops being enough

Semaphore's x86 machines top out at 4 vCPU (machine types). That is fine until a test suite outgrows it, and then the usual answer is splitting the work across more jobs. BuildPulse runs up to 64 vCPU, so a build that has hit the ceiling can move up a size and stay on Semaphore. Every size, with a monthly bill next to Semaphore's, is on buildpulse.io/pricing.

Try it on one block

You do not have to move a whole pipeline to find out whether this holds for your builds. Create an agent type in Semaphore, paste its registration token into BuildPulse, and change the machine on one block:

.semaphore/semaphore.yml

 agent:   machine:-    type: f1-standard-4-    os_image: ubuntu2404+    type: s1-bp-x64-4x

That block now runs on BuildPulse, and everything else stays on Semaphore. Each job gets a fresh machine, usually running in under a minute. If your numbers look like ours, move the next one. Setup steps are in the runner docs, and every size side by side is on BuildPulse vs Semaphore machines.

How we measured

  • The same jobs: vuejs/core v3.5.13 (install, build, unit tests), hugo v0.139.3 (Go compile) and hugo's own Dockerfile at the same tag, with no cache.
  • The same toolchain: Node 20.18.1 and Go 1.23.4, installed from the same tarballs on both machines, so the machine is the only thing that changes.
  • 10 runs per machine, one after another so no two runs competed, medians reported.
  • Semaphore's clock, not ours: job time is Semaphore's own job duration in whole seconds, the number its bill is based on.

Think something is off, or seeing different numbers on your own builds? Open an issue and tell us.

Semaphore prices from Semaphore pricing, checked October 5, 2026.

Move one Semaphore block and compare the bill

Create an agent type, paste its token into BuildPulse, and point one block at it. Everything else stays on Semaphore.

3,000 free minutes every month · No credit card required