forked from tangled.org/core
Monorepo for Tangled

docs: update spindle pipelines workflow syntax documentation

authored by handle.invalid and committed by Tangled 45cd444e 784f670e

Changed files
+130 -54
docs
spindle
+130 -54
docs/spindle/pipeline.md
··· 1 - # spindle pipeline manifest 1 + # spindle pipelines 2 + 3 + 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. 4 + 5 + The fields are: 2 6 3 - Spindle pipelines are defined under the `.tangled/workflows` directory in a 4 - repo. Generally: 7 + - [Trigger](#trigger): A **required** field that defines when a workflow should be triggered. 8 + - [Engine](#engine): A **required** field that defines which engine a workflow should run on. 9 + - [Clone options](#clone-options): An **optional** field that defines how the repository should be cloned. 10 + - [Dependencies](#dependencies): An **optional** field that allows you to list dependencies you may need. 11 + - [Environment](#environment): An **optional** field that allows you to define environment variables. 12 + - [Steps](#steps): An **optional** field that allows you to define what steps should run in the workflow. 5 13 6 - * Pipelines are defined in YAML. 7 - * Workflows can run using different *engines*. 14 + ## Trigger 8 15 9 - The most barebones workflow looks like this: 16 + 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: 17 + 18 + - `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: 19 + - `push`: The workflow should run every time a commit is pushed to the repository. 20 + - `pull_request`: The workflow should run every time a pull request is made or updated. 21 + - `manual`: The workflow can be triggered manually. 22 + - `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. 23 + 24 + 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: 10 25 11 26 ```yaml 12 27 when: 13 - - event: ["push"] 28 + - event: ["push", "manual"] 29 + branch: ["main", "develop"] 30 + - event: ["pull_request"] 14 31 branch: ["main"] 32 + ``` 15 33 34 + ## Engine 35 + 36 + Next is the engine on which the workflow should run, defined using the **required** `engine` field. The currently supported engines are: 37 + 38 + - `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. 39 + 40 + Example: 41 + 42 + ```yaml 16 43 engine: "nixery" 44 + ``` 45 + 46 + ## Clone options 17 47 18 - # optional 48 + 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: 49 + 50 + - `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. 51 + - `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. 52 + - `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. 53 + 54 + The default settings are: 55 + 56 + ```yaml 19 57 clone: 20 58 skip: false 21 - depth: 50 22 - submodules: true 59 + depth: 1 60 + submodules: false 23 61 ``` 24 62 25 - The `when` and `engine` fields are required, while every other aspect 26 - of how the definition is parsed is up to the engine. Currently, a spindle 27 - provides at least one of these built-in engines: 63 + ## Dependencies 28 64 29 - ## `nixery` 65 + 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. 30 66 31 - The Nixery engine uses an instance of [Nixery](https://nixery.dev) to run 32 - steps that use dependencies from [Nixpkgs](https://github.com/NixOS/nixpkgs). 33 - 34 - Here's an example that uses all fields: 67 + 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: 35 68 36 69 ```yaml 37 - # build_and_test.yaml 38 - when: 39 - - event: ["push", "pull_request"] 40 - branch: ["main", "develop"] 41 - - event: ["manual"] 42 - 43 70 dependencies: 44 - ## from nixpkgs 71 + # nixpkgs 45 72 nixpkgs: 46 73 - nodejs 47 - ## custom registry 48 - git+https://tangled.sh/@oppi.li/statix: 49 - - statix 74 + - go 75 + # custom registry 76 + git+https://tangled.sh/@example.com/my_pkg: 77 + - my_pkg 78 + ``` 50 79 51 - steps: 52 - - name: "Install dependencies" 53 - command: "npm install" 54 - environment: 55 - NODE_ENV: "development" 56 - CI: "true" 80 + Now these dependencies are available to use in your workflow! 57 81 58 - - name: "Run linter" 59 - command: "npm run lint" 82 + ## Environment 83 + 84 + 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.** 85 + 86 + Example: 87 + 88 + ```yaml 89 + environment: 90 + GOOS: "linux" 91 + GOARCH: "arm64" 92 + NODE_ENV: "production" 93 + MY_ENV_VAR: "MY_ENV_VALUE" 94 + ``` 60 95 61 - - name: "Run tests" 62 - command: "npm test" 63 - environment: 64 - NODE_ENV: "test" 65 - JEST_WORKERS: "2" 96 + ## Steps 66 97 67 - - name: "Build application" 98 + 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: 99 + 100 + - `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. 101 + - `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. 102 + - `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.** 103 + 104 + Example: 105 + 106 + ```yaml 107 + steps: 108 + - name: "Build backend" 109 + command: "go build" 110 + environment: 111 + GOOS: "darwin" 112 + GOARCH: "arm64" 113 + - name: "Build frontend" 68 114 command: "npm run build" 69 115 environment: 70 116 NODE_ENV: "production" 117 + ``` 71 118 72 - environment: 73 - BUILD_NUMBER: "123" 74 - GIT_BRANCH: "main" 119 + ## Complete workflow 75 120 76 - ## current repository is cloned and checked out at the target ref 77 - ## by default. 121 + ```yaml 122 + # .tangled/workflows/build.yml 123 + 124 + when: 125 + - event: ["push", "manual"] 126 + branch: ["main", "develop"] 127 + - event: ["pull_request"] 128 + branch: ["main"] 129 + 130 + engine: "nixery" 131 + 132 + # using the default values 78 133 clone: 79 134 skip: false 80 - depth: 50 81 - submodules: true 82 - ``` 135 + depth: 1 136 + submodules: false 83 137 84 - ## git push options 138 + dependencies: 139 + # nixpkgs 140 + nixpkgs: 141 + - nodejs 142 + - go 143 + # custom registry 144 + git+https://tangled.sh/@example.com/my_pkg: 145 + - my_pkg 85 146 86 - These are push options that can be used with the `--push-option (-o)` flag of git push: 147 + environment: 148 + GOOS: "linux" 149 + GOARCH: "arm64" 150 + NODE_ENV: "production" 151 + MY_ENV_VAR: "MY_ENV_VALUE" 152 + 153 + steps: 154 + - name: "Build backend" 155 + command: "go build" 156 + environment: 157 + GOOS: "darwin" 158 + GOARCH: "arm64" 159 + - name: "Build frontend" 160 + command: "npm run build" 161 + environment: 162 + NODE_ENV: "production" 163 + ``` 87 164 88 - - `verbose-ci`, `ci-verbose`: enables diagnostics reporting for the CI pipeline, allowing you to see any issues when you push. 89 - - `skip-ci`, `ci-skip`: skips triggering the CI pipeline. 165 + 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).