Skip to content
compiler.dev

Semaphore vs GitHub Actions with compiler.dev runners

Last updated

Semaphore is a hosted CI/CD service with transparent per-minute machine pricing and a pipeline model built around blocks and parallel jobs. It is a credible alternative to GitHub Actions, particularly for teams that care about fast test parallelism. If your code is on GitHub, though, you can usually get the same speed gain by changing the runner rather than the platform. Here is how they compare.

How Semaphore pricing works

Semaphore's pricing page (checked October 2026) lists pay-per-minute compute:

MachinePer minute
Ubuntu ARM, 2 vCPU$0.003
Ubuntu ARM, 4 vCPU$0.006
Ubuntu ARM, 8 vCPU$0.012
Ubuntu x64, 2 vCPU$0.0075
Ubuntu x64, 4 vCPU$0.015
macOS, 4 vCPU$0.09
Self-hosted agent, any machine$0.0025

The free tier is $15 of credit per month, which the page says is roughly 2,000 minutes on x64 2 vCPU. Other limits listed: 20 concurrent jobs by default (more on request), 20 GB a month of egress and 100 GB of artifact storage included, then $0.35 per GB egress and $0.07 per GB storage, and 9.6 GB of cache storage per project. Optional extras include a dedicated cache server or private Docker registry at $400 a month each, and support tiers from $50 a month.

The page does not list an 8 vCPU x64 option, so the closest like-for-like comparison with our default machine is the 4 vCPU x64 at $0.015.

Side by side

SemaphoreGitHub Actions + compiler.dev
Pricing modelPay per minute by machine type, free credit monthlyGitHub plan, plus per-minute runner credit
Linux x64 per minute$0.0075 (2 vCPU), $0.015 (4 vCPU)$0.003 (2 vCPU), $0.006 (4 vCPU), $0.012 (8 vCPU)
macOS$0.09/min (4 vCPU)$0.028/min (7-core), $0.055/min (14-core), early access
Config.semaphore/semaphore.yml, blocks and jobs.github/workflows/*.yml
Cachingcache store / cache restore CLIactions/cache plus machine caches
Self-hosted$0.0025/min agent feeSelf-hosted runners
EcosystemSmaller, focused on core CI featuresLargest marketplace
Where it runsSemaphore cloud, or your own agentsGitHub, jobs on compiler.dev VMs

Per-minute prices only mean something at equal speed. A 4 vCPU Semaphore minute and a 4 vCPU compiler.dev minute ($0.006) are the direct comparison; our 8 vCPU box at $0.012 is cheaper per minute than Semaphore's 4 vCPU.

Where Semaphore is genuinely better

  • Transparent, simple pricing. Machine type and price are on one page, with no credit conversion and no per-seat fee on the pay-per-minute model.
  • Cheap ARM. Ubuntu ARM at $0.003 for 2 vCPU is a low rate if you build for ARM.
  • Pipeline model. Blocks run in sequence or in parallel, and jobs inside a block fan out. Promotions model deployment gates in a clear way.
  • Test parallelism features. Semaphore has built-in tooling for splitting tests across parallel jobs and its own test reports and flaky test views.
  • Self-hosted agents for a flat fee. $0.0025 per minute on any machine is a simple model for hybrid setups.

The case for GitHub Actions on faster runners

Actions gives you native pull request integration, required checks, merge queue and the biggest library of reusable steps. A second CI means a second place to read logs, a second set of secrets and webhook plumbing.

The main objection is runner speed and cost. compiler.dev runs standard workflows on 8 vCPU / 16 GB Linux, a fresh VM per job, at $0.012 per minute, with dependency, git and Docker layer caches ready on the machine. GitHub's own 8-core larger runner is $0.022. In our benchmarks, Next.js + Go + Kafka + Redis went from 1m16s to 0m44s and Turborepo + Next.js + tRPC + MySQL from 3m29s to 1m53s versus GitHub-hosted runners. We did not benchmark Semaphore. If Semaphore's parallel blocks are what make you fast today, replicate that with a matrix, see test sharding on GitHub Actions.

Rates are on the pricing page, and the runner size picker helps you choose a size.

Migration sketch

A Semaphore pipeline:

version: v1.0
name: CI
agent:
  machine:
    type: e1-standard-4
    os_image: ubuntu2204
blocks:
  - name: Test
    task:
      prologue:
        commands:
          - checkout
          - cache restore deps-$(checksum package-lock.json)
          - npm ci
          - cache store deps-$(checksum package-lock.json) node_modules
      jobs:
        - name: Unit
          commands: [npm run test:unit]
        - name: Lint
          commands: [npm run lint]

The GitHub Actions equivalent:

name: ci
on: [push, pull_request]
jobs:
  test:
    runs-on: [self-hosted, Linux, compiler-ci]
    strategy:
      matrix:
        task: [test:unit, lint]
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: npm
      - run: npm ci
      - run: npm run ${{ matrix.task }}

Things to adjust:

  1. Machine type becomes the runner you pick. Our default is 8 vCPU; pick another size if your job is small.
  2. A block with a prologue that every job shares becomes repeated setup steps, since each job gets a clean machine. Caches keep that cheap, see caching guide.
  3. Promotions become jobs with needs: and an environment with approvals.
  4. Secrets move from Semaphore secrets to GitHub secrets.

Install the GitHub App when you are ready to try it.

FAQ

Is Semaphore free?

There is $15 of free credit a month, which Semaphore says is about 2,000 minutes on x64 2 vCPU (checked October 2026). After that it is pay per minute.

Is Semaphore cheaper than GitHub Actions?

On 2 vCPU x64, Semaphore is $0.0075 per minute against GitHub's $0.006. On larger machines the answer depends on the provider. Use the cost calculator with your own minutes.

Does Semaphore work with GitHub?

Yes, it connects to GitHub repositories. Results show as checks, though as a separate system alongside Actions.

How hard is it to migrate from Semaphore?

Usually small. The pipeline concepts map to jobs, matrices and needs. Plan more time for promotions and any custom Docker images.