Skip to content

Build CI Cost Notes

This note summarizes a direct smoke-test comparison of the current Blacksmith GitHub Actions usage against Buddy, CircleCI, and Buildkite.

Current GitHub Actions Usage

The repository currently uses blacksmith-4vcpu-ubuntu-2404 across most Linux jobs in .github/workflows.

Measured from GitHub Actions job data for 2026-04-01..2026-04-30:

Runner groupJobsActual job minutesRounded job minutes
Blacksmith300139.85308
GitHub macOS65.387
GitHub ubuntu-latest3111.6831

Blacksmith minutes by workflow:

WorkflowJobsActual minutesRounded job minutes
monitor-openapi-updates224109.17224
build-test1821.0230
stale-issues303.3530
Auto Publish Pets on Merge102.4010
validate121.938
build-source-registry10.901
publish-single-pet20.572
review-new-pet-scaffold10.301
suggest-new-pet-scaffold-template10.121
pr-standards10.101

Blacksmith's displayed Linux x64 base price is $0.004/min; the current 4-vCPU runner is approximately $0.008/min if priced proportionally.

Estimated April Blacksmith cost:

BasisEstimate
Actual seconds: 139.85 * $0.008$1.12
Rounded per job: 308 * $0.008$2.46

This usage appears likely to remain inside Blacksmith's included free minutes for this repository's current volume.

Buddy

The Buddy CLI was installed and authenticated:

bash
brew tap buddy/bdy
brew install bdy
bdy version

Installed CLI version: 1.22.23.

Two disposable Buddy pipelines were created in raggle/openpets, executed, and then deleted.

Smoke Run

Pipeline: codex-buddy-cost-smoke

Command:

bash
bdy pipeline run codex-buddy-cost-smoke \
  --workspace raggle \
  --project openpets \
  --branch main \
  --wait 10 \
  --clear-cache

Result:

MetricValue
Statussuccessful
End-to-end time8.067s
Build action time6.065s
Resource settingNANO
Revision51f3863

Execution URL:

text
https://app.buddy.works/raggle/openpets/pipelines/pipeline/559863/execution/69f3920dd9e9ce60919c87e2

Resource Probe

Pipeline: codex-buddy-resource-probe

Result:

MetricValue
Statussuccessful
End-to-end time4.811s
Build action time3.104s
Resource settingNANO

The probe logged host-level CPU and memory values, not a useful cgroup billing limit, so cost estimates should use Buddy's published GB-minute pricing rather than container introspection.

Buddy pricing used for estimation:

Plan/pricing itemValue
Free included usage300 pipeline GB-minutes
ProEUR 29/month
Pro included usage3000 pipeline GB-minutes
Overagefrom $0.0015 / GB-minute

Estimated Buddy overage value for the April Blacksmith workload if runtime is similar:

Assumed allocationApril GB-minutesOverage-rate value
1 GB139.85$0.21
4 GB559.40$0.84
8 GB1118.80$1.68
16 GB2237.60$3.36

Buddy overage reaches the estimated Blacksmith $0.008/min at about 5.33 GB of allocation. Below that, Buddy overage is cheaper per minute; above that, Blacksmith is cheaper per raw minute. On Buddy Pro, even a 16 GB equivalent of April's observed workload fits within the included 3000 GB-minutes.

CircleCI

The CircleCI CLI was already installed via Homebrew:

bash
circleci version

Installed CLI version: 0.1.36202+50a6f56.

The CLI was authenticated with a personal API token. Do not commit or document the token itself.

CircleCI project details:

FieldValue
Project sluggh/raggle-ai/openpets
Project IDab87c092-24b1-4a02-bb75-49815bcbf0f6
Organizationraggle-ai
Organization IDf88ea760-6314-4ffb-b361-2f7f8eb76e2a
Pipeline definition IDba6696d7-0989-5c4c-9e99-8e2c45669819

The existing CircleCI project points at .circleci/config.yml. Since that file was not present on main, an API-triggered pipeline on main errored immediately:

text
No configuration was found in your project.

To run a real test, a temporary branch was created and pushed:

FieldValue
Branchcodex/circleci-cost-smoke
Commite6722b4
Config.circleci/config.yml

The config used Docker small:

yaml
version: 2.1

jobs:
  smoke:
    docker:
      - image: cimg/node:20.20
    resource_class: small
    steps:
      - checkout
      - run:
          name: Probe runtime
          command: |
            node --version
            npm --version
            nproc
            grep MemTotal /proc/meminfo
            git rev-parse --short HEAD

workflows:
  smoke:
    jobs:
      - smoke

The config validated locally:

bash
circleci config validate .circleci/config.yml

CircleCI Runs

PipelineTriggerStatusJob runtime
#8branch push webhooksuccess9s
#9manual API triggersuccess21s

CircleCI pricing used for estimation:

ResourceCPURAMCredits/min
Docker small12 GB5
Docker medium24 GB10
Docker large48 GB20
Linux VM large415 GB20

CircleCI plan pricing:

Plan itemValue
Free included usage30,000 credits/month
Free small Docker equivalentup to 6000 build minutes
Performancestarts at $15/month
Additional credits$15 / 25,000 credits

Estimated CircleCI cost for the April Blacksmith workload:

CircleCI equivalentCreditsPaid-credit value
Docker small, 139.85 * 5699.25$0.42
Docker large / Linux large, 139.85 * 202797.00$1.68

Both estimates fit inside CircleCI's 30,000 monthly free credits.

Buildkite

The Buildkite CLI was installed from Buildkite's Homebrew tap:

bash
brew install buildkite/buildkite/bk@3
bk version

Installed CLI version: 3.40.0.

The CLI was authenticated with a Buildkite API token. Do not commit or document the token itself.

Buildkite token/account details:

FieldValue
Buildkite organizationanduimagui
Useranduimagui
User emailreandrew@fastmail.com
Token descriptionpets

The token could only see the anduimagui Buildkite organization, not a raggle/raggle-ai Buildkite organization. An existing anduimagui/openpets pipeline was present, but it pointed at Buildkite's starter repository:

text
git@github.com:buildkite/starter-pipeline-example.git

That starter pipeline had already run successfully:

PipelineBuildStatusEnd-to-end time
anduimagui/openpets#1passed21.590s

To run a repo-specific test, a disposable pipeline was created:

FieldValue
Pipelineanduimagui/openpets-cost-smoke
Repositoryhttps://github.com/raggle-ai/openpets.git
Branchcodex/circleci-cost-smoke
Commit2055b69
URLhttps://buildkite.com/anduimagui/openpets-cost-smoke/builds/1

Temporary pipeline YAML:

yaml
steps:
  - label: ":buildkite: OpenPets cost smoke"
    command: |
      echo "Buildkite cost smoke"
      uname -a
      nproc
      grep MemTotal /proc/meminfo
      git rev-parse --short HEAD

The config validated locally:

bash
bk pipeline validate --file .buildkite/codex-cost-smoke.yml

The build was triggered with:

bash
bk build create \
  --pipeline openpets-cost-smoke \
  --branch codex/circleci-cost-smoke \
  --commit HEAD \
  --message "Codex Buildkite cost smoke"

Result:

MetricValue
Statuspassed
End-to-end time8.957s
Job runtime3.607s
Queuedefault
Agent versionbuildkite-agent/3.123.1
CPU visible to job2
Memory visible to job4,073,716 kB

The disposable openpets-cost-smoke pipeline was deleted after the run.

Buildkite pricing used for estimation:

Plan/pricing itemValue
Personal included hosted-agent usage500 minutes/month
Personal Linux shapeSmall only
Personal Linux vCPU concurrencyUp to 6 vCPU
Pro$30 / active user / month
Pro included hosted-agent usage2000 minutes/month
Hosted-agent overage$0.013 / minute

Estimated Buildkite cost for the April Blacksmith workload:

BasisEstimate
Actual seconds: 139.85 * $0.013$1.82
Rounded per job: 308 * $0.013$4.00

Both estimates fit inside Buildkite Personal's 500 included hosted-agent minutes. Buildkite is closer to CircleCI/Buddy operationally than Blacksmith: it requires Buildkite pipeline configuration and hosted/self-hosted queues; it is not a direct GitHub Actions runs-on replacement.

Comparison

ProviderDirect test resultApril equivalent estimateNotes
BlacksmithExisting GitHub Actions data$1.12 actual / $2.46 roundedDrop-in runs-on replacement already in use
BuddyReal CLI-triggered smoke run succeeded in 8.067s$0.21-$3.36 depending on GB allocationRequires recreating CI as Buddy pipelines
CircleCIReal branch push/API runs succeeded in 9s and 21s$0.42-$1.68 depending on resource classRequires porting workflows to .circleci/config.yml
BuildkiteReal CLI/API-triggered hosted-agent run succeeded in 8.957s$1.82 actual / $4.00 roundedRequires Buildkite pipeline config and hosted/self-hosted queues

Recommendation

From a pure compute-cost perspective, all four options are effectively negligible for this repository's current usage, and Buddy/CircleCI/Buildkite all appear to fit within included free or bundled usage.

The main decision is migration cost:

  • Keep Blacksmith if the goal is the least operational change. It is already a drop-in GitHub Actions runner label.
  • Consider Buddy if the team wants Buddy's pipeline UX and is comfortable rebuilding workflows there. Cost should remain low unless large GB allocations are required.
  • Consider CircleCI if the team is willing to port GitHub Actions workflows into CircleCI config. The current project exists and runs successfully once a config is present, but it is not a direct runs-on replacement.
  • Consider Buildkite if the team wants a mature hosted-control-plane CI with a hosted-agent option or eventual self-hosted agents. For current usage, the hosted-agent minutes fit inside the Personal allowance, but workflows still need to be ported to Buildkite pipeline YAML.

Sources