Design principles:
- Designed to be local first.
- Runtime is accessible, not abstracted away.
Important
This is a work in progress. It will change.
The project represents a CI/CD that provides container orchestration capabilities for automation workflows. It allows users to define pipelines in JavaScript/TypeScript or YAML format (with backward compatibility for Concourse CI-style configurations). The system currently supports two orchestration drivers, Docker and Native, with Docker being the more feature-complete implementation.
The pipeline execution model follows a task-based approach where containers can be run with defined commands, environment variables, and shared volumes. The core architecture includes an orchestration layer that abstracts container operations, a runtime layer for JavaScript/TypeScript execution via Goja VM, and backward compatibility for Concourse-style YAML pipelines. The project is in active development, with recent additions focused on support for resource operations (get/put) and environment variables, with thorough integration testing across supported platforms.
To execute a pipeline, use the runner command:
go run main.go runner <pipeline-file>
The runner supports both JavaScript/TypeScript and YAML pipeline formats:
# Run a JavaScript pipeline
go run main.go runner examples/hello-world.js
# Run a YAML pipeline (Concourse-style)
go run main.go runner examples/hello-world.yml
Note: The runner executes the pipeline in a single iteration and then exits.
To view pipeline execution results in a web interface:
- Start the server:
go run main.go server
- Open your browser and navigate to:
http://localhost:8080/tasks
The web interface displays the execution results and task tree. Note: The server does not provide live updates - you'll need to refresh the page to see new results.
- Storage: Both runner and server use SQLite by default
(
sqlite://test.db
). You can specify a different storage location:
go run main.go runner --storage sqlite://my-pipeline.db examples/pipeline.js
go run main.go server --storage sqlite://my-pipeline.db --port 9000
- Orchestrator: Choose between
docker
(default) andnative
orchestration:
go run main.go runner --driver native examples/pipeline.js
- Logging: Control log level and format:
go run main.go runner --log-level debug --log-format json examples/pipeline.js
This is relying on strict integration testing at the moment. I'd like to keep the interfaces the same, but change underlying implementation.
The platforms of docker
and native
are tested against.
brew bundle
task
Please see examples/
for real world usages. They are run as part of the test
suite to.