One binary. Any database. Runs anywhere.
Apache 2.0 licensed. Inspired by Concourse CI.
The pipeline that builds, tests, and deploys PikoCI is publicly visible. PR checks, integration tests against six backends, multi-arch Docker builds, zero-downtime self-redeployment. No account required to view it.
No Docker Compose. No Kubernetes. No setup scripts. Download and run.
Start in memory. Add SQLite for persistence. Add Postgres and distributed workers at scale. The tool never changes.
The pipeline is the environment. Run it anywhere. pikoci run -p pipeline.hcl -j test runs any job on your laptop — no server, no push, no waiting. Override resources with local paths. Iterate before touching CI.
Resource types, runners, services, secret backends, and notification types. Define once, reuse across jobs. Source any of them from a URL.
Terraform-style syntax. More expressive than YAML. Readable, reviewable, versionable.
Bundle the binary with a pipeline file and SQLite. Move it anywhere. Run it instantly.
Clean HCL syntax. Resources flow through jobs. Dependencies are explicit. No magic.
resource_type "git" { source = "pikoci://git" } resource "git" "app" { params { url = "https://github.com/myorg/app.git" name = "app" } } job "test" { get "git" "app" { trigger = true } task "run-tests" { run "docker" { image = "golang:1.25" cmd = "cd app && go test ./..." } } }
service_type "postgres" { start "exec" { path = "/bin/sh" args = ["-ec", "docker run -d --name pikoci-pg -p 5432:5432 -e POSTGRES_PASSWORD=test postgres:16"] } ready_check "exec" { path = "/bin/sh" args = ["-ec", "docker exec pikoci-pg pg_isready"] interval = "2s" timeout = "30s" } stop "exec" { path = "/bin/sh" args = ["-ec", "docker rm -f pikoci-pg"] } } job "integration" { service "postgres" {} get "cron" "tick" { trigger = true } task "test" { run "exec" { path = "make" args = ["test"] } } }
secret_type "env" { source = "pikoci://file" format = "env" path = "/etc/pikoci/secrets.env" } variable "deploy_token" { type = string secret "env" { key = "DEPLOY_TOKEN" } } resource_type "git" { source = "pikoci://git" } resource "git" "app" { params { url = "https://github.com/myorg/app.git" name = "app" token = var.deploy_token } } job "deploy" { get "git" "app" { trigger = true } task "push" { run "exec" { path = "/bin/sh" args = ["-c", "cd app && ./deploy.sh"] } } }
Three commands. No dependencies. Your pipeline is already loaded and running.
# Download the binary $ curl -L https://github.com/pikoci/pikoci/releases/latest/download/linux-amd64 -o pikoci && chmod +x pikoci $ ./pikoci server --db-system mem --run-worker --pipeline-config pipeline.hcl # Or use Docker $ docker run -p 8080:8080 ghcr.io/pikoci/pikoci:latest server --db-system mem --run-worker --pipeline-config pipeline.hcl # open http://localhost:8080
Your pipeline is already loaded and running.