Pipelines
Pipelines live in the repository at .slipway/*.yaml (one pipeline per file) or slipway.yaml at the root. The format is YAML 1.2. A JSON Schema is published at slipway.systems/schema/pipeline-v1.json, and slipway validate checks files against it and runs semantic validation.
The design goals: readable at a glance, no surprises for people coming from GitHub Actions or GitLab CI, deploys are first-class (a job can bind to an environment), and everything dynamic is CEL inside ${{ }}.
Anatomy
Section titled “Anatomy”version: 1 # required; integername: api-service # required; unique per projectdescription: Build, test and ship the APIon: # triggers push: { branches: [main, "release/**"] } pull_request: schedule: - cron: "0 3 * * 1-5" manual: inputs: version: { type: string, required: true, description: Semver to release } dry_run: { type: boolean, default: false }env: # pipeline-wide environment GOFLAGS: -mod=readonlydefaults: runs_on: [linux, x64] timeout: 30m shell: bashconcurrency: group: ${{ pipeline.name }}-${{ git.ref }} cancel_in_progress: truepermissions: # scopes of the job OIDC token id_token: write contents: readstages: [...] # or jobs: [...] for a single implicit stageA pipeline has either stages: (explicit) or jobs: (shorthand: one implicit stage), not both. It may alternatively extends: an org-level base pipeline.
| Topic | Page |
|---|---|
| When pipelines start | Triggers |
| DAG, matrix, retries, concurrency, deploy jobs | Stages and jobs |
run, uses, template, outputs |
Steps |
| Services, caches, artifacts, test reports | Caches, artifacts and services |
Reusable steps, org templates, extends |
Templates and reusable steps |
| Checking a file | Validation and editor support |
| Every key | Reference (generated from the schema) |
| Expressions | Expressions and functions |
A complete example
Section titled “A complete example”version: 1name: webon: push: { branches: [main] } pull_request:jobs: - name: test runs_on: [linux] container: { image: node:22 } steps: - uses: slipway/checkout@v1 - run: npm ci && npm test - name: deploy needs: [test] if: ${{ git.branch == "main" }} environment: { name: production, service: web } steps: - uses: slipway/deploy@v1 with: { strategy: canary }