Config
Bring the config you have.
Executors, commands, parameters, workflows, requires, matrix, branch filters and contexts. The compiler follows CircleCI's own compile rules.
ForgeCI runs your existing .circleci/config.yml on machines you control. Push to GitHub and Docker runners pick up the jobs, stream the logs live and report back to the pull request.
# The config you already have.
version: 2.1
jobs:
test:
docker:
- image: cimg/ruby:3.3
resource_class: spot
parallelism: 4
steps:
- checkout
- run: bundle install
- run: |
circleci tests glob "test/**/*_test.rb" |
circleci tests run --split-by=filesize \
--command="xargs bin/rails test"
workflows:
ci:
jobs: [test]
Features
A Rails control plane, a pure-Ruby config compiler and zero-dependency Docker runners.
Config
Executors, commands, parameters, workflows, requires, matrix, branch filters and contexts. The compiler follows CircleCI's own compile rules.
Runners
Runners poll over outbound HTTPS, so they work behind NAT. Route jobs with resource_class: checks on Spot instances, deploys on an on-demand host.
Tests
parallelism: 4 and circleci tests run give each runner a share of the files, balanced by size.
Logs
Step output streams to the dashboard as it runs, with secrets masked before they leave the runner.
GitHub
A GitHub App starts pipelines on push and pull request, clones private repos with short-lived tokens and posts commit statuses.
How it works
No inbound ports on your runners and no hosted control plane.
The GitHub App gets the webhook and reads .circleci/config.yml at that commit. Without the App, start a run from any script with forge-ci trigger.
The config is validated and compiled into workflows and jobs. A config with errors fails fast, with the error on the commit.
Runners claim queued jobs, run each step in Docker and stream logs back. A job starts as soon as the jobs it requires pass.
Compatibility
An unsupported feature fails with a clear error instead of running differently.
Supported
executors, commands, parametersrequires, matrix, branch filters, contextswhen conditions, timeoutsparallelism with circleci tests glob, split and run$BASH_ENV and CIRCLE_* variablesNot yet
machine, macos and windows executorssetup_remote_dockerQuickstart
Postgres, the control plane, the worker and a runner.
$ git clone https://github.com/azmi2409/forge-ci && cd forge-ci
$ cp .env.example .env # S3 bucket and credentials, secrets
$ openssl rand -hex 32 # paste into .env as RUNNER_TOKEN
$ docker compose up --build -d
$ docker compose up -d runner
# then open http://localhost:3000 and sign in
Create the S3 bucket first with aws s3 mb s3://<bucket>. For production, with HTTPS, the GitHub App and runners on their own hosts, follow the deploy guide.
Open source
Point ForgeCI at the config you have and run it on hardware you already own.
Get ForgeCI on GitHub