A lightweight, local-first CI/CD tool written in Rust with a modern, real-time Terminal User Interface (TUI).
- Stages & Jobs: Group related jobs into stages for better organization and a clearer overview of your pipeline's progress.
- Build History & Persistence: Automatically saves build results and logs to a local history, allowing you to review past performance and failures.
- Sequential by Default: Jobs run one-by-one in the order defined in your pipeline, ensuring a predictable flow.
- Explicit Parallelism: Use the
parallel: trueflag to run independent jobs concurrently. - Dependency Tracking (DAG): Fine-tune execution order with the
needskeyword for complex dependency graphs. - Log Search & Filtering: Quickly find errors or specific output with real-time log filtering (
/). - Pipeline Hooks: Define
on_successandon_failurecommands to run after the pipeline completes. - Responsive TUI: A spacious, modern interface with OneDark colors that adapts to your terminal size.
- Headless Mode: Run pipelines in a non-interactive mode with real-time log streaming to stdout. Ideal for AI agents, CI automation, and scripts.
- Git Integration: Live display of current branch and latest commit info in the header.
- Credential & Secret Management: Declare required secrets in your pipeline. Conveyor will securely prompt for missing values at startup and automatically mask them (as
****) in all TUI logs. - Environment Variables: Support for pipeline-level, job-specific, local
env.yamlvariables, and securesecrets.yaml. - Cross-Platform: Automatically selects the correct shell (
cmdfor Windows,shfor Linux/macOS). - Graceful Process Termination: Safely cancels running jobs and cleans up orphaned compilation processes instantly when quitting (
Q) or retrying (R). - Isolated Workspaces: Remote pipelines clone into dynamically generated, globally unique directories to prevent file locking and stomping collisions.
Ensure you have the Rust toolchain installed.
git clone https://github.com/yourusername/conveyor.git
cd conveyor
cargo build --release- Create a
pipeline.yamlin your project root. - (Optional) Create an
env.yamlfor local/secret environment variables. - Run Conveyor:
cargo run
Conveyor can also run pipelines directly from a remote Git repository. It will clone the repository into a temporary workspace and automatically load the pipeline.yaml from its root.
# Run the default branch (usually main)
cargo run -- https://github.com/user/repo.git
# Run a specific branch
cargo run -- https://github.com/user/repo.git my-feature-branch- '1' / '2' / '3' / '4': Switch between Dashboard, History, Pipeline Config, and Env Variables.
- Up/Down Arrows: Select a job in the Dashboard to view its logs.
- 'R': Retry the current pipeline (resets states and starts fresh).
- '/': Enter Search Mode to filter logs in real-time.
- 'Esc': Exit search mode or clear the current search query.
- 'PgUp' / 'PgDn': Scroll through logs.
- 'q': Quit the application.
Example pipeline.yaml using the modern Stages format:
name: Example Service
on_success: "echo 'Success! Notifications sent.'"
on_failure: "echo 'Build failed. Check history for details.'"
stages:
- name: Build
jobs:
- name: Compile
steps:
- name: Build binary
command: cargo build --release
- name: Test
jobs:
- name: Unit Tests
steps:
- name: Run pytest
command: pytest
- name: Integration Tests
parallel: true
steps:
- name: Run integration
command: npm test
- name: Deploy
jobs:
- name: Push Image
needs: ["Unit Tests", "Integration Tests"]
steps:
- name: Docker Push
command: docker push my-app:latestNote: The older flat jobs: format is still supported for backward compatibility.
Store sensitive or machine-specific variables in an env.yaml file. Use secrets.yaml for credentials; any value defined here will be masked in the TUI logs.
Example env.yaml:
DEBUG: "true"
LOG_LEVEL: "info"Example secrets.yaml:
API_KEY: "my-very-secret-key"
SSH_PRIVATE_KEY: |
-----BEGIN RSA PRIVATE KEY-----
...To enforce secret entry, add them to your pipeline.yaml:
name: My Pipeline
secrets:
- API_KEY
- DOCKER_PASSWORDIf these are not present in secrets.yaml, Conveyor will prompt for them securely at startup.
To run Conveyor without the TUI, use the --headless flag. This will stream all logs directly to stdout and exit with a proper status code (0 for success, 1 for failure).
# Run local pipeline
cargo run -- --headless
# Run remote repository
cargo run -- https://github.com/user/repo.git --headlessTo closely mirror the capabilities of professional CI systems like Jenkins, the following features are planned:
- ๐ฆ Artifact Management: Capture and archive build outputs (binaries, test reports) for later retrieval directly from the TUI.
- ๐๏ธ Input Parameters: Support for "Build with Parameters," allowing users to select options (like environment or version) before a pipeline starts.
- ๐๏ธ Distributed Agents: The ability to delegate jobs to remote machines via SSH or a custom agent protocol.
- โฒ๏ธ Triggering System: Background daemon mode to poll Git repositories or listen for Webhooks to trigger builds automatically.
MIT