Open Source CI/CD

PikoCI, the CI/CD that grows with you.

One binary. Any database. Runs anywhere.

Apache 2.0 licensed. Inspired by Concourse CI.

PikoCI deploys itself.

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.

pikoci / main
Loading live pipeline...
Public pipeline · no login required · view build status, logs, and pipeline graph without an account View pipeline.hcl on GitHub →

What makes it different.

01

Single binary

No Docker Compose. No Kubernetes. No setup scripts. Download and run.

02

Grows with you

Start in memory. Add SQLite for persistence. Add Postgres and distributed workers at scale. The tool never changes.

03

Run pipelines locally

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.

04

Five pluggable abstractions

Resource types, runners, services, secret backends, and notification types. Define once, reuse across jobs. Source any of them from a URL.

05

HCL pipelines

Terraform-style syntax. More expressive than YAML. Readable, reviewable, versionable.

06

Truly portable

Bundle the binary with a pipeline file and SQLite. Move it anywhere. Run it instantly.

Pipelines as code.

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"]
    }
  }
}

View PikoCI's own pipeline.hcl on GitHub →

Running in seconds.

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.