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.
Role-based access, approval gates before deploys, audit log of every action, and OIDC single sign-on. The controls you need without the complexity you don't.
Terraform-style syntax. More expressive than YAML. Readable, reviewable, versionable.
Resource types, runners, services, secret backends, and notification types. Define once, reuse across jobs. Source any of them from a URL.
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/pikoci-linux-amd64 -o pikoci && chmod +x pikoci $ ./pikoci server --db-system mem --jwt-secret my-secret --run-worker --pipeline-config pipeline.hcl # Or use Docker $ docker run -p 8080:8080 ghcr.io/pikoci/pikoci:latest server --db-system mem --jwt-secret my-secret --run-worker --pipeline-config pipeline.hcl # open http://localhost:8080
Your pipeline is already loaded and running.