{"id":50409452,"url":"https://github.com/pikoci/pikoci","last_synced_at":"2026-06-11T17:00:43.764Z","repository":{"id":317116357,"uuid":"1065966765","full_name":"PikoCI/pikoci","owner":"PikoCI","description":"The CI/CD that grows with you. One binary, any database, any queue, runs anywhere.","archived":false,"fork":false,"pushed_at":"2026-06-07T06:24:31.000Z","size":14872,"stargazers_count":95,"open_issues_count":67,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-06-07T07:10:39.429Z","etag":null,"topics":["cd","ci","ci-cd","cicd","go","golang","queue"],"latest_commit_sha":null,"homepage":"https://pikoci.com","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/PikoCI.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-28T19:38:53.000Z","updated_at":"2026-06-07T06:56:10.000Z","dependencies_parsed_at":"2025-09-29T00:21:42.284Z","dependency_job_id":"df131352-312e-42b9-bb36-5bafd6a6dbdb","html_url":"https://github.com/PikoCI/pikoci","commit_stats":null,"previous_names":["xescugc/qid","xescugc/pikoci","pikoci/pikoci"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/PikoCI/pikoci","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PikoCI%2Fpikoci","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PikoCI%2Fpikoci/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PikoCI%2Fpikoci/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PikoCI%2Fpikoci/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/PikoCI","download_url":"https://codeload.github.com/PikoCI/pikoci/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PikoCI%2Fpikoci/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34208761,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-11T02:00:06.485Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cd","ci","ci-cd","cicd","go","golang","queue"],"created_at":"2026-05-31T03:00:25.608Z","updated_at":"2026-06-11T17:00:43.744Z","avatar_url":"https://github.com/PikoCI.png","language":"Go","funding_links":[],"categories":["Continuous Integration"],"sub_categories":["Standard CLI"],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"pikoci/transport/http/assets/images/logo.svg\" width=\"96\" height=\"96\" alt=\"PikoCI Logo\"/\u003e\n\n  # PikoCI\n\n  **The CI/CD that grows with you. One binary, any database, runs anywhere.**\n\n  [![Go Version](https://img.shields.io/badge/go-1.25+-blue)](https://golang.org)\n  [![License](https://img.shields.io/badge/license-Apache%202.0-yellow)](LICENSE)\n  [![Go Report Card](https://goreportcard.com/badge/github.com/pikoci/pikoci)](https://goreportcard.com/report/github.com/pikoci/pikoci)\n  [![Go Reference](https://pkg.go.dev/badge/github.com/pikoci/pikoci.svg)](https://pkg.go.dev/github.com/pikoci/pikoci)\n  [![GitHub Release](https://img.shields.io/github/v/release/PikoCI/pikoci)](https://github.com/PikoCI/pikoci/releases/latest)\n  [![Docker Image](https://img.shields.io/badge/docker-ghcr.io%2Fpikoci%2Fpikoci-blue?logo=docker)](https://github.com/orgs/PikoCI/packages/container/package/pikoci)\n  [![codecov](https://codecov.io/gh/PikoCI/pikoci/graph/badge.svg)](https://codecov.io/gh/PikoCI/pikoci)\n  [![Discord](https://img.shields.io/badge/Discord-Join%20us-5865F2?logo=discord\u0026logoColor=white)](https://discord.gg/gctEh24CTm)\n\n  [Documentation](https://docs.pikoci.com) · [Quick Start](#quick-start) · [Contributing](#contributing) · [Discord](https://discord.gg/gctEh24CTm)\n\u003c/div\u003e\n\n![PikoCI pipeline](https://ci.pikoci.com/teams/main/pipelines/pikoci/image.svg)\n\n## What is PikoCI?\n\nPikoCI is a self-hosted CI/CD system built around a resource/resource-type pipeline model, inspired by [Concourse CI](https://concourse-ci.org), but designed to run anywhere without operational pain.\n\nMost CI/CD tools either lock you into a cloud platform or require spinning up multiple services just to get started. PikoCI runs as a single binary with a pluggable database backend. Use what you already have, or run entirely in memory with zero external dependencies. Bundle your binary, your pipelines, and your database file, and move them anywhere.\n\nPipelines are defined in [HCL](https://github.com/hashicorp/hcl). The runner abstraction means you're not locked into a specific execution environment.\n\n\n## Features\n\n- **Single binary**: download and run. No Docker Compose, no Kubernetes, no setup scripts.\n- **Truly portable**: bundle the binary with your pipeline config and SQLite file. Move it anywhere, run it instantly.\n- **In-memory mode**: run the entire system in memory for development and testing. Zero files, zero cleanup.\n- **Any SQL database**: SQLite (built-in), MySQL, PostgreSQL, and any other SQL-compatible backend.\n- **Resource model**: pipelines built from resources and resource types. Clean, composable, reusable.\n- **HCL pipelines**: more expressive and readable than YAML. Familiar to anyone who has used Terraform.\n- **Flexible runners**: run jobs on the host machine, in Docker containers, or define your own runner.\n- **Pipelines at startup**: pass a pipeline config at launch and it's ready the moment the server starts. No CLI or UI step required.\n- **Public pipelines**: mark a pipeline as public so anyone can view its status without an account. Perfect for open source projects.\n- **Built-in UI**: visualize pipeline state, stream build logs, manage pipelines from a web interface.\n- **Teams and users**: multi-user support with team-based access control. [Granular role management planned (#207)](https://github.com/PikoCI/pikoci/issues/207).\n- **DOT graph output**: export pipeline state as a DOT graph, or as embeddable SVG/PNG images for READMEs and dashboards.\n\n\n## Quick Start\n\n### Download\n\n```bash\n# Linux (amd64)\ncurl -L https://github.com/PikoCI/pikoci/releases/latest/download/linux-amd64 -o pikoci\nchmod +x pikoci\n\n# macOS (amd64)\ncurl -L https://github.com/PikoCI/pikoci/releases/latest/download/darwin-amd64 -o pikoci\nchmod +x pikoci\n```\n\nOr build from source:\n\n```bash\ngit clone https://github.com/PikoCI/pikoci.git\ncd pikoci\ngo build -o pikoci .\n```\n\nOr pull the Docker image:\n\n```bash\ndocker pull ghcr.io/pikoci/pikoci:latest\n```\n\n### Run with a pipeline\n\nThe fastest way to get started. Pass a pipeline config directly at launch. When the server starts, your pipeline is already loaded and ready:\n\n```bash\n./pikoci server \\\n  --db-system mem \\\n  --jwt-secret my-secret \\\n  --run-worker \\\n  --pipeline-name my-pipeline \\\n  --pipeline-config pipeline.hcl\n```\n\nOr with Docker:\n\n```bash\ndocker run -p 8080:8080 ghcr.io/pikoci/pikoci:latest server \\\n  --db-system mem \\\n  --jwt-secret my-secret \\\n  --run-worker \\\n  --pipeline-name my-pipeline \\\n  --pipeline-config pipeline.hcl\n```\n\nOpen [http://localhost:8080](http://localhost:8080) and log in with the default user `admin` and password `admin123`. On first login with the default password, you will be redirected to the Profile page to set a new password.\n\n\u003e **Users:** pass `--users 'username:hashed-password'` to create users or override the default password at startup. Users who have changed their password via the UI/CLI are not affected. Use `pikoci user-password` to generate password hashes.\n\n### Example pipeline\n\nA cron resource checks for new versions every 10 seconds. When a new version is detected, it triggers the `gen` job, which runs `echo IN` on the host machine.\n\n```hcl\nresource \"cron\" \"my_cron\" {\n  check_interval = \"@every 10s\"\n}\n\njob \"gen\" {\n  get \"cron\" \"my_cron\" {\n    trigger = true\n  }\n  task \"echo\" {\n    run \"exec\" {\n      path = \"echo\"\n      args = [\"IN\"]\n    }\n  }\n}\n```\n\n\n## Local Execution\n\nRun a single pipeline job locally without starting a server. PikoCI spins up an in-memory database and worker in a single process, executes the job, streams the output, and exits with an appropriate exit code.\n\n```bash\n# Run a job from a pipeline file\npikoci run -p pipeline.hcl -j my-job\n\n# Override variables\npikoci run -p pipeline.hcl -j my-job --var db_password=local\n\n# Use a local directory instead of pulling a resource (type.name format)\npikoci run -p pipeline.hcl -j test --resource git.my-repo=./my-repo\n\n# Load variables from a JSON file\npikoci run -p pipeline.hcl -j my-job -v vars.json\n```\n\nResource overrides (`--resource name=path`) copy the local directory into the working directory, skipping the resource type's pull command entirely. This is useful for testing pipeline changes against local code.\n\nSee [#161](https://github.com/PikoCI/pikoci/issues/161) for more details.\n\n\n## Examples\n\nThe [`examples/`](examples/) folder contains ready-to-run pipelines and a Docker Compose file for one-command evaluation. See the [examples README](examples/README.md) for details.\n\n\n## Pipeline Visualization\n\nPikoCI can export pipeline state as a [DOT graph](https://graphviz.org/doc/info/lang.html):\n\n```bash\n# Export as SVG\npikoci client -u localhost:8080 pipelines graph -n my-pipeline | dot -Tsvg \u003e pipeline.svg\n\n# Live view in terminal\nwatch -n2 'pikoci client -u localhost:8080 pipelines graph -n my-pipeline | dot -Txtk'\n```\n\n\n## Running Workers Separately\n\nFor production setups, run the server and workers as separate processes on different machines:\n\n```bash\n# Server (logs a worker token on startup)\n./pikoci server --db-system mysql --jwt-secret my-secret --run-worker=false\n\n# Generate a worker token (or copy from server logs)\n./pikoci worker-token --jwt-secret my-secret\n\n# Worker, can run anywhere with HTTP access to the server\n./pikoci worker --pikoci-url http://your-server:8080 --worker-token \u003ctoken\u003e\n```\n\nFull server and worker configuration options are covered in the [documentation](https://docs.pikoci.com/Server).\n\n\n## Dogfooding: PikoCI runs its own CI\n\nPikoCI uses itself for CI. See it live at [pikoci.com/teams/main/pipelines/pikoci](https://pikoci.com/teams/main/pipelines/pikoci). The [full pipeline](deploy/pipeline.hcl) runs lint, unit tests, integration tests, and backend tests with services — all defined in HCL:\n\n```hcl\nresource_type \"git\" {\n  source = \"pikoci://git\"\n}\n\nresource \"git\" \"pikoci_pr\" {\n  params {\n    url   = var.git_url\n    name  = var.git_name\n    pr    = true\n    token = var.github_token\n  }\n}\n\njob \"lint\" {\n  get \"git\" \"pikoci_pr\" { trigger = true }\n  task \"make\" {\n    run \"docker\" {\n      image = \"golang:1.25.1\"\n      cmd   = \"cd ${var.git_name} \u0026\u0026 make lint\"\n    }\n  }\n}\n\njob \"test-mock\" {\n  get \"git\" \"pikoci_pr\" { trigger = true }\n  task \"make\" {\n    run \"docker\" {\n      image = \"golang:1.25.1\"\n      cmd   = \"cd ${var.git_name} \u0026\u0026 make test-mock\"\n    }\n  }\n}\n\njob \"test-integration\" {\n  get \"git\" \"pikoci_pr\" { trigger = true }\n  task \"make\" {\n    run \"docker\" {\n      image = \"golang:1.25.1\"\n      cmd   = \"cd ${var.git_name} \u0026\u0026 make test-integration\"\n    }\n  }\n}\n\njob \"test-backends\" {\n  get \"git\" \"pikoci_pr\" {\n    trigger = true\n    passed  = [\"lint\", \"test-mock\", \"test-integration\"]\n  }\n\n  service \"mariadb\" {}\n  service \"postgresql\" {}\n  service \"vault\" {}\n\n  task \"make\" {\n    run \"docker\" {\n      image = \"golang:1.25.1\"\n      cmd   = \"cd ${var.git_name} \u0026\u0026 make test-backends\"\n      args  = [\"--network=host\"]\n    }\n  }\n}\n```\n\nThe `test-backends` job uses [service types](https://docs.pikoci.com/Services) to spin up MariaDB, PostgreSQL, and Vault as Docker containers, runs the backend integration tests against them, then tears everything down. See the [full pipeline](deploy/pipeline.hcl) for secrets, variables, and service definitions.\n\n\n## Coming from Concourse?\n\nPikoCI's resource model is directly inspired by Concourse. The main differences:\n\n- **Runners** replace task `image_resource`. Define a runner once, reference it from any job\n- **Deployment** is a single binary instead of a multi-service setup requiring PostgreSQL\n- **Secrets** use `secret_type` blocks with secret-backed variables. Built-in support for Vault and file-based secrets (JSON, env, raw)\n\n[Concourse pipeline importer planned (#210)](https://github.com/PikoCI/pikoci/issues/210).\n\n\n## Documentation\n\nFull documentation is at [docs.pikoci.com](https://docs.pikoci.com):\n\n- [Pipeline configuration reference](https://docs.pikoci.com/Pipeline)\n- [Resource types](https://docs.pikoci.com/Resource-Types)\n- [Runners](https://docs.pikoci.com/Runners)\n- [Server configuration](https://docs.pikoci.com/Server)\n- [Variables and secrets](https://docs.pikoci.com/Variables)\n- [Database backends](https://docs.pikoci.com/Database)\n- [CLI reference](https://docs.pikoci.com/CLI)\n- [Public pipelines](https://docs.pikoci.com/Public-Pipelines)\n- [Running workers separately](https://docs.pikoci.com/Workers)\n- [Deployment](https://docs.pikoci.com/Deployment)\n- [Portability and bundling](https://docs.pikoci.com/Portability)\n- [Coming from Concourse](https://docs.pikoci.com/Concourse)\n\n\n## Contributing\n\nPikoCI is open source and contributions are welcome. Please open an issue before starting work on a large feature so we can discuss the approach.\n\n```bash\ngit clone https://github.com/PikoCI/pikoci.git\ncd pikoci\nmake test\n```\n\n\n## License\n\nApache 2.0, see [LICENSE](LICENSE).\n\n\u003cdiv align=\"center\"\u003e\n  \u003csub\u003eBuilt with Go · Inspired by Concourse · Designed to run anywhere\u003c/sub\u003e\n\u003c/div\u003e\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpikoci%2Fpikoci","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpikoci%2Fpikoci","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpikoci%2Fpikoci/lists"}