···11-# spindle pipeline manifest11+# spindle pipelines2233-Spindle pipelines are defined under the `.tangled/workflows` directory in a44-repo. Generally:33+Spindle workflows allow you to write CI/CD pipelines in a simple format. They're located in the `.tangled/workflows` directory at the root of your repository, and are defined using YAML.5466-* Pipelines are defined in YAML.77-* Workflows can run using different *engines*.55+The fields are:8699-The most barebones workflow looks like this:77+- [Trigger](#trigger): A **required** field that defines when a workflow should be triggered.88+- [Engine](#engine): A **required** field that defines which engine a workflow should run on.99+- [Clone options](#clone-options): An **optional** field that defines how the repository should be cloned.1010+- [Dependencies](#dependencies): An **optional** field that allows you to list dependencies you may need.1111+- [Environment](#environment): An **optional** field that allows you to define environment variables.1212+- [Steps](#steps): An **optional** field that allows you to define what steps should run in the workflow.1313+1414+## Trigger1515+1616+The first thing to add to a workflow is the trigger, which defines when a workflow runs. This is defined using a `when` field, which takes in a list of conditions. Each condition has the following fields:1717+1818+- `event`: This is a **required** field that defines when your workflow should run. It's a list that can take one or more of the following values:1919+ - `push`: The workflow should run every time a commit is pushed to the repository.2020+ - `pull_request`: The workflow should run every time a pull request is made or updated.2121+ - `manual`: The workflow can be triggered manually.2222+- `branch`: This is a **required** field that defines which branches the workflow should run for. If used with the `push` event, commits to the branch(es) listed here will trigger the workflow. If used with the `pull_request` event, updates to pull requests targeting the branch(es) listed here will trigger the workflow. This field has no effect with the `manual` event.2323+2424+For example, if you'd like define a workflow that runs when commits are pushed to the `main` and `develop` branches, or when pull requests that target the `main` branch are updated, or manually, you can do so with:10251126```yaml1227when:1313- - event: ["push"]2828+ - event: ["push", "manual"]2929+ branch: ["main", "develop"]3030+ - event: ["pull_request"]3131+ branch: ["main"]3232+```3333+3434+## Engine3535+3636+Next is the engine on which the workflow should run, defined using the **required** `engine` field. The currently supported engines are:3737+3838+- `nixery`: This uses an instance of [Nixery](https://nixery.dev) to run steps, which allows you to add [dependencies](#dependencies) from [Nixpkgs](https://github.com/NixOS/nixpkgs). You can search for packages on https://search.nixos.org, and there's a pretty good chance the package(s) you're looking for will be there.3939+4040+Example:4141+4242+```yaml4343+engine: "nixery"4444+```4545+4646+## Clone options4747+4848+When a workflow starts, the first step is to clone the repository. You can customize this behavior using the **optional** `clone` field. It has the following fields:4949+5050+- `skip`: Setting this to `true` will skip cloning the repository. This can be useful if your workflow is doing something that doesn't require anything from the repository itself. This is `false` by default.5151+- `depth`: This sets the number of commits, or the "clone depth", to fetch from the repository. For example, if you set this to 2, the last 2 commits will be fetched. By default, the depth is set to 1, meaning only the most recent commit will be fetched, which is the commit that triggered the workflow.5252+- `submodules`: If you use [git submodules](https://git-scm.com/book/en/v2/Git-Tools-Submodules) in your repository, setting this field to `true` will recursively fetch all submodules. This is `false` by default.5353+5454+The default settings are:5555+5656+```yaml5757+clone:5858+ skip: false5959+ depth: 16060+ submodules: false6161+```6262+6363+## Dependencies6464+6565+Usually when you're running a workflow, you'll need additional dependencies. The `dependencies` field lets you define which dependencies to get, and from where. It's a key-value map, with the key being the registry to fetch dependencies from, and the value being the list of dependencies to fetch.6666+6767+Say you want to fetch Node.js and Go from `nixpkgs`, and a package called `my_pkg` you've made from your own registry at your repository at `https://tangled.sh/@example.com/my_pkg`. You can define those dependencies like so:6868+6969+```yaml7070+dependencies:7171+ # nixpkgs7272+ nixpkgs:7373+ - nodejs7474+ - go7575+ # custom registry7676+ git+https://tangled.sh/@example.com/my_pkg:7777+ - my_pkg7878+```7979+8080+Now these dependencies are available to use in your workflow!8181+8282+## Environment8383+8484+The `environment` field allows you define environment variables that will be available throughout the entire workflow. **Do not put secrets here, these environment variables are visible to anyone viewing the repository. You can add secrets for pipelines in your repository's settings.**8585+8686+Example:8787+8888+```yaml8989+environment:9090+ GOOS: "linux"9191+ GOARCH: "arm64"9292+ NODE_ENV: "production"9393+ MY_ENV_VAR: "MY_ENV_VALUE"9494+```9595+9696+## Steps9797+9898+The `steps` field allows you to define what steps should run in the workflow. It's a list of step objects, each with the following fields:9999+100100+- `name`: This field allows you to give your step a name. This name is visible in your workflow runs, and is used to describe what the step is doing.101101+- `command`: This field allows you to define a command to run in that step. The step is run in a Bash shell, and the logs from the command will be visible in the pipelines page on the Tangled website. The [dependencies](#dependencies) you added will be available to use here.102102+- `environment`: Similar to the global [environment](#environment) config, this **optional** field is a key-value map that allows you to set environment variables for the step. **Do not put secrets here, these environment variables are visible to anyone viewing the repository. You can add secrets for pipelines in your repository's settings.**103103+104104+Example:105105+106106+```yaml107107+steps:108108+ - name: "Build backend"109109+ command: "go build"110110+ environment:111111+ GOOS: "darwin"112112+ GOARCH: "arm64"113113+ - name: "Build frontend"114114+ command: "npm run build"115115+ environment:116116+ NODE_ENV: "production"117117+```118118+119119+## Complete workflow120120+121121+```yaml122122+# .tangled/workflows/build.yml123123+124124+when:125125+ - event: ["push", "manual"]126126+ branch: ["main", "develop"]127127+ - event: ["pull_request"]14128 branch: ["main"]1512916130engine: "nixery"171311818-# optional132132+# using the default values19133clone:20134 skip: false2121- depth: 502222- submodules: true2323-```2424-2525-The `when` and `engine` fields are required, while every other aspect2626-of how the definition is parsed is up to the engine. Currently, a spindle2727-provides at least one of these built-in engines:2828-2929-## `nixery`3030-3131-The Nixery engine uses an instance of [Nixery](https://nixery.dev) to run3232-steps that use dependencies from [Nixpkgs](https://github.com/NixOS/nixpkgs).3333-3434-Here's an example that uses all fields:3535-3636-```yaml3737-# build_and_test.yaml3838-when:3939- - event: ["push", "pull_request"]4040- branch: ["main", "develop"]4141- - event: ["manual"]135135+ depth: 1136136+ submodules: false4213743138dependencies:4444- ## from nixpkgs139139+ # nixpkgs45140 nixpkgs:46141 - nodejs4747- ## custom registry4848- git+https://tangled.sh/@oppi.li/statix:4949- - statix142142+ - go143143+ # custom registry144144+ git+https://tangled.sh/@example.com/my_pkg:145145+ - my_pkg146146+147147+environment:148148+ GOOS: "linux"149149+ GOARCH: "arm64"150150+ NODE_ENV: "production"151151+ MY_ENV_VAR: "MY_ENV_VALUE"5015251153steps:5252- - name: "Install dependencies"5353- command: "npm install"154154+ - name: "Build backend"155155+ command: "go build"54156 environment:5555- NODE_ENV: "development"5656- CI: "true"5757-5858- - name: "Run linter"5959- command: "npm run lint"6060-6161- - name: "Run tests"6262- command: "npm test"6363- environment:6464- NODE_ENV: "test"6565- JEST_WORKERS: "2"6666-6767- - name: "Build application"157157+ GOOS: "darwin"158158+ GOARCH: "arm64"159159+ - name: "Build frontend"68160 command: "npm run build"69161 environment:70162 NODE_ENV: "production"7171-7272-environment:7373- BUILD_NUMBER: "123"7474- GIT_BRANCH: "main"7575-7676-## current repository is cloned and checked out at the target ref7777-## by default.7878-clone:7979- skip: false8080- depth: 508181- submodules: true82163```831648484-## git push options8585-8686-These are push options that can be used with the `--push-option (-o)` flag of git push:8787-8888-- `verbose-ci`, `ci-verbose`: enables diagnostics reporting for the CI pipeline, allowing you to see any issues when you push.8989-- `skip-ci`, `ci-skip`: skips triggering the CI pipeline.165165+If you want another example of a workflow, you can look at the one [Tangled uses to build the project](https://tangled.sh/@tangled.sh/core/blob/master/.tangled/workflows/build.yml).