README.md 165.4 KB
Newer Older
M
Marcia Ramos 已提交
1
---
2 3 4
stage: Verify
group: Continuous Integration
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
M
Marcia Ramos 已提交
5 6 7
type: reference
---

8
# GitLab CI/CD pipeline configuration reference
D
Douwe Maan 已提交
9

10
GitLab CI/CD [pipelines](../pipelines/index.md) are configured using a YAML file called `.gitlab-ci.yml` within each project.
11

E
Evan Read 已提交
12
The `.gitlab-ci.yml` file defines the structure and order of the pipelines and determines:
13

E
Evan Read 已提交
14 15 16 17 18 19 20 21 22 23
- What to execute using [GitLab Runner](https://docs.gitlab.com/runner/).
- What decisions to make when specific conditions are encountered. For example, when a process succeeds or fails.

This topic covers CI/CD pipeline configuration. For other CI/CD configuration information, see:

- [GitLab CI/CD Variables](../variables/README.md), for configuring the environment the pipelines run in.
- [GitLab Runner advanced configuration](https://docs.gitlab.com/runner/configuration/advanced-configuration.html), for configuring GitLab Runner.

We have complete examples of configuring pipelines:

24
- For a quick introduction to GitLab CI/CD, follow our [quick start guide](../quick_start/README.md).
E
Evan Read 已提交
25
- For a collection of examples, see [GitLab CI/CD Examples](../examples/README.md).
26
- To see a large `.gitlab-ci.yml` file used in an enterprise, see the [`.gitlab-ci.yml` file for `gitlab`](https://gitlab.com/gitlab-org/gitlab/blob/master/.gitlab-ci.yml).
27

28 29 30 31 32 33 34
> For some additional information about GitLab CI/CD:
>
> - <i class="fa fa-youtube-play youtube" aria-hidden="true"></i>&nbsp;Watch the [CI/CD Ease of configuration](https://www.youtube.com/embed/opdLqwz6tcE) video.
> - Watch the [Making the case for CI/CD in your organization](https://about.gitlab.com/compare/github-actions-alternative/)
>   webcast to learn the benefits of CI/CD and how to measure the results of CI/CD automation.
> - <i class="fa fa-youtube-play youtube" aria-hidden="true"></i>&nbsp;Learn how [Verizon reduced rebuilds](https://about.gitlab.com/blog/2019/02/14/verizon-customer-story/)
>   from 30 days to under 8 hours with GitLab.
35

36
NOTE: **Note:**
37 38
If you have a [mirrored repository that GitLab pulls from](../../user/project/repository/repository_mirroring.md#pulling-from-a-remote-repository-starter),
you may need to enable pipeline triggering. Go to your project's
39 40
**Settings > Repository > Pull from a remote repository > Trigger pipelines for mirror updates**.

E
Evan Read 已提交
41 42 43
## Introduction

Pipeline configuration begins with jobs. Jobs are the most fundamental element of a `.gitlab-ci.yml` file.
44

E
Evan Read 已提交
45 46 47 48 49 50 51
Jobs are:

- Defined with constraints stating under what conditions they should be executed.
- Top-level elements with an arbitrary name and must contain at least the [`script`](#script) clause.
- Not limited in how many can be defined.

For example:
D
Douwe Maan 已提交
52 53 54 55 56 57 58 59 60

```yaml
job1:
  script: "execute-script-for-job1"

job2:
  script: "execute-script-for-job2"
```

61
The above example is the simplest possible CI/CD configuration with two separate
62 63 64
jobs, where each of the jobs executes a different command.
Of course a command can execute code directly (`./configure;make;make install`)
or run a script (`test.sh`) in the repository.
D
Douwe Maan 已提交
65

66 67
Jobs are picked up by [runners](../runners/README.md) and executed within the
environment of the runner. What is important is that each job is run
68
independently from each other.
D
Douwe Maan 已提交
69

70
### Validate the `.gitlab-ci.yml`
E
Evan Read 已提交
71

72
Each instance of GitLab CI/CD has an embedded debug tool called Lint, which validates the
E
Evan Read 已提交
73
content of your `.gitlab-ci.yml` files. You can find the Lint under the page `ci/lint` of your
M
Marcel Amirault 已提交
74
project namespace. For example, `https://gitlab.example.com/gitlab-org/project-123/-/ci/lint`.
E
Evan Read 已提交
75 76 77

### Unavailable names for jobs

78
Each job must have a unique name, but there are a few **reserved `keywords` that
79
can't be used as job names**:
D
Douwe Maan 已提交
80

81 82 83 84 85 86 87 88
- `image`
- `services`
- `stages`
- `types`
- `before_script`
- `after_script`
- `variables`
- `cache`
89
- `include`
D
Douwe Maan 已提交
90

E
Evan Read 已提交
91 92 93 94 95 96 97 98 99 100 101 102 103
### Using reserved keywords

If you get validation error when using specific values (for example, `true` or `false`), try to:

- Quote them.
- Change them to a different form. For example, `/bin/true`.

## Configuration parameters

A job is defined as a list of parameters that define the job's behavior.

The following table lists available parameters for jobs:

104 105
| Keyword                                            | Description                                                                                                                                                                         |
|:---------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
106
| [`script`](#script)                                | Shell script that is executed by a runner.                                                                                                                                           |
107
| [`after_script`](#before_script-and-after_script)  | Override a set of commands that are executed after job.                                                                                                                             |
108 109
| [`allow_failure`](#allow_failure)                  | Allow job to fail. Failed job does not contribute to commit status.                                                                                                                 |
| [`artifacts`](#artifacts)                          | List of files and directories to attach to a job on success. Also available: `artifacts:paths`, `artifacts:exclude`, `artifacts:expose_as`, `artifacts:name`, `artifacts:untracked`, `artifacts:when`, `artifacts:expire_in`, `artifacts:reports`. |
110 111
| [`before_script`](#before_script-and-after_script) | Override a set of commands that are executed before job.                                                                                                                            |
| [`cache`](#cache)                                  | List of files that should be cached between subsequent runs. Also available: `cache:paths`, `cache:key`, `cache:untracked`, and `cache:policy`.                                     |
112
| [`coverage`](#coverage)                            | Code coverage settings for a given job.                                                                                                                                             |
113 114 115
| [`dependencies`](#dependencies)                    | Restrict which artifacts are passed to a specific job by providing a list of jobs to fetch artifacts from.                                                                          |
| [`environment`](#environment)                      | Name of an environment to which the job deploys. Also available: `environment:name`, `environment:url`, `environment:on_stop`, `environment:auto_stop_in` and `environment:action`. |
| [`except`](#onlyexcept-basic)                      | Limit when jobs are not created. Also available: [`except:refs`, `except:kubernetes`, `except:variables`, and `except:changes`](#onlyexcept-advanced).                              |
116
| [`extends`](#extends)                              | Configuration entries that this job inherits from.                                                                                                                       |
117 118 119 120 121 122
| [`image`](#image)                                  | Use Docker images. Also available: `image:name` and `image:entrypoint`.                                                                                                             |
| [`include`](#include)                              | Allows this job to include external YAML files. Also available: `include:local`, `include:file`, `include:template`, and `include:remote`.                                          |
| [`interruptible`](#interruptible)                  | Defines if a job can be canceled when made redundant by a newer run.                                                                                                                |
| [`only`](#onlyexcept-basic)                        | Limit when jobs are created. Also available: [`only:refs`, `only:kubernetes`, `only:variables`, and `only:changes`](#onlyexcept-advanced).                                          |
| [`pages`](#pages)                                  | Upload the result of a job to use with GitLab Pages.                                                                                                                                |
| [`parallel`](#parallel)                            | How many instances of a job should be run in parallel.                                                                                                                              |
123
| [`release`](#release)                              | Instructs the runner to generate a [Release](../../user/project/releases/index.md) object.                                                                                          |
124
| [`resource_group`](#resource_group)                | Limit job concurrency.                                                                                                                                                              |
125
| [`retry`](#retry)                                  | When and how many times a job can be auto-retried in case of a failure.                                                                                                             |
126
| [`rules`](#rules)                                  | List of conditions to evaluate and determine selected attributes of a job, and whether or not it's created. May not be used alongside `only`/`except`.                              |
127 128
| [`services`](#services)                            | Use Docker services images. Also available: `services:name`, `services:alias`, `services:entrypoint`, and `services:command`.                                                       |
| [`stage`](#stage)                                  | Defines a job stage (default: `test`).                                                                                                                                              |
129
| [`tags`](#tags)                                    | List of tags that are used to select a runner.                                                                                                                                       |
130 131 132
| [`timeout`](#timeout)                              | Define a custom job-level timeout that takes precedence over the project-wide setting.                                                                                              |
| [`trigger`](#trigger)                              | Defines a downstream pipeline trigger.                                                                                                                                              |
| [`variables`](#variables)                          | Define job variables on a job level.                                                                                                                                                |
133
| [`when`](#when)                                    | When to run job. Also available: `when:manual` and `when:delayed`.                                                                                                                  |
E
Evan Read 已提交
134

135 136 137 138 139
## Global parameters

Some parameters must be defined at a global level, affecting all jobs in the pipeline.

### Global defaults
K
Kamil Trzciński 已提交
140 141 142 143 144 145 146 147 148 149 150

Some parameters can be set globally as the default for all jobs using the
`default:` keyword. Default parameters can then be overridden by job-specific
configuration.

The following job parameters can be defined inside a `default:` block:

- [`image`](#image)
- [`services`](#services)
- [`before_script`](#before_script-and-after_script)
- [`after_script`](#before_script-and-after_script)
151
- [`tags`](#tags)
K
Kamil Trzciński 已提交
152
- [`cache`](#cache)
153
- [`artifacts`](#artifacts)
154
- [`retry`](#retry)
155
- [`timeout`](#timeout)
156
- [`interruptible`](#interruptible)
K
Kamil Trzciński 已提交
157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172

In the following example, the `ruby:2.5` image is set as the default for all
jobs except the `rspec 2.6` job, which uses the `ruby:2.6` image:

```yaml
default:
  image: ruby:2.5

rspec:
  script: bundle exec rspec

rspec 2.6:
  image: ruby:2.6
  script: bundle exec rspec
```

173
#### `inherit`
174

175
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207484) in GitLab 12.9.
176 177 178 179

You can disable inheritance of globally defined defaults
and variables with the `inherit:` parameter.

180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
To enable or disable the inheritance of all `variables:` or `default:` parameters, use the following format:

- `default: true` or `default: false`
- `variables: true` or `variables: false`

To inherit only a subset of `default:` parameters or `variables:`, specify what
you wish to inherit, and any not listed will **not** be inherited. Use
one of the following formats:

```yaml
inherit:
  default: [parameter1, parameter2]
  variables: [VARIABLE1, VARIABLE2]
```

Or:

```yaml
inherit:
  default:
    - parameter1
    - parameter2
  variables:
    - VARIABLE1
    - VARIABLE2
```

207 208
In the example below:

209 210 211 212
- `rubocop`:
  - **will** inherit: Nothing.
- `rspec`:
  - **will** inherit: the default `image` and the `WEBHOOK_URL` variable.
213
  - will **not** inherit: the default `before_script` and the `DOMAIN` variable.
214 215
- `capybara`:
  - **will** inherit: the default `before_script` and `image`.
216
  - will **not** inherit: the `DOMAIN` and `WEBHOOK_URL` variables.
217 218
- `karma`:
  - **will** inherit: the default `image` and `before_script`, and the `DOMAIN` variable.
219
  - will **not** inherit: `WEBHOOK_URL` variable.
220 221 222

```yaml
default:
223
  image: 'ruby:2.4'
224 225 226 227 228
  before_script:
    - echo Hello World

variables:
  DOMAIN: example.com
229
  WEBHOOK_URL: https://my-webhook.example.com
230 231

rubocop:
232 233 234
  inherit:
    default: false
    variables: false
235 236 237 238
  script: bundle exec rubocop

rspec:
  inherit:
239 240
    default: [image]
    variables: [WEBHOOK_URL]
241 242 243 244 245 246
  script: bundle exec rspec

capybara:
  inherit:
    variables: false
  script: bundle exec capybara
247 248 249 250 251 252

karma:
  inherit:
    default: true
    variables: [DOMAIN]
  script: karma
253 254
```

255
### `stages`
E
Evan Read 已提交
256

257 258
`stages` is used to define stages that contain jobs and is defined
globally for the pipeline.
E
Evan Read 已提交
259

260 261
The specification of `stages` allows for having flexible multi stage pipelines.
The ordering of elements in `stages` defines the ordering of jobs' execution:
E
Evan Read 已提交
262

263 264 265 266 267
1. Jobs of the same stage are run in parallel.
1. Jobs of the next stage are run after the jobs from the previous stage
   complete successfully.

Let's consider the following example, which defines 3 stages:
E
Evan Read 已提交
268 269

```yaml
270 271 272 273
stages:
  - build
  - test
  - deploy
E
Evan Read 已提交
274 275
```

276 277 278 279 280 281
1. First, all jobs of `build` are executed in parallel.
1. If all jobs of `build` succeed, the `test` jobs are executed in parallel.
1. If all jobs of `test` succeed, the `deploy` jobs are executed in parallel.
1. If all jobs of `deploy` succeed, the commit is marked as `passed`.
1. If any of the previous jobs fails, the commit is marked as `failed` and no
   jobs of further stage are executed.
282

283
There are also two edge cases worth mentioning:
E
Evan Read 已提交
284

285 286
1. If no `stages` are defined in `.gitlab-ci.yml`, then the `build`,
   `test` and `deploy` are allowed to be used as job's stage by default.
287
1. If a job does not specify a `stage`, the job is assigned the `test` stage.
E
Evan Read 已提交
288

289
### `workflow:rules`
E
Evan Read 已提交
290

291
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/29654) in GitLab 12.5
292

293 294
The top-level `workflow:` key applies to the entirety of a pipeline, and
determines whether or not a pipeline is created. It accepts a single
295 296
`rules:` key that operates similarly to [`rules:` defined within jobs](#rules),
enabling dynamic configuration of the pipeline.
297

298 299
If you are new to GitLab CI/CD and `workflow: rules`, you may find the [`workflow:rules` templates](#workflowrules-templates) useful.

300
To define your own `workflow: rules`, the available configuration options are:
301 302 303 304

- [`if`](#rulesif): Define a rule.
- [`when`](#when): May be set to `always` or `never` only. If not provided, the default value is `always`​.

305 306
If a pipeline attempts to run but matches no rule, it's dropped and doesn't run.

307 308 309 310 311 312 313 314 315 316 317
Use the example rules below exactly as written to allow pipelines that match the rule
to run. Add `when: never` to prevent pipelines that match the rule from running. See
the [common `if` clauses for `rules`](#common-if-clauses-for-rules) for more examples.

| Example rules                                        | Details                                                   |
|------------------------------------------------------|-----------------------------------------------------------|
| `if: '$CI_PIPELINE_SOURCE == "merge_request_event"'` | Control when merge request pipelines run.                 |
| `if: '$CI_PIPELINE_SOURCE == "push"'`                | Control when both branch pipelines and tag pipelines run. |
| `if: $CI_COMMIT_TAG`                                 | Control when tag pipelines run.                           |
| `if: $CI_COMMIT_BRANCH`                              | Control when branch pipelines run.                        |

318 319
For example, in the following configuration, pipelines run for all `push` events (changes to
branches and new tags). Only push events with `-wip` in the commit message are excluded. Scheduled
320
pipelines and merge request pipelines don't run, as there's no rule allowing them.
321 322 323 324 325 326

```yaml
workflow:
  rules:
    - if: $CI_COMMIT_REF_NAME =~ /-wip$/
      when: never
327 328 329 330 331 332 333 334 335 336 337 338 339 340 341
    - if: '$CI_PIPELINE_SOURCE == "push"'
```

This example has strict rules, and no other pipelines can run.

Alternatively, you can have loose rules by using only `when: never` rules, followed
by a final `when: always` rule. This allows all types of pipelines, except for any
that match the `when: never` rules:

```yaml
workflow:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "schedule"'
      when: never
    - if: '$CI_PIPELINE_SOURCE == "push"'
342 343 344 345
      when: never
    - when: always
```

346 347 348 349 350
This example never allows pipelines for schedules or `push` (branches and tags) pipelines,
but does allow pipelines in **all** other cases, *including* merge request pipelines.

As with `rules` defined in jobs, be careful not to use a configuration that allows
merge request pipelines and branch pipelines to run at the same time, or you could
351
have [duplicate pipelines](#prevent-duplicate-pipelines).
352

353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389
#### `workflow:rules` templates

> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217732) in GitLab 13.0.

We provide pre-made templates for use with your pipelines that set up `workflow: rules`
for common scenarios. Usage of these will make things easier and prevent duplicate pipelines from running.

The [`Branch-Pipelines` template](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates/Workflows/Branch-Pipelines.gitlab-ci.yml)
makes your pipelines run for branches and tags.

Branch pipeline status will be displayed within merge requests that use that branch
as a source, but this pipeline type does not support any features offered by
[Merge Request Pipelines](../merge_request_pipelines/) like
[Pipelines for Merge Results](../merge_request_pipelines/#pipelines-for-merged-results-premium)
or [Merge Trains](../merge_request_pipelines/pipelines_for_merged_results/merge_trains/).
Use this template if you are intentionally avoiding those features.

It is [included](#include) as follows:

```yaml
include:
  - template: 'Workflows/Branch-Pipelines.gitlab-ci.yml'
```

The [`MergeRequest-Pipelines` template](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates/Workflows/MergeRequest-Pipelines.gitlab-ci.yml)
makes your pipelines run for the default branch (usually `master`), tags, and
all types of merge request pipelines. Use this template if you use any of the
the [Pipelines for Merge Requests features](../merge_request_pipelines/), as mentioned
above.

It is [included](#include) as follows:

```yaml
include:
  - template: 'Workflows/MergeRequest-Pipelines.gitlab-ci.yml'
```

390
### `include`
E
Evan Read 已提交
391

392 393
> - Introduced in [GitLab Premium](https://about.gitlab.com/pricing/) 10.5.
> - Available for Starter, Premium and Ultimate since 10.6.
394
> - [Moved](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/42861) to GitLab Core in 11.4.
E
Evan Read 已提交
395

396 397
Using the `include` keyword allows the inclusion of external YAML files. This helps
to break down the CI/CD configuration into multiple files and increases readability for long configuration files.
398
It's also possible to have template files stored in a central repository and projects include their
399 400
configuration files. This helps avoid duplicated configuration, for example, global default variables for all projects.

401
`include` requires the external YAML file to have the extensions `.yml` or `.yaml`,
402
otherwise the external file is not included.
E
Evan Read 已提交
403

404 405 406 407 408 409 410
`include` supports the following inclusion methods:

| Method                          | Description                                                       |
|:--------------------------------|:------------------------------------------------------------------|
| [`local`](#includelocal)        | Include a file from the local project repository.                 |
| [`file`](#includefile)          | Include a file from a different project repository.               |
| [`remote`](#includeremote)      | Include a file from a remote URL. Must be publicly accessible.    |
411
| [`template`](#includetemplate)  | Include templates that are provided by GitLab.                    |
412

413 414
The `include` methods do not support [variable expansion](../variables/where_variables_can_be_used.md#variables-usage).

415 416 417
NOTE: **Note:**
`.gitlab-ci.yml` configuration included by all methods is evaluated at pipeline creation.
The configuration is a snapshot in time and persisted in the database. Any changes to
418
referenced `.gitlab-ci.yml` configuration is not reflected in GitLab until the next pipeline is created.
419

420
The files defined by `include` are:
E
Evan Read 已提交
421

422 423 424
- Deep merged with those in `.gitlab-ci.yml`.
- Always evaluated first and merged with the content of `.gitlab-ci.yml`,
  regardless of the position of the `include` keyword.
E
Evan Read 已提交
425

426 427
TIP: **Tip:**
Use merging to customize and override included CI/CD configurations with local
428
definitions. Local definitions in `.gitlab-ci.yml` override included definitions.
E
Evan Read 已提交
429

430
NOTE: **Note:**
431 432
Using [YAML anchors](#anchors) across different YAML files sourced by `include` is not
supported. You must only refer to anchors in the same file. Instead
433
of using YAML anchors, you can use the [`extends` keyword](#extends).
E
Evan Read 已提交
434

435
#### `include:local`
E
Evan Read 已提交
436

437 438
`include:local` includes a file from the same repository as `.gitlab-ci.yml`.
It's referenced using full paths relative to the root directory (`/`).
E
Evan Read 已提交
439

440
You can only use files that are tracked by Git on the same branch
441 442
your configuration file is on. In other words, when using a `include:local`, make
sure that both `.gitlab-ci.yml` and the local file are on the same branch.
E
Evan Read 已提交
443

444
All [nested includes](#nested-includes) are executed in the scope of the same project,
445
so it's possible to use local, project, remote, or template includes.
E
Evan Read 已提交
446

447 448
NOTE: **Note:**
Including local files through Git submodules paths is not supported.
E
Evan Read 已提交
449

450
Example:
E
Evan Read 已提交
451

452 453 454 455
```yaml
include:
  - local: '/templates/.gitlab-ci-template.yml'
```
E
Evan Read 已提交
456

457
TIP: **Tip:**
458
Local includes can be used as a replacement for symbolic links that are not followed.
459 460 461 462 463 464 465

This can be defined as a short local include:

```yaml
include: '.gitlab-ci-production.yml'
```

466
#### `include:file`
E
Evan Read 已提交
467

468
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53903) in GitLab 11.7.
E
Evan Read 已提交
469

470 471 472
To include files from another private project under the same GitLab instance,
use `include:file`. This file is referenced using full paths relative to the
root directory (`/`). For example:
E
Evan Read 已提交
473

474 475 476 477 478
```yaml
include:
  - project: 'my-group/my-project'
    file: '/templates/.gitlab-ci-template.yml'
```
E
Evan Read 已提交
479

480
You can also specify `ref`, with the default being the `HEAD` of the project:
E
Evan Read 已提交
481

482 483 484 485 486
```yaml
include:
  - project: 'my-group/my-project'
    ref: master
    file: '/templates/.gitlab-ci-template.yml'
E
Evan Read 已提交
487

488 489 490
  - project: 'my-group/my-project'
    ref: v1.0.0
    file: '/templates/.gitlab-ci-template.yml'
K
Kamil Trzcinski 已提交
491

492 493 494 495
  - project: 'my-group/my-project'
    ref: 787123b47f14b552955ca2786bc9542ae66fee5b # Git SHA
    file: '/templates/.gitlab-ci-template.yml'
```
496

497
All [nested includes](#nested-includes) are executed in the scope of the target project,
498
so it's possible to use local (relative to target project), project, remote
499
or template includes.
500

501 502 503 504 505 506 507 508 509 510 511 512
#### `include:remote`

`include:remote` can be used to include a file from a different location,
using HTTP/HTTPS, referenced by using the full URL. The remote file must be
publicly accessible through a simple GET request as authentication schemas
in the remote URL are not supported. For example:

```yaml
include:
  - remote: 'https://gitlab.com/awesome-project/raw/master/.gitlab-ci-template.yml'
```

513
All [nested includes](#nested-includes) are executed without context as public user, so only another remote
514 515
or public project, or template, is allowed.

516
#### `include:template`
517

518
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53445) in GitLab 11.7.
519

520 521
`include:template` can be used to include `.gitlab-ci.yml` templates that are
[shipped with GitLab](https://gitlab.com/gitlab-org/gitlab/tree/master/lib/gitlab/ci/templates).
522

523
For example:
524

525
```yaml
526 527 528
# File sourced from GitLab's template collection
include:
  - template: Auto-DevOps.gitlab-ci.yml
529 530
```

531
Multiple `include:template` files:
D
Douwe Maan 已提交
532

533 534 535 536 537
```yaml
include:
  - template: Android-Fastlane.gitlab-ci.yml
  - template: Auto-DevOps.gitlab-ci.yml
```
538

539
All [nested includes](#nested-includes) are executed only with the permission of the user,
540
so it's possible to use project, remote or template includes.
D
Douwe Maan 已提交
541

542
#### Nested includes
543

544
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/56836) in GitLab 11.9.
545

546
Nested includes allow you to compose a set of includes.
547

548
A total of 100 includes is allowed, but duplicate includes are considered a configuration error.
549

550
Since [GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/issues/28212), the time limit
551
for resolving all files is 30 seconds.
552

553
#### Additional `includes` examples
554

555
There is a list of [additional `includes` examples](includes.md) available.
556

557
## Parameter details
558

559
The following are detailed explanations for parameters used to configure CI/CD pipelines.
560

561
### `image`
562

563
Used to specify [a Docker image](../docker/using_docker_images.md#what-is-an-image) to use for the job.
564

565
For:
566

567 568
- Simple definition examples, see [Define `image` and `services` from `.gitlab-ci.yml`](../docker/using_docker_images.md#define-image-and-services-from-gitlab-ciyml).
- Detailed usage information, refer to [Docker integration](../docker/README.md) documentation.
569

570
#### `image:name`
571

572
An [extended Docker configuration option](../docker/using_docker_images.md#extended-docker-configuration-options).
573

574
For more information, see [Available settings for `image`](../docker/using_docker_images.md#available-settings-for-image).
575

576
#### `image:entrypoint`
577

578
An [extended Docker configuration option](../docker/using_docker_images.md#extended-docker-configuration-options).
579

580
For more information, see [Available settings for `image`](../docker/using_docker_images.md#available-settings-for-image).
581

582
#### `services`
583

584
Used to specify a [service Docker image](../docker/using_docker_images.md#what-is-a-service), linked to a base image specified in [`image`](#image).
585

586
For:
587

588 589 590
- Simple definition examples, see [Define `image` and `services` from `.gitlab-ci.yml`](../docker/using_docker_images.md#define-image-and-services-from-gitlab-ciyml).
- Detailed usage information, refer to [Docker integration](../docker/README.md) documentation.
- For example services, see [GitLab CI/CD Services](../services/README.md).
591

592
##### `services:name`
593

594
An [extended Docker configuration option](../docker/using_docker_images.md#extended-docker-configuration-options).
595

596
For more information, see [Available settings for `services`](../docker/using_docker_images.md#available-settings-for-services).
597

598
##### `services:alias`
599

600
An [extended Docker configuration option](../docker/using_docker_images.md#extended-docker-configuration-options).
601

602
For more information, see [Available settings for `services`](../docker/using_docker_images.md#available-settings-for-services).
603

604
##### `services:entrypoint`
605

606
An [extended Docker configuration option](../docker/using_docker_images.md#extended-docker-configuration-options).
607

608
For more information, see [Available settings for `services`](../docker/using_docker_images.md#available-settings-for-services).
609

610
##### `services:command`
611

612
An [extended Docker configuration option](../docker/using_docker_images.md#extended-docker-configuration-options).
613

614
For more information, see [Available settings for `services`](../docker/using_docker_images.md#available-settings-for-services).
615

616 617 618
### `script`

`script` is the only required keyword that a job needs. It's a shell script
619
that is executed by the runner. For example:
620 621

```yaml
622 623
job:
  script: "bundle exec rspec"
624 625
```

626 627 628
[YAML anchors for scripts](#yaml-anchors-for-script) are available.

This parameter can also contain several commands using an array:
629 630

```yaml
631 632 633 634
job:
  script:
    - uname -a
    - bundle exec rspec
635 636
```

637
NOTE: **Note:**
638 639
Sometimes, `script` commands must be wrapped in single or double quotes.
For example, commands that contain a colon (`:`) must be wrapped in quotes so
640 641 642
that the YAML parser knows to interpret the whole thing as a string rather than
a "key: value" pair. Be careful when using special characters:
`:`, `{`, `}`, `[`, `]`, `,`, `&`, `*`, `#`, `?`, `|`, `-`, `<`, `>`, `=`, `!`, `%`, `@`, `` ` ``.
643

644 645
If any of the script commands return an exit code other than zero, the job
fails and further commands are not executed. You can avoid this behavior by
646
storing the exit code in a variable:
647

648 649 650 651 652 653
```yaml
job:
  script:
    - false || exit_code=$?
    - if [ $exit_code -ne 0 ]; then echo "Previous command failed"; fi;
```
654

655
#### `before_script` and `after_script`
656

657
> Introduced in GitLab 8.7 and requires GitLab Runner v1.2.
658

659 660 661
`before_script` is used to define a command that should be run before each
job, including deploy jobs, but after the restoration of any [artifacts](#artifacts).
This must be an array.
662

663 664
Scripts specified in `before_script` are concatenated with any scripts specified
in the main [`script`](#script), and executed together in a single shell.
665

666
`after_script` is used to define the command that runs after each
667
job, including failed ones. This must be an array.
668

669 670
Scripts specified in `after_script` are executed in a new shell, separate from any
`before_script` or `script` scripts. As a result, they:
671

672 673 674
- Have a current working directory set back to the default.
- Have no access to changes done by scripts defined in `before_script` or `script`, including:
  - Command aliases and variables exported in `script` scripts.
675
  - Changes outside of the working tree (depending on the runner executor), like
676 677
    software installed by a `before_script` or `script` script.
- Have a separate timeout, which is hard coded to 5 minutes. See
678
  [related issue](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/2716) for details.
679
- Don't affect the job's exit code. If the `script` section succeeds and the
680
  `after_script` times out or fails, the job exits with code `0` (`Job Succeeded`).
681

682 683
It's possible to overwrite a globally defined `before_script` or `after_script`
if you set it per-job:
684 685

```yaml
686 687 688
default:
  before_script:
    - global before script
689

690 691 692 693 694 695 696
job:
  before_script:
    - execute this instead of global before script
  script:
    - my command
  after_script:
    - execute this after my script
697 698
```

699
[YAML anchors for `before_script` and `after_script`](#yaml-anchors-for-before_script-and-after_script) are available.
700

701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738
#### Coloring script output

Script output can be colored using [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors),
or by running commands or programs that output ANSI escape codes.

For example, using [Bash with color codes](https://misc.flogisoft.com/bash/tip_colors_and_formatting):

```yaml
job:
  script:
    - echo -e "\e[31mThis text is red,\e[0m but this text isn't\e[31m however this text is red again."
```

You can define the color codes in Shell variables, or even [custom environment variables](../variables/README.md#custom-environment-variables),
which makes the commands easier to read and reusable.

For example, using the same example as above and variables defined in a `before_script`:

```yaml
job:
  before_script:
    - TXT_RED="\e[31m" && TXT_CLEAR="\e[0m"
  script:
    - echo -e "${TXT_RED}This text is red,${TXT_CLEAR} but this part isn't${TXT_RED} however this part is again."
    - echo "This text is not colored"
```

Or with [PowerShell color codes](https://superuser.com/a/1259916):

```yaml
job:
  before_script:
    - $esc="$([char]27)"; $TXT_RED="$esc[31m"; $TXT_CLEAR="$esc[0m"
  script:
    - Write-Host $TXT_RED"This text is red,"$TXT_CLEAR" but this text isn't"$TXT_RED" however this text is red again."
    - Write-Host "This text is not colored"
```

739
#### Multi-line commands
740 741

You can split long commands into multi-line commands to improve readability
742
using [`|` (literal) and `>` (folded) YAML multi-line block scalar indicators](https://yaml-multiline.info/).
743 744 745

CAUTION: **Warning:**
If multiple commands are combined into one command string, only the last command's
746
failure or success is reported,
747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808
[incorrectly ignoring failures from earlier commands due to a bug](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/25394).
If the success of the job depends on the success or failure of these commands,
you can run the commands as separate `script:` items, or add `exit 1` commands
as appropriate to the command string where needed.

You can use the `|` (literal) YAML multiline block scalar indicator to write
commands over multiple lines in the `script` section of a job description.
Each line is treated as a separate command.
Only the first command is repeated in the job log, but additional
commands are still executed:

```yaml
job:
  script:
    - |
      echo "First command line."
      echo "Second command line."
      echo "Third command line."
```

The example above renders in the job log as:

```shell
$ echo First command line # collapsed multi-line command
First command line
Second command line.
Third command line.
```

The `>` (folded) YAML multiline block scalar indicator treats empty lines between
sections as the start of a new command:

```yaml
job:
  script:
    - >
      echo "First command line
      is split over two lines."

      echo "Second command line."
```

This behaves similarly to writing multiline commands without the `>` or `|` block
scalar indicators:

```yaml
job:
  script:
    - echo "First command line
      is split over two lines."

      echo "Second command line."
```

Both examples above render in the job log as:

```shell
$ echo First command line is split over two lines. # collapsed multi-line command
First command line is split over two lines.
Second command line.
```

809
When you omit the `>` or `|` block scalar indicators, GitLab forms the command
810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833
by concatenating non-empty lines, so make sure the lines can run when concatenated.

Shell [here documents](https://en.wikipedia.org/wiki/Here_document) work with the
`|` and `>` operators as well. The example below transliterates the lower case letters
to upper case:

```yaml
job:
  script:
    - |
      tr a-z A-Z << END_TEXT
        one two three
        four five six
      END_TEXT
```

Results in:

```shell
$ tr a-z A-Z << END_TEXT # collapsed multi-line command
  ONE TWO THREE
  FOUR FIVE SIX
```

834 835 836 837
#### Custom collapsible sections

See [custom collapsible sections](../pipelines/index.md#custom-collapsible-sections).

838
### `stage`
839

840
`stage` is defined per-job and relies on [`stages`](#stages), which is defined
841 842
globally. It allows to group jobs into different stages, and jobs of the same
`stage` are executed in parallel (subject to [certain conditions](#using-your-own-runners)). For example:
843

844 845 846 847 848
```yaml
stages:
  - build
  - test
  - deploy
849

850 851 852
job 0:
  stage: .pre
  script: make something useful before build stage
853

854 855 856
job 1:
  stage: build
  script: make build dependencies
857

858 859 860
job 2:
  stage: build
  script: make build artifacts
861

862 863 864
job 3:
  stage: test
  script: make test
865

866 867 868
job 4:
  stage: deploy
  script: make deploy
869

870 871 872
job 5:
  stage: .post
  script: make something useful at the end of pipeline
873 874
```

875
#### Using your own runners
876

877 878 879
When you use your own runners, GitLab Runner runs only one job at a time by default. See the
`concurrent` flag in [runner global settings](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-global-section)
for more information.
880

881
Jobs run on your own runners in parallel only if:
882

883 884
- Run on different runners.
- The runner's `concurrent` setting has been changed.
885

886
#### `.pre` and `.post`
887

888
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31441) in GitLab 12.4.
889

890
The following stages are available to every pipeline:
891

892 893
- `.pre`, which is guaranteed to always be the first stage in a pipeline.
- `.post`, which is guaranteed to always be the last stage in a pipeline.
894

895
User-defined stages are executed after `.pre` and before `.post`.
E
Evan Read 已提交
896

897
The order of `.pre` and `.post` can't be changed, even if defined out of order in `.gitlab-ci.yml`.
898
For example, the following are equivalent configuration:
899

900
- Configured in order:
901

902
  ```yaml
903 904 905 906 907 908
  stages:
    - .pre
    - a
    - b
    - .post
  ```
909

910
- Configured out of order:
911

912
  ```yaml
913 914 915 916 917 918
  stages:
    - a
    - .pre
    - b
    - .post
  ```
919

920
- Not explicitly configured:
E
Evan Read 已提交
921

922
  ```yaml
923 924 925 926
  stages:
    - a
    - b
  ```
927

928
NOTE: **Note:**
929
A pipeline is not created if all jobs are in `.pre` or `.post` stages.
930

931
### `extends`
932

933
> Introduced in GitLab 11.3.
934

935 936
`extends` defines entry names that a job that uses `extends`
inherits from.
937

938
It's an alternative to using [YAML anchors](#anchors) and is a little
939
more flexible and readable:
940

941 942 943 944 945 946 947
```yaml
.tests:
  script: rake test
  stage: test
  only:
    refs:
      - branches
948

949 950 951 952 953 954 955
rspec:
  extends: .tests
  script: rake rspec
  only:
    variables:
      - $RSPEC
```
E
Evan Read 已提交
956

957
In the example above, the `rspec` job inherits from the `.tests` template job.
958
GitLab performs a reverse deep merge based on the keys. GitLab:
959

960 961
- Merges the `rspec` contents into `.tests` recursively.
- Doesn't merge the values of the keys.
962

963
The result is this `rspec` job:
964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980

```yaml
rspec:
  script: rake rspec
  stage: test
  only:
    refs:
      - branches
    variables:
      - $RSPEC
```

NOTE: **Note:**
Note that `script: rake test` has been overwritten by `script: rake rspec`.

If you do want to include the `rake test`, see [`before_script` and `after_script`](#before_script-and-after_script).

981
`.tests` in this example is a [hidden job](#hide-jobs), but it's
982 983
possible to inherit from regular jobs as well.

984
`extends` supports multi-level inheritance. You should avoid using more than 3 levels,
985
but you can use as many as eleven.
986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012
The following example has two levels of inheritance:

```yaml
.tests:
  only:
    - pushes

.rspec:
  extends: .tests
  script: rake rspec

rspec 1:
  variables:
    RSPEC_SUITE: '1'
  extends: .rspec

rspec 2:
  variables:
    RSPEC_SUITE: '2'
  extends: .rspec

spinach:
  extends: .tests
  script: rake spinach
```

In GitLab 12.0 and later, it's also possible to use multiple parents for
1013 1014 1015 1016 1017 1018
`extends`.

#### Merge details

`extends` is able to merge hashes but not arrays.
The algorithm used for merge is "closest scope wins", so
1019
keys from the last member always override anything defined on other
1020 1021 1022 1023
levels. For example:

```yaml
.only-important:
1024 1025 1026
  variables:
    URL: "http://my-url.internal"
    IMPORTANT_VAR: "the details"
1027 1028 1029 1030 1031
  only:
    - master
    - stable
  tags:
    - production
1032 1033
  script:
    - echo "Hello world!"
1034 1035

.in-docker:
1036 1037
  variables:
    URL: "http://docker-url.internal"
1038 1039 1040 1041 1042
  tags:
    - docker
  image: alpine

rspec:
1043 1044
  variables:
    GITLAB: "is-awesome"
1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055
  extends:
    - .only-important
    - .in-docker
  script:
    - rake rspec
```

This results in the following `rspec` job:

```yaml
rspec:
1056 1057 1058 1059
  variables:
    URL: "http://docker-url.internal"
    IMPORTANT_VAR: "the details"
    GITLAB: "is-awesome"
1060 1061 1062 1063 1064 1065 1066 1067 1068 1069
  only:
    - master
    - stable
  tags:
    - docker
  image: alpine
  script:
    - rake rspec
```

1070 1071 1072 1073 1074 1075 1076 1077 1078
Note that in the example above:

- `variables` sections have been merged but that `URL: "http://my-url.internal"`
has been overwritten by `URL: "http://docker-url.internal"`.
- `tags: ['production']` has been overwritten by `tags: ['docker']`.
- `script` has not been merged but rather `script: ['echo "Hello world!"']` has
  been overwritten by `script: ['rake rspec']`. Arrays can be
  merged using [YAML anchors](#anchors).

1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100
#### Using `extends` and `include` together

`extends` works across configuration files combined with `include`.

For example, if you have a local `included.yml` file:

```yaml
.template:
  script:
    - echo Hello!
```

Then, in `.gitlab-ci.yml` you can use it like this:

```yaml
include: included.yml

useTemplate:
  image: alpine
  extends: .template
```

1101
This example runs a job called `useTemplate` that runs `echo Hello!` as defined in
1102 1103 1104 1105
the `.template` job, and uses the `alpine` Docker image as defined in the local job.

### `rules`

1106
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27863) in GitLab 12.3.
1107

1108
The `rules` keyword can be used to include or exclude jobs in pipelines.
1109

1110 1111 1112
Rules are evaluated *in order* until the first match. When matched, the job
is either included or excluded from the pipeline, depending on the configuration.
If included, the job also has [certain attributes](#rules-attributes)
1113
added to it.
1114 1115

CAUTION: **Caution:**
1116 1117
`rules` replaces [`only/except`](#onlyexcept-basic) and can't be used in conjunction with it.
If you attempt to use both keywords in the same job, the linter returns a
1118 1119
`key may not be used with rules` error.

1120
#### Rules attributes
1121

1122
The job attributes allowed by `rules` are:
1123

1124 1125 1126 1127
- [`when`](#when): If not defined, defaults to `when: on_success`.
  - If used as `when: delayed`, `start_in` is also required.
- [`allow_failure`](#allow_failure): If not defined, defaults to `allow_failure: false`.

1128
If a rule evaluates to true, and `when` has any value except `never`, the job is included in the pipeline.
1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147

For example:

```yaml
docker build:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  rules:
    - if: '$CI_COMMIT_BRANCH == "master"'
      when: delayed
      start_in: '3 hours'
      allow_failure: true
```

Additional job configuration may be added to rules in the future. If something
useful is not available, please [open an issue](https://gitlab.com/gitlab-org/gitlab/-/issues).

#### Rules clauses

Available rule clauses are:
1148

1149 1150 1151 1152 1153
| Clause                     | Description                                                                                                                        |
|----------------------------|------------------------------------------------------------------------------------------------------------------------------------|
| [`if`](#rulesif)           | Add or exclude jobs from a pipeline by evaluating an `if` statement. Similar to [`only:variables`](#onlyvariablesexceptvariables). |
| [`changes`](#ruleschanges) | Add or exclude jobs from a pipeline based on what files are changed. Same as [`only:changes`](#onlychangesexceptchanges).          |
| [`exists`](#rulesexists)   | Add or exclude jobs from a pipeline based on the presence of specific files.                                                       |
1154

1155 1156 1157
Rules are evaluated in order until a match is found. If a match is found, the attributes
are checked to see if the job should be added to the pipeline. If no attributes are defined,
the defaults are:
1158

1159 1160
- `when: on_success`
- `allow_failure: false`
1161

1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174
The job is added to the pipeline:

- If a rule matches and has `when: on_success`, `when: delayed` or `when: always`.
- If no rules match, but the last clause is `when: on_success`, `when: delayed`
  or `when: always` (with no rule).

The job is not added to the pipeline:

- If no rules match, and there is no standalone `when: on_success`, `when: delayed` or
  `when: always`.
- If a rule matches, and has `when: never` as the attribute.

For example, using `if` clauses to strictly limit when jobs run:
1175 1176 1177 1178 1179

```yaml
job:
  script: "echo Hello, Rules!"
  rules:
1180
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
1181
      when: manual
1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212
      allow_failure: true
    - if: '$CI_PIPELINE_SOURCE == "schedule"'
```

In this example:

- If the pipeline is for a merge request, the first rule matches, and the job
  is added to the [merge request pipeline](../merge_request_pipelines/index.md)
  with attributes of:
  - `when: manual` (manual job)
  - `allow_failure: true` (allows the pipeline to continue running even if the manual job is not run)
- If the pipeline is **not** for a merge request, the first rule doesn't match, and the
  second rule is evaluated.
- If the pipeline is a scheduled pipeline, the second rule matches, and the job
  is added to the scheduled pipeline. Since no attributes were defined, it is added
  with:
  - `when: on_success` (default)
  - `allow_failure: false` (default)
- In **all other cases**, no rules match, so the job is **not** added to any other pipeline.

Alternatively, you can define a set of rules to exclude jobs in a few cases, but
run them in all other cases:

```yaml
job:
  script: "echo Hello, Rules!"
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      when: never
    - if: '$CI_PIPELINE_SOURCE == "schedule"'
      when: never
1213 1214 1215
    - when: on_success
```

1216 1217 1218 1219
- If the pipeline is for a merge request, the job is **not** be added to the pipeline.
- If the pipeline is a scheduled pipeline, the job is **not** be added to the pipeline.
- In **all other cases**, the job is added to the pipeline, with `when: on_success`.

1220
CAUTION: **Caution:**
1221
If you use a `when:` clause as the final rule (not including `when: never`), two
1222 1223
simultaneous pipelines may start. Both push pipelines and merge request pipelines can
be triggered by the same event (a push to the source branch for an open merge request).
1224
See how to [prevent duplicate pipelines](#prevent-duplicate-pipelines)
1225 1226
for more details.

1227
#### Prevent duplicate pipelines
1228

1229 1230 1231 1232
Jobs defined with `rules` can trigger multiple pipelines with the same action. You
don't have to explicitly configure rules for each type of pipeline to trigger them
accidentally. Rules that are too loose (allowing too many types of pipelines) could
cause a second pipeline to run unexpectedly.
1233

1234 1235 1236
Some configurations that have the potential to cause duplicate pipelines cause a
[pipeline warning](../troubleshooting.md#pipeline-warnings) to be displayed.
[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/219431) in GitLab 13.3.
1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251

For example:

```yaml
job:
  script: "echo This creates double pipelines!"
  rules:
    - if: '$CUSTOM_VARIABLE == "false"'
      when: never
    - when: always
```

This job does not run when `$CUSTOM_VARIABLE` is false, but it *does* run in **all**
other pipelines, including **both** push (branch) and merge request pipelines. With
this configuration, every push to an open merge request's source branch
1252
causes duplicated pipelines.
1253

1254
There are multiple ways to avoid this:
1255

1256 1257 1258
- Use [`workflow: rules`](#workflowrules) to specify which types of pipelines
  can run. To eliminate duplicate pipelines, allow only merge request pipelines
  or push (branch) pipelines.
1259

1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322
- Rewrite the rules to run the job only in very specific cases,
  and avoid using a final `when:` rule:

  ```yaml
  job:
    script: "echo This does NOT create double pipelines!"
    rules:
      - if: '$CUSTOM_VARIABLE == "true" && $CI_PIPELINE_SOURCE == "merge_request_event"'
  ```

You can prevent duplicate pipelines by changing the job rules to avoid either push (branch)
pipelines or merge request pipelines. However, if you use a `- when: always` rule without
`workflow: rules`, GitLab still displays a [pipeline warning](../troubleshooting.md#pipeline-warnings).

For example, the following does not trigger double pipelines, but is not recommended
without `workflow: rules`:

```yaml
job:
  script: "echo This does NOT create double pipelines!"
  rules:
    - if: '$CI_PIPELINE_SOURCE == "push"'
      when: never
    - when: always
```

Do not include both push and merge request pipelines in the same job:

```yaml
job:
  script: "echo This creates double pipelines!"
  rules:
    - if: '$CI_PIPELINE_SOURCE == "push"'
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
```

Also, do not mix `only/except` jobs with `rules` jobs in the same pipeline.
It may not cause YAML errors, but the different default behaviors of `only/except`
and `rules` can cause issues that are difficult to troubleshoot:

```yaml
job-with-no-rules:
  script: "echo This job runs in branch pipelines."

job-with-rules:
  script: "echo This job runs in merge request pipelines."
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
```

For every change pushed to the branch, duplicate pipelines run. One
branch pipeline runs a single job (`job-with-no-rules`), and one merge request pipeline
runs the other job (`job-with-rules`). Jobs with no rules default
to [`except: merge_requests`](#onlyexcept-basic), so `job-with-no-rules`
runs in all cases except merge requests.

It is not possible to define rules based on whether or not a branch has an open
merge request associated with it. You can't configure a job to be included in:

- Only branch pipelines when the branch doesn't have a merge request associated with it.
- Only merge request pipelines when the branch has a merge request associated with it.

See the [related issue](https://gitlab.com/gitlab-org/gitlab/-/issues/201845) for more details.
1323

1324
#### `rules:if`
1325 1326 1327 1328 1329 1330 1331

`rules:if` clauses determine whether or not jobs are added to a pipeline by evaluating
a simple `if` statement. If the `if` statement is true, the job is either included
or excluded from a pipeline. In plain English, `if` rules can be interpreted as one of:

- "If this rule evaluates to true, add the job" (default).
- "If this rule evaluates to true, do not add the job" (by adding `when: never`).
1332 1333

`rules:if` differs slightly from `only:variables` by accepting only a single
1334
expression string per rule, rather than an array of them. Any set of expressions to be
1335 1336
evaluated can be [conjoined into a single expression](../variables/README.md#conjunction--disjunction)
by using `&&` or `||`, and use
1337
the [variable matching syntax](../variables/README.md#syntax-of-environment-variable-expressions).
1338 1339
Unlike variables in [`script`](../variables/README.md#syntax-of-environment-variables-in-job-scripts)
sections, variables in rules expressions are always formatted as `$VARIABLE`.
1340

1341 1342 1343
`if:` clauses are evaluated based on the values of [predefined environment variables](../variables/predefined_variables.md)
or [custom environment variables](../variables/README.md#custom-environment-variables).

1344 1345 1346 1347 1348 1349
For example:

```yaml
job:
  script: "echo Hello, Rules!"
  rules:
1350
    - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/ && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"'
1351
      when: always
1352
    - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/'
1353
      when: manual
1354 1355
      allow_failure: true
    - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME' # Checking for the presence of a variable is possible
1356 1357
```

1358 1359
Some details regarding the logic that determines the `when` for the job:

1360
- If none of the provided rules match, the job is set to `when: never` and is
1361 1362 1363
  not included in the pipeline.
- A rule without any conditional clause, such as a `when` or `allow_failure`
  rule without `if` or `changes`, always matches, and is always used if reached.
1364
- If a rule matches and has no `when` defined, the rule uses the `when`
1365
  defined for the job, which defaults to `on_success` if not defined.
1366 1367
- You can define `when` once per rule, or once at the job-level, which applies to
  all rules. You can't mix `when` at the job-level with `when` in rules.
1368

1369 1370
##### Common `if` clauses for `rules`

1371
For behavior similar to the [`only`/`except` keywords](#onlyexcept-basic), you can
1372
check the value of the `$CI_PIPELINE_SOURCE` variable:
1373

1374 1375 1376 1377
| Value                         | Description                                                                                                                                                                                                                      |
|-------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `api`                         | For pipelines triggered by the [pipelines API](../../api/pipelines.md#create-a-new-pipeline).                                                                                                                                    |
| `chat`                        | For pipelines created by using a [GitLab ChatOps](../chatops/README.md) command.                                                                                                                                                 |
1378
| `external`                    | When using CI services other than GitLab.                                                                                                                                                                                        |
1379
| `external_pull_request_event` | When an external pull request on GitHub is created or updated. See [Pipelines for external pull requests](../ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests).                                            |
1380
| `merge_request_event`         | For pipelines created when a merge request is created or updated. Required to enable [merge request pipelines](../merge_request_pipelines/index.md), [merged results pipelines](../merge_request_pipelines/pipelines_for_merged_results/index.md), and [merge trains](../merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md). |
1381
| `parent_pipeline`             | For pipelines triggered by a [parent/child pipeline](../parent_child_pipelines.md) with `rules`, use this in the child pipeline configuration so that it can be triggered by the parent pipeline.                                |
1382 1383 1384 1385 1386 1387
| `pipeline`                    | For [multi-project pipelines](../multi_project_pipelines.md) created by [using the API with `CI_JOB_TOKEN`](../multi_project_pipelines.md#triggering-multi-project-pipelines-through-api), or the [`trigger`](#trigger) keyword. |
| `push`                        | For pipelines triggered by a `git push` event, including for branches and tags.                                                                                                                                                  |
| `schedule`                    | For [scheduled pipelines](../pipelines/schedules.md).                                                                                                                                                                            |
| `trigger`                     | For pipelines created by using a [trigger token](../triggers/README.md#trigger-token).                                                                                                                                           |
| `web`                         | For pipelines created by using **Run pipeline** button in the GitLab UI, from the project's **CI/CD > Pipelines** section.                                                                                                       |
| `webide`                      | For pipelines created by using the [WebIDE](../../user/project/web_ide/index.md).                                                                                                                                                |
1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430

For example:

```yaml
job:
  script: "echo Hello, Rules!"
  rules:
    - if: '$CI_PIPELINE_SOURCE == "schedule"'
      when: manual
      allow_failure: true
    - if: '$CI_PIPELINE_SOURCE == "push"'
```

This example runs the job as a manual job in scheduled pipelines or in push
pipelines (to branches or tags), with `when: on_success` (default). It does not
add the job to any other pipeline type.

Another example:

```yaml
job:
  script: "echo Hello, Rules!"
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
    - if: '$CI_PIPELINE_SOURCE == "schedule"'
```

This example runs the job as a `when: on_success` job in [merge request pipelines](../merge_request_pipelines/index.md)
and scheduled pipelines. It does not run in any other pipeline type.

Other commonly used variables for `if` clauses:

- `if: $CI_COMMIT_TAG`: If changes are pushed for a tag.
- `if: $CI_COMMIT_BRANCH`: If changes are pushed to any branch.
- `if: '$CI_COMMIT_BRANCH == "master"'`: If changes are pushed to `master`.
- `if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'`: If changes are pushed to the default
  branch (usually `master`). Useful if reusing the same configuration in multiple
  projects with potentially different default branches.
- `if: '$CI_COMMIT_BRANCH =~ /regex-expression/'`: If the commit branch matches a regular expression.
- `if: '$CUSTOM_VARIABLE !~ /regex-expression/'`: If the [custom variable](../variables/README.md#custom-environment-variables)
  `CUSTOM_VARIABLE` does **not** match a regular expression.
- `if: '$CUSTOM_VARIABLE == "value1"'`: If the custom variable `CUSTOM_VARIABLE` is
  exactly `value1`.
1431

1432
#### `rules:changes`
1433 1434 1435 1436 1437 1438

To determine if jobs should be added to a pipeline, `rules: changes` clauses check
the files changed by Git push events.

`rules: changes` works exactly the same way as [`only: changes` and `except: changes`](#onlychangesexceptchanges),
accepting an array of paths. Similarly, it always returns true if there is no
1439
Git push event, for example, when a new tag is created. It should only be used for branch pipelines or merge request pipelines.
1440 1441

For example:
1442 1443

```yaml
1444 1445 1446 1447
workflow:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'

1448 1449 1450
docker build:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  rules:
1451
    - changes:
1452
        - Dockerfile
1453
      when: manual
1454
      allow_failure: true
1455 1456
```

1457
In this example:
E
Evan Read 已提交
1458

1459 1460 1461 1462
- [`workflow: rules`](#workflowrules) allows only pipelines for merge requests for all jobs.
- If `Dockerfile` has changed, add the job to the pipeline as a manual job, and allow the pipeline
  to continue running even if the job is not triggered (`allow_failure: true`).
- If `Dockerfile` has not changed, do not add job to any pipeline (same as `when: never`).
E
Evan Read 已提交
1463

1464 1465 1466
To implement a rule similar to [`except: changes`](#onlychangesexceptchanges),
use `when: never`.

1467
#### `rules:exists`
1468

1469
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/24021) in GitLab 12.4.
1470

1471
`exists` accepts an array of paths and matches if any of these paths exist
1472 1473 1474 1475 1476 1477 1478 1479 1480
as files in the repository.

For example:

```yaml
job:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  rules:
    - exists:
1481
        - Dockerfile
1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493
```

You can also use glob patterns to match multiple files in any directory within
the repository.

For example:

```yaml
job:
  script: bundle exec rspec
  rules:
    - exists:
1494
        - spec/**.rb
1495 1496 1497 1498
```

NOTE: **Note:**
For performance reasons, using `exists` with patterns is limited to 10000
1499
checks. After the 10000th check, rules with patterned globs always match.
1500

1501
#### `rules:allow_failure`
1502

1503
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30235) in GitLab 12.8.
1504 1505 1506 1507 1508

You can use [`allow_failure: true`](#allow_failure) within `rules:` to allow a job to fail, or a manual job to
wait for action, without stopping the pipeline itself. All jobs using `rules:` default to `allow_failure: false`
if `allow_failure:` is not defined.

1509 1510 1511 1512
The rule-level `rules:allow_failure` option overrides the job-level
[`allow_failure`](#allow_failure) option, and is only applied when the job is
triggered by the particular rule.

1513 1514 1515 1516 1517 1518 1519 1520 1521
```yaml
job:
  script: "echo Hello, Rules!"
  rules:
    - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"'
      when: manual
      allow_failure: true
```

1522
In this example, if the first rule matches, then the job has `when: manual` and `allow_failure: true`.
1523

E
Evan Read 已提交
1524
#### Complex rule clauses
1525

1526
To conjoin `if`, `changes`, and `exists` clauses with an `AND`, use them in the
1527
same rule.
E
Evan Read 已提交
1528 1529 1530

In the following example:

1531
- If the `Dockerfile` file or any file in `/docker/scripts` has changed, and var=blah,
1532 1533
  then the job runs manually
- Otherwise, the job isn't included in the pipeline.
1534 1535 1536 1537 1538 1539 1540

```yaml
docker build:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  rules:
    - if: '$VAR == "string value"'
      changes: # Will include the job and set to when:manual if any of the follow paths match a modified file.
1541 1542
        - Dockerfile
        - docker/scripts/*
1543 1544 1545 1546
      when: manual
  # - when: never would be redundant here, this is implied any time rules are listed.
```

E
Evan Read 已提交
1547 1548
Keywords such as `branches` or `refs` that are currently available for
`only`/`except` are not yet available in `rules` as they are being individually
1549 1550 1551
considered for their usage and behavior in this context. Future keyword improvements
are being discussed in our [epic for improving `rules`](https://gitlab.com/groups/gitlab-org/-/epics/2783),
where anyone can add suggestions or requests.
1552

1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568
You can use [parentheses](../variables/README.md#parentheses) with `&&` and `||` to build more complicated variable expressions.
[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/230938) in GitLab 13.3:

```yaml
job1:
  script:
    - echo This rule uses parentheses.
  rules:
    if: ($CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH == "develop") && $MY_VARIABLE
```

NOTE: **Note:**
In GitLab 13.2 and older, the order of operations when mixing `||` and `&&` in a single rule may not have executed
in the expected order. This is [fixed](https://gitlab.com/gitlab-org/gitlab/-/issues/230938)
in GitLab 13.3.

1569
### `only`/`except` (basic)
1570

1571
NOTE: **Note:**
1572 1573 1574
The [`rules`](#rules) syntax is an improved, more powerful solution for defining
when jobs should run or not. Consider using `rules` instead of `only/except` to get
the most out of your pipelines.
1575

1576 1577
`only` and `except` are two parameters that set a job policy to limit when
jobs are created:
1578

1579 1580 1581
1. `only` defines the names of branches and tags the job runs for.
1. `except` defines the names of branches and tags the job does
    **not** run for.
1582

1583
There are a few rules that apply to the usage of job policy:
1584

1585 1586 1587 1588 1589
- `only` and `except` are inclusive. If both `only` and `except` are defined
   in a job specification, the ref is filtered by `only` and `except`.
- `only` and `except` allow the use of regular expressions ([supported regexp syntax](#supported-onlyexcept-regexp-syntax)).
- `only` and `except` allow to specify a repository path to filter jobs for
   forks.
D
Douwe Maan 已提交
1590

1591
In addition, `only` and `except` allow the use of special keywords:
D
Douwe Maan 已提交
1592

1593 1594 1595
| **Value**                | **Description**                                                                                                                                                                                                                  |
|--------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `api`                    | For pipelines triggered by the [pipelines API](../../api/pipelines.md#create-a-new-pipeline).                                                                                                                                    |
1596 1597
| `branches`               | When the Git reference for a pipeline is a branch.                                                                                                                                                                               |
| `chat`                   | For pipelines created by using a [GitLab ChatOps](../chatops/README.md) command.                                                                                                                                                 |
1598
| `external`               | When using CI services other than GitLab.                                                                                                                                                                                        |
1599 1600
| `external_pull_requests` | When an external pull request on GitHub is created or updated (See [Pipelines for external pull requests](../ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests)).                                           |
| `merge_requests`         | For pipelines created when a merge request is created or updated. Enables [merge request pipelines](../merge_request_pipelines/index.md), [merged results pipelines](../merge_request_pipelines/pipelines_for_merged_results/index.md), and [merge trains](../merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md). |
1601 1602 1603
| `pipelines`              | For [multi-project pipelines](../multi_project_pipelines.md) created by [using the API with `CI_JOB_TOKEN`](../multi_project_pipelines.md#triggering-multi-project-pipelines-through-api), or the [`trigger`](#trigger) keyword. |
| `pushes`                 | For pipelines triggered by a `git push` event, including for branches and tags.                                                                                                                                                  |
| `schedules`              | For [scheduled pipelines](../pipelines/schedules.md).                                                                                                                                                                            |
1604
| `tags`                   | When the Git reference for a pipeline is a tag.                                                                                                                                                                                  |
1605 1606
| `triggers`               | For pipelines created by using a [trigger token](../triggers/README.md#trigger-token).                                                                                                                                           |
| `web`                    | For pipelines created by using **Run pipeline** button in the GitLab UI, from the project's **CI/CD > Pipelines** section.                                                                                                       |
1607

1608 1609
In the example below, `job` will run only for refs that start with `issue-`,
whereas all branches will be skipped:
1610 1611

```yaml
D
Douwe Maan 已提交
1612
job:
1613 1614 1615 1616 1617 1618 1619
  # use regexp
  only:
    - /^issue-.*$/
  # use special keyword
  except:
    - branches
```
D
Douwe Maan 已提交
1620

1621 1622
Pattern matching is case-sensitive by default. Use `i` flag modifier, like
`/pattern/i` to make a pattern case-insensitive:
1623 1624

```yaml
1625 1626 1627 1628 1629 1630 1631
job:
  # use regexp
  only:
    - /^issue-.*$/i
  # use special keyword
  except:
    - branches
1632 1633
```

1634 1635
In this example, `job` will run only for refs that are tagged, or if a build is
explicitly requested via an API trigger or a [Pipeline Schedule](../pipelines/schedules.md):
1636 1637

```yaml
1638 1639 1640 1641 1642 1643
job:
  # use special keywords
  only:
    - tags
    - triggers
    - schedules
1644 1645
```

1646 1647
The repository path can be used to have jobs executed only for the parent
repository and not forks:
1648 1649

```yaml
1650 1651 1652 1653 1654 1655
job:
  only:
    - branches@gitlab-org/gitlab
  except:
    - master@gitlab-org/gitlab
    - /^release/.*$/@gitlab-org/gitlab
1656 1657
```

1658 1659
The above example will run `job` for all branches on `gitlab-org/gitlab`,
except `master` and those with names prefixed with `release/`.
W
Winnie Hellmann 已提交
1660

1661
If a job does not have an `only` rule, `only: ['branches', 'tags']` is set by
1662
default. If it does not have an `except` rule, it's empty.
W
Winnie Hellmann 已提交
1663

1664
For example,
W
Winnie Hellmann 已提交
1665

1666 1667 1668 1669
```yaml
job:
  script: echo 'test'
```
W
Winnie Hellmann 已提交
1670

1671
is translated to:
W
Winnie Hellmann 已提交
1672 1673

```yaml
1674 1675 1676
job:
  script: echo 'test'
  only: ['branches', 'tags']
W
Winnie Hellmann 已提交
1677 1678
```

1679
#### Regular expressions
W
Winnie Hellmann 已提交
1680

1681 1682 1683
Because `@` is used to denote the beginning of a ref's repository path,
matching a ref name containing the `@` character in a regular expression
requires the use of the hex character code match `\x40`.
W
Winnie Hellmann 已提交
1684

1685 1686
Only the tag or branch name can be matched by a regular expression.
The repository path, if given, is always matched literally.
1687

1688 1689 1690 1691 1692 1693
If a regular expression shall be used to match the tag or branch name,
the entire ref name part of the pattern has to be a regular expression,
and must be surrounded by `/`.
(With regular expression flags appended after the closing `/`.)
So `issue-/.*/` won't work to match all tag names or branch names
that begin with `issue-`.
1694

1695
TIP: **Tip:**
1696 1697 1698 1699
Use anchors `^` and `$` to avoid the regular expression
matching only a substring of the tag name or branch name.
For example, `/^issue-.*$/` is equivalent to `/^issue-/`,
while just `/issue/` would also match a branch called `severe-issues`.
1700

1701
#### Supported `only`/`except` regexp syntax
1702

1703 1704
CAUTION: **Warning:**
This is a breaking change that was introduced with GitLab 11.9.4.
1705

1706 1707
In GitLab 11.9.4, GitLab begun internally converting regexp used
in `only` and `except` parameters to [RE2](https://github.com/google/re2/wiki/Syntax).
1708

1709 1710 1711 1712
This means that only subset of features provided by [Ruby Regexp](https://ruby-doc.org/core/Regexp.html)
is supported. [RE2](https://github.com/google/re2/wiki/Syntax) limits the set of features
provided due to computational complexity, which means some features became unavailable in GitLab 11.9.4.
For example, negative lookaheads.
1713

1714 1715 1716
For GitLab versions from 11.9.7 and up to GitLab 12.0, GitLab provides a feature flag that can be
enabled by administrators that allows users to use unsafe regexp syntax. This brings compatibility
with previously allowed syntax version and allows users to gracefully migrate to the new syntax.
1717

1718 1719 1720
```ruby
Feature.enable(:allow_unsafe_ruby_regexp)
```
1721

1722
### `only`/`except` (advanced)
1723

1724
CAUTION: **Warning:**
1725
This is an _alpha_ feature, and is subject to change at any time without
1726
prior notice!
1727

1728 1729
GitLab supports both simple and complex strategies, so it's possible to use an
array and a hash configuration scheme.
1730

1731
Four keys are available:
1732

1733 1734 1735 1736
- `refs`
- `variables`
- `changes`
- `kubernetes`
1737

1738 1739
If you use multiple keys under `only` or `except`, the keys will be evaluated as a
single conjoined expression. That is:
1740

1741 1742
- `only:` means "include this job if all of the conditions match".
- `except:` means "exclude this job if any of the conditions match".
1743

1744
With `only`, individual keys are logically joined by an AND:
1745

1746 1747 1748
> (any of refs) AND (any of variables) AND (any of changes) AND (if Kubernetes is active)

In the example below, the `test` job will `only` be created when **all** of the following are true:
1749

1750 1751 1752
- The pipeline has been [scheduled](../../user/project/pipelines/schedules.md) **or** runs for `master`.
- The `variables` keyword matches.
- The `kubernetes` service is active on the project.
1753

1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764
```yaml
test:
  script: npm run test
  only:
    refs:
      - master
      - schedules
    variables:
      - $CI_COMMIT_MESSAGE =~ /run-end-to-end-tests/
    kubernetes: active
```
1765

1766
`except` is implemented as a negation of this complete expression:
1767

1768
> NOT((any of refs) AND (any of variables) AND (any of changes) AND (if Kubernetes is active))
1769

1770
This means the keys are treated as if joined by an OR. This relationship could be described as:
1771

1772
> (any of refs) OR (any of variables) OR (any of changes) OR (if Kubernetes is active)
1773

1774
In the example below, the `test` job will **not** be created when **any** of the following are true:
1775

1776
- The pipeline runs for the `master` branch.
1777
- There are changes to the `README.md` file in the root directory of the repository.
1778 1779

```yaml
1780 1781 1782 1783 1784 1785 1786
test:
  script: npm run test
  except:
    refs:
      - master
    changes:
      - "README.md"
1787 1788
```

1789
#### `only:refs`/`except:refs`
1790

1791
> `refs` policy introduced in GitLab 10.0.
1792

1793 1794
The `refs` strategy can take the same values as the
[simplified only/except configuration](#onlyexcept-basic).
1795

1796 1797
In the example below, the `deploy` job is going to be created only when the
pipeline has been [scheduled](../pipelines/schedules.md) or runs for the `master` branch:
1798

1799 1800 1801 1802 1803 1804 1805
```yaml
deploy:
  only:
    refs:
      - master
      - schedules
```
1806

1807
#### `only:kubernetes`/`except:kubernetes`
1808

1809
> `kubernetes` policy introduced in GitLab 10.0.
1810

1811
The `kubernetes` strategy accepts only the `active` keyword.
1812

1813 1814
In the example below, the `deploy` job is going to be created only when the
Kubernetes service is active in the project:
1815 1816

```yaml
1817 1818 1819
deploy:
  only:
    kubernetes: active
1820 1821
```

1822
#### `only:variables`/`except:variables`
1823

1824
> `variables` policy introduced in GitLab 10.7.
1825

1826 1827 1828 1829
The `variables` keyword is used to define variables expressions. In other words,
you can use predefined variables / project / group or
environment-scoped variables to define an expression GitLab is going to
evaluate in order to decide whether a job should be created or not.
1830

1831
Examples of using variables expressions:
1832

1833 1834 1835 1836 1837 1838 1839 1840 1841 1842
```yaml
deploy:
  script: cap staging deploy
  only:
    refs:
      - branches
    variables:
      - $RELEASE == "staging"
      - $STAGING
```
1843

1844
Another use case is excluding jobs depending on a commit message:
1845 1846

```yaml
1847 1848 1849 1850 1851
end-to-end:
  script: rake test:end-to-end
  except:
    variables:
      - $CI_COMMIT_MESSAGE =~ /skip-end-to-end-tests/
1852 1853
```

1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864
You can use [parentheses](../variables/README.md#parentheses) with `&&` and `||` to build more complicated variable expressions.
[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/230938) in GitLab 13.3:

```yaml
job1:
  script:
    - echo This rule uses parentheses.
  only:
    variables:
      - ($CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH == "develop") && $MY_VARIABLE
```
1865

1866
#### `only:changes`/`except:changes`
1867

1868
> `changes` policy [introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/19232) in GitLab 11.4.
1869

1870 1871
Using the `changes` keyword with `only` or `except` makes it possible to define if
a job should be created based on files modified by a Git push event.
1872

1873
This means the `only:changes` policy is useful for pipelines where:
1874

1875 1876 1877 1878 1879
- `$CI_PIPELINE_SOURCE == 'push'`
- `$CI_PIPELINE_SOURCE == 'merge_request_event'`
- `$CI_PIPELINE_SOURCE == 'external_pull_request_event'`

If there is no Git push event, such as for pipelines with
1880
[sources other than the three above](../variables/predefined_variables.md),
1881
`changes` can't determine if a given file is new or old, and will always
1882 1883 1884
return true.

A basic example of using `only: changes`:
1885 1886

```yaml
1887 1888 1889 1890 1891 1892 1893 1894
docker build:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  only:
    changes:
      - Dockerfile
      - docker/scripts/*
      - dockerfiles/**/*
      - more_scripts/*.{rb,py,sh}
1895 1896
```

1897 1898 1899
In the scenario above, when pushing commits to an existing branch in GitLab,
it creates and triggers the `docker build` job, provided that one of the
commits contains changes to any of the following:
1900

1901 1902 1903 1904
- The `Dockerfile` file.
- Any of the files inside `docker/scripts/` directory.
- Any of the files and subdirectories inside the `dockerfiles` directory.
- Any of the files with `rb`, `py`, `sh` extensions inside the `more_scripts` directory.
1905

1906 1907
CAUTION: **Warning:**
If using `only:changes` with [only allow merge requests to be merged if the pipeline succeeds](../../user/project/merge_requests/merge_when_pipeline_succeeds.md#only-allow-merge-requests-to-be-merged-if-the-pipeline-succeeds),
1908
undesired behavior could result if you don't [also use `only:merge_requests`](#using-onlychanges-with-pipelines-for-merge-requests).
1909

1910
You can also use glob patterns to match multiple files in either the root directory
1911
of the repository, or in _any_ directory within the repository, but they must be wrapped
1912
in double quotes or GitLab will fail to parse the `.gitlab-ci.yml`. For example:
1913

1914 1915 1916 1917 1918 1919 1920 1921
```yaml
test:
  script: npm run test
  only:
    changes:
      - "*.json"
      - "**/*.sql"
```
1922

1923
The following example will skip the `build` job if a change is detected in any file
1924
in the root directory of the repository with a `.md` extension:
1925

1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940
```yaml
build:
  script: npm run build
  except:
    changes:
      - "*.md"
```

CAUTION: **Warning:**
There are some points to be aware of when
[using this feature with new branches or tags *without* pipelines for merge requests](#using-onlychanges-without-pipelines-for-merge-requests).

CAUTION: **Warning:**
There are some points to be aware of when
[using this feature with scheduled pipelines](#using-onlychanges-with-scheduled-pipelines).
1941

1942
##### Using `only:changes` with pipelines for merge requests
1943

1944
With [pipelines for merge requests](../merge_request_pipelines/index.md),
1945
it's possible to define a job to be created based on files modified
1946
in a merge request.
1947

1948 1949 1950 1951
In order to deduce the correct base SHA of the source branch, we recommend combining
this keyword with `only: [merge_requests]`. This way, file differences are correctly
calculated from any further commits, thus all changes in the merge requests are properly
tested in pipelines.
1952

1953
For example:
1954 1955

```yaml
1956 1957 1958 1959 1960 1961 1962 1963
docker build service one:
  script: docker build -t my-service-one-image:$CI_COMMIT_REF_SLUG .
  only:
    refs:
      - merge_requests
    changes:
      - Dockerfile
      - service-one/**/*
1964 1965
```

1966 1967 1968
In the scenario above, if a merge request is created or updated that changes
either files in `service-one` directory or the `Dockerfile`, GitLab creates
and triggers the `docker build service one` job.
1969

1970 1971 1972
Note that if [pipelines for merge requests](../merge_request_pipelines/index.md) is
combined with `only: [change]`, but `only: [merge_requests]` is omitted, there could be
unwanted behavior.
1973

1974 1975 1976 1977 1978 1979 1980 1981 1982
For example:

```yaml
docker build service one:
  script: docker build -t my-service-one-image:$CI_COMMIT_REF_SLUG .
  only:
    changes:
      - Dockerfile
      - service-one/**/*
1983 1984
```

1985 1986
In the example above, a pipeline could fail due to changes to a file in `service-one/**/*`.
A later commit could then be pushed that does not include any changes to this file,
1987
but includes changes to the `Dockerfile`, and this pipeline could pass because it's only
1988 1989 1990
testing the changes to the `Dockerfile`. GitLab checks the **most recent pipeline**,
that **passed**, and will show the merge request as mergeable, despite the earlier
failed pipeline caused by a change that was not yet corrected.
1991

1992 1993
With this configuration, care must be taken to check that the most recent pipeline
properly corrected any failures from previous pipelines.
1994

1995
##### Using `only:changes` without pipelines for merge requests
1996

1997 1998
Without [pipelines for merge requests](../merge_request_pipelines/index.md), pipelines
run on branches or tags that don't have an explicit association with a merge request.
1999 2000
In this case, a previous SHA is used to calculate the diff, which is equivalent to `git diff HEAD~`.
This can result in some unexpected behavior, including:
2001

2002 2003 2004
- When pushing a new branch or a new tag to GitLab, the policy always evaluates to true.
- When pushing a new commit, the changed files are calculated using the previous commit
  as the base SHA.
2005

2006
##### Using `only:changes` with scheduled pipelines
2007

2008 2009 2010
`only:changes` always evaluates as "true" in [Scheduled pipelines](../pipelines/schedules.md).
All files are considered to have "changed" when a scheduled pipeline
runs.
2011

2012
### `needs`
2013

2014
> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/47063) in GitLab 12.2.
2015
> - In GitLab 12.3, maximum number of jobs in `needs` array raised from five to 50.
2016
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30631) in GitLab 12.8, `needs: []` lets jobs start immediately.
2017

2018 2019 2020 2021 2022 2023 2024
The `needs:` keyword enables executing jobs out-of-order, allowing you to implement
a [directed acyclic graph](../directed_acyclic_graph/index.md) in your `.gitlab-ci.yml`.

This lets you run some jobs without waiting for other ones, disregarding stage ordering
so you can have multiple stages running concurrently.

Let's consider the following example:
2025 2026

```yaml
2027 2028
linux:build:
  stage: build
2029

2030 2031
mac:build:
  stage: build
2032

2033 2034 2035
lint:
  stage: test
  needs: []
2036

2037 2038 2039
linux:rspec:
  stage: test
  needs: ["linux:build"]
2040

2041 2042 2043
linux:rubocop:
  stage: test
  needs: ["linux:build"]
2044

2045 2046 2047
mac:rspec:
  stage: test
  needs: ["mac:build"]
2048

2049 2050 2051
mac:rubocop:
  stage: test
  needs: ["mac:build"]
2052

2053 2054 2055
production:
  stage: deploy
```
2056

2057
This example creates four paths of execution:
2058

2059
- Linter: the `lint` job will run immediately without waiting for the `build` stage to complete because it has no needs (`needs: []`).
2060

2061 2062
- Linux path: the `linux:rspec` and `linux:rubocop` jobs will be run as soon
  as the `linux:build` job finishes without waiting for `mac:build` to finish.
2063

2064 2065
- macOS path: the `mac:rspec` and `mac:rubocop` jobs will be run as soon
  as the `mac:build` job finishes, without waiting for `linux:build` to finish.
2066

2067 2068 2069
- The `production` job will be executed as soon as all previous jobs
  finish; in this case: `linux:build`, `linux:rspec`, `linux:rubocop`,
  `mac:build`, `mac:rspec`, `mac:rubocop`.
2070

2071
#### Requirements and limitations
2072

2073 2074 2075
- If `needs:` is set to point to a job that is not instantiated
  because of `only/except` rules or otherwise does not exist, the
  pipeline will be created with YAML error.
2076
- The maximum number of jobs that a single job can need in the `needs:` array is limited:
2077
  - For GitLab.com, the limit is 50. For more information, see our
2078
    [infrastructure issue](https://gitlab.com/gitlab-com/gl-infra/infrastructure/-/issues/7541).
2079
  - For self-managed instances, the limit is: 50. This limit [can be changed](#changing-the-needs-job-limit-core-only).
2080 2081 2082
- If `needs:` refers to a job that is marked as `parallel:`.
  the current job will depend on all parallel jobs created.
- `needs:` is similar to `dependencies:` in that it needs to use jobs from prior stages,
2083
  meaning it's impossible to create circular dependencies. Depending on jobs in the
2084
  current stage is not possible either, but support [is planned](https://gitlab.com/gitlab-org/gitlab/-/issues/30632).
2085 2086
- Related to the above, stages must be explicitly defined for all jobs
  that have the keyword `needs:` or are referred to by one.
2087

2088
##### Changing the `needs:` job limit **(CORE ONLY)**
2089

2090
The maximum number of jobs that can be defined within `needs:` defaults to 50.
2091

2092 2093
A GitLab administrator with [access to the GitLab Rails console](../../administration/feature_flags.md)
can choose a custom limit. For example, to set the limit to 100:
2094

2095
```ruby
2096
Plan.default.actual_limits.update!(ci_needs_size_limit: 100)
2097 2098
```

2099 2100 2101
NOTE: **Note:**
To disable the ability to use DAG, set the limit to `0`.

2102
#### Artifact downloads with `needs`
2103

2104
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14311) in GitLab v12.6.
2105

2106
When using `needs`, artifact downloads are controlled with `artifacts: true` (default) or `artifacts: false`.
2107 2108 2109 2110

Since GitLab 12.6, you can't combine the [`dependencies`](#dependencies) keyword
with `needs` to control artifact downloads in jobs. `dependencies` is still valid
in jobs that do not use `needs`.
2111

2112
In the example below, the `rspec` job will download the `build_job` artifacts, while the
2113
`rubocop` job won't:
2114

2115
```yaml
2116 2117 2118
build_job:
  stage: build
  artifacts:
2119
    paths:
2120
      - binaries/
2121

2122 2123
rspec:
  stage: test
2124 2125 2126
  needs:
    - job: build_job
      artifacts: true
2127

2128 2129 2130 2131 2132 2133
rubocop:
  stage: test
  needs:
    - job: build_job
      artifacts: false
```
2134

2135 2136 2137
Additionally, in the three syntax examples below, the `rspec` job will download the artifacts
from all three `build_jobs`, as `artifacts` is true for `build_job_1`, and will
**default** to true for both `build_job_2` and `build_job_3`.
K
Kamil Trzcinski 已提交
2138

2139 2140 2141 2142 2143 2144 2145 2146
```yaml
rspec:
  needs:
    - job: build_job_1
      artifacts: true
    - job: build_job_2
    - build_job_3
```
2147

2148
#### Cross project artifact downloads with `needs` **(PREMIUM)**
2149

2150
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14311) in GitLab v12.7.
2151

2152 2153
`needs` can be used to download artifacts from up to five jobs in pipelines on
[other refs in the same project](#artifact-downloads-between-pipelines-in-the-same-project),
2154
or pipelines in different projects, groups and namespaces:
2155

2156 2157 2158 2159 2160 2161
```yaml
build_job:
  stage: build
  script:
    - ls -lhR
  needs:
2162
    - project: namespace/group/project-name
2163 2164 2165 2166
      job: build-1
      ref: master
      artifacts: true
```
2167

2168
`build_job` will download the artifacts from the latest successful `build-1` job
2169 2170 2171 2172 2173
on the `master` branch in the `group/project-name` project. If the project is in the
same group or namespace, you can omit them from the `project:` key. For example,
`project: group/project-name` or `project: project-name`.

The user running the pipeline must have at least `reporter` access to the group or project, or the group/project must have public visibility.
2174

2175
##### Artifact downloads between pipelines in the same project
2176

2177 2178 2179 2180
`needs` can be used to download artifacts from different pipelines in the current project
by setting the `project` keyword as the current project's name, and specifying a ref.
In the example below, `build_job` will download the artifacts for the latest successful
`build-1` job with the `other-ref` ref:
K
Kamil Trzcinski 已提交
2181

2182
```yaml
2183 2184 2185 2186 2187 2188 2189 2190 2191
build_job:
  stage: build
  script:
    - ls -lhR
  needs:
    - project: group/same-project-name
      job: build-1
      ref: other-ref
      artifacts: true
2192
```
K
Kamil Trzcinski 已提交
2193

2194
Environment variables support for `project:`, `job:`, and `ref` was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/202093)
2195
in GitLab 13.3. [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/235761) in GitLab 13.4.
2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210

For example:

```yaml
build_job:
  stage: build
  script:
    - ls -lhR
  needs:
    - project: $CI_PROJECT_PATH
      job: $DEPENDENCY_JOB_NAME
      ref: $CI_COMMIT_BRANCH
      artifacts: true
```

2211 2212 2213 2214 2215
NOTE: **Note:**
Downloading artifacts from jobs that are run in [`parallel:`](#parallel) is not supported.

### `tags`

2216 2217
Use `tags` to select a specific runner from the list of all runners that are
available for the project.
2218

2219
When you register a runner, you can specify the runner's tags, for
2220 2221
example `ruby`, `postgres`, `development`.

2222 2223
In this example, the job is run by a runner that
has both `ruby` AND `postgres` tags defined.
2224 2225 2226

```yaml
job:
2227 2228 2229
  tags:
    - ruby
    - postgres
2230 2231
```

2232 2233 2234
You can use tags to run different jobs on different platforms. For
example, if you have an OS X runner with tag `osx` and a Windows runner with tag
`windows`, you can run a job on each platform:
2235 2236

```yaml
2237 2238 2239 2240 2241
windows job:
  stage:
    - build
  tags:
    - windows
2242
  script:
2243
    - echo Hello, %USERNAME%!
2244

2245 2246 2247 2248 2249
osx job:
  stage:
    - build
  tags:
    - osx
2250
  script:
2251
    - echo "Hello, $USER!"
2252 2253
```

2254
### `allow_failure`
2255

2256
Use `allow_failure` when you want to let a job fail without impacting the rest of the CI
2257 2258 2259 2260
suite.
The default value is `false`, except for [manual](#whenmanual) jobs using the
`when: manual` syntax, unless using [`rules:`](#rules) syntax, where all jobs
default to false, *including* `when: manual` jobs.
2261

2262 2263 2264
When enabled and the job fails, the job will show an orange warning in the UI.
However, the logical flow of the pipeline will consider the job a
success/passed, and is not blocked.
2265

2266 2267 2268
Assuming all other jobs are successful, the job's stage and its pipeline will
show the same orange warning. However, the associated commit will be marked
"passed", without warnings.
2269

2270
In the example below, `job1` and `job2` will run in parallel, but if `job1`
2271
fails, it won't stop the next stage from running, since it's marked with
2272
`allow_failure: true`:
2273

2274 2275 2276 2277 2278 2279
```yaml
job1:
  stage: test
  script:
    - execute_script_that_will_fail
  allow_failure: true
2280

2281 2282 2283 2284 2285 2286 2287 2288 2289
job2:
  stage: test
  script:
    - execute_script_that_will_succeed

job3:
  stage: deploy
  script:
    - deploy_to_staging
2290 2291
```

2292
### `when`
2293

2294 2295
`when` is used to implement jobs that are run in case of failure or despite the
failure.
2296

2297
`when` can be set to one of the following values:
2298

2299 2300 2301 2302 2303 2304 2305 2306 2307 2308
1. `on_success` - execute job only when all jobs from prior stages
    succeed (or are considered succeeding because they are marked
    `allow_failure`). This is the default.
1. `on_failure` - execute job only when at least one job from prior stages
    fails.
1. `always` - execute job regardless of the status of jobs from prior stages.
1. `manual` - execute job manually (added in GitLab 8.10). Read about
    [manual actions](#whenmanual) below.
1. `delayed` - execute job after a certain period (added in GitLab 11.14).
    Read about [delayed actions](#whendelayed) below.
2309 2310 2311
1. `never`:
   - With [`rules`](#rules), don't execute job.
   - With [`workflow:rules`](#workflowrules), don't run pipeline.
2312

2313
For example:
2314

2315 2316 2317 2318 2319 2320 2321
```yaml
stages:
  - build
  - cleanup_build
  - test
  - deploy
  - cleanup
2322

2323 2324 2325 2326
build_job:
  stage: build
  script:
    - make build
2327

2328 2329 2330 2331 2332
cleanup_build_job:
  stage: cleanup_build
  script:
    - cleanup build when failed
  when: on_failure
2333

2334 2335 2336 2337
test_job:
  stage: test
  script:
    - make test
2338

2339 2340 2341 2342 2343
deploy_job:
  stage: deploy
  script:
    - make deploy
  when: manual
2344

2345 2346 2347 2348 2349
cleanup_job:
  stage: cleanup
  script:
    - cleanup after jobs
  when: always
2350 2351
```

2352
The above script:
2353

2354 2355
1. Executes `cleanup_build_job` only when `build_job` fails.
1. Always executes `cleanup_job` as the last step in pipeline regardless of
2356
   success or failure.
2357
1. Executes `deploy_job` when you run it manually in the GitLab UI.
2358

2359
#### `when:manual`
2360

2361 2362 2363
> - Introduced in GitLab 8.10.
> - Blocking manual actions were introduced in GitLab 9.0.
> - Protected actions were introduced in GitLab 9.2.
2364

2365 2366 2367 2368
Manual actions are a special type of job that are not executed automatically,
they need to be explicitly started by a user. An example usage of manual actions
would be a deployment to a production environment. Manual actions can be started
from the pipeline, job, environment, and deployment views. Read more at the
2369
[environments documentation](../environments/index.md#configuring-manual-deployments).
2370

2371 2372 2373 2374
Manual actions can be either optional or blocking. Blocking manual actions will
block the execution of the pipeline at the stage this action is defined in. It's
possible to resume execution of the pipeline when someone executes a blocking
manual action by clicking a _play_ button.
2375

2376
When a pipeline is blocked, it won't be merged if Merge When Pipeline Succeeds
2377 2378
is set. Blocked pipelines also do have a special status, called _manual_.
When the `when:manual` syntax is used, manual actions are non-blocking by
2379
default. If you want to make manual action blocking, it's necessary to add
2380
`allow_failure: false` to the job's definition in `.gitlab-ci.yml`.
A
Achilleas Pipinellis 已提交
2381

2382
Optional manual actions have `allow_failure: true` set by default and their
2383
Statuses don't contribute to the overall pipeline status. So, if a manual
2384
action fails, the pipeline will eventually succeed.
2385

2386 2387
NOTE: **Note:**
When using [`rules:`](#rules), `allow_failure` defaults to `false`, including for manual jobs.
2388

2389 2390 2391 2392
Manual actions are considered to be write actions, so permissions for
[protected branches](../../user/project/protected_branches.md) are used when
a user wants to trigger an action. In other words, in order to trigger a manual
action assigned to a branch that the pipeline is running for, the user needs to
2393
have the ability to merge to this branch. It's possible to use protected environments
2394 2395
to more strictly [protect manual deployments](#protecting-manual-jobs-premium) from being
run by unauthorized users.
2396

2397 2398 2399 2400
NOTE: **Note:**
Using `when:manual` and `trigger` together results in the error `jobs:#{job-name} when
should be on_success, on_failure or always`, because `when:manual` prevents triggers
being used.
2401

2402
##### Protecting manual jobs **(PREMIUM)**
2403

2404 2405
It's possible to use [protected environments](../environments/protected_environments.md)
to define a precise list of users authorized to run a manual job. By allowing only
2406
users associated with a protected environment to trigger manual jobs, it's possible
2407
to implement some special use cases, such as:
2408

2409 2410
- More precisely limiting who can deploy to an environment.
- Enabling a pipeline to be blocked until an approved user "approves" it.
2411

2412
To do this, you must:
2413

2414
1. Add an `environment` to the job. For example:
2415

2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427
   ```yaml
   deploy_prod:
     stage: deploy
     script:
       - echo "Deploy to production server"
     environment:
       name: production
       url: https://example.com
     when: manual
     only:
       - master
   ```
2428

2429 2430 2431 2432 2433
1. In the [protected environments settings](../environments/protected_environments.md#protecting-environments),
   select the environment (`production` in the example above) and add the users, roles or groups
   that are authorized to trigger the manual job to the **Allowed to Deploy** list. Only those in
   this list will be able to trigger this manual job, as well as GitLab administrators
   who are always able to use protected environments.
2434

2435
Additionally, if a manual job is defined as blocking by adding `allow_failure: false`,
2436
the next stages of the pipeline won't run until the manual job is triggered. This
2437 2438
can be used as a way to have a defined list of users allowed to "approve" later pipeline
stages by triggering the blocking manual job.
2439

2440
#### `when:delayed`
2441

2442
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/51352) in GitLab 11.4.
2443

2444 2445
Delayed job are for executing scripts after a certain period.
This is useful if you want to avoid jobs entering `pending` state immediately.
2446

2447 2448
You can set the period with `start_in` key. The value of `start_in` key is an elapsed time in seconds, unless a unit is
provided. `start_in` key must be less than or equal to one week. Examples of valid values include:
2449

2450
- `'5'`
2451
- `5 seconds`
2452 2453 2454
- `30 minutes`
- `1 day`
- `1 week`
2455

2456
When there is a delayed job in a stage, the pipeline won't progress until the delayed job has finished.
2457
This means this keyword can also be used for inserting delays between different stages.
2458

2459
The timer of a delayed job starts immediately after the previous stage has completed.
2460
Similar to other types of jobs, a delayed job's timer won't start unless the previous stage passed.
2461

2462
The following example creates a job named `timed rollout 10%` that is executed 30 minutes after the previous stage has completed:
2463

2464 2465 2466 2467 2468 2469 2470
```yaml
timed rollout 10%:
  stage: deploy
  script: echo 'Rolling out 10% ...'
  when: delayed
  start_in: 30 minutes
```
2471

2472
You can stop the active timer of a delayed job by clicking the **{time-out}** (**Unschedule**) button.
2473
This job will never be executed in the future unless you execute the job manually.
2474

2475 2476
To start a delayed job immediately, click the **Play** button.
Soon GitLab Runner picks up and starts the job.
2477

2478
### `environment`
2479

2480 2481
> - Introduced in GitLab 8.9.
> - You can read more about environments and find more examples in the
2482
>   [documentation about environments](../environments/index.md).
2483

2484 2485 2486 2487 2488
`environment` is used to define that a job deploys to a specific environment.
If `environment` is specified and no environment under that name exists, a new
one will be created automatically.

In its simplest form, the `environment` keyword can be defined like:
2489 2490

```yaml
2491 2492 2493 2494
deploy to production:
  stage: deploy
  script: git push production HEAD:master
  environment: production
2495 2496
```

2497 2498
In the above example, the `deploy to production` job will be marked as doing a
deployment to the `production` environment.
2499

2500
#### `environment:name`
2501

2502 2503 2504 2505 2506 2507
> - Introduced in GitLab 8.11.
> - Before GitLab 8.11, the name of an environment could be defined as a string like
>   `environment: production`. The recommended way now is to define it under the
>   `name` keyword.
> - The `name` parameter can use any of the defined CI variables,
>   including predefined, secure variables and `.gitlab-ci.yml` [`variables`](#variables).
2508
>   You however can't use variables defined under `script`.
B
Ben Bodenmiller 已提交
2509

2510
The `environment` name can contain:
2511

2512 2513 2514 2515 2516 2517 2518 2519 2520
- letters
- digits
- spaces
- `-`
- `_`
- `/`
- `$`
- `{`
- `}`
2521

2522 2523
Common names are `qa`, `staging`, and `production`, but you can use whatever
name works with your workflow.
2524

2525
Instead of defining the name of the environment right after the `environment`
2526
keyword, it's also possible to define it as a separate value. For that, use
2527
the `name` keyword under `environment`:
2528 2529

```yaml
2530 2531 2532 2533 2534
deploy to production:
  stage: deploy
  script: git push production HEAD:master
  environment:
    name: production
2535 2536
```

2537
#### `environment:url`
2538

2539 2540 2541 2542 2543
> - Introduced in GitLab 8.11.
> - Before GitLab 8.11, the URL could be added only in GitLab's UI. The
>   recommended way now is to define it in `.gitlab-ci.yml`.
> - The `url` parameter can use any of the defined CI variables,
>   including predefined, secure variables and `.gitlab-ci.yml` [`variables`](#variables).
2544
>   You however can't use variables defined under `script`.
2545

2546
This optional value exposes buttons that take you to the defined URL
2547

2548 2549
In this example, if the job finishes successfully, it creates buttons
in the merge requests and in the environments/deployments pages that point
2550
to `https://prod.example.com`.
2551

2552 2553 2554 2555 2556 2557 2558 2559
```yaml
deploy to production:
  stage: deploy
  script: git push production HEAD:master
  environment:
    name: production
    url: https://prod.example.com
```
2560

2561
#### `environment:on_stop`
2562

2563
> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/22191) in GitLab 8.13.
2564 2565 2566
> - Starting with GitLab 8.14, when you have an environment that has a stop action
>   defined, GitLab will automatically trigger a stop action when the associated
>   branch is deleted.
2567

2568 2569 2570
Closing (stopping) environments can be achieved with the `on_stop` keyword defined under
`environment`. It declares a different job that runs in order to close
the environment.
2571

2572
Read the `environment:action` section for an example.
2573

2574
#### `environment:action`
O
Olivier Gonzalez 已提交
2575

2576
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/22191) in GitLab 8.13.
O
Olivier Gonzalez 已提交
2577

2578 2579 2580 2581 2582 2583 2584
The `action` keyword can be used to specify jobs that prepare, start, or stop environments.

| **Value** | **Description**                                                                                                                                               |
|-----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------|
| start     | Default value. Indicates that job starts the environment. Deployment will be created after job starts.                                                          |
| prepare   | Indicates that job is only preparing the environment. Does not affect deployments. [Read more about environments](../environments/index.md#prepare-an-environment) |
| stop      | Indicates that job stops deployment. See the example below.                                                                                                   |
O
Olivier Gonzalez 已提交
2585

2586
Take for instance:
O
Olivier Gonzalez 已提交
2587

2588 2589 2590 2591 2592
```yaml
review_app:
  stage: deploy
  script: make deploy-app
  environment:
2593 2594
    name: review/$CI_COMMIT_REF_NAME
    url: https://$CI_ENVIRONMENT_SLUG.example.com
2595
    on_stop: stop_review_app
O
Olivier Gonzalez 已提交
2596

2597 2598 2599 2600 2601 2602 2603
stop_review_app:
  stage: deploy
  variables:
    GIT_STRATEGY: none
  script: make delete-app
  when: manual
  environment:
2604
    name: review/$CI_COMMIT_REF_NAME
2605 2606
    action: stop
```
O
Olivier Gonzalez 已提交
2607

2608 2609 2610 2611 2612 2613
In the above example we set up the `review_app` job to deploy to the `review`
environment, and we also defined a new `stop_review_app` job under `on_stop`.
Once the `review_app` job is successfully finished, it will trigger the
`stop_review_app` job based on what is defined under `when`. In this case we
set it up to `manual` so it will need a [manual action](#whenmanual) via
GitLab's web interface in order to run.
O
Olivier Gonzalez 已提交
2614

2615 2616
Also in the example, `GIT_STRATEGY` is set to `none` so that GitLab Runner won’t
try to check out the code after the branch is deleted when the `stop_review_app`
2617
job is [automatically triggered](../environments/index.md#automatically-stopping-an-environment).
O
Olivier Gonzalez 已提交
2618

2619 2620 2621 2622
NOTE: **Note:**
The above example overwrites global variables. If your stop environment job depends
on global variables, you can use [anchor variables](#yaml-anchors-for-variables) when setting the `GIT_STRATEGY`
to change it without overriding the global variables.
O
Olivier Gonzalez 已提交
2623

2624
The `stop_review_app` job is **required** to have the following keywords defined:
O
Olivier Gonzalez 已提交
2625

2626 2627 2628
- `when` - [reference](#when)
- `environment:name`
- `environment:action`
O
Olivier Gonzalez 已提交
2629

2630 2631 2632 2633 2634 2635
Additionally, both jobs should have matching [`rules`](../yaml/README.md#onlyexcept-basic)
or [`only/except`](../yaml/README.md#onlyexcept-basic) configuration. In the example
above, if the configuration is not identical, the `stop_review_app` job might not be
included in all pipelines that include the `review_app` job, and it will not be
possible to trigger the `action: stop` to stop the environment automatically.

2636
#### `environment:auto_stop_in`
O
Olivier Gonzalez 已提交
2637

2638
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/20956) in GitLab 12.8.
O
Olivier Gonzalez 已提交
2639

2640 2641
The `auto_stop_in` keyword is for specifying life period of the environment,
that when expired, GitLab automatically stops them.
O
Olivier Gonzalez 已提交
2642

2643
For example,
O
Olivier Gonzalez 已提交
2644

2645 2646 2647 2648 2649 2650 2651
```yaml
review_app:
  script: deploy-review-app
  environment:
    name: review/$CI_COMMIT_REF_NAME
    auto_stop_in: 1 day
```
O
Olivier Gonzalez 已提交
2652

2653 2654
When `review_app` job is executed and a review app is created, a life period of
the environment is set to `1 day`.
O
Olivier Gonzalez 已提交
2655

2656
For more information, see
2657
[the environments auto-stop documentation](../environments/index.md#environments-auto-stop)
O
Olivier Gonzalez 已提交
2658

2659
#### `environment:kubernetes`
O
Olivier Gonzalez 已提交
2660

2661
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27630) in GitLab 12.6.
O
Olivier Gonzalez 已提交
2662

2663 2664
The `kubernetes` block is used to configure deployments to a
[Kubernetes cluster](../../user/project/clusters/index.md) that is associated with your project.
O
Olivier Gonzalez 已提交
2665

2666
For example:
2667

2668 2669 2670 2671 2672 2673 2674 2675 2676
```yaml
deploy:
  stage: deploy
  script: make deploy-app
  environment:
    name: production
    kubernetes:
      namespace: production
```
O
Olivier Gonzalez 已提交
2677

2678 2679 2680
This will set up the `deploy` job to deploy to the `production`
environment, using the `production`
[Kubernetes namespace](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/).
O
Olivier Gonzalez 已提交
2681

2682
For more information, see
2683
[Available settings for `kubernetes`](../environments/index.md#configuring-kubernetes-deployments).
O
Olivier Gonzalez 已提交
2684

2685 2686 2687 2688
NOTE: **Note:**
Kubernetes configuration is not supported for Kubernetes clusters
that are [managed by GitLab](../../user/project/clusters/index.md#gitlab-managed-clusters).
To follow progress on support for GitLab-managed clusters, see the
2689
[relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/38054).
2690

2691
#### Dynamic environments
2692

2693 2694
> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/21971) in GitLab 8.12 and GitLab Runner 1.6.
> - The `$CI_ENVIRONMENT_SLUG` was [introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/22864) in GitLab 8.15.
2695 2696
> - The `name` and `url` parameters can use any of the defined CI variables,
>   including predefined, secure variables and `.gitlab-ci.yml` [`variables`](#variables).
2697
>   You however can't use variables defined under `script`.
2698

2699
For example:
2700

2701 2702 2703 2704 2705 2706 2707 2708
```yaml
deploy as review app:
  stage: deploy
  script: make deploy
  environment:
    name: review/$CI_COMMIT_REF_NAME
    url: https://$CI_ENVIRONMENT_SLUG.example.com/
```
O
Olivier Gonzalez 已提交
2709

2710 2711
The `deploy as review app` job will be marked as deployment to dynamically
create the `review/$CI_COMMIT_REF_NAME` environment, where `$CI_COMMIT_REF_NAME`
2712
is an [environment variable](../variables/README.md) set by the runner. The
2713 2714 2715 2716
`$CI_ENVIRONMENT_SLUG` variable is based on the environment name, but suitable
for inclusion in URLs. In this case, if the `deploy as review app` job was run
in a branch named `pow`, this environment would be accessible with an URL like
`https://review-pow.example.com/`.
O
Olivier Gonzalez 已提交
2717

2718
This implies that the underlying server that hosts the application
2719
is properly configured.
O
Olivier Gonzalez 已提交
2720

2721 2722 2723
The common use case is to create dynamic environments for branches and use them
as Review Apps. You can see a simple example using Review Apps at
<https://gitlab.com/gitlab-examples/review-apps-nginx/>.
O
Olivier Gonzalez 已提交
2724

2725
### `cache`
M
Marcel Amirault 已提交
2726

2727 2728 2729 2730 2731
> - Introduced in GitLab Runner v0.7.0.
> - `cache` can be set globally and per-job.
> - From GitLab 9.0, caching is enabled and shared between pipelines and jobs
>   by default.
> - From GitLab 9.2, caches are restored before [artifacts](#artifacts).
2732

2733 2734 2735
TIP: **Learn more:**
Read how caching works and find out some good practices in the
[caching dependencies documentation](../caching/index.md).
M
Marcel Amirault 已提交
2736

2737
`cache` is used to specify a list of files and directories that should be
2738 2739
cached between jobs. You can only use paths that are within the local working
copy.
M
Marcel Amirault 已提交
2740

2741
If `cache` is defined outside the scope of jobs, it means it's set
2742
globally and all jobs will use that definition.
2743

2744
#### `cache:paths`
2745

2746
Use the `paths` directive to choose which files or directories to cache. Paths
2747
are relative to the project directory (`$CI_PROJECT_DIR`) and can't directly link outside it.
2748
Wildcards can be used that follow the [glob](https://en.wikipedia.org/wiki/Glob_(programming))
2749 2750 2751 2752 2753 2754
patterns and:

- In [GitLab Runner 13.0](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/2620) and later,
[`doublestar.Glob`](https://pkg.go.dev/github.com/bmatcuk/doublestar@v1.2.2?tab=doc#Match).
- In GitLab Runner 12.10 and earlier,
[`filepath.Match`](https://pkg.go.dev/path/filepath/#Match).
2755

2756
Cache all files in `binaries` that end in `.apk` and the `.config` file:
2757

2758 2759 2760 2761 2762 2763 2764 2765
```yaml
rspec:
  script: test
  cache:
    paths:
      - binaries/*.apk
      - .config
```
2766

2767 2768
Locally defined cache overrides globally defined options. The following `rspec`
job will cache only `binaries/`:
2769

2770
```yaml
2771 2772 2773
cache:
  paths:
    - my/files
2774

2775 2776 2777 2778
rspec:
  script: test
  cache:
    key: rspec
2779
    paths:
P
pityonline 已提交
2780
      - binaries/
2781
```
2782

2783 2784 2785
Note that since cache is shared between jobs, if you're using different
paths for different jobs, you should also set a different **cache:key**
otherwise cache content can be overwritten.
2786

2787
#### `cache:key`
2788

2789
> Introduced in GitLab Runner v1.0.0.
2790

2791 2792 2793
Since the cache is shared between jobs, if you're using different
paths for different jobs, you should also set a different `cache:key`
otherwise cache content can be overwritten.
2794

2795 2796
The `key` parameter defines the affinity of caching between jobs,
to have a single cache for all jobs, cache per-job, cache per-branch
2797
or any other way that fits your workflow. This way, you can fine tune caching,
2798
including caching data between different jobs or even different branches.
S
Shinya Maeda 已提交
2799

2800
The `cache:key` variable can use any of the
2801 2802
[predefined variables](../variables/README.md). The default key, if not
set, is just literal `default`, which means everything is shared between
2803
pipelines and jobs by default, starting from GitLab 9.0.
S
Shinya Maeda 已提交
2804

2805
NOTE: **Note:**
2806
The `cache:key` variable can't contain the `/` character, or the equivalent
2807
URI-encoded `%2F`; a value made only of dots (`.`, `%2E`) is also forbidden.
2808

2809
For example, to enable per-branch caching:
2810

2811 2812 2813 2814 2815 2816
```yaml
cache:
  key: "$CI_COMMIT_REF_SLUG"
  paths:
    - binaries/
```
2817

2818 2819
If you use **Windows Batch** to run your shell scripts you need to replace
`$` with `%`:
2820 2821

```yaml
2822 2823 2824 2825 2826
cache:
  key: "%CI_COMMIT_REF_SLUG%"
  paths:
    - binaries/
```
2827

2828
##### `cache:key:files`
2829

2830
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18986) in GitLab v12.5.
2831

2832 2833 2834
The `cache:key:files` keyword extends the `cache:key` functionality by making it easier
to reuse some caches, and rebuild them less often, which will speed up subsequent pipeline
runs.
2835

2836 2837 2838 2839
When you include `cache:key:files`, you must also list the project files that will be used to generate the key, up to a maximum of two files.
The cache `key` will be a SHA checksum computed from the most recent commits (up to two, if two files are listed)
that changed the given files. If neither file was changed in any commits,
the fallback key will be `default`.
2840

2841 2842 2843 2844 2845 2846 2847 2848 2849 2850
```yaml
cache:
  key:
    files:
      - Gemfile.lock
      - package.json
  paths:
    - vendor/ruby
    - node_modules
```
2851

2852
In this example we're creating a cache for Ruby and Node.js dependencies that
2853 2854 2855 2856
is tied to current versions of the `Gemfile.lock` and `package.json` files. Whenever one of
these files changes, a new cache key is computed and a new cache is created. Any future
job runs using the same `Gemfile.lock` and `package.json`  with `cache:key:files` will
use the new cache, instead of rebuilding the dependencies.
2857

2858
##### `cache:key:prefix`
2859

2860
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18986) in GitLab v12.5.
2861

2862 2863 2864
When you want to combine a prefix with the SHA computed for `cache:key:files`,
use the `prefix` parameter with `key:files`.
For example, if you add a `prefix` of `test`, the resulting key is: `test-feef9576d21ee9b6a32e30c5c79d0a0ceb68d1e5`.
2865 2866
If neither file was changed in any commits, the prefix is added to `default`, so the
key in the example would be `test-default`.
2867

2868 2869
Like `cache:key`, `prefix` can use any of the [predefined variables](../variables/README.md),
but the following are not allowed:
2870

2871 2872
- the `/` character (or the equivalent URI-encoded `%2F`)
- a value made only of `.` (or the equivalent URI-encoded `%2E`)
2873

2874 2875 2876 2877 2878 2879 2880 2881
```yaml
cache:
  key:
    files:
      - Gemfile.lock
    prefix: ${CI_JOB_NAME}
  paths:
    - vendor/ruby
2882

2883 2884 2885 2886
rspec:
  script:
    - bundle exec rspec
```
2887

2888 2889 2890 2891 2892 2893 2894
For example, adding a `prefix` of `$CI_JOB_NAME` will
cause the key to look like: `rspec-feef9576d21ee9b6a32e30c5c79d0a0ceb68d1e5` and
the job cache is shared across different branches. If a branch changes
`Gemfile.lock`, that branch will have a new SHA checksum for `cache:key:files`. A new cache key
will be generated, and a new cache will be created for that key.
If `Gemfile.lock` is not found, the prefix is added to
`default`, so the key in the example would be `rspec-default`.
2895

2896
#### `cache:untracked`
2897

2898 2899
Set `untracked: true` to cache all files that are untracked in your Git
repository:
2900

2901 2902 2903 2904 2905
```yaml
rspec:
  script: test
  cache:
    untracked: true
2906 2907
```

2908
Cache all Git untracked files and files in `binaries`:
2909

2910 2911 2912 2913 2914 2915 2916
```yaml
rspec:
  script: test
  cache:
    untracked: true
    paths:
      - binaries/
2917 2918
```

2919
#### `cache:policy`
2920

2921
> Introduced in GitLab 9.4.
2922

2923
The default behavior of a caching job is to download the files at the start of
2924 2925
execution, and to re-upload them at the end. Any changes made by the
job are persisted for future runs. This behavior is known as the `pull-push` cache
2926
policy.
2927

2928
If you know the job does not alter the cached files, you can skip the upload step
2929 2930 2931
by setting `policy: pull` in the job specification. Typically, this would be
twinned with an ordinary cache job at an earlier stage to ensure the cache
is updated from time to time:
2932 2933

```yaml
2934 2935 2936 2937 2938 2939 2940 2941
stages:
  - setup
  - test

prepare:
  stage: setup
  cache:
    key: gems
2942
    paths:
2943 2944 2945
      - vendor/bundle
  script:
    - bundle install --deployment
2946 2947 2948

rspec:
  stage: test
2949 2950 2951 2952 2953 2954 2955
  cache:
    key: gems
    paths:
      - vendor/bundle
    policy: pull
  script:
    - bundle exec rspec ...
2956 2957
```

2958 2959 2960
This helps to speed up job execution and reduce load on the cache server,
especially when you have a large number of cache-using jobs executing in
parallel.
2961

2962 2963 2964
Additionally, if you have a job that unconditionally recreates the cache without
reference to its previous contents, you can use `policy: push` in that job to
skip the download step.
2965

2966
### `artifacts`
2967

2968 2969 2970 2971 2972
> - Introduced in GitLab Runner v0.7.0 for non-Windows platforms.
> - Windows support was added in GitLab Runner v.1.0.0.
> - From GitLab 9.2, caches are restored before artifacts.
> - Not all executors are [supported](https://docs.gitlab.com/runner/executors/#compatibility-chart).
> - Job artifacts are only collected for successful jobs by default.
2973

2974
`artifacts` is used to specify a list of files and directories that are
2975
attached to the job when it [succeeds, fails, or always](#artifactswhen).
2976

2977
The artifacts will be sent to GitLab after the job finishes and will
2978 2979
be available for download in the GitLab UI provided that the size is not
larger than the [maximum artifact size](../../user/gitlab_com/index.md#gitlab-cicd).
2980

2981
[Read more about artifacts](../pipelines/job_artifacts.md).
2982

2983
#### `artifacts:paths`
2984

2985
Paths are relative to the project directory (`$CI_PROJECT_DIR`) and can't directly
2986
link outside it. Wildcards can be used that follow the [glob](https://en.wikipedia.org/wiki/Glob_(programming))
2987 2988 2989 2990 2991 2992
patterns and:

- In [GitLab Runner 13.0](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/2620) and later,
[`doublestar.Glob`](https://pkg.go.dev/github.com/bmatcuk/doublestar@v1.2.2?tab=doc#Match).
- In GitLab Runner 12.10 and earlier,
[`filepath.Match`](https://pkg.go.dev/path/filepath/#Match).
2993 2994 2995 2996

To restrict which jobs a specific job will fetch artifacts from, see [dependencies](#dependencies).

Send all files in `binaries` and `.config`:
2997 2998

```yaml
2999 3000 3001 3002
artifacts:
  paths:
    - binaries/
    - .config
3003 3004
```

3005
To disable artifact passing, define the job with empty [dependencies](#dependencies):
3006

3007 3008 3009 3010 3011 3012
```yaml
job:
  stage: build
  script: make build
  dependencies: []
```
3013

3014 3015
You may want to create artifacts only for tagged releases to avoid filling the
build server storage with temporary build artifacts.
3016

3017
Create artifacts only for tags (`default-job` won't create artifacts):
3018

3019 3020 3021 3022 3023 3024
```yaml
default-job:
  script:
    - mvn test -U
  except:
    - tags
3025

3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036
release-job:
  script:
    - mvn package -U
  artifacts:
    paths:
      - target/*.war
  only:
    - tags
```

You can use wildcards for directories too. For example, if you want to get all the files inside the directories that end with `xyz`:
3037 3038

```yaml
3039 3040 3041 3042
job:
  artifacts:
    paths:
      - path/*xyz/*
3043 3044
```

3045 3046
#### `artifacts:exclude`

3047
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15122) in GitLab 13.1
3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071
> - Requires GitLab Runner 13.1

`exclude` makes it possible to prevent files from being added to an artifacts
archive.

Similar to [`artifacts:paths`](#artifactspaths), `exclude` paths are relative
to the project directory. Wildcards can be used that follow the
[glob](https://en.wikipedia.org/wiki/Glob_(programming)) patterns and
[`filepath.Match`](https://golang.org/pkg/path/filepath/#Match).

For example, to store all files in `binaries/`, but not `*.o` files located in
subdirectories of `binaries/`:

```yaml
artifacts:
  paths:
    - binaries/
  exclude:
    - binaries/**/*.o
```

Files matched by [`artifacts:untracked`](#artifactsuntracked) can be excluded using
`artifacts:exclude` too.

3072
#### `artifacts:expose_as`
3073

3074
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15018) in GitLab 12.5.
3075

3076 3077
The `expose_as` keyword can be used to expose [job artifacts](../pipelines/job_artifacts.md)
in the [merge request](../../user/project/merge_requests/index.md) UI.
3078

3079
For example, to match a single file:
3080

3081
```yaml
3082
test:
3083
  script: [ "echo 'test' > file.txt" ]
3084 3085
  artifacts:
    expose_as: 'artifact 1'
3086
    paths: ['file.txt']
3087
```
3088

3089 3090
With this configuration, GitLab will add a link **artifact 1** to the relevant merge request
that points to `file1.txt`.
3091

3092 3093
An example that will match an entire directory:

3094
```yaml
3095
test:
3096
  script: [ "mkdir test && echo 'test' > test/file.txt" ]
3097 3098
  artifacts:
    expose_as: 'artifact 1'
3099
    paths: ['test/']
3100 3101
```

3102 3103
Note the following:

3104
- Artifacts do not display in the merge request UI when using variables to define the `artifacts:paths`.
3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117
- A maximum of 10 job artifacts per merge request can be exposed.
- Glob patterns are unsupported.
- If a directory is specified, the link will be to the job [artifacts browser](../pipelines/job_artifacts.md#browsing-artifacts) if there is more than
  one file in the directory.
- For exposed single file artifacts with `.html`, `.htm`, `.txt`, `.json`, `.xml`,
  and `.log` extensions, if [GitLab Pages](../../administration/pages/index.md) is:
  - Enabled, GitLab will automatically render the artifact.
  - Not enabled, you will see the file in the artifacts browser.

#### `artifacts:name`

> Introduced in GitLab 8.6 and GitLab Runner v1.1.0.

3118 3119 3120
Use the `name` directive to define the name of the created artifacts
archive. You can specify a unique name for every archive, which can be
useful when you want to download the archive from GitLab. The `artifacts:name`
3121
variable can make use of any of the [predefined variables](../variables/README.md).
3122
The default name is `artifacts`, which becomes `artifacts.zip` when you download it.
3123 3124 3125

NOTE: **Note:**
If your branch-name contains forward slashes
3126
(for example `feature/my-feature`) it's advised to use `$CI_COMMIT_REF_SLUG`
3127 3128 3129
instead of `$CI_COMMIT_REF_NAME` for proper naming of the artifact.

To create an archive with a name of the current job:
M
Markus Doits 已提交
3130

3131 3132 3133 3134 3135 3136 3137
```yaml
job:
  artifacts:
    name: "$CI_JOB_NAME"
    paths:
      - binaries/
```
3138

3139 3140
To create an archive with a name of the current branch or tag including only
the binaries directory:
3141 3142

```yaml
3143 3144 3145 3146 3147
job:
  artifacts:
    name: "$CI_COMMIT_REF_NAME"
    paths:
      - binaries/
3148 3149
```

3150 3151
To create an archive with a name of the current job and the current branch or
tag including only the binaries directory:
3152 3153

```yaml
3154 3155 3156 3157 3158
job:
  artifacts:
    name: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME"
    paths:
      - binaries/
3159 3160
```

3161
To create an archive with a name of the current [stage](#stages) and branch name:
3162

3163 3164 3165 3166 3167 3168 3169
```yaml
job:
  artifacts:
    name: "$CI_JOB_STAGE-$CI_COMMIT_REF_NAME"
    paths:
      - binaries/
```
3170

3171
---
3172

3173 3174
If you use **Windows Batch** to run your shell scripts you need to replace
`$` with `%`:
3175

3176 3177 3178 3179 3180 3181 3182
```yaml
job:
  artifacts:
    name: "%CI_JOB_STAGE%-%CI_COMMIT_REF_NAME%"
    paths:
      - binaries/
```
3183

3184 3185
If you use **Windows PowerShell** to run your shell scripts you need to replace
`$` with `$env:`:
3186 3187

```yaml
3188 3189 3190 3191 3192
job:
  artifacts:
    name: "$env:CI_JOB_STAGE-$env:CI_COMMIT_REF_NAME"
    paths:
      - binaries/
3193 3194
```

3195
#### `artifacts:untracked`
M
Matija Čupić 已提交
3196

3197 3198
`artifacts:untracked` is used to add all Git untracked files as artifacts (along
to the paths defined in `artifacts:paths`).
M
Matija Čupić 已提交
3199

3200 3201
NOTE: **Note:**
`artifacts:untracked` ignores configuration in the repository's `.gitignore` file.
M
Matija Čupić 已提交
3202

3203
Send all Git untracked files:
M
Matija Čupić 已提交
3204

3205 3206 3207 3208
```yaml
artifacts:
  untracked: true
```
M
Matija Čupić 已提交
3209

3210
Send all Git untracked files and files in `binaries`:
M
Matija Čupić 已提交
3211

3212
```yaml
3213 3214 3215 3216
artifacts:
  untracked: true
  paths:
    - binaries/
M
Matija Čupić 已提交
3217
```
3218

3219 3220 3221 3222 3223 3224
Send all untracked files but [exclude](#artifactsexclude) `*.txt`:

```yaml
artifacts:
  untracked: true
  exclude:
3225
    - "*.txt"
3226 3227
```

3228
#### `artifacts:when`
3229

3230
> Introduced in GitLab 8.9 and GitLab Runner v1.3.0.
3231

3232 3233
`artifacts:when` is used to upload artifacts on job failure or despite the
failure.
3234

3235
`artifacts:when` can be set to one of the following values:
3236

3237 3238 3239
1. `on_success` - upload artifacts only when the job succeeds. This is the default.
1. `on_failure` - upload artifacts only when the job fails.
1. `always` - upload artifacts regardless of the job status.
3240

3241
To upload artifacts only when job fails:
3242

3243 3244 3245 3246 3247
```yaml
job:
  artifacts:
    when: on_failure
```
3248

3249
#### `artifacts:expire_in`
E
Evan Read 已提交
3250

3251
> Introduced in GitLab 8.9 and GitLab Runner v1.3.0.
E
Evan Read 已提交
3252

3253 3254 3255 3256
Use `expire_in` to specify how long artifacts are active before they
expire and are deleted.

The expiration time period begins when the artifact is uploaded and
3257 3258
stored on GitLab. If the expiry time is not defined, it defaults to the
[instance wide setting](../../user/admin_area/settings/continuous_integration.md#default-artifacts-expiration-core-only)
3259
(30 days by default).
E
Evan Read 已提交
3260

3261
To override the expiration date and protect artifacts from being automatically deleted:
3262 3263 3264 3265

- Use the **Keep** button on the job page.
- Set the value of `expire_in` to `never`. [Available](https://gitlab.com/gitlab-org/gitlab/-/issues/22761)
  in GitLab 13.3 and later.
3266

3267 3268
After their expiry, artifacts are deleted hourly by default (via a cron job),
and are not accessible anymore.
E
Evan Read 已提交
3269

3270
The value of `expire_in` is an elapsed time in seconds, unless a unit is
3271
provided. Examples of valid values:
3272

3273 3274
- `'42'`
- `42 seconds`
3275 3276 3277 3278 3279 3280
- `3 mins 4 sec`
- `2 hrs 20 min`
- `2h20min`
- `6 mos 1 day`
- `47 yrs 6 mos and 4d`
- `3 weeks and 2 days`
3281
- `never`
E
Evan Read 已提交
3282

3283
To expire artifacts 1 week after being uploaded:
E
Evan Read 已提交
3284 3285

```yaml
3286 3287 3288
job:
  artifacts:
    expire_in: 1 week
E
Evan Read 已提交
3289 3290
```

3291
NOTE: **Note:**
3292 3293 3294 3295
Since [GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/issues/16267), the latest
artifacts for refs can be locked against deletion, and kept regardless of the expiry time. This feature is disabled
by default and is not ready for production use. It can be enabled for testing by
enabling the `:keep_latest_artifact_for_ref` and `:destroy_only_unlocked_expired_artifacts` [feature flags](../../administration/feature_flags.md).
3296

3297
#### `artifacts:reports`
E
Evan Read 已提交
3298

3299 3300
The [`artifacts:reports` keyword](../pipelines/job_artifacts.md#artifactsreports)
is used for collecting test reports, code quality reports, and security reports from jobs.
3301
It also exposes these reports in GitLab's UI (merge requests, pipeline views, and security dashboards).
3302

3303 3304 3305 3306 3307
These are the available report types:

| Parameter                                                                                                                            | Description |
|--------------------------------------------------------------------------------------------------------------------------------------|-------------|
| [`artifacts:reports:cobertura`](../pipelines/job_artifacts.md#artifactsreportscobertura)                                             | The `cobertura` report collects Cobertura coverage XML files.                    |
3308
| [`artifacts:reports:codequality`](../pipelines/job_artifacts.md#artifactsreportscodequality)                                         | The `codequality` report collects CodeQuality issues.                            |
3309 3310
| [`artifacts:reports:container_scanning`](../pipelines/job_artifacts.md#artifactsreportscontainer_scanning-ultimate) **(ULTIMATE)**   | The `container_scanning` report collects Container Scanning vulnerabilities.     |
| [`artifacts:reports:dast`](../pipelines/job_artifacts.md#artifactsreportsdast-ultimate) **(ULTIMATE)**                               | The `dast` report collects Dynamic Application Security Testing vulnerabilities. |
3311 3312 3313
| [`artifacts:reports:dependency_scanning`](../pipelines/job_artifacts.md#artifactsreportsdependency_scanning-ultimate) **(ULTIMATE)** | The `dependency_scanning` report collects Dependency Scanning vulnerabilities.   |
| [`artifacts:reports:dotenv`](../pipelines/job_artifacts.md#artifactsreportsdotenv)                                                   | The `dotenv` report collects a set of environment variables.                     |
| [`artifacts:reports:junit`](../pipelines/job_artifacts.md#artifactsreportsjunit)                                                     | The `junit` report collects JUnit XML files.                                     |
3314
| [`artifacts:reports:license_management`](../pipelines/job_artifacts.md#artifactsreportslicense_management-ultimate) **(ULTIMATE)**   | The `license_management` report collects Licenses (*removed from GitLab 13.0*).  |
3315
| [`artifacts:reports:license_scanning`](../pipelines/job_artifacts.md#artifactsreportslicense_scanning-ultimate) **(ULTIMATE)**       | The `license_scanning` report collects Licenses.                                 |
3316
| [`artifacts:reports:load_performance`](../pipelines/job_artifacts.md#artifactsreportsload_performance-premium) **(PREMIUM)**         | The `load_performance` report collects load performance metrics.                 |
3317
| [`artifacts:reports:metrics`](../pipelines/job_artifacts.md#artifactsreportsmetrics-premium) **(PREMIUM)**                           | The `metrics` report collects Metrics.                                           |
3318 3319 3320
| [`artifacts:reports:performance`](../pipelines/job_artifacts.md#artifactsreportsperformance-premium) **(PREMIUM)**                   | The `performance` report collects Browser Performance metrics.                   |
| [`artifacts:reports:sast`](../pipelines/job_artifacts.md#artifactsreportssast-ultimate) **(ULTIMATE)**                               | The `sast` report collects Static Application Security Testing vulnerabilities.  |
| [`artifacts:reports:terraform`](../pipelines/job_artifacts.md#artifactsreportsterraform)                                             | The `terraform` report collects Terraform `tfplan.json` files.                   |
E
Evan Read 已提交
3321

3322
#### `dependencies`
3323

3324
> Introduced in GitLab 8.6 and GitLab Runner v1.1.1.
3325

3326 3327 3328
By default, all [`artifacts`](#artifacts) from all previous [stages](#stages)
are passed, but you can use the `dependencies` parameter to define a limited
list of jobs (or no jobs) to fetch artifacts from.
3329

3330
To use this feature, define `dependencies` in context of the job and pass
3331
a list of all previous jobs the artifacts should be downloaded from.
3332 3333 3334 3335
You can only define jobs from stages that are executed before the current one.
An error will be shown if you define jobs from the current stage or next ones.
Defining an empty array will skip downloading any artifacts for that job.
The status of the previous job is not considered when using `dependencies`, so
3336
if it failed or it's a manual job that was not run, no error occurs.
3337

3338 3339 3340 3341
In the following example, we define two jobs with artifacts, `build:osx` and
`build:linux`. When the `test:osx` is executed, the artifacts from `build:osx`
will be downloaded and extracted in the context of the build. The same happens
for `test:linux` and artifacts from `build:linux`.
3342

3343 3344
The job `deploy` will download artifacts from all previous jobs because of
the [stage](#stages) precedence:
K
Kamil Trzciński 已提交
3345

3346
```yaml
3347 3348 3349 3350 3351 3352
build:osx:
  stage: build
  script: make build:osx
  artifacts:
    paths:
      - binaries/
K
Kamil Trzciński 已提交
3353

3354 3355 3356 3357 3358 3359
build:linux:
  stage: build
  script: make build:linux
  artifacts:
    paths:
      - binaries/
3360

3361 3362 3363 3364 3365
test:osx:
  stage: test
  script: make test:osx
  dependencies:
    - build:osx
3366

3367 3368 3369 3370 3371
test:linux:
  stage: test
  script: make test:linux
  dependencies:
    - build:linux
3372

3373 3374 3375
deploy:
  stage: deploy
  script: make deploy
3376 3377
```

3378
##### When a dependent job will fail
K
Kamil Trzciński 已提交
3379

3380
> Introduced in GitLab 10.3.
3381

3382 3383 3384 3385
If the artifacts of the job that is set as a dependency have been
[expired](#artifactsexpire_in) or
[erased](../pipelines/job_artifacts.md#erasing-artifacts), then
the dependent job will fail.
3386

3387 3388 3389 3390
NOTE: **Note:**
You can ask your administrator to
[flip this switch](../../administration/job_artifacts.md#validation-for-dependencies)
and bring back the old behavior.
K
Kamil Trzciński 已提交
3391

3392
### `coverage`
3393

3394
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/20428) in GitLab 8.17.
3395

3396
Use `coverage` to configure how code coverage is extracted from the
3397
job output.
3398

3399 3400 3401 3402
Regular expressions are the only valid kind of value expected here. So, using
surrounding `/` is mandatory in order to consistently and explicitly represent
a regular expression string. You must escape special characters if you want to
match them literally.
3403

3404
A simple example:
K
Kamil Trzciński 已提交
3405

3406
```yaml
3407 3408 3409
job1:
  script: rspec
  coverage: '/Code coverage: \d+\.\d+/'
K
Kamil Trzciński 已提交
3410 3411
```

3412
### `retry`
3413

3414
> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/3442) in GitLab 9.5.
3415
> - [Behavior expanded](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3515) in GitLab 11.5 to control which failures to retry on.
3416

3417
Use `retry` to configure how many times a job is going to be retried in
3418
case of a failure.
3419

3420
When a job fails and has `retry` configured, it's going to be processed again
3421
up to the amount of times specified by the `retry` keyword.
3422

3423 3424 3425 3426 3427
If `retry` is set to 2, and a job succeeds in a second run (first retry), it won't be retried
again. `retry` value has to be a positive integer, equal or larger than 0, but
lower or equal to 2 (two retries maximum, three runs in total).

A simple example to retry in all failure cases:
3428

3429
```yaml
3430 3431 3432
test:
  script: rspec
  retry: 2
3433
```
3434

3435
By default, a job will be retried on all failure cases. To have a better control
3436
over which failures to retry, `retry` can be a hash with the following keys:
3437

3438 3439
- `max`: The maximum number of retries.
- `when`: The failure cases to retry.
3440

3441
To retry only runner system failures at maximum two times:
3442

3443 3444 3445 3446 3447 3448 3449
```yaml
test:
  script: rspec
  retry:
    max: 2
    when: runner_system_failure
```
3450

3451 3452
If there is another failure, other than a runner system failure, the job will
not be retried.
3453

3454
To retry on multiple failure cases, `when` can also be an array of failures:
3455

3456 3457 3458 3459 3460 3461 3462 3463 3464
```yaml
test:
  script: rspec
  retry:
    max: 2
    when:
      - runner_system_failure
      - stuck_or_timeout_failure
```
K
Kamil Trzciński 已提交
3465

3466
Possible values for `when` are:
K
Kamil Trzciński 已提交
3467

3468 3469 3470 3471
<!--
  Please make sure to update `RETRY_WHEN_IN_DOCUMENTATION` array in
  `spec/lib/gitlab/ci/config/entry/retry_spec.rb` if you change any of
  the documented values below. The test there makes sure that all documented
3472
  values are really valid as a configuration option and therefore should always
3473 3474
  stay in sync with this documentation.
 -->
3475

3476 3477 3478 3479 3480
- `always`: Retry on any failure (default).
- `unknown_failure`: Retry when the failure reason is unknown.
- `script_failure`: Retry when the script failed.
- `api_failure`: Retry on API failure.
- `stuck_or_timeout_failure`: Retry when the job got stuck or timed out.
3481
- `runner_system_failure`: Retry if there was a runner system failure (for example, job setup failed).
3482 3483 3484 3485
- `missing_dependency_failure`: Retry if a dependency was missing.
- `runner_unsupported`: Retry if the runner was unsupported.
- `stale_schedule`: Retry if a delayed job could not be executed.
- `job_execution_timeout`: Retry if the script exceeded the maximum execution time set for the job.
3486
- `archived_failure`: Retry if the job is archived and can't be run.
3487 3488 3489
- `unmet_prerequisites`: Retry if the job failed to complete prerequisite tasks.
- `scheduler_failure`: Retry if the scheduler failed to assign the job to a runner.
- `data_integrity_failure`: Retry if there was a structural integrity problem detected.
3490

3491 3492
You can specify the number of [retry attempts for certain stages of job execution](#job-stages-attempts) using variables.

3493
### `timeout`
3494

3495
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14887) in GitLab 12.3.
3496

3497
Use `timeout` to configure a timeout for a specific job. For example:
3498

3499
```yaml
3500 3501 3502 3503 3504 3505 3506
build:
  script: build.sh
  timeout: 3 hours 30 minutes

test:
  script: rspec
  timeout: 3h 30m
3507 3508
```

3509
The job-level timeout can exceed the
3510
[project-level timeout](../pipelines/settings.md#timeout) but can't
3511
exceed the runner-specific timeout.
3512

3513
### `parallel`
3514

3515
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/21480) in GitLab 11.5.
3516

3517
Use `parallel` to configure how many instances of a job to run in
3518
parallel. This value has to be greater than or equal to two (2) and less than or equal to 50.
3519

3520
This creates N instances of the same job that run in parallel. They are named
3521
sequentially from `job_name 1/N` to `job_name N/N`.
3522

3523
For every job, `CI_NODE_INDEX` and `CI_NODE_TOTAL` [environment variables](../variables/README.md#predefined-environment-variables) are set.
K
Kamil Trzciński 已提交
3524

3525 3526
Marking a job to be run in parallel requires adding `parallel` to your configuration
file. For example:
K
Kamil Trzciński 已提交
3527

3528
```yaml
3529 3530 3531
test:
  script: rspec
  parallel: 5
3532
```
3533

3534 3535 3536
TIP: **Tip:**
Parallelize tests suites across parallel jobs.
Different languages have different tools to facilitate this.
K
Kamil Trzciński 已提交
3537

3538
A simple example using [Semaphore Test Boosters](https://github.com/renderedtext/test-boosters) and RSpec to run some Ruby tests:
K
Kamil Trzciński 已提交
3539

3540 3541 3542
```ruby
# Gemfile
source 'https://rubygems.org'
K
Kamil Trzciński 已提交
3543

3544 3545 3546
gem 'rspec'
gem 'semaphore_test_boosters'
```
3547

3548
```yaml
3549 3550
test:
  parallel: 3
3551
  script:
3552 3553
    - bundle
    - bundle exec rspec_booster --job $CI_NODE_INDEX/$CI_NODE_TOTAL
3554
```
3555

3556 3557
CAUTION: **Caution:**
Please be aware that semaphore_test_boosters reports usages statistics to the author.
3558

3559 3560
You can then navigate to the **Jobs** tab of a new pipeline build and see your RSpec
job split into three separate jobs.
3561

3562 3563
#### Parallel `matrix` jobs

3564
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15356) in GitLab 13.3.
3565

3566
Use `matrix:` to configure different variables for jobs that are running in parallel.
3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603
There can be from 2 to 50 jobs.

Every job gets the same `CI_NODE_TOTAL` [environment variable](../variables/README.md#predefined-environment-variables) value, and a unique `CI_NODE_INDEX` value.

```yaml
deploystacks:
  stage: deploy
  script:
    - bin/deploy
  parallel:
    matrix:
      - PROVIDER: aws
        STACK:
          - monitoring
          - app1
          - app2
      - PROVIDER: ovh
        STACK: [monitoring, backup, app]
      - PROVIDER: [gcp, vultr]
        STACK: [data, processing]
```

This generates 10 parallel `deploystacks` jobs, each with different values for `PROVIDER` and `STACK`:

```plaintext
deploystacks 1/10 with PROVIDER=aws and STACK=monitoring
deploystacks 2/10 with PROVIDER=aws and STACK=app1
deploystacks 3/10 with PROVIDER=aws and STACK=app2
deploystacks 4/10 with PROVIDER=ovh and STACK=monitoring
deploystacks 5/10 with PROVIDER=ovh and STACK=backup
deploystacks 6/10 with PROVIDER=ovh and STACK=app
deploystacks 7/10 with PROVIDER=gcp and STACK=data
deploystacks 8/10 with PROVIDER=gcp and STACK=processing
deploystacks 9/10 with PROVIDER=vultr and STACK=data
deploystacks 10/10 with PROVIDER=vultr and STACK=processing
```

3604
### `trigger`
3605

3606 3607
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/8997) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.8.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/199224) to GitLab Core in 12.8.
3608

3609 3610
Use `trigger` to define a downstream pipeline trigger. When GitLab starts a job created
with a `trigger` definition, a downstream pipeline is created.
3611

3612
You can use this keyword to create two different types of downstream pipelines:
3613

3614 3615
- [Multi-project pipelines](../multi_project_pipelines.md#creating-multi-project-pipelines-from-gitlab-ciyml)
- [Child pipelines](../parent_child_pipelines.md)
3616

3617 3618 3619 3620
[Since GitLab 13.2](https://gitlab.com/gitlab-org/gitlab/-/issues/197140/), you can
see which job triggered a downstream pipeline by hovering your mouse cursor over
the downstream pipeline job in the [pipeline graph](../pipelines/index.md#visualize-pipelines).

3621 3622 3623 3624
NOTE: **Note:**
Using a `trigger` with `when:manual` together results in the error `jobs:#{job-name}
when should be on_success, on_failure or always`, because `when:manual` prevents
triggers being used.
3625

3626
#### Simple `trigger` syntax for multi-project pipelines
3627

3628 3629
The simplest way to configure a downstream trigger is to use `trigger` keyword
with a full path to a downstream project:
3630

3631 3632 3633 3634
```yaml
rspec:
  stage: test
  script: bundle exec rspec
3635

3636 3637 3638 3639
staging:
  stage: deploy
  trigger: my/deployment
```
3640

3641
#### Complex `trigger` syntax for multi-project pipelines
3642

3643
It's possible to configure a branch name that GitLab will use to create
3644
a downstream pipeline with:
3645

3646
```yaml
3647 3648 3649 3650 3651 3652 3653 3654 3655
rspec:
  stage: test
  script: bundle exec rspec

staging:
  stage: deploy
  trigger:
    project: my/deployment
    branch: stable
3656 3657
```

3658
It's possible to mirror the status from a triggered pipeline:
3659

3660
```yaml
3661 3662 3663 3664 3665
trigger_job:
  trigger:
    project: my/project
    strategy: depend
```
3666

3667
It's possible to mirror the status from an upstream pipeline:
3668

3669 3670 3671 3672 3673
```yaml
upstream_bridge:
  stage: test
  needs:
    pipeline: other/project
3674 3675
```

3676
#### `trigger` syntax for child pipeline
3677

3678
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/16094) in GitLab 12.7.
3679

3680 3681
To create a [child pipeline](../parent_child_pipelines.md), specify the path to the
YAML file containing the CI config of the child pipeline:
3682 3683

```yaml
3684 3685 3686
trigger_job:
  trigger:
    include: path/to/child-pipeline.yml
3687 3688
```

3689
Similar to [multi-project pipelines](../multi_project_pipelines.md#mirroring-status-from-triggered-pipeline),
3690
it's possible to mirror the status from a triggered pipeline:
3691 3692

```yaml
3693 3694 3695 3696 3697
trigger_job:
  trigger:
    include:
      - local: path/to/child-pipeline.yml
    strategy: depend
3698 3699
```

3700
##### Trigger child pipeline with generated configuration file
3701

3702
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/35632) in GitLab 12.9.
3703

3704
You can also trigger a child pipeline from a [dynamically generated configuration file](../parent_child_pipelines.md#dynamic-child-pipelines):
3705 3706

```yaml
3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719
generate-config:
  stage: build
  script: generate-ci-config > generated-config.yml
  artifacts:
    paths:
      - generated-config.yml

child-pipeline:
  stage: test
  trigger:
    include:
      - artifact: generated-config.yml
        job: generate-config
3720 3721
```

3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733
The `generated-config.yml` is extracted from the artifacts and used as the configuration
for triggering the child pipeline.

#### Linking pipelines with `trigger:strategy`

By default, the `trigger` job completes with the `success` status
as soon as the downstream pipeline is created.

To force the `trigger` job to wait for the downstream (multi-project or child) pipeline to complete, use
`strategy: depend`. This will make the trigger job wait with a "running" status until the triggered
pipeline completes. At that point, the `trigger` job will complete and display the same status as
the downstream job.
3734 3735

```yaml
3736 3737 3738 3739
trigger_job:
  trigger:
    include: path/to/child-pipeline.yml
    strategy: depend
3740 3741
```

3742 3743 3744
This can help keep your pipeline execution linear. In the example above, jobs from
subsequent stages will wait for the triggered pipeline to successfully complete before
starting, at the cost of reduced parallelization.
3745

3746
#### Trigger a pipeline by API call
3747

3748 3749
Triggers can be used to force a rebuild of a specific branch, tag or commit,
with an API call when a pipeline gets created using a trigger token.
3750

3751
Not to be confused with the [`trigger`](#trigger) parameter.
3752

3753
[Read more in the triggers documentation.](../triggers/README.md)
3754

3755
### `interruptible`
3756

3757
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32022) in GitLab 12.3.
3758

3759 3760 3761
`interruptible` is used to indicate that a job should be canceled if made redundant by a newer pipeline run. Defaults to `false`.
This value will only be used if the [automatic cancellation of redundant pipelines feature](../pipelines/settings.md#auto-cancel-pending-pipelines)
is enabled.
3762

3763
When enabled, a pipeline on the same branch will be canceled when:
3764

3765
- It's made redundant by a newer pipeline run.
3766
- Either all jobs are set as interruptible, or any uninterruptible jobs haven't started.
3767

3768
Pending jobs are always considered interruptible.
3769

3770 3771
TIP: **Tip:**
Set jobs as interruptible that can be safely canceled once started (for instance, a build job).
3772

3773
Here is a simple example:
3774 3775

```yaml
3776 3777 3778 3779
stages:
  - stage1
  - stage2
  - stage3
3780

3781 3782 3783 3784 3785
step-1:
  stage: stage1
  script:
    - echo "Can be canceled."
  interruptible: true
3786

3787 3788 3789 3790
step-2:
  stage: stage2
  script:
    - echo "Can not be canceled."
3791

3792 3793 3794 3795 3796
step-3:
  stage: stage3
  script:
    - echo "Because step-2 can not be canceled, this step will never be canceled, even though set as interruptible."
  interruptible: true
3797 3798
```

3799
In the example above, a new pipeline run will cause an existing running pipeline to be:
W
Wolphin 已提交
3800

3801 3802
- Canceled, if only `step-1` is running or pending.
- Not canceled, once `step-2` starts running.
W
Wolphin 已提交
3803

3804 3805
NOTE: **Note:**
Once an uninterruptible job is running, the pipeline will never be canceled, regardless of the final job's state.
W
Wolphin 已提交
3806

3807
### `resource_group`
W
Wolphin 已提交
3808

3809
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15536) in GitLab 12.7.
W
Wolphin 已提交
3810

3811
Sometimes running multiple jobs or pipelines at the same time in an environment
3812
can lead to errors during the deployment.
W
Wolphin 已提交
3813

3814
To avoid these errors, the `resource_group` attribute can be used to ensure that
3815
the runner doesn't run certain jobs simultaneously.
3816

3817 3818 3819
When the `resource_group` key is defined for a job in `.gitlab-ci.yml`,
job executions are mutually exclusive across different pipelines for the same project.
If multiple jobs belonging to the same resource group are enqueued simultaneously,
3820
only one of the jobs is picked by the runner, and the other jobs wait until the
3821
`resource_group` is free.
3822

3823
Here is a simple example:
3824 3825

```yaml
3826 3827 3828
deploy-to-production:
  script: deploy
  resource_group: production
3829 3830
```

3831
In this case, if a `deploy-to-production` job is running in a pipeline, and a new
3832
`deploy-to-production` job is created in a different pipeline, it won't run until
3833 3834
the currently running/pending `deploy-to-production` job is finished. As a result,
you can ensure that concurrent deployments will never happen to the production environment.
3835

3836 3837 3838
There can be multiple `resource_group`s defined per environment. A good use case for this
is when deploying to physical devices. You may have more than one physical device, and each
one can be deployed to, but there can be only one deployment per device at any given time.
3839

3840
NOTE: **Note:**
3841 3842
This key can only contain letters, digits, `-`, `_`, `/`, `$`, `{`, `}`, `.`, and spaces.
It can't start or end with `/`.
3843

3844 3845
For more information, see [Deployments Safety](../environments/deployment_safety.md).

3846 3847 3848 3849
### `release`

> [Introduced](https://gitlab.com/gitlab-org/gitlab/merge_requests/19298) in GitLab 13.2.

3850
`release` indicates that the job creates a [Release](../../user/project/releases/index.md).
3851 3852 3853 3854

These methods are supported:

- [`tag_name`](#releasetag_name)
3855 3856 3857 3858 3859
- [`name`](#releasename) (optional)
- [`description`](#releasedescription) (optional)
- [`ref`](#releaseref) (optional)
- [`milestones`](#releasemilestones) (optional)
- [`released_at`](#releasereleased_at) (optional)
3860 3861 3862 3863 3864 3865 3866 3867 3868

The Release is created only if the job processes without error. If the Rails API
returns an error during Release creation, the `release` job fails.

#### `release-cli` Docker image

The Docker image to use for the `release-cli` must be specified, using the following directive:

```yaml
3869
image: registry.gitlab.com/gitlab-org/release-cli:latest
3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887
```

#### Script

All jobs require a `script` tag at a minimum. A `:release` job can use the output of a
`:script` tag, but if this is not necessary, a placeholder script can be used, for example:

```yaml
script:
  - echo 'release job'
```

An [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/223856) exists to remove this requirement in an upcoming version of GitLab.

A pipeline can have multiple `release` jobs, for example:

```yaml
ios-release:
3888 3889
  script:
    - echo 'iOS release job'
3890 3891
  release:
     tag_name: v1.0.0-ios
3892
     description: 'iOS release v1.0.0'
3893 3894

android-release:
3895 3896
  script:
    - echo 'Android release job'
3897 3898
  release:
     tag_name: v1.0.0-android
3899
     description: 'Android release v1.0.0'
3900 3901 3902 3903 3904 3905
```

#### `release:tag_name`

The `tag_name` must be specified. It can refer to an existing Git tag or can be specified by the user.

3906
When the specified tag doesn't exist in the repository, a new tag is created from the associated SHA of the pipeline.
3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932

For example, when creating a Release from a Git tag:

```yaml
job:
  release:
    tag_name: $CI_COMMIT_TAG
    description: changelog.txt
```

It is also possible to create any unique tag, in which case `only: tags` is not mandatory.
A semantic versioning example:

```yaml
job:
  release:
    tag_name: ${MAJOR}_${MINOR}_${REVISION}
    description: changelog.txt
```

- The Release is created only if the job's main script succeeds.
- If the Release already exists, it is not updated and the job with the `release` keyword fails.
- The `release` section executes after the `script` tag and before the `after_script`.

#### `release:name`

3933
The Release name. If omitted, it is populated with the value of `release: tag_name`.
3934 3935 3936

#### `release:description`

3937
Specifies the longer description of the Release.
3938 3939 3940

#### `release:ref`

3941 3942
If the `release: tag_name` doesn’t exist yet, the release is created from `ref`.
`ref` can be a commit SHA, another tag name, or a branch name.
3943 3944 3945 3946 3947 3948 3949

#### `release:milestones`

The title of each milestone the release is associated with.

#### `release:released_at`

3950 3951
The date and time when the release is ready. Defaults to the current date and time if not
defined. Expected in ISO 8601 format (2019-03-15T08:00:00Z).
3952 3953 3954

#### Complete example for `release`

3955 3956 3957
Combining the individual examples given above for `release` results in the following
code snippets. There are two options, depending on how you generate the
tags. These options cannot be used together, so choose one:
3958

3959 3960
- To create a release when you push a Git tag, or when you add a Git tag
  in the UI by going to **Repository > Tags**:
3961

3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982
  ```yaml
  release_job:
    stage: release
    image: registry.gitlab.com/gitlab-org/release-cli:latest
    rules:
      - if: $CI_COMMIT_TAG                  # Run this job when a tag is created manually
    script:
      - echo 'running release_job'
    release:
       name: 'Release $CI_COMMIT_TAG'
       description: 'Created using the release-cli $EXTRA_DESCRIPTION' # $EXTRA_DESCRIPTION must be defined
       tag_name: '$CI_COMMIT_TAG'                                      # elsewhere in the pipeline.
       ref: '$CI_COMMIT_TAG'
       milestones:
         - 'm1'
         - 'm2'
         - 'm3'
       released_at: '2020-07-15T08:00:00Z'  # Optional, will auto generate if not defined,
                                            # or can use a variable.
  ```

3983
- To create a release automatically when commits are pushed or merged to the default branch,
3984 3985
  using a new Git tag that is defined with variables:

3986 3987 3988 3989 3990
NOTE: **Note:**
Environment variables set in `before_script` or `script` are not available for expanding
in the same job. Read more about
[potentially making variables available for expanding](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/6400).

3991
  ```yaml
3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004
  prepare_job:
    stage: prepare                                              # This stage must run before the release stage
    rules:
      - if: $CI_COMMIT_TAG
        when: never                                             # Do not run this job when a tag is created manually
      - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH             # Run this job when commits are pushed or merged to the default branch
    script:
      - echo "EXTRA_DESCRIPTION=some message" >> variables.env  # Generate the EXTRA_DESCRIPTION and TAG environment variables
      - echo "TAG=v$(cat VERSION)" >> variables.env             # and append to the variables.env file
    artifacts:
      reports:
        dotenv: variables.env                                   # Use artifacts:reports:dotenv to expose the variables to other jobs

4005 4006 4007
  release_job:
    stage: release
    image: registry.gitlab.com/gitlab-org/release-cli:latest
4008 4009 4010
    needs:
    - job: prepare_job
      artifacts: true
4011 4012 4013
    rules:
      - if: $CI_COMMIT_TAG
        when: never                                 # Do not run this job when a tag is created manually
4014
      - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Run this job when commits are pushed or merged to the default branch
4015
    script:
4016
      - echo 'running release_job for $TAG'
4017
    release:
4018 4019 4020 4021 4022
       name: 'Release $TAG'
       description: 'Created using the release-cli $EXTRA_DESCRIPTION' # $EXTRA_DESCRIPTION and the $TAG
       tag_name: '$TAG'                                                # variables must be defined elsewhere
       ref: '$CI_COMMIT_SHA'                                           # in the pipeline. For example, in the
       milestones:                                                     # prepare_job
4023 4024 4025 4026 4027 4028
         - 'm1'
         - 'm2'
         - 'm3'
       released_at: '2020-07-15T08:00:00Z'          # Optional, will auto generate if not defined,
                                                    # or can use a variable.
  ```
4029 4030 4031 4032 4033 4034 4035

#### `releaser-cli` command line

The entries under the `:release` node are transformed into a `bash` command line and sent
to the Docker container, which contains the [release-cli](https://gitlab.com/gitlab-org/release-cli).
You can also call the `release-cli` directly from a `script` entry.

4036
The YAML described above would be translated into a CLI command like this:
4037 4038

```shell
4039
release-cli create --name "Release $CI_COMMIT_SHA" --description "Created using the release-cli $EXTRA_DESCRIPTION" --tag-name "v${MAJOR}.${MINOR}.${REVISION}" --ref "$CI_COMMIT_SHA" --released-at "2020-07-15T08:00:00Z" --milestone "m1" --milestone "m2" --milestone "m3"
4040 4041
```

E
Evan Read 已提交
4042
### `pages`
4043 4044 4045 4046 4047 4048 4049 4050 4051

`pages` is a special job that is used to upload static content to GitLab that
can be used to serve your website. It has a special syntax, so the two
requirements below must be met:

- Any static content must be placed under a `public/` directory.
- `artifacts` with a path to the `public/` directory must be defined.

The example below simply moves all files from the root of the project to the
4052
`public/` directory. The `.public` workaround is so `cp` does not also copy
4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069
`public/` to itself in an infinite loop:

```yaml
pages:
  stage: deploy
  script:
    - mkdir .public
    - cp -r * .public
    - mv .public public
  artifacts:
    paths:
      - public
  only:
    - master
```

Read more on [GitLab Pages user documentation](../../user/project/pages/index.md).
4070

4071
## `variables`
4072 4073 4074 4075 4076

> Introduced in GitLab Runner v0.5.0.

NOTE: **Note:**
Integers (as well as strings) are legal both for variable's name and value.
4077
Floats are not legal and can't be used.
4078

4079 4080 4081
Variables are configurable values in `.gitlab-ci.yml` that are passed to jobs.
They can be set globally and per-job.
When you use the `variables` keyword in jobs, it overrides the global
4082
YAML variables and predefined ones of the same name.
4083

4084
Variables are stored in the Git repository and are meant for non-sensitive
4085 4086 4087 4088 4089 4090 4091
project configuration, for example:

```yaml
variables:
  DATABASE_URL: "postgres://postgres@postgres/my_database"
```

4092
You can use these variables later in all executed commands and scripts.
4093
The YAML-defined variables are also set to all created service containers,
4094
so that you can fine tune them.
4095

4096 4097 4098 4099 4100 4101 4102
Except for the user-defined variables, there are also variables [set up by the
runner itself](../variables/README.md#predefined-environment-variables).
One example would be `CI_COMMIT_REF_NAME`, which has the value of
the branch or tag name the project is built for. Apart from the variables
you can set in `.gitlab-ci.yml`, there are also environment
[variables](../variables/README.md#gitlab-cicd-environment-variables),
which can be set in the GitLab UI.
4103

4104
[YAML anchors for variables](#yaml-anchors-for-variables) are available.
4105

4106
Learn more about [variables and their priority](../variables/README.md).
4107

4108
### Git strategy
M
Mark Pundsack 已提交
4109

4110 4111 4112 4113 4114
> - Introduced in GitLab 8.9 as an experimental feature.
> - `GIT_STRATEGY=none` requires GitLab Runner v1.7+.

CAUTION: **Caution:**
May change or be removed completely in future releases.
N
Nick Thomas 已提交
4115 4116

You can set the `GIT_STRATEGY` used for getting recent application code, either
4117 4118
globally or per-job in the [`variables`](#variables) section. If left
unspecified, the default from project settings will be used.
M
Mark Pundsack 已提交
4119

N
Nick Thomas 已提交
4120 4121 4122
There are three possible values: `clone`, `fetch`, and `none`.

`clone` is the slowest option. It clones the repository from scratch for every
4123
job, ensuring that the local working copy is always pristine.
M
Mark Pundsack 已提交
4124

4125
```yaml
M
Mark Pundsack 已提交
4126 4127 4128 4129
variables:
  GIT_STRATEGY: clone
```

4130
`fetch` is faster as it re-uses the local working copy (falling back to `clone`
4131
if it does not exist). `git clean` is used to undo any changes made by the last
N
Nick Thomas 已提交
4132
job, and `git fetch` is used to retrieve commits made since the last job ran.
M
Mark Pundsack 已提交
4133

4134
```yaml
M
Mark Pundsack 已提交
4135 4136 4137 4138
variables:
  GIT_STRATEGY: fetch
```

4139
`none` also re-uses the local working copy, but skips all Git operations
4140
(including GitLab Runner's pre-clone script, if present). It's mostly useful
4141
for jobs that operate exclusively on artifacts (for example, `deploy`). Git repository
4142
data may be present, but it's certain to be out of date, so you should only
4143
rely on files brought into the local working copy from cache or artifacts.
N
Nick Thomas 已提交
4144

4145
```yaml
N
Nick Thomas 已提交
4146 4147 4148 4149
variables:
  GIT_STRATEGY: none
```

4150 4151
NOTE: **Note:**
`GIT_STRATEGY` is not supported for
E
Evan Read 已提交
4152
[Kubernetes executor](https://docs.gitlab.com/runner/executors/kubernetes.html),
4153
but may be in the future. See the [support Git strategy with Kubernetes executor feature proposal](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3847)
4154 4155
for updates.

4156
### Git submodule strategy
4157 4158 4159 4160

> Requires GitLab Runner v1.10+.

The `GIT_SUBMODULE_STRATEGY` variable is used to control if / how Git
4161 4162
submodules are included when fetching the code before a build. You can set them
globally or per-job in the [`variables`](#variables) section.
4163

4164
There are three possible values: `none`, `normal`, and `recursive`:
4165

4166
- `none` means that submodules won't be included when fetching the project
4167 4168
  code. This is the default, which matches the pre-v1.10 behavior.

4169
- `normal` means that only the top-level submodules will be included. It's
4170
  equivalent to:
4171

4172
  ```shell
M
Marcel Amirault 已提交
4173 4174 4175
  git submodule sync
  git submodule update --init
  ```
4176 4177

- `recursive` means that all submodules (including submodules of submodules)
4178 4179
  will be included. This feature needs Git v1.8.1 and later. When using a
  GitLab Runner with an executor not based on Docker, make sure the Git version
4180
  meets that requirement. It's equivalent to:
4181

4182
  ```shell
M
Marcel Amirault 已提交
4183 4184 4185
  git submodule sync --recursive
  git submodule update --init --recursive
  ```
4186 4187 4188

Note that for this feature to work correctly, the submodules must be configured
(in `.gitmodules`) with either:
4189

4190 4191 4192 4193
- the HTTP(S) URL of a publicly-accessible repository, or
- a relative path to another repository on the same GitLab server. See the
  [Git submodules](../git_submodules.md) documentation.

4194
### Git checkout
4195

E
Evan Read 已提交
4196
> Introduced in GitLab Runner 9.3.
4197 4198 4199 4200 4201 4202

The `GIT_CHECKOUT` variable can be used when the `GIT_STRATEGY` is set to either
`clone` or `fetch` to specify whether a `git checkout` should be run. If not
specified, it defaults to true. You can set them globally or per-job in the
[`variables`](#variables) section.

4203
If set to `false`, the runner will:
4204 4205 4206 4207 4208 4209 4210

- when doing `fetch` - update the repository and leave working copy on
  the current revision,
- when doing `clone` - clone the repository and leave working copy on the
  default branch.

Having this setting set to `true` will mean that for both `clone` and `fetch`
4211
strategies the runner will checkout the working copy to a revision related
4212 4213 4214 4215 4216 4217 4218
to the CI pipeline:

```yaml
variables:
  GIT_STRATEGY: clone
  GIT_CHECKOUT: "false"
script:
4219 4220 4221 4222
  - git checkout -B master origin/master
  - git merge $CI_COMMIT_SHA
```

4223
### Git clean flags
4224 4225 4226 4227 4228 4229 4230

> Introduced in GitLab Runner 11.10

The `GIT_CLEAN_FLAGS` variable is used to control the default behavior of
`git clean` after checking out the sources. You can set it globally or per-job in the
[`variables`](#variables) section.

4231
`GIT_CLEAN_FLAGS` accepts all possible options of the [`git clean`](https://git-scm.com/docs/git-clean)
4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247
command.

`git clean` is disabled if `GIT_CHECKOUT: "false"` is specified.

If `GIT_CLEAN_FLAGS` is:

- Not specified, `git clean` flags default to `-ffdx`.
- Given the value `none`, `git clean` is not executed.

For example:

```yaml
variables:
  GIT_CLEAN_FLAGS: -ffdx -e cache/
script:
  - ls -al cache/
4248
```
4249

4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268
### Git fetch extra flags

> [Introduced](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4142) in GitLab Runner 13.1.

The `GIT_FETCH_EXTRA_FLAGS` variable is used to control the behavior of
`git fetch`. You can set it globally or per-job in the [`variables`](#variables) section.

`GIT_FETCH_EXTRA_FLAGS` accepts all possible options of the [`git fetch`](https://git-scm.com/docs/git-fetch) command, but please note that `GIT_FETCH_EXTRA_FLAGS` flags will be appended after the default flags that can't be modified.

The default flags are:

- [GIT_DEPTH](#shallow-cloning).
- The list of [refspecs](https://git-scm.com/book/en/v2/Git-Internals-The-Refspec).
- A remote called `origin`.

If `GIT_FETCH_EXTRA_FLAGS` is:

- Not specified, `git fetch` flags default to `--prune --quiet` along with the default flags.
- Given the value `none`, `git fetch` is executed only with the default flags.
4269

4270 4271 4272 4273 4274 4275 4276 4277 4278
For example, the default flags are `--prune --quiet`, so you can make `git fetch` more verbose by overriding this with just `--prune`:

```yaml
variables:
  GIT_FETCH_EXTRA_FLAGS: --prune
script:
  - ls -al cache/
```

4279
The configuration above will result in `git fetch` being called this way:
4280 4281 4282 4283 4284

```shell
git fetch origin $REFSPECS --depth 50  --prune
```

4285
Where `$REFSPECS` is a value provided to the runner internally by GitLab.
4286

4287
### Job stages attempts
4288 4289 4290

> Introduced in GitLab, it requires GitLab Runner v1.9+.

4291
You can set the number for attempts the running job will try to execute each
4292 4293
of the following stages:

4294 4295 4296
| Variable                          | Description                                            |
|-----------------------------------|--------------------------------------------------------|
| **ARTIFACT_DOWNLOAD_ATTEMPTS**    | Number of attempts to download artifacts running a job |
4297
| **EXECUTOR_JOB_SECTION_ATTEMPTS** | [Since GitLab 12.10](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4450), the number of attempts to run a section in a job after a [`No Such Container`](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4450) error ([Docker executor](https://docs.gitlab.com/runner/executors/docker.html) only). |
4298 4299
| **GET_SOURCES_ATTEMPTS**          | Number of attempts to fetch sources running a job      |
| **RESTORE_CACHE_ATTEMPTS**        | Number of attempts to restore the cache running a job  |
4300 4301 4302 4303 4304

The default is one single attempt.

Example:

4305
```yaml
4306
variables:
4307
  GET_SOURCES_ATTEMPTS: 3
4308 4309
```

4310
You can set them globally or per-job in the [`variables`](#variables) section.
4311

4312
### Shallow cloning
M
Mark Pundsack 已提交
4313

4314 4315
> Introduced in GitLab 8.9 as an experimental feature.

4316
NOTE: **Note:**
4317
As of GitLab 12.0, newly created projects will automatically have a [default `git depth` value of `50`](../pipelines/settings.md#git-shallow-clone).
M
Mark Pundsack 已提交
4318

4319 4320
You can specify the depth of fetching and cloning using `GIT_DEPTH`. This does a
shallow clone of the repository and can significantly speed up cloning for
M
Mark Pundsack 已提交
4321 4322
repositories with a large number of commits or old, large binaries. The value is
passed to `git fetch` and `git clone`.
M
Mark Pundsack 已提交
4323

E
Evan Read 已提交
4324
NOTE: **Note:**
4325 4326
If you use a depth of 1 and have a queue of jobs or retry
jobs, jobs may fail.
M
Mark Pundsack 已提交
4327

4328
Since Git fetching and cloning is based on a ref, such as a branch name, runners
4329
can't clone a specific commit SHA. If there are multiple jobs in the queue, or
4330
you're retrying an old job, the commit to be tested needs to be within the
4331
Git history that is cloned. Setting too small a value for `GIT_DEPTH` can make
M
Mark Pundsack 已提交
4332
it impossible to run these old commits. You will see `unresolved reference` in
4333
job logs. You should then reconsider changing `GIT_DEPTH` to a higher value.
M
Mark Pundsack 已提交
4334

4335 4336
Jobs that rely on `git describe` may not work correctly when `GIT_DEPTH` is
set since only part of the Git history is present.
M
Mark Pundsack 已提交
4337 4338

To fetch or clone only the last 3 commits:
4339 4340

```yaml
M
Mark Pundsack 已提交
4341
variables:
M
Mark Pundsack 已提交
4342
  GIT_DEPTH: "3"
M
Mark Pundsack 已提交
4343 4344
```

4345 4346
You can set it globally or per-job in the [`variables`](#variables) section.

4347
### Custom build directories
4348

4349
> [Introduced](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/2211) in GitLab Runner 11.10.
4350 4351

NOTE: **Note:**
4352
This can only be used when `custom_build_dir` is enabled in the [runner's
4353 4354 4355
configuration](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runnerscustom_build_dir-section).
This is the default configuration for `docker` and `kubernetes` executor.

E
Evan Read 已提交
4356 4357 4358
By default, GitLab Runner clones the repository in a unique subpath of the
`$CI_BUILDS_DIR` directory. However, your project might require the code in a
specific directory (Go projects, for example). In that case, you can specify
4359 4360
the `GIT_CLONE_PATH` variable to tell the runner the directory to clone the
repository in:
4361

4362
```yaml
4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374
variables:
  GIT_CLONE_PATH: $CI_BUILDS_DIR/project-name

test:
  script:
    - pwd
```

The `GIT_CLONE_PATH` has to always be within `$CI_BUILDS_DIR`. The directory set in `$CI_BUILDS_DIR`
is dependent on executor and configuration of [runners.builds_dir](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runners-section)
setting.

4375
#### Handling concurrency
4376 4377 4378 4379

An executor using a concurrency greater than `1` might lead
to failures because multiple jobs might be working on the same directory if the `builds_dir`
is shared between jobs.
4380
GitLab Runner does not try to prevent this situation. It's up to the administrator
4381
and developers to comply with the requirements of runner configuration.
4382

4383
To avoid this scenario, you can use a unique path within `$CI_BUILDS_DIR`, because runner
4384 4385 4386 4387 4388 4389 4390 4391
exposes two additional variables that provide a unique `ID` of concurrency:

- `$CI_CONCURRENT_ID`: Unique ID for all jobs running within the given executor.
- `$CI_CONCURRENT_PROJECT_ID`: Unique ID for all jobs running within the given executor and project.

The most stable configuration that should work well in any scenario and on any executor
is to use `$CI_CONCURRENT_ID` in the `GIT_CLONE_PATH`. For example:

4392
```yaml
4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403
variables:
  GIT_CLONE_PATH: $CI_BUILDS_DIR/$CI_CONCURRENT_ID/project-name

test:
  script:
    - pwd
```

The `$CI_CONCURRENT_PROJECT_ID` should be used in conjunction with `$CI_PROJECT_PATH`
as the `$CI_PROJECT_PATH` provides a path of a repository. That is, `group/subgroup/project`. For example:

4404
```yaml
4405 4406 4407 4408 4409 4410 4411 4412
variables:
  GIT_CLONE_PATH: $CI_BUILDS_DIR/$CI_CONCURRENT_ID/$CI_PROJECT_PATH

test:
  script:
    - pwd
```

4413
#### Nested paths
4414 4415

The value of `GIT_CLONE_PATH` is expanded once and nesting variables
4416
within is not supported.
4417 4418 4419 4420

For example, you define both the variables below in your
`.gitlab-ci.yml` file:

4421
```yaml
4422 4423 4424 4425 4426 4427 4428
variables:
  GOPATH: $CI_BUILDS_DIR/go
  GIT_CLONE_PATH: $GOPATH/src/namespace/project
```

The value of `GIT_CLONE_PATH` is expanded once into
`$CI_BUILDS_DIR/go/src/namespace/project`, and results in failure
4429
because `$CI_BUILDS_DIR` is not expanded.
4430

4431 4432 4433
## Special YAML features

It's possible to use special YAML features like anchors (`&`), aliases (`*`)
4434
and map merging (`<<`). Use these features to reduce the complexity
4435 4436 4437 4438
of `.gitlab-ci.yml`.

Read more about the various [YAML features](https://learnxinyminutes.com/docs/yaml/).

4439 4440 4441 4442
In most cases, the [`extends` keyword](#extends) is more user friendly and should
be used over these special YAML features. YAML anchors may still
need to be used to merge arrays.

4443 4444
### Anchors

4445
> Introduced in GitLab 8.6 and GitLab Runner v1.1.1.
4446

4447
YAML has a handy feature called 'anchors', which lets you easily duplicate
4448
content across your document. Anchors can be used to duplicate/inherit
4449
properties, and is a perfect example to be used with [hidden jobs](#hide-jobs)
4450 4451
to provide templates for your jobs. When there is duplicate keys, GitLab will
perform a reverse deep merge based on the keys.
4452 4453 4454 4455

The following example uses anchors and map merging. It will create two jobs,
`test1` and `test2`, that will inherit the parameters of `.job_template`, each
having their own custom `script` defined:
4456 4457

```yaml
4458
.job_template: &job_definition  # Hidden key that defines an anchor named 'job_definition'
4459
  image: ruby:2.6
4460 4461 4462 4463 4464
  services:
    - postgres
    - redis

test1:
4465
  <<: *job_definition           # Merge the contents of the 'job_definition' alias
4466
  script:
4467
    - test1 project
4468 4469

test2:
4470
  <<: *job_definition           # Merge the contents of the 'job_definition' alias
4471
  script:
4472 4473 4474 4475 4476 4477 4478 4479 4480
    - test2 project
```

`&` sets up the name of the anchor (`job_definition`), `<<` means "merge the
given hash into the current one", and `*` includes the named anchor
(`job_definition` again). The expanded version looks like this:

```yaml
.job_template:
4481
  image: ruby:2.6
4482 4483 4484 4485 4486
  services:
    - postgres
    - redis

test1:
4487
  image: ruby:2.6
4488 4489 4490 4491 4492 4493 4494
  services:
    - postgres
    - redis
  script:
    - test1 project

test2:
4495
  image: ruby:2.6
4496 4497 4498 4499 4500
  services:
    - postgres
    - redis
  script:
    - test2 project
4501 4502
```

4503 4504 4505 4506
Let's see another one example. This time we will use anchors to define two sets
of services. This will create two jobs, `test:postgres` and `test:mysql`, that
will share the `script` directive defined in `.job_template`, and the `services`
directive defined in `.postgres_services` and `.mysql_services` respectively:
4507 4508 4509 4510 4511

```yaml
.job_template: &job_definition
  script:
    - test project
4512 4513
  tags:
    - dev
4514 4515 4516 4517 4518 4519

.postgres_services:
  services: &postgres_definition
    - postgres
    - ruby

4520
.mysql_services:
4521 4522 4523 4524 4525
  services: &mysql_definition
    - mysql
    - ruby

test:postgres:
A
Achilleas Pipinellis 已提交
4526
  <<: *job_definition
4527
  services: *postgres_definition
4528 4529
  tags:
    - postgres
4530 4531

test:mysql:
A
Achilleas Pipinellis 已提交
4532
  <<: *job_definition
4533 4534 4535
  services: *mysql_definition
```

4536
The expanded version looks like this:
4537

4538 4539 4540 4541
```yaml
.job_template:
  script:
    - test project
4542 4543
  tags:
    - dev
4544

4545 4546 4547 4548
.postgres_services:
  services:
    - postgres
    - ruby
4549

4550 4551 4552 4553 4554 4555
.mysql_services:
  services:
    - mysql
    - ruby

test:postgres:
4556
  script:
4557 4558 4559 4560
    - test project
  services:
    - postgres
    - ruby
4561 4562
  tags:
    - postgres
4563 4564 4565 4566 4567 4568 4569

test:mysql:
  script:
    - test project
  services:
    - mysql
    - ruby
4570 4571
  tags:
    - dev
4572 4573
```

4574
You can see that the hidden jobs are conveniently used as templates.
4575

4576 4577 4578
NOTE: **Note:**
Note that `tags: [dev]` has been overwritten by `tags: [postgres]`.

4579 4580
NOTE: **Note:**
You can't use YAML anchors across multiple files when leveraging the [`include`](#include)
4581 4582
feature. Anchors are only valid within the file they were defined in. Instead
of using YAML anchors, you can use the [`extends` keyword](#extends).
4583

4584 4585
#### YAML anchors for `before_script` and `after_script`

4586
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/23005) in GitLab 12.5.
4587 4588 4589 4590 4591 4592 4593 4594 4595

You can use [YAML anchors](#anchors) with `before_script` and `after_script`,
which makes it possible to include a predefined list of commands in multiple
jobs.

Example:

```yaml
.something_before: &something_before
4596
  - echo 'something before'
4597 4598

.something_after: &something_after
4599 4600
  - echo 'something after'
  - echo 'another thing after'
4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612

job_name:
  before_script:
    - *something_before
  script:
    - echo 'this is the script'
  after_script:
    - *something_after
```

#### YAML anchors for `script`

4613
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/23005) in GitLab 12.5.
4614 4615 4616 4617 4618 4619 4620 4621

You can use [YAML anchors](#anchors) with scripts, which makes it possible to
include a predefined list of commands in multiple jobs.

For example:

```yaml
.something: &something
4622
  - echo 'something'
4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642

job_name:
  script:
    - *something
    - echo 'this is the script'
```

#### YAML anchors for variables

[YAML anchors](#anchors) can be used with `variables`, to easily repeat assignment
of variables across multiple jobs. It can also enable more flexibility when a job
requires a specific `variables` block that would otherwise override the global variables.

In the example below, we will override the `GIT_STRATEGY` variable without affecting
the use of the `SAMPLE_VARIABLE` variable:

```yaml
# global variables
variables: &global-variables
  SAMPLE_VARIABLE: sample_variable_value
4643
  ANOTHER_SAMPLE_VARIABLE: another_sample_variable_value
4644 4645 4646 4647 4648 4649 4650 4651 4652 4653

# a job that needs to set the GIT_STRATEGY variable, yet depend on global variables
job_no_git_strategy:
  stage: cleanup
  variables:
    <<: *global-variables
    GIT_STRATEGY: none
  script: echo $SAMPLE_VARIABLE
```

4654
### Hide jobs
4655

4656 4657 4658 4659
> Introduced in GitLab 8.6 and GitLab Runner v1.1.1.

If you want to temporarily 'disable' a job, rather than commenting out all the
lines where the job is defined:
E
Evan Read 已提交
4660

4661 4662 4663 4664 4665
```yaml
#hidden_job:
#  script:
#    - run test
```
4666

4667
You can instead start its name with a dot (`.`) and it won't be processed by
4668 4669 4670 4671 4672 4673 4674 4675 4676
GitLab CI/CD. In the following example, `.hidden_job` will be ignored:

```yaml
.hidden_job:
  script:
    - run test
```

Use this feature to ignore jobs, or use the
4677
[special YAML features](#special-yaml-features) and transform the hidden jobs
4678 4679 4680 4681 4682 4683 4684 4685 4686
into templates.

## Skip Pipeline

If your commit message contains `[ci skip]` or `[skip ci]`, using any
capitalization, the commit will be created but the pipeline will be skipped.

Alternatively, one can pass the `ci.skip` [Git push option](../../user/project/push_options.md#push-options-for-gitlab-cicd)
if using Git 2.10 or newer.
4687

4688 4689
## Processing Git pushes

4690 4691
GitLab will create at most 4 branch and tag pipelines when
pushing multiple changes in single `git push` invocation.
4692

4693 4694
This limitation does not affect any of the updated Merge Request pipelines.
All updated Merge Requests will have a pipeline created when using
4695 4696
[pipelines for merge requests](../merge_request_pipelines/index.md).

4697
## Deprecated parameters
4698

4699
The following parameters are deprecated.
4700

4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732
### Globally-defined `types`

CAUTION: **Deprecated:**
`types` is deprecated, and could be removed in a future release.
Use [`stages`](#stages) instead.

### Job-defined `type`

CAUTION: **Deprecated:**
`type` is deprecated, and could be removed in one of the future releases.
Use [`stage`](#stage) instead.

### Globally-defined `image`, `services`, `cache`, `before_script`, `after_script`

Defining `image`, `services`, `cache`, `before_script`, and
`after_script` globally is deprecated. Support could be removed
from a future release.

Use [`default:`](#global-defaults) instead. For example:

```yaml
default:
  image: ruby:2.5
  services:
    - docker:dind
  cache:
    paths: [vendor/]
  before_script:
    - bundle install --path vendor/
  after_script:
    - rm -rf tmp/
```
4733

M
Marcia Ramos 已提交
4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744
<!-- ## Troubleshooting

Include any troubleshooting steps that you can foresee. If you know beforehand what issues
one might have when setting this up, or when something is changed, or on upgrading, it's
important to describe those, too. Think of things that may go wrong and include them here.
This is important to minimize requests for support, and to avoid doc comments with
questions that you know someone might ask.

Each scenario can be a third-level heading, e.g. `### Getting error message X`.
If you have none to add when creating a doc, leave this section in place
but commented out to help encourage others to add to it in the future. -->