Skip to content

Set up CI

After you have pushed a repo, add a workflow and run it. Codebahn runs hosted CI on both plans. It implements GitHub Actions syntax, so most .github/workflows files run unchanged. For the differences, see compatibility.

Solo includes 200 minutes per month (one concurrent job). Crew includes 1,000 minutes per seat (pooled).

If your repository already has .github/workflows/, Codebahn picks it up. You can also use .codebahn/workflows/, .forgejo/workflows/, or .gitea/workflows/; when more than one exists, see workflow directories for precedence and de-duplication rules.

If you don’t have a workflow yet, create .forgejo/workflows/ci.yml. Each example below is a complete project with source, tests, and a working CI workflow. Clone one to get started, or browse the workflow file to copy it into your own repo.

LanguageWhat it runsRepository
Gogo vet + go test + Docker buildexample-go (workflow)
TypeScripttsc --noEmit + Vitestexample-typescript (workflow)
.NET 8dotnet restore + build + xUnitexample-dotnet (workflow)
Flutterflutter analyze + flutter testexample-flutter (workflow)

All workflows use on: [push, pull_request] and runs-on: codebahn-small.

runs-on: codebahn-small routes to Codebahn’s hosted runners in Paris (fr-par). ubuntu-latest is an alias for codebahn-small; you can also use codebahn-medium or codebahn-large for bigger runners. Go and Node are pre-cached in the job image, so actions/setup-go and actions/setup-node resolve offline. Popular actions are also mirrored locally if you want to keep CI traffic in the EU. Anything else (cloud CLIs, browsers, databases, other runtimes) you install in your workflow. See CI runners for the full image contents and runner sizes.

Terminal window
git add .github/workflows/ci.yml
git commit -m "ci: add workflow"
git push

Open the repository and click the Actions tab. Your run appears there with live logs. Pushing a new commit to the same branch cancels any in-progress run on that branch.

Each job’s wall-clock time is rounded up to a whole minute, then multiplied by the runner’s cost factor. A 5-minute job on codebahn-small (1x) uses 5 compute minutes. The same job on codebahn-medium (2x) uses 10, and on codebahn-large (3x) uses 15. A job that finishes in 20 seconds still counts as a minute.

A workflow with three parallel jobs that each run one minute on the default runner uses three compute minutes.

Concurrency is capped by member count: 2 concurrent jobs (1-5 members), 4 (6-15), 8 (16+). Above the cap, extra jobs wait until a slot frees. That is separate from the minute cap below.

Top-ups are €9 per 1,000 minutes, bought under Settings > Billing. Plan minutes drain first; top-up minutes are used only after, and they persist until consumed rather than resetting each month. See billing for limits and warnings.

BYO runners are available on all plans, alongside hosted runners.

You can register your own forgejo-runner alongside the hosted ones and route jobs to it by label. Give the runner a custom label, then target it with runs-on: my-label; jobs match by exact label. The registration token is single-use and is revoked after the first runner registers, so re-registering needs a fresh token.

See CI runners for the registration steps, or Run your own CI for BYO runner setup and external CI alternatives.