README.md 128.2 KB
Newer Older
M
Marcia Ramos 已提交
1 2 3 4
---
type: reference
---

E
Evan Read 已提交
5
# GitLab CI/CD Pipeline Configuration Reference
D
Douwe Maan 已提交
6

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

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

E
Evan Read 已提交
11 12 13 14 15 16 17 18 19 20
- 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:

21
- For a quick introduction to GitLab CI/CD, follow our [quick start guide](../quick_start/README.md).
E
Evan Read 已提交
22
- For a collection of examples, see [GitLab CI/CD Examples](../examples/README.md).
23
- 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).
24

25
NOTE: **Note:**
26
If you have a [mirrored repository where GitLab pulls from](../../user/project/repository/repository_mirroring.md#pulling-from-a-remote-repository-starter),
27 28 29
you may need to enable pipeline triggering in your project's
**Settings > Repository > Pull from a remote repository > Trigger pipelines for mirror updates**.

E
Evan Read 已提交
30 31 32
## Introduction

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

E
Evan Read 已提交
34 35 36 37 38 39 40
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 已提交
41 42 43 44 45 46 47 48 49

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

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

50
The above example is the simplest possible CI/CD configuration with two separate
51 52 53
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 已提交
54

55 56 57
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
independently from each other.
D
Douwe Maan 已提交
58

59
### Validate the `.gitlab-ci.yml`
E
Evan Read 已提交
60

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

### Unavailable names for jobs

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

70 71 72 73 74 75 76 77
- `image`
- `services`
- `stages`
- `types`
- `before_script`
- `after_script`
- `variables`
- `cache`
78
- `include`
D
Douwe Maan 已提交
79

E
Evan Read 已提交
80 81 82 83 84 85 86 87 88 89 90 91 92
### 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:

93 94 95 96 97 98 99 100 101 102
| Keyword                                            | Description                                                                                                                                                                         |
|:---------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [`script`](#script)                                | Shell script which is executed by Runner.                                                                                                                                           |
| [`image`](#image)                                  | Use docker images. Also available: `image:name` and `image:entrypoint`.                                                                                                             |
| [`services`](#services)                            | Use docker services images. Also available: `services:name`, `services:alias`, `services:entrypoint`, and `services:command`.                                                       |
| [`before_script`](#before_script-and-after_script) | Override a set of commands that are executed before job.                                                                                                                            |
| [`after_script`](#before_script-and-after_script)  | Override a set of commands that are executed after job.                                                                                                                             |
| [`stage`](#stage)                                  | Defines a job stage (default: `test`).                                                                                                                                              |
| [`only`](#onlyexcept-basic)                        | Limit when jobs are created. Also available: [`only:refs`, `only:kubernetes`, `only:variables`, and `only:changes`](#onlyexcept-advanced).                                          |
| [`except`](#onlyexcept-basic)                      | Limit when jobs are not created. Also available: [`except:refs`, `except:kubernetes`, `except:variables`, and `except:changes`](#onlyexcept-advanced).                              |
103
| [`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`.                             |
104
| [`tags`](#tags)                                    | List of tags which are used to select Runner.                                                                                                                                       |
105
| [`allow_failure`](#allow_failure)                  | Allow job to fail. Failed job does not contribute to commit status.                                                                                                                  |
106 107 108
| [`when`](#when)                                    | When to run job. Also available: `when:manual` and `when:delayed`.                                                                                                                  |
| [`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`. |
| [`cache`](#cache)                                  | List of files that should be cached between subsequent runs. Also available: `cache:paths`, `cache:key`, `cache:untracked`, and `cache:policy`.                                     |
109
| [`artifacts`](#artifacts)                          | List of files and directories to attach to a job on success. Also available: `artifacts:paths`, `artifacts:expose_as`, `artifacts:name`, `artifacts:untracked`, `artifacts:when`, `artifacts:expire_in`, `artifacts:reports`, `artifacts:reports:junit`, `artifacts:reports:cobertura`, and `artifacts:reports:terraform`.<br><br>In GitLab [Enterprise Edition](https://about.gitlab.com/pricing/), these are available: `artifacts:reports:codequality`, `artifacts:reports:sast`, `artifacts:reports:dependency_scanning`, `artifacts:reports:container_scanning`, `artifacts:reports:dast`, `artifacts:reports:license_management`, `artifacts:reports:performance` and `artifacts:reports:metrics`. |
110 111 112 113 114 115 116 117 118 119 120 121
| [`dependencies`](#dependencies)                    | Restrict which artifacts are passed to a specific job by providing a list of jobs to fetch artifacts from.                                                                          |
| [`coverage`](#coverage)                            | Code coverage settings for a given job.                                                                                                                                             |
| [`retry`](#retry)                                  | When and how many times a job can be auto-retried in case of a failure.                                                                                                             |
| [`timeout`](#timeout)                              | Define a custom job-level timeout that takes precedence over the project-wide setting.                                                                                              |
| [`parallel`](#parallel)                            | How many instances of a job should be run in parallel.                                                                                                                              |
| [`trigger`](#trigger)                              | Defines a downstream pipeline trigger.                                                                                                                                              |
| [`include`](#include)                              | Allows this job to include external YAML files. Also available: `include:local`, `include:file`, `include:template`, and `include:remote`.                                          |
| [`extends`](#extends)                              | Configuration entries that this job is going to inherit from.                                                                                                                       |
| [`pages`](#pages)                                  | Upload the result of a job to use with GitLab Pages.                                                                                                                                |
| [`variables`](#variables)                          | Define job variables on a job level.                                                                                                                                                |
| [`interruptible`](#interruptible)                  | Defines if a job can be canceled when made redundant by a newer run.                                                                                                                |
| [`resource_group`](#resource_group)                | Limit job concurrency.                                                                                                                                                              |
E
Evan Read 已提交
122 123 124 125

NOTE: **Note:**
Parameters `types` and `type` are [deprecated](#deprecated-parameters).

126 127 128 129 130
## Global parameters

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

### Global defaults
K
Kamil Trzciński 已提交
131 132 133 134 135 136 137 138 139 140 141

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)
142
- [`tags`](#tags)
K
Kamil Trzciński 已提交
143
- [`cache`](#cache)
144
- [`artifacts`](#artifacts)
145
- [`retry`](#retry)
146
- [`timeout`](#timeout)
147
- [`interruptible`](#interruptible)
K
Kamil Trzciński 已提交
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163

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
```

164
#### `inherit`
165 166 167 168 169 170

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

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

171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
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
```

198 199
In the example below:

200 201 202 203
- `rubocop`:
  - **will** inherit: Nothing.
- `rspec`:
  - **will** inherit: the default `image` and the `WEBHOOK_URL` variable.
204
  - will **not** inherit: the default `before_script` and the `DOMAIN` variable.
205 206
- `capybara`:
  - **will** inherit: the default `before_script` and `image`.
207
  - will **not** inherit: the `DOMAIN` and `WEBHOOK_URL` variables.
208 209
- `karma`:
  - **will** inherit: the default `image` and `before_script`, and the `DOMAIN` variable.
210
  - will **not** inherit: `WEBHOOK_URL` variable.
211 212 213

```yaml
default:
214
  image: 'ruby:2.4'
215 216 217 218 219
  before_script:
    - echo Hello World

variables:
  DOMAIN: example.com
220
  WEBHOOK_URL: https://my-webhook.example.com
221 222

rubocop:
223 224 225
  inherit:
    default: false
    variables: false
226 227 228 229
  script: bundle exec rubocop

rspec:
  inherit:
230 231
    default: [image]
    variables: [WEBHOOK_URL]
232 233 234 235 236 237
  script: bundle exec rspec

capybara:
  inherit:
    variables: false
  script: bundle exec capybara
238 239 240 241 242 243

karma:
  inherit:
    default: true
    variables: [DOMAIN]
  script: karma
244 245
```

246
### `stages`
E
Evan Read 已提交
247

248 249
`stages` is used to define stages that can be used by jobs and is defined
globally.
E
Evan Read 已提交
250

251 252
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 已提交
253

254 255 256 257 258
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 已提交
259 260

```yaml
261 262 263 264
stages:
  - build
  - test
  - deploy
E
Evan Read 已提交
265 266
```

267 268 269 270 271 272
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.
273

274
There are also two edge cases worth mentioning:
E
Evan Read 已提交
275

276 277
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.
278
1. If a job does not specify a `stage`, the job is assigned the `test` stage.
E
Evan Read 已提交
279

280
### `workflow:rules`
E
Evan Read 已提交
281

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

284 285 286 287
The top-level `workflow:` key applies to the entirety of a pipeline, and will
determine whether or not a pipeline is created. It currently accepts a single
`rules:` key that operates similarly to [`rules:` defined within jobs](#rules),
enabling dynamic configuration of the pipeline.
288

289
The configuration options currently available for `workflow:rules` are:​
E
Evan Read 已提交
290

291 292
- [`if`](#rulesif): Define a rule.
- [`when`](#when): May be set to `always` or `never` only. If not provided, the default value is `always`​.
E
Evan Read 已提交
293

294 295
The list of `if` rules is evaluated until a single one is matched. If none
match, the last `when` will be used:
E
Evan Read 已提交
296

297 298 299 300 301 302 303 304 305
```yaml
workflow:
  rules:
    - if: $CI_COMMIT_REF_NAME =~ /-wip$/
      when: never
    - if: $CI_COMMIT_TAG
      when: never
    - when: always
```
E
Evan Read 已提交
306

307
### `include`
E
Evan Read 已提交
308

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

313 314
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.
315
It's also possible to have template files stored in a central repository and projects include their
316 317
configuration files. This helps avoid duplicated configuration, for example, global default variables for all projects.

318
`include` requires the external YAML file to have the extensions `.yml` or `.yaml`,
319
otherwise the external file won't be included.
E
Evan Read 已提交
320

321 322 323 324 325 326 327 328 329 330 331 332
`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.    |
| [`template`](#includetemplate)  | Include templates which are provided by GitLab.                   |

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
333
referenced `.gitlab-ci.yml` configuration won't be reflected in GitLab until the next pipeline is created.
334

335
The files defined in `include` are:
E
Evan Read 已提交
336

337 338 339
- 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 已提交
340

341 342 343
TIP: **Tip:**
Use merging to customize and override included CI/CD configurations with local
definitions.
E
Evan Read 已提交
344

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

350
#### `include:local`
E
Evan Read 已提交
351

352 353
`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 已提交
354

355 356 357
You can only use files that are currently tracked by Git on the same branch
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 已提交
358

359
All [nested includes](#nested-includes) will be executed in the scope of the same project,
360
so it's possible to use local, project, remote, or template includes.
E
Evan Read 已提交
361

362 363
NOTE: **Note:**
Including local files through Git submodules paths is not supported.
E
Evan Read 已提交
364

365
Example:
E
Evan Read 已提交
366

367 368 369 370
```yaml
include:
  - local: '/templates/.gitlab-ci-template.yml'
```
E
Evan Read 已提交
371

372 373 374 375 376 377 378 379 380
TIP: **Tip:**
Local includes can be used as a replacement for symbolic links which are not followed.

This can be defined as a short local include:

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

381
#### `include:file`
E
Evan Read 已提交
382

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

385 386 387
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 已提交
388

389 390 391 392 393
```yaml
include:
  - project: 'my-group/my-project'
    file: '/templates/.gitlab-ci-template.yml'
```
E
Evan Read 已提交
394

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

397 398 399 400 401
```yaml
include:
  - project: 'my-group/my-project'
    ref: master
    file: '/templates/.gitlab-ci-template.yml'
E
Evan Read 已提交
402

403 404 405
  - project: 'my-group/my-project'
    ref: v1.0.0
    file: '/templates/.gitlab-ci-template.yml'
K
Kamil Trzcinski 已提交
406

407 408 409 410
  - project: 'my-group/my-project'
    ref: 787123b47f14b552955ca2786bc9542ae66fee5b # Git SHA
    file: '/templates/.gitlab-ci-template.yml'
```
411

412
All [nested includes](#nested-includes) will be executed in the scope of the target project,
413
so it's possible to use local (relative to target project), project, remote
414
or template includes.
415

416 417 418 419 420 421 422 423 424 425 426 427 428 429 430
#### `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'
```

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

431
#### `include:template`
432

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

435 436
`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).
437

438
For example:
439

440
```yaml
441 442 443
# File sourced from GitLab's template collection
include:
  - template: Auto-DevOps.gitlab-ci.yml
444 445
```

446
Multiple `include:template` files:
D
Douwe Maan 已提交
447

448 449 450 451 452
```yaml
include:
  - template: Android-Fastlane.gitlab-ci.yml
  - template: Auto-DevOps.gitlab-ci.yml
```
453

454
All [nested includes](#nested-includes) will be executed only with the permission of the user,
455
so it's possible to use project, remote or template includes.
D
Douwe Maan 已提交
456

457
#### Nested includes
458

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

461
Nested includes allow you to compose a set of includes.
462

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

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

468
#### Additional `includes` examples
469

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

472
## Parameter details
473

474
The following are detailed explanations for parameters used to configure CI/CD pipelines.
475

476
### `image`
477

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

480
For:
481

482 483
- 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.
484

485
#### `image:name`
486

487
An [extended docker configuration option](../docker/using_docker_images.md#extended-docker-configuration-options).
488

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

491
#### `image:entrypoint`
492

493
An [extended docker configuration option](../docker/using_docker_images.md#extended-docker-configuration-options).
494

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

497
#### `services`
498

499
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).
500

501
For:
502

503 504 505
- 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).
506

507
##### `services:name`
508

509
An [extended docker configuration option](../docker/using_docker_images.md#extended-docker-configuration-options).
510

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

513
##### `services:alias`
514

515
An [extended docker configuration option](../docker/using_docker_images.md#extended-docker-configuration-options).
516

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

519
##### `services:entrypoint`
520

521
An [extended docker configuration option](../docker/using_docker_images.md#extended-docker-configuration-options).
522

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

525
##### `services:command`
526

527
An [extended docker configuration option](../docker/using_docker_images.md#extended-docker-configuration-options).
528

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

531 532 533 534
### `script`

`script` is the only required keyword that a job needs. It's a shell script
which is executed by the Runner. For example:
535 536

```yaml
537 538
job:
  script: "bundle exec rspec"
539 540
```

541 542 543
[YAML anchors for scripts](#yaml-anchors-for-script) are available.

This parameter can also contain several commands using an array:
544 545

```yaml
546 547 548 549
job:
  script:
    - uname -a
    - bundle exec rspec
550 551
```

552 553 554 555 556 557
NOTE: **Note:**
Sometimes, `script` commands will need to be wrapped in single or double quotes.
For example, commands that contain a colon (`:`) need to be wrapped in quotes so
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:
`:`, `{`, `}`, `[`, `]`, `,`, `&`, `*`, `#`, `?`, `|`, `-`, `<`, `>`, `=`, `!`, `%`, `@`, `` ` ``.
558

559
If any of the script commands return an exit code different from zero, the job
560
will fail and further commands won't be executed. This behavior can be avoided by
561
storing the exit code in a variable:
562

563 564 565 566 567 568
```yaml
job:
  script:
    - false || exit_code=$?
    - if [ $exit_code -ne 0 ]; then echo "Previous command failed"; fi;
```
569

570
#### `before_script` and `after_script`
571

572
> Introduced in GitLab 8.7 and requires GitLab Runner v1.2.
573

574 575 576
`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.
577

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

581 582
`after_script` is used to define the command that will be run after each
job, including failed ones. This must be an array.
583

584 585
Scripts specified in `after_script` are executed in a new shell, separate from any
`before_script` or `script` scripts. As a result, they:
586

587 588 589 590 591 592 593
- 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.
  - Changes outside of the working tree (depending on the Runner executor), like
    software installed by a `before_script` or `script` script.
- Have a separate timeout, which is hard coded to 5 minutes. See
  [related issue](https://gitlab.com/gitlab-org/gitlab-runner/issues/2716) for details.
594
- Don't affect the job's exit code. If the `script` section succeeds and the
595
  `after_script` times out or fails, the job will exit with code `0` (`Job Succeeded`).
596

597 598
It's possible to overwrite a globally defined `before_script` or `after_script`
if you set it per-job:
599 600

```yaml
601 602 603
default:
  before_script:
    - global before script
604

605 606 607 608 609 610 611
job:
  before_script:
    - execute this instead of global before script
  script:
    - my command
  after_script:
    - execute this after my script
612 613
```

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

616
### `stage`
617

618 619 620
`stage` is defined per-job and relies on [`stages`](#stages) which is defined
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:
621

622 623 624 625 626
```yaml
stages:
  - build
  - test
  - deploy
627

628 629 630
job 0:
  stage: .pre
  script: make something useful before build stage
631

632 633 634
job 1:
  stage: build
  script: make build dependencies
635

636 637 638
job 2:
  stage: build
  script: make build artifacts
639

640 641 642
job 3:
  stage: test
  script: make test
643

644 645 646
job 4:
  stage: deploy
  script: make deploy
647

648 649 650
job 5:
  stage: .post
  script: make something useful at the end of pipeline
651 652
```

653
#### Using your own Runners
654

655 656 657
When using 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).
658

659
Jobs will run on your own Runners in parallel only if:
660

661 662
- Run on different Runners.
- The Runner's `concurrent` setting has been changed.
663

664
#### `.pre` and `.post`
665

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

668
The following stages are available to every pipeline:
669

670 671
- `.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.
672

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

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

678
- Configured in order:
679

680 681 682 683 684 685 686
  ```yml
  stages:
    - .pre
    - a
    - b
    - .post
  ```
687

688
- Configured out of order:
689

690 691 692 693 694 695 696
  ```yml
  stages:
    - a
    - .pre
    - b
    - .post
  ```
697

698
- Not explicitly configured:
E
Evan Read 已提交
699

700 701 702 703 704
  ```yml
  stages:
    - a
    - b
  ```
705

706
NOTE: **Note:**
707
A pipeline won't be created if it only contains jobs in `.pre` or `.post` stages.
708

709
### `extends`
710

711
> Introduced in GitLab 11.3.
712

713 714
`extends` defines entry names that a job that uses `extends` is going to
inherit from.
715

716
It's an alternative to using [YAML anchors](#anchors) and is a little
717
more flexible and readable:
718

719 720 721 722 723 724 725
```yaml
.tests:
  script: rake test
  stage: test
  only:
    refs:
      - branches
726

727 728 729 730 731 732 733
rspec:
  extends: .tests
  script: rake rspec
  only:
    variables:
      - $RSPEC
```
E
Evan Read 已提交
734

735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761
In the example above, the `rspec` job inherits from the `.tests` template job.
GitLab will perform a reverse deep merge based on the keys. GitLab will:

- Merge the `rspec` contents into `.tests` recursively.
- Not merge the values of the keys.

This results in the following `rspec` job:

```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).

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

762
`extends` supports multi-level inheritance, however it's not recommended to
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 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856
use more than three levels. The maximum nesting level that is supported is 10.
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
`extends`. The algorithm used for merge is "closest scope wins", so
keys from the last member will always shadow anything defined on other
levels. For example:

```yaml
.only-important:
  only:
    - master
    - stable
  tags:
    - production

.in-docker:
  tags:
    - docker
  image: alpine

rspec:
  extends:
    - .only-important
    - .in-docker
  script:
    - rake rspec
```

This results in the following `rspec` job:

```yaml
rspec:
  only:
    - master
    - stable
  tags:
    - docker
  image: alpine
  script:
    - rake rspec
```

#### 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
```

This will run a job called `useTemplate` that runs `echo Hello!` as defined in
the `.template` job, and uses the `alpine` Docker image as defined in the local job.

### `rules`

857
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27863) in GitLab 12.3.
858 859 860

`rules` allows for a list of individual rule objects to be evaluated
*in order*, until one matches and dynamically provides attributes to the job.
861
Note that `rules` can't be used in combination with `only/except` since it's intended
862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890
to replace that functionality. If you attempt to do this the linter will return a
`key may not be used with rules` error.

Available rule clauses include:

- [`if`](#rulesif) (similar to [`only:variables`](#onlyvariablesexceptvariables))
- [`changes`](#ruleschanges) (same as [`only:changes`](#onlychangesexceptchanges))
- [`exists`](#rulesexists)

For example, using `if`. This configuration specifies that `job` should be built
and run for every pipeline on merge requests targeting `master`, regardless of
the status of other builds:

```yaml
job:
  script: "echo Hello, Rules!"
  rules:
    - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"'
      when: always
    - if: '$VAR =~ /pattern/'
      when: manual
    - when: on_success
```

In this example, if the first rule:

- Matches, the job will be given the `when:always` attribute.
- Does not match, the second and third rules will be evaluated sequentially
  until a match is found. That is, the job will be given either the:
891
  - `when: manual` attribute if the second rule matches. **The stage won't complete until this manual job is triggered and completes successfully.**
892 893 894 895 896 897 898 899
  - `when: on_success` attribute if the second rule does not match. The third
    rule will always match when reached because it has no conditional clauses.

#### `rules:if`

`rules:if` differs slightly from `only:variables` by accepting only a single
expression string, rather than an array of them. Any set of expressions to be
evaluated should be conjoined into a single expression using `&&` or `||`, and use
900
the [variable matching syntax](../variables/README.md#syntax-of-environment-variable-expressions).
901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926

For example:

```yaml
job:
  script: "echo Hello, Rules!"
  rules:
    - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/ && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"' # This rule will be evaluated
      when: always
    - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/' # This rule will only be evaluated if the target branch is not "master"
      when: manual
    - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME' # If neither of the first two match but the simple presence does, we set to "on_success" by default
```

If none of the provided rules match, the job will be set to `when:never`, and
not included in the pipeline. If `rules:when` is not included in the configuration
at all, the behavior defaults to `job:when`, which continues to default to
`on_success`.

#### `rules:changes`

`rules: changes` works exactly the same way as `only: changes` and `except: changes`,
accepting an array of paths. Similarly, it will always return true if there is no
Git push event. See [`only/except: changes`](#onlychangesexceptchanges) for more information.

For example:
927 928 929 930 931 932 933 934 935 936 937 938 939

```yaml
docker build:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  rules:
    - changes: # Will include the job and set to when:manual if any of the follow paths match a modified file.
      - Dockerfile
      when: manual
    - if: '$VAR == "string value"'
      when: manual # Will include the job and set to when:manual if the expression evaluates to true, after the `changes:` rule fails to match.
    - when: on_success # If neither of the first rules match, set to on_success
```

E
Evan Read 已提交
940 941 942 943 944
In this example, a job either set to:

- Run manually if `Dockerfile` has changed OR `$VAR == "string value"`.
- `when:on_success` by the last rule, where no earlier clauses evaluate to true.

945 946
#### `rules:exists`

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

949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978
`exists` accepts an array of paths and will match if any of these paths exist
as files in the repository.

For example:

```yaml
job:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  rules:
    - exists:
      - Dockerfile
```

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:
      - spec/**.rb
```

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

979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997
#### `rules:allow_failure`

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

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.

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

In this example, if the first rule matches, then the job will have `when: manual` and `allow_failure: true`.

998 999 1000 1001 1002 1003 1004
#### Exclude jobs with `rules:` from certain pipelines

Jobs with `rules:` can cause two pipelines to be created unexpectedly:

- One pipeline from pushing a commit to a branch.
- A second ["detached" pipeline for a merge request](../merge_request_pipelines/index.md).

1005
`only` and `except` jobs don't trigger merge request pipelines by default, but this
1006 1007 1008
is not the case for jobs with `rules:`, which may be surprising if migrating from `only`
and `except` to `rules:`.

1009
If you're using `rules:` and you see two pipelines for commits to branches that have
1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038
a merge request, you have two options:

- Individually exclude each job that uses `rules:` from merge request pipelines. The
  example below will cause the job to **not** run in *pipelines for merge requests*,
  but it **will** run in pipelines for *new tags and pipelines running on branch refs*:

  ```yaml
  job:
    rules:
      - if: $CI_MERGE_REQUEST_ID
        when: never
      - when: manual
    script:
      - echo hello
  ```

- Add a global [`workflow: rules`](#workflowrules) to allow pipelines in only certain
  situations. The example below will only run pipelines for merge requests, new tags and
  changes to master. It will **not** run any pipelines *on any branch except master*, but
  it will run **detached merge request pipelines** for any merge request, targeting any branch:

  ```yaml
  workflow:
    rules:
      - if: $CI_MERGE_REQUEST_ID
      - if: $CI_COMMIT_TAG
      - if: $CI_COMMIT_BRANCH == "master"
  ```

E
Evan Read 已提交
1039
#### Complex rule clauses
1040

1041 1042
To conjoin `if`, `changes`, and `exists` clauses with an AND, use them in the
same rule.
E
Evan Read 已提交
1043 1044 1045 1046 1047

In the following example:

- We run the job manually if `Dockerfile` or any file in `docker/scripts/`
  has changed AND `$VAR == "string value"`.
1048
- Otherwise, the job won't be included in the pipeline.
1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061

```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.
      - Dockerfile
      - docker/scripts/*
      when: manual
  # - when: never would be redundant here, this is implied any time rules are listed.
```

E
Evan Read 已提交
1062 1063 1064 1065
The only clauses currently available are:

- `if`
- `changes`
1066
- `exists`
E
Evan Read 已提交
1067 1068 1069 1070

Keywords such as `branches` or `refs` that are currently available for
`only`/`except` are not yet available in `rules` as they are being individually
considered for their usage and behavior in this context.
1071 1072 1073

#### Permitted attributes

E
Evan Read 已提交
1074 1075 1076 1077
The only job attributes currently set by `rules` are:

- `when`.
- `start_in`, if `when` is set to `delayed`.
1078
- `allow_failure`.
E
Evan Read 已提交
1079 1080 1081

A job will be included in a pipeline if `when` is evaluated to any value
except `never`.
1082

E
Evan Read 已提交
1083 1084
Delayed jobs require a `start_in` value, so rule objects do as well. For
example:
1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096

```yaml
docker build:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  rules:
    - changes: # Will include the job and delay 3 hours when the Dockerfile has changed
      - Dockerfile
      when: delayed
      start_in: '3 hours'
    - when: on_success # Otherwise include the job and set to run normally
```

E
Evan Read 已提交
1097
Additional job configuration may be added to rules in the future. If something
1098
useful is not available, please
1099
[open an issue](https://gitlab.com/gitlab-org/gitlab/issues).
1100

1101
### `only`/`except` (basic)
1102

1103
NOTE: **Note:**
1104 1105 1106
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.
1107

1108 1109
`only` and `except` are two parameters that set a job policy to limit when
jobs are created:
1110

1111 1112 1113
1. `only` defines the names of branches and tags for which the job will run.
1. `except` defines the names of branches and tags for which the job will
    **not** run.
1114

1115
There are a few rules that apply to the usage of job policy:
1116

1117 1118 1119 1120 1121
- `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 已提交
1122

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

1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138
| **Value** |  **Description**  |
| --------- |  ---------------- |
| `branches`       | When a Git reference of a pipeline is a branch.  |
| `tags`           | When a Git reference of a pipeline is a tag.  |
| `api`            | When pipeline has been triggered by a second pipelines API (not triggers API).  |
| `external`       | When using CI services other than GitLab. |
| `pipelines`      | For multi-project triggers, created using the API with `CI_JOB_TOKEN`. |
| `pushes`         | Pipeline is triggered by a `git push` by the user. |
| `schedules`      | For [scheduled pipelines](../pipelines/schedules.md). |
| `triggers`       | For pipelines created using a trigger token. |
| `web`            | For pipelines created using **Run pipeline** button in GitLab UI (under your project's **Pipelines**). |
| `merge_requests` | When a merge request is created or updated (See [pipelines for merge requests](../merge_request_pipelines/index.md)). |
| `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)). |
| `chat`          | For jobs created using a [GitLab ChatOps](../chatops/README.md) command. |
1139

1140 1141
In the example below, `job` will run only for refs that start with `issue-`,
whereas all branches will be skipped:
1142 1143

```yaml
D
Douwe Maan 已提交
1144
job:
1145 1146 1147 1148 1149 1150 1151
  # use regexp
  only:
    - /^issue-.*$/
  # use special keyword
  except:
    - branches
```
D
Douwe Maan 已提交
1152

1153 1154
Pattern matching is case-sensitive by default. Use `i` flag modifier, like
`/pattern/i` to make a pattern case-insensitive:
1155 1156

```yaml
1157 1158 1159 1160 1161 1162 1163
job:
  # use regexp
  only:
    - /^issue-.*$/i
  # use special keyword
  except:
    - branches
1164 1165
```

1166 1167
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):
1168 1169

```yaml
1170 1171 1172 1173 1174 1175
job:
  # use special keywords
  only:
    - tags
    - triggers
    - schedules
1176 1177
```

1178 1179
The repository path can be used to have jobs executed only for the parent
repository and not forks:
1180 1181

```yaml
1182 1183 1184 1185 1186 1187
job:
  only:
    - branches@gitlab-org/gitlab
  except:
    - master@gitlab-org/gitlab
    - /^release/.*$/@gitlab-org/gitlab
1188 1189
```

1190 1191
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 已提交
1192

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

1196
For example,
W
Winnie Hellmann 已提交
1197

1198 1199 1200 1201
```yaml
job:
  script: echo 'test'
```
W
Winnie Hellmann 已提交
1202

1203
is translated to:
W
Winnie Hellmann 已提交
1204 1205

```yaml
1206 1207 1208
job:
  script: echo 'test'
  only: ['branches', 'tags']
W
Winnie Hellmann 已提交
1209 1210
```

1211
#### Regular expressions
W
Winnie Hellmann 已提交
1212

1213 1214 1215
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 已提交
1216

1217 1218
Only the tag or branch name can be matched by a regular expression.
The repository path, if given, is always matched literally.
1219

1220 1221 1222 1223 1224 1225
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-`.
1226

1227 1228 1229 1230 1231
TIP: **Tip**
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`.
1232

1233
#### Supported `only`/`except` regexp syntax
1234

1235 1236
CAUTION: **Warning:**
This is a breaking change that was introduced with GitLab 11.9.4.
1237

1238 1239
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).
1240

1241 1242 1243 1244
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.
1245

1246 1247 1248
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.
1249

1250 1251 1252
```ruby
Feature.enable(:allow_unsafe_ruby_regexp)
```
1253

1254
### `only`/`except` (advanced)
1255

1256
CAUTION: **Warning:**
1257
This is an _alpha_ feature, and is subject to change at any time without
1258
prior notice!
1259

1260 1261
GitLab supports both simple and complex strategies, so it's possible to use an
array and a hash configuration scheme.
1262

1263
Four keys are available:
1264

1265 1266 1267 1268
- `refs`
- `variables`
- `changes`
- `kubernetes`
1269

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

1273 1274
- `only:` means "include this job if all of the conditions match".
- `except:` means "exclude this job if any of the conditions match".
1275

1276
With `only`, individual keys are logically joined by an AND:
1277

1278 1279 1280
> (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:
1281

1282 1283 1284
- 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.
1285

1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296
```yaml
test:
  script: npm run test
  only:
    refs:
      - master
      - schedules
    variables:
      - $CI_COMMIT_MESSAGE =~ /run-end-to-end-tests/
    kubernetes: active
```
1297

1298
`except` is implemented as a negation of this complete expression:
1299

1300
> NOT((any of refs) AND (any of variables) AND (any of changes) AND (if Kubernetes is active))
1301

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

1304
> (any of refs) OR (any of variables) OR (any of changes) OR (if Kubernetes is active)
1305

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

1308
- The pipeline runs for the `master`.
1309
- There are changes to the `README.md` file in the root directory of the repository.
1310 1311

```yaml
1312 1313 1314 1315 1316 1317 1318
test:
  script: npm run test
  except:
    refs:
      - master
    changes:
      - "README.md"
1319 1320
```

1321
#### `only:refs`/`except:refs`
1322

1323
> `refs` policy introduced in GitLab 10.0.
1324

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

1328 1329
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:
1330

1331 1332 1333 1334 1335 1336 1337
```yaml
deploy:
  only:
    refs:
      - master
      - schedules
```
1338

1339
#### `only:kubernetes`/`except:kubernetes`
1340

1341
> `kubernetes` policy introduced in GitLab 10.0.
1342

1343
The `kubernetes` strategy accepts only the `active` keyword.
1344

1345 1346
In the example below, the `deploy` job is going to be created only when the
Kubernetes service is active in the project:
1347 1348

```yaml
1349 1350 1351
deploy:
  only:
    kubernetes: active
1352 1353
```

1354
#### `only:variables`/`except:variables`
1355

1356
> `variables` policy introduced in GitLab 10.7.
1357

1358 1359 1360 1361
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.
1362

1363
Examples of using variables expressions:
1364

1365 1366 1367 1368 1369 1370 1371 1372 1373 1374
```yaml
deploy:
  script: cap staging deploy
  only:
    refs:
      - branches
    variables:
      - $RELEASE == "staging"
      - $STAGING
```
1375

1376
Another use case is excluding jobs depending on a commit message:
1377 1378

```yaml
1379 1380 1381 1382 1383
end-to-end:
  script: rake test:end-to-end
  except:
    variables:
      - $CI_COMMIT_MESSAGE =~ /skip-end-to-end-tests/
1384 1385
```

1386
Learn more about [variables expressions](../variables/README.md#environment-variables-expressions).
1387

1388
#### `only:changes`/`except:changes`
1389

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

1392 1393
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.
1394

1395
This means the `only:changes` policy is useful for pipelines where:
1396

1397 1398 1399 1400 1401 1402
- `$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
[sources other than the three above](../variables/predefined_variables.md#variables-reference),
1403
`changes` can't determine if a given file is new or old, and will always
1404 1405 1406
return true.

A basic example of using `only: changes`:
1407 1408

```yaml
1409 1410 1411 1412 1413 1414 1415 1416
docker build:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  only:
    changes:
      - Dockerfile
      - docker/scripts/*
      - dockerfiles/**/*
      - more_scripts/*.{rb,py,sh}
1417 1418
```

1419 1420 1421
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:
1422

1423 1424 1425 1426
- 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.
1427

1428 1429
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),
1430
undesired behavior could result if you don't [also use `only:merge_requests`](#using-onlychanges-with-pipelines-for-merge-requests).
1431

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

1436 1437 1438 1439 1440 1441 1442 1443
```yaml
test:
  script: npm run test
  only:
    changes:
      - "*.json"
      - "**/*.sql"
```
1444

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

1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462
```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).
1463

1464
##### Using `only:changes` with pipelines for merge requests
1465

1466
With [pipelines for merge requests](../merge_request_pipelines/index.md),
1467
it's possible to define a job to be created based on files modified
1468
in a merge request.
1469

1470 1471 1472 1473
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.
1474

1475
For example:
1476 1477

```yaml
1478 1479 1480 1481 1482 1483 1484 1485
docker build service one:
  script: docker build -t my-service-one-image:$CI_COMMIT_REF_SLUG .
  only:
    refs:
      - merge_requests
    changes:
      - Dockerfile
      - service-one/**/*
1486 1487
```

1488 1489 1490
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.
1491

1492 1493 1494
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.
1495

1496 1497 1498 1499 1500 1501 1502 1503 1504
For example:

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

1507 1508
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,
1509
but includes changes to the `Dockerfile`, and this pipeline could pass because it's only
1510 1511 1512
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.
1513

1514 1515
With this configuration, care must be taken to check that the most recent pipeline
properly corrected any failures from previous pipelines.
1516

1517
##### Using `only:changes` without pipelines for merge requests
1518

1519 1520 1521 1522
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.
In this case, a previous SHA is used to calculate the diff, which equivalent to `git diff HEAD~`.
This could result in some unexpected behavior, including:
1523

1524 1525 1526
- 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.
1527

1528
##### Using `only:changes` with scheduled pipelines
1529

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

1534
### `needs`
1535

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

1540 1541 1542 1543 1544 1545 1546
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:
1547 1548

```yaml
1549 1550
linux:build:
  stage: build
1551

1552 1553
mac:build:
  stage: build
1554

1555 1556 1557
lint:
  stage: test
  needs: []
1558

1559 1560 1561
linux:rspec:
  stage: test
  needs: ["linux:build"]
1562

1563 1564 1565
linux:rubocop:
  stage: test
  needs: ["linux:build"]
1566

1567 1568 1569
mac:rspec:
  stage: test
  needs: ["mac:build"]
1570

1571 1572 1573
mac:rubocop:
  stage: test
  needs: ["mac:build"]
1574

1575 1576 1577
production:
  stage: deploy
```
1578

1579
This example creates four paths of execution:
1580

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

1583 1584
- 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.
1585

1586 1587
- 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.
1588

1589 1590 1591
- 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`.
1592

1593
#### Requirements and limitations
1594

1595 1596 1597
- 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.
1598
- The maximum number of jobs that a single job can need in the `needs:` array is limited:
1599 1600 1601 1602 1603 1604 1605 1606
  - For GitLab.com, the limit is ten. For more information, see our
    [infrastructure issue](https://gitlab.com/gitlab-com/gl-infra/infrastructure/issues/7541).
  - For self-managed instances, the limit is:
    - 10, if the `ci_dag_limit_needs` feature flag is enabled (default).
    - 50, if the `ci_dag_limit_needs` feature flag is disabled.
- 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,
1607
  meaning it's impossible to create circular dependencies. Depending on jobs in the
1608 1609 1610
  current stage is not possible either, but support [is planned](https://gitlab.com/gitlab-org/gitlab/issues/30632).
- Related to the above, stages must be explicitly defined for all jobs
  that have the keyword `needs:` or are referred to by one.
1611

1612
##### Changing the `needs:` job limit
1613

1614 1615 1616 1617
The maximum number of jobs that can be defined within `needs:` defaults to 10, but
can be changed to 50 via a feature flag. To change the limit to 50,
[start a Rails console session](../../administration/troubleshooting/debug.md#starting-a-rails-console-session)
and run:
1618

1619 1620
```ruby
Feature::disable(:ci_dag_limit_needs)
1621 1622
```

1623
To set it back to 10, run the opposite command:
1624

1625 1626
```ruby
Feature::enable(:ci_dag_limit_needs)
1627 1628
```

1629
#### Artifact downloads with `needs`
1630

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

1633 1634
When using `needs`, artifact downloads are controlled with `artifacts: true` or `artifacts: false`.
The `dependencies` keyword should not be used with `needs`, as this is deprecated since GitLab 12.6.
1635

1636
In the example below, the `rspec` job will download the `build_job` artifacts, while the
1637
`rubocop` job won't:
1638

1639
```yaml
1640 1641 1642
build_job:
  stage: build
  artifacts:
1643
    paths:
1644
      - binaries/
1645

1646 1647
rspec:
  stage: test
1648 1649 1650
  needs:
    - job: build_job
      artifacts: true
1651

1652 1653 1654 1655 1656 1657
rubocop:
  stage: test
  needs:
    - job: build_job
      artifacts: false
```
1658

1659 1660 1661
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 已提交
1662

1663 1664 1665 1666 1667 1668 1669 1670
```yaml
rspec:
  needs:
    - job: build_job_1
      artifacts: true
    - job: build_job_2
    - build_job_3
```
1671

1672
#### Cross project artifact downloads with `needs` **(PREMIUM)**
1673

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

1676 1677 1678
`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),
or pipelines in different projects:
1679

1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690
```yaml
build_job:
  stage: build
  script:
    - ls -lhR
  needs:
    - project: group/project-name
      job: build-1
      ref: master
      artifacts: true
```
1691

1692 1693
`build_job` will download the artifacts from the latest successful `build-1` job
on the `master` branch in the `group/project-name` project.
1694

1695
##### Artifact downloads between pipelines in the same project
1696

1697 1698 1699 1700
`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 已提交
1701

1702
```yaml
1703 1704 1705 1706 1707 1708 1709 1710 1711
build_job:
  stage: build
  script:
    - ls -lhR
  needs:
    - project: group/same-project-name
      job: build-1
      ref: other-ref
      artifacts: true
1712
```
K
Kamil Trzcinski 已提交
1713

1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726
NOTE: **Note:**
Downloading artifacts from jobs that are run in [`parallel:`](#parallel) is not supported.

### `tags`

`tags` is used to select specific Runners from the list of all Runners that are
allowed to run this project.

During the registration of a Runner, you can specify the Runner's tags, for
example `ruby`, `postgres`, `development`.

`tags` allow you to run jobs with Runners that have the specified tags
assigned to them:
1727 1728 1729

```yaml
job:
1730 1731 1732
  tags:
    - ruby
    - postgres
1733 1734
```

1735 1736
The specification above, will make sure that `job` is built by a Runner that
has both `ruby` AND `postgres` tags defined.
1737

1738 1739 1740
Tags are also a great way to run different jobs on different platforms, for
example, given an OS X Runner with tag `osx` and Windows Runner with tag
`windows`, the following jobs run on respective platforms:
1741 1742

```yaml
1743 1744 1745 1746 1747
windows job:
  stage:
    - build
  tags:
    - windows
1748
  script:
1749
    - echo Hello, %USERNAME%!
1750

1751 1752 1753 1754 1755
osx job:
  stage:
    - build
  tags:
    - osx
1756
  script:
1757
    - echo "Hello, $USER!"
1758 1759
```

1760
### `allow_failure`
1761

1762 1763 1764 1765 1766
`allow_failure` allows a job to fail without impacting the rest of the CI
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.
1767

1768 1769 1770
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.
1771

1772 1773 1774
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.
1775

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

1780 1781 1782 1783 1784 1785
```yaml
job1:
  stage: test
  script:
    - execute_script_that_will_fail
  allow_failure: true
1786

1787 1788 1789 1790 1791 1792 1793 1794 1795
job2:
  stage: test
  script:
    - execute_script_that_will_succeed

job3:
  stage: deploy
  script:
    - deploy_to_staging
1796 1797
```

1798
### `when`
1799

1800 1801
`when` is used to implement jobs that are run in case of failure or despite the
failure.
1802

1803
`when` can be set to one of the following values:
1804

1805 1806 1807 1808 1809 1810 1811 1812 1813 1814
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.
1815

1816
For example:
1817

1818 1819 1820 1821 1822 1823 1824
```yaml
stages:
  - build
  - cleanup_build
  - test
  - deploy
  - cleanup
1825

1826 1827 1828 1829
build_job:
  stage: build
  script:
    - make build
1830

1831 1832 1833 1834 1835
cleanup_build_job:
  stage: cleanup_build
  script:
    - cleanup build when failed
  when: on_failure
1836

1837 1838 1839 1840
test_job:
  stage: test
  script:
    - make test
1841

1842 1843 1844 1845 1846
deploy_job:
  stage: deploy
  script:
    - make deploy
  when: manual
1847

1848 1849 1850 1851 1852
cleanup_job:
  stage: cleanup
  script:
    - cleanup after jobs
  when: always
1853 1854
```

1855
The above script will:
1856

1857 1858 1859 1860
1. Execute `cleanup_build_job` only when `build_job` fails.
1. Always execute `cleanup_job` as the last step in pipeline regardless of
   success or failure.
1. Allow you to manually execute `deploy_job` from GitLab's UI.
1861

1862
#### `when:manual`
1863

1864 1865 1866
> - Introduced in GitLab 8.10.
> - Blocking manual actions were introduced in GitLab 9.0.
> - Protected actions were introduced in GitLab 9.2.
1867

1868 1869 1870 1871 1872
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
[environments documentation](../environments.md#configuring-manual-deployments).
1873

1874 1875 1876 1877
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.
1878

1879
When a pipeline is blocked, it won't be merged if Merge When Pipeline Succeeds
1880 1881
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
1882
default. If you want to make manual action blocking, it's necessary to add
1883
`allow_failure: false` to the job's definition in `.gitlab-ci.yml`.
A
Achilleas Pipinellis 已提交
1884

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

1889 1890
NOTE: **Note:**
When using [`rules:`](#rules), `allow_failure` defaults to `false`, including for manual jobs.
1891

1892 1893 1894 1895
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
1896
have the ability to merge to this branch. It's possible to use protected environments
1897 1898
to more strictly [protect manual deployments](#protecting-manual-jobs-premium) from being
run by unauthorized users.
1899

1900 1901 1902 1903
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.
1904

1905
##### Protecting manual jobs **(PREMIUM)**
1906

1907 1908
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
1909
users associated with a protected environment to trigger manual jobs, it's possible
1910
to implement some special use cases, such as:
1911

1912 1913
- More precisely limiting who can deploy to an environment.
- Enabling a pipeline to be blocked until an approved user "approves" it.
1914

1915
To do this, you must:
1916

1917
1. Add an `environment` to the job. For example:
1918

1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930
   ```yaml
   deploy_prod:
     stage: deploy
     script:
       - echo "Deploy to production server"
     environment:
       name: production
       url: https://example.com
     when: manual
     only:
       - master
   ```
1931

1932 1933 1934 1935 1936
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.
1937

1938
Additionally, if a manual job is defined as blocking by adding `allow_failure: false`,
1939
the next stages of the pipeline won't run until the manual job is triggered. This
1940 1941
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.
1942

1943
#### `when:delayed`
1944

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

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

1950 1951
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:
1952

1953 1954 1955 1956 1957
- `'5'`
- `10 seconds`
- `30 minutes`
- `1 day`
- `1 week`
1958

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

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

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

1967 1968 1969 1970 1971 1972 1973
```yaml
timed rollout 10%:
  stage: deploy
  script: echo 'Rolling out 10% ...'
  when: delayed
  start_in: 30 minutes
```
1974

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

1978 1979
You can start a delayed job immediately by clicking the **Play** button.
GitLab Runner will pick your job soon and start the job.
1980

1981
### `environment`
1982

1983 1984 1985
> - Introduced in GitLab 8.9.
> - You can read more about environments and find more examples in the
>   [documentation about environments](../environments.md).
1986

1987 1988 1989 1990 1991
`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:
1992 1993

```yaml
1994 1995 1996 1997
deploy to production:
  stage: deploy
  script: git push production HEAD:master
  environment: production
1998 1999
```

2000 2001
In the above example, the `deploy to production` job will be marked as doing a
deployment to the `production` environment.
2002

2003
#### `environment:name`
2004

2005 2006 2007 2008 2009 2010
> - 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).
2011
>   You however can't use variables defined under `script`.
B
Ben Bodenmiller 已提交
2012

2013
The `environment` name can contain:
2014

2015 2016 2017 2018 2019 2020 2021 2022 2023
- letters
- digits
- spaces
- `-`
- `_`
- `/`
- `$`
- `{`
- `}`
2024

2025 2026
Common names are `qa`, `staging`, and `production`, but you can use whatever
name works with your workflow.
2027

2028
Instead of defining the name of the environment right after the `environment`
2029
keyword, it's also possible to define it as a separate value. For that, use
2030
the `name` keyword under `environment`:
2031 2032

```yaml
2033 2034 2035 2036 2037
deploy to production:
  stage: deploy
  script: git push production HEAD:master
  environment:
    name: production
2038 2039
```

2040
#### `environment:url`
2041

2042 2043 2044 2045 2046
> - 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).
2047
>   You however can't use variables defined under `script`.
2048

2049 2050
This is an optional value that when set, it exposes buttons in various places
in GitLab which when clicked take you to the defined URL.
2051

2052 2053 2054
In the example below, if the job finishes successfully, it will create buttons
in the merge requests and in the environments/deployments pages which will point
to `https://prod.example.com`.
2055

2056 2057 2058 2059 2060 2061 2062 2063
```yaml
deploy to production:
  stage: deploy
  script: git push production HEAD:master
  environment:
    name: production
    url: https://prod.example.com
```
2064

2065
#### `environment:on_stop`
2066

2067
> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/22191) in GitLab 8.13.
2068 2069 2070
> - 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.
2071

2072 2073 2074
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.
2075

2076
Read the `environment:action` section for an example.
2077

2078
#### `environment:action`
O
Olivier Gonzalez 已提交
2079

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

2082 2083
The `action` keyword is to be used in conjunction with `on_stop` and is defined
in the job that is called to close the environment.
O
Olivier Gonzalez 已提交
2084

2085
Take for instance:
O
Olivier Gonzalez 已提交
2086

2087 2088 2089 2090 2091 2092 2093
```yaml
review_app:
  stage: deploy
  script: make deploy-app
  environment:
    name: review
    on_stop: stop_review_app
O
Olivier Gonzalez 已提交
2094

2095 2096 2097 2098 2099 2100 2101 2102 2103 2104
stop_review_app:
  stage: deploy
  variables:
    GIT_STRATEGY: none
  script: make delete-app
  when: manual
  environment:
    name: review
    action: stop
```
O
Olivier Gonzalez 已提交
2105

2106 2107 2108 2109 2110 2111
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 已提交
2112

2113 2114 2115
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`
job is [automatically triggered](../environments.md#automatically-stopping-an-environment).
O
Olivier Gonzalez 已提交
2116

2117 2118 2119 2120
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 已提交
2121

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

2124 2125 2126 2127 2128
- `when` - [reference](#when)
- `environment:name`
- `environment:action`
- `stage` should be the same as the `review_app` in order for the environment
  to stop automatically when the branch is deleted
O
Olivier Gonzalez 已提交
2129

2130
#### `environment:auto_stop_in`
O
Olivier Gonzalez 已提交
2131

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

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

2137
For example,
O
Olivier Gonzalez 已提交
2138

2139 2140 2141 2142 2143 2144 2145
```yaml
review_app:
  script: deploy-review-app
  environment:
    name: review/$CI_COMMIT_REF_NAME
    auto_stop_in: 1 day
```
O
Olivier Gonzalez 已提交
2146

2147 2148
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 已提交
2149

2150 2151
For more information, see
[the environments auto-stop documentation](../environments.md#environments-auto-stop)
O
Olivier Gonzalez 已提交
2152

2153
#### `environment:kubernetes`
O
Olivier Gonzalez 已提交
2154

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

2157 2158
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 已提交
2159

2160
For example:
2161

2162 2163 2164 2165 2166 2167 2168 2169 2170
```yaml
deploy:
  stage: deploy
  script: make deploy-app
  environment:
    name: production
    kubernetes:
      namespace: production
```
O
Olivier Gonzalez 已提交
2171

2172 2173 2174
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 已提交
2175

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

2179 2180 2181 2182 2183
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
[relevant issue](https://gitlab.com/gitlab-org/gitlab/issues/38054).
2184

2185
#### Dynamic environments
2186

2187 2188
> - [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.
2189 2190
> - The `name` and `url` parameters can use any of the defined CI variables,
>   including predefined, secure variables and `.gitlab-ci.yml` [`variables`](#variables).
2191
>   You however can't use variables defined under `script`.
2192

2193
For example:
2194

2195 2196 2197 2198 2199 2200 2201 2202
```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 已提交
2203

2204 2205 2206 2207 2208 2209 2210
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`
is an [environment variable](../variables/README.md) set by the Runner. The
`$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 已提交
2211

2212 2213
This of course implies that the underlying server which hosts the application
is properly configured.
O
Olivier Gonzalez 已提交
2214

2215 2216 2217
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 已提交
2218

2219
### `cache`
M
Marcel Amirault 已提交
2220

2221 2222 2223 2224 2225
> - 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).
2226

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

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

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

2238
#### `cache:paths`
2239

2240
Use the `paths` directive to choose which files or directories will be cached. Paths
2241
are relative to the project directory (`$CI_PROJECT_DIR`) and can't directly link outside it.
2242
Wildcards can be used that follow the [glob](https://en.wikipedia.org/wiki/Glob_(programming))
2243 2244 2245 2246 2247 2248
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).
2249

2250
Cache all files in `binaries` that end in `.apk` and the `.config` file:
2251

2252 2253 2254 2255 2256 2257 2258 2259
```yaml
rspec:
  script: test
  cache:
    paths:
      - binaries/*.apk
      - .config
```
2260

2261 2262
Locally defined cache overrides globally defined options. The following `rspec`
job will cache only `binaries/`:
2263

2264
```yaml
2265 2266 2267
cache:
  paths:
    - my/files
2268

2269 2270 2271 2272
rspec:
  script: test
  cache:
    key: rspec
2273
    paths:
P
pityonline 已提交
2274
      - binaries/
2275
```
2276

2277 2278 2279
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.
2280

2281
#### `cache:key`
2282

2283
> Introduced in GitLab Runner v1.0.0.
2284

2285 2286 2287
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.
2288

2289 2290 2291 2292
The `key` directive allows you to define the affinity of caching between jobs,
allowing to have a single cache for all jobs, cache per-job, cache per-branch
or any other way that fits your workflow. This way, you can fine tune caching,
allowing you to cache data between different jobs or even different branches.
S
Shinya Maeda 已提交
2293

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

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

2303
For example, to enable per-branch caching:
2304

2305 2306 2307 2308 2309 2310
```yaml
cache:
  key: "$CI_COMMIT_REF_SLUG"
  paths:
    - binaries/
```
2311

2312 2313
If you use **Windows Batch** to run your shell scripts you need to replace
`$` with `%`:
2314 2315

```yaml
2316 2317 2318 2319 2320
cache:
  key: "%CI_COMMIT_REF_SLUG%"
  paths:
    - binaries/
```
2321

2322
##### `cache:key:files`
2323

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

2326 2327 2328
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.
2329

2330 2331 2332 2333
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`.
2334

2335 2336 2337 2338 2339 2340 2341 2342 2343 2344
```yaml
cache:
  key:
    files:
      - Gemfile.lock
      - package.json
  paths:
    - vendor/ruby
    - node_modules
```
2345

2346
In this example we're creating a cache for Ruby and Node.js dependencies that
2347 2348 2349 2350
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.
2351

2352
##### `cache:key:prefix`
2353

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

2356 2357 2358 2359 2360
The `prefix` parameter adds extra functionality to `key:files` by allowing the key to
be composed of the given `prefix` combined with the SHA computed for `cache:key:files`.
For example, adding a `prefix` of `test`, will cause keys to look like: `test-feef9576d21ee9b6a32e30c5c79d0a0ceb68d1e5`.
If neither file was changed in any commits, the prefix is added to `default`, so the
key in the example would be `test-default`.
2361

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

2365 2366
- the `/` character (or the equivalent URI-encoded `%2F`)
- a value made only of `.` (or the equivalent URI-encoded `%2E`)
2367

2368 2369 2370 2371 2372 2373 2374 2375
```yaml
cache:
  key:
    files:
      - Gemfile.lock
    prefix: ${CI_JOB_NAME}
  paths:
    - vendor/ruby
2376

2377 2378 2379 2380
rspec:
  script:
    - bundle exec rspec
```
2381

2382 2383 2384 2385 2386 2387 2388
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`.
2389

2390
#### `cache:untracked`
2391

2392 2393
Set `untracked: true` to cache all files that are untracked in your Git
repository:
2394

2395 2396 2397 2398 2399
```yaml
rspec:
  script: test
  cache:
    untracked: true
2400 2401
```

2402
Cache all Git untracked files and files in `binaries`:
2403

2404 2405 2406 2407 2408 2409 2410
```yaml
rspec:
  script: test
  cache:
    untracked: true
    paths:
      - binaries/
2411 2412
```

2413
#### `cache:policy`
2414

2415
> Introduced in GitLab 9.4.
2416

2417
The default behavior of a caching job is to download the files at the start of
2418 2419 2420
execution, and to re-upload them at the end. This allows any changes made by the
job to be persisted for future runs, and is known as the `pull-push` cache
policy.
2421

2422
If you know the job does not alter the cached files, you can skip the upload step
2423 2424 2425
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:
2426 2427

```yaml
2428 2429 2430 2431 2432 2433 2434 2435
stages:
  - setup
  - test

prepare:
  stage: setup
  cache:
    key: gems
2436
    paths:
2437 2438 2439
      - vendor/bundle
  script:
    - bundle install --deployment
2440 2441 2442

rspec:
  stage: test
2443 2444 2445 2446 2447 2448 2449
  cache:
    key: gems
    paths:
      - vendor/bundle
    policy: pull
  script:
    - bundle exec rspec ...
2450 2451
```

2452 2453 2454
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.
2455

2456 2457 2458
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.
2459

2460
### `artifacts`
2461

2462 2463 2464 2465 2466
> - 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.
2467

2468 2469
`artifacts` is used to specify a list of files and directories which should be
attached to the job when it [succeeds, fails, or always](#artifactswhen).
2470

2471 2472
The artifacts will be sent to GitLab after the job finishes and will
be available for download in the GitLab UI.
2473

2474
[Read more about artifacts](../pipelines/job_artifacts.md).
2475

2476
#### `artifacts:paths`
2477

2478
Paths are relative to the project directory (`$CI_PROJECT_DIR`) and can't directly
2479 2480 2481 2482 2483 2484
link outside it. 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).

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

Send all files in `binaries` and `.config`:
2485 2486

```yaml
2487 2488 2489 2490
artifacts:
  paths:
    - binaries/
    - .config
2491 2492
```

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

2495 2496 2497 2498 2499 2500
```yaml
job:
  stage: build
  script: make build
  dependencies: []
```
2501

2502 2503
You may want to create artifacts only for tagged releases to avoid filling the
build server storage with temporary build artifacts.
2504

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

2507 2508 2509 2510 2511 2512
```yaml
default-job:
  script:
    - mvn test -U
  except:
    - tags
2513

2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524
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`:
2525 2526

```yaml
2527 2528 2529 2530
job:
  artifacts:
    paths:
      - path/*xyz/*
2531 2532
```

2533
#### `artifacts:expose_as`
2534

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

2537 2538
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.
2539

2540
For example, to match a single file:
2541

2542 2543 2544 2545 2546 2547 2548
```yml
test:
  script: [ 'echo 1' ]
  artifacts:
    expose_as: 'artifact 1'
    paths: ['path/to/file.txt']
```
2549

2550 2551
With this configuration, GitLab will add a link **artifact 1** to the relevant merge request
that points to `file1.txt`.
2552

2553 2554 2555
An example that will match an entire directory:

```yml
2556
test:
2557 2558 2559 2560
  script: [ 'echo 1' ]
  artifacts:
    expose_as: 'artifact 1'
    paths: ['path/to/directory/']
2561 2562
```

2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585
Note the following:

- 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.

The `name` directive allows you to define the name of the created artifacts
archive. That way, you can have a unique name for every archive which could be
useful when you'd like to download the archive from GitLab. The `artifacts:name`
variable can make use of any of the [predefined variables](../variables/README.md).
The default name is `artifacts`, which becomes `artifacts.zip` when downloaded.

NOTE: **Note:**
If your branch-name contains forward slashes
2586
(for example `feature/my-feature`) it's advised to use `$CI_COMMIT_REF_SLUG`
2587 2588 2589
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 已提交
2590

2591 2592 2593 2594 2595 2596 2597
```yaml
job:
  artifacts:
    name: "$CI_JOB_NAME"
    paths:
      - binaries/
```
2598

2599 2600
To create an archive with a name of the current branch or tag including only
the binaries directory:
2601 2602

```yaml
2603 2604 2605 2606 2607
job:
  artifacts:
    name: "$CI_COMMIT_REF_NAME"
    paths:
      - binaries/
2608 2609
```

2610 2611
To create an archive with a name of the current job and the current branch or
tag including only the binaries directory:
2612 2613

```yaml
2614 2615 2616 2617 2618
job:
  artifacts:
    name: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME"
    paths:
      - binaries/
2619 2620
```

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

2623 2624 2625 2626 2627 2628 2629
```yaml
job:
  artifacts:
    name: "$CI_JOB_STAGE-$CI_COMMIT_REF_NAME"
    paths:
      - binaries/
```
2630

2631
---
2632

2633 2634
If you use **Windows Batch** to run your shell scripts you need to replace
`$` with `%`:
2635

2636 2637 2638 2639 2640 2641 2642
```yaml
job:
  artifacts:
    name: "%CI_JOB_STAGE%-%CI_COMMIT_REF_NAME%"
    paths:
      - binaries/
```
2643

2644 2645
If you use **Windows PowerShell** to run your shell scripts you need to replace
`$` with `$env:`:
2646 2647

```yaml
2648 2649 2650 2651 2652
job:
  artifacts:
    name: "$env:CI_JOB_STAGE-$env:CI_COMMIT_REF_NAME"
    paths:
      - binaries/
2653 2654
```

2655
#### `artifacts:untracked`
M
Matija Čupić 已提交
2656

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

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

2663
Send all Git untracked files:
M
Matija Čupić 已提交
2664

2665 2666 2667 2668
```yaml
artifacts:
  untracked: true
```
M
Matija Čupić 已提交
2669

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

2672
```yaml
2673 2674 2675 2676
artifacts:
  untracked: true
  paths:
    - binaries/
M
Matija Čupić 已提交
2677
```
2678

2679
#### `artifacts:when`
2680

2681
> Introduced in GitLab 8.9 and GitLab Runner v1.3.0.
2682

2683 2684
`artifacts:when` is used to upload artifacts on job failure or despite the
failure.
2685

2686
`artifacts:when` can be set to one of the following values:
2687

2688 2689 2690
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.
2691

2692
To upload artifacts only when job fails:
2693

2694 2695 2696 2697 2698
```yaml
job:
  artifacts:
    when: on_failure
```
2699

2700
#### `artifacts:expire_in`
E
Evan Read 已提交
2701

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

2704 2705 2706 2707 2708
`expire_in` allows you to specify how long artifacts should live before they
expire and are therefore deleted, counting from the time they are uploaded and
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)
(30 days by default, forever on GitLab.com).
E
Evan Read 已提交
2709

2710 2711
You can use the **Keep** button on the job page to override expiration and
keep artifacts forever.
2712

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

2716
The value of `expire_in` is an elapsed time in seconds, unless a unit is
2717
provided. Examples of valid values:
2718

2719 2720 2721 2722 2723 2724 2725
- `42`
- `3 mins 4 sec`
- `2 hrs 20 min`
- `2h20min`
- `6 mos 1 day`
- `47 yrs 6 mos and 4d`
- `3 weeks and 2 days`
E
Evan Read 已提交
2726

2727
To expire artifacts 1 week after being uploaded:
E
Evan Read 已提交
2728 2729

```yaml
2730 2731 2732
job:
  artifacts:
    expire_in: 1 week
E
Evan Read 已提交
2733 2734
```

2735 2736 2737 2738
NOTE: **Note:**
For artifacts created in [GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/issues/16267)
and later, the latest artifact for a ref is always kept, regardless of the expiry time.

2739
#### `artifacts:reports`
E
Evan Read 已提交
2740

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

2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761
These are the available report types:

| Parameter                                                                                                                            | Description |
|--------------------------------------------------------------------------------------------------------------------------------------|-------------|
| [`artifacts:reports:junit`](../pipelines/job_artifacts.md#artifactsreportsjunit)                                                     | The `junit` report collects JUnit XML files.                                     |
| [`artifacts:reports:dotenv`](../pipelines/job_artifacts.md#artifactsreportsdotenv)                                                   | The `dotenv` report collects a set of environment variables.                     |
| [`artifacts:reports:cobertura`](../pipelines/job_artifacts.md#artifactsreportscobertura)                                             | The `cobertura` report collects Cobertura coverage XML files.                    |
| [`artifacts:reports:terraform`](../pipelines/job_artifacts.md#artifactsreportsterraform)                                             | The `terraform` report collects Terraform `tfplan.json` files.                   |
| [`artifacts:reports:codequality`](../pipelines/job_artifacts.md#artifactsreportscodequality-starter) **(STARTER)**                   | The `codequality` report collects CodeQuality issues.                            |
| [`artifacts:reports:sast`](../pipelines/job_artifacts.md#artifactsreportssast-ultimate) **(ULTIMATE)**                               | The `sast` report collects Static Application Security Testing vulnerabilities.  |
| [`artifacts:reports:dependency_scanning`](../pipelines/job_artifacts.md#artifactsreportsdependency_scanning-ultimate) **(ULTIMATE)** | The `dependency_scanning` report collects Dependency Scanning vulnerabilities.   |
| [`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. |
| [`artifacts:reports:license_management`](../pipelines/job_artifacts.md#artifactsreportslicense_management-ultimate) **(ULTIMATE)**   | The `license_management` report collects Licenses (*deprecated*).                |
| [`artifacts:reports:license_scanning`](../pipelines/job_artifacts.md#artifactsreportslicense_scanning-ultimate) **(ULTIMATE)**       | The `license_scanning` report collects Licenses.                                 |
| [`artifacts:reports:performance`](../pipelines/job_artifacts.md#artifactsreportsperformance-premium) **(PREMIUM)**                   | The `performance` report collects Performance metrics.                           |
| [`artifacts:reports:metrics`](../pipelines/job_artifacts.md#artifactsreportsmetrics-premium) **(PREMIUM)**                           | The `metrics` report collects Metrics.                                           |
E
Evan Read 已提交
2762

2763
#### `dependencies`
2764

2765
> Introduced in GitLab 8.6 and GitLab Runner v1.1.1.
2766

2767 2768 2769
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.
2770

2771 2772 2773 2774 2775 2776
To use this feature, define `dependencies` in context of the job and pass
a list of all previous jobs from which the artifacts should be downloaded.
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
2777
if it failed or it's a manual job that was not run, no error occurs.
2778

2779 2780 2781 2782
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`.
2783

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

2787
```yaml
2788 2789 2790 2791 2792 2793
build:osx:
  stage: build
  script: make build:osx
  artifacts:
    paths:
      - binaries/
K
Kamil Trzciński 已提交
2794

2795 2796 2797 2798 2799 2800
build:linux:
  stage: build
  script: make build:linux
  artifacts:
    paths:
      - binaries/
2801

2802 2803 2804 2805 2806
test:osx:
  stage: test
  script: make test:osx
  dependencies:
    - build:osx
2807

2808 2809 2810 2811 2812
test:linux:
  stage: test
  script: make test:linux
  dependencies:
    - build:linux
2813

2814 2815 2816
deploy:
  stage: deploy
  script: make deploy
2817 2818
```

2819
##### When a dependent job will fail
K
Kamil Trzciński 已提交
2820

2821
> Introduced in GitLab 10.3.
2822

2823 2824 2825 2826
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.
2827

2828 2829 2830 2831
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 已提交
2832

2833
### `coverage`
2834

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

2837 2838
`coverage` allows you to configure how code coverage will be extracted from the
job output.
2839

2840 2841 2842 2843
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.
2844

2845
A simple example:
K
Kamil Trzciński 已提交
2846

2847
```yaml
2848 2849 2850
job1:
  script: rspec
  coverage: '/Code coverage: \d+\.\d+/'
K
Kamil Trzciński 已提交
2851 2852
```

2853
### `retry`
2854

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

2858 2859
`retry` allows you to configure how many times a job is going to be retried in
case of a failure.
2860

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

2864 2865 2866 2867 2868
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:
2869

2870
```yaml
2871 2872 2873
test:
  script: rspec
  retry: 2
2874
```
2875

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

2879 2880
- `max`: The maximum number of retries.
- `when`: The failure cases to retry.
2881

2882
To retry only runner system failures at maximum two times:
2883

2884 2885 2886 2887 2888 2889 2890
```yaml
test:
  script: rspec
  retry:
    max: 2
    when: runner_system_failure
```
2891

2892 2893
If there is another failure, other than a runner system failure, the job will
not be retried.
2894

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

2897 2898 2899 2900 2901 2902 2903 2904 2905
```yaml
test:
  script: rspec
  retry:
    max: 2
    when:
      - runner_system_failure
      - stuck_or_timeout_failure
```
K
Kamil Trzciński 已提交
2906

2907
Possible values for `when` are:
K
Kamil Trzciński 已提交
2908

2909 2910 2911 2912
<!--
  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
2913
  values are really valid as a configuration option and therefore should always
2914 2915
  stay in sync with this documentation.
 -->
2916

2917 2918 2919 2920 2921
- `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.
2922
- `runner_system_failure`: Retry if there was a runner system failure (for example, job setup failed).
2923 2924 2925 2926
- `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.
2927
- `archived_failure`: Retry if the job is archived and can't be run.
2928 2929 2930
- `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.
2931

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

2934
### `timeout`
2935

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

2938
`timeout` allows you to configure a timeout for a specific job. For example:
2939

2940
```yaml
2941 2942 2943 2944 2945 2946 2947
build:
  script: build.sh
  timeout: 3 hours 30 minutes

test:
  script: rspec
  timeout: 3h 30m
2948 2949
```

2950
The job-level timeout can exceed the
2951
[project-level timeout](../pipelines/settings.md#timeout) but can't
2952
exceed the Runner-specific timeout.
2953

2954
### `parallel`
2955

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

2958 2959
`parallel` allows you to configure how many instances of a job to run in
parallel. This value has to be greater than or equal to two (2) and less than or equal to 50.
2960

2961
This creates N instances of the same job that run in parallel. They are named
2962
sequentially from `job_name 1/N` to `job_name N/N`.
2963

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

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

2969
```yaml
2970 2971 2972
test:
  script: rspec
  parallel: 5
2973
```
2974

2975 2976 2977
TIP: **Tip:**
Parallelize tests suites across parallel jobs.
Different languages have different tools to facilitate this.
K
Kamil Trzciński 已提交
2978

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

2981 2982 2983
```ruby
# Gemfile
source 'https://rubygems.org'
K
Kamil Trzciński 已提交
2984

2985 2986 2987
gem 'rspec'
gem 'semaphore_test_boosters'
```
2988

2989
```yaml
2990 2991
test:
  parallel: 3
2992
  script:
2993 2994
    - bundle
    - bundle exec rspec_booster --job $CI_NODE_INDEX/$CI_NODE_TOTAL
2995
```
2996

2997 2998
CAUTION: **Caution:**
Please be aware that semaphore_test_boosters reports usages statistics to the author.
2999

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

3003
### `trigger`
3004

3005 3006
> - [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.
3007

3008 3009 3010
`trigger` allows you to define downstream pipeline trigger. When a job created
from `trigger` definition is started by GitLab, a downstream pipeline gets
created.
3011

3012
This keyword allows the creation of two different types of downstream pipelines:
3013

3014 3015
- [Multi-project pipelines](../multi_project_pipelines.md#creating-multi-project-pipelines-from-gitlab-ciyml)
- [Child pipelines](../parent_child_pipelines.md)
3016

3017 3018 3019 3020
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.
3021

3022
#### Simple `trigger` syntax for multi-project pipelines
3023

3024 3025
The simplest way to configure a downstream trigger is to use `trigger` keyword
with a full path to a downstream project:
3026

3027 3028 3029 3030
```yaml
rspec:
  stage: test
  script: bundle exec rspec
3031

3032 3033 3034 3035
staging:
  stage: deploy
  trigger: my/deployment
```
3036

3037
#### Complex `trigger` syntax for multi-project pipelines
3038

3039
It's possible to configure a branch name that GitLab will use to create
3040
a downstream pipeline with:
3041

3042
```yaml
3043 3044 3045 3046 3047 3048 3049 3050 3051
rspec:
  stage: test
  script: bundle exec rspec

staging:
  stage: deploy
  trigger:
    project: my/deployment
    branch: stable
3052 3053
```

3054
It's possible to mirror the status from a triggered pipeline:
3055

3056
```yaml
3057 3058 3059 3060 3061
trigger_job:
  trigger:
    project: my/project
    strategy: depend
```
3062

3063
It's possible to mirror the status from an upstream pipeline:
3064

3065 3066 3067 3068 3069
```yaml
upstream_bridge:
  stage: test
  needs:
    pipeline: other/project
3070 3071
```

3072
#### `trigger` syntax for child pipeline
3073

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

3076 3077
To create a [child pipeline](../parent_child_pipelines.md), specify the path to the
YAML file containing the CI config of the child pipeline:
3078 3079

```yaml
3080 3081 3082
trigger_job:
  trigger:
    include: path/to/child-pipeline.yml
3083 3084
```

3085
Similar to [multi-project pipelines](../multi_project_pipelines.md#mirroring-status-from-triggered-pipeline),
3086
it's possible to mirror the status from a triggered pipeline:
3087 3088

```yaml
3089 3090 3091 3092 3093
trigger_job:
  trigger:
    include:
      - local: path/to/child-pipeline.yml
    strategy: depend
3094 3095
```

3096
##### Trigger child pipeline with generated configuration file
3097

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

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

```yaml
3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115
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
3116 3117
```

3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129
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.
3130 3131

```yaml
3132 3133 3134 3135
trigger_job:
  trigger:
    include: path/to/child-pipeline.yml
    strategy: depend
3136 3137
```

3138 3139 3140
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.
3141

3142
#### Trigger a pipeline by API call
3143

3144 3145
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.
3146

3147
Not to be confused with the [`trigger`](#trigger) parameter.
3148

3149
[Read more in the triggers documentation.](../triggers/README.md)
3150

3151
### `interruptible`
3152

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

3155 3156 3157
`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.
3158

3159
When enabled, a pipeline on the same branch will be canceled when:
3160

3161 3162
- it's made redundant by a newer pipeline run.
- Either all jobs are set as interruptible, or any uninterruptible jobs haven't started.
3163

3164
Pending jobs are always considered interruptible.
3165

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

3169
Here is a simple example:
3170 3171

```yaml
3172 3173 3174 3175
stages:
  - stage1
  - stage2
  - stage3
3176

3177 3178 3179 3180 3181
step-1:
  stage: stage1
  script:
    - echo "Can be canceled."
  interruptible: true
3182

3183 3184 3185 3186
step-2:
  stage: stage2
  script:
    - echo "Can not be canceled."
3187

3188 3189 3190 3191 3192
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
3193 3194
```

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

3197 3198
- Canceled, if only `step-1` is running or pending.
- Not canceled, once `step-2` starts running.
W
Wolphin 已提交
3199

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

3203
### `resource_group`
W
Wolphin 已提交
3204

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

3207 3208
Sometimes running multiples jobs or pipelines at the same time in an environment
can lead to errors during the deployment.
W
Wolphin 已提交
3209

3210
To avoid these errors, the `resource_group` attribute can be used to ensure that
3211
the Runner won't run certain jobs simultaneously.
3212

3213 3214 3215 3216 3217
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,
only one of the jobs will be picked by the Runner, and the other jobs will wait until the
`resource_group` is free.
3218

3219
Here is a simple example:
3220 3221

```yaml
3222 3223 3224
deploy-to-production:
  script: deploy
  resource_group: production
3225 3226
```

3227
In this case, if a `deploy-to-production` job is running in a pipeline, and a new
3228
`deploy-to-production` job is created in a different pipeline, it won't run until
3229 3230
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.
3231

3232 3233 3234
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.
3235

3236
NOTE: **Note:**
3237 3238
This key can only contain letters, digits, `-`, `_`, `/`, `$`, `{`, `}`, `.`, and spaces.
It can't start or end with `/`.
3239

E
Evan Read 已提交
3240
### `pages`
3241 3242 3243 3244 3245 3246 3247 3248 3249

`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
3250
`public/` directory. The `.public` workaround is so `cp` does not also copy
3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267
`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).
3268

3269
## `variables`
3270 3271 3272 3273 3274

> Introduced in GitLab Runner v0.5.0.

NOTE: **Note:**
Integers (as well as strings) are legal both for variable's name and value.
3275
Floats are not legal and can't be used.
3276 3277 3278

GitLab CI/CD allows you to define variables inside `.gitlab-ci.yml` that are
then passed in the job environment. They can be set globally and per-job.
3279 3280
When the `variables` keyword is used on a job level, it will override the global
YAML variables and predefined ones of the same name.
3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294

They are stored in the Git repository and are meant to store non-sensitive
project configuration, for example:

```yaml
variables:
  DATABASE_URL: "postgres://postgres@postgres/my_database"
```

These variables can be later used in all executed commands and scripts.
The YAML-defined variables are also set to all created service containers,
thus allowing to fine tune them.

Except for the user defined variables, there are also the ones [set up by the
E
Evan Read 已提交
3295
Runner itself](../variables/README.md#predefined-environment-variables).
3296 3297 3298
One example would be `CI_COMMIT_REF_NAME` which has the value of
the branch or tag name for which project is built. Apart from the variables
you can set in `.gitlab-ci.yml`, there are also the so called
3299
[Variables](../variables/README.md#gitlab-cicd-environment-variables)
3300 3301
which can be set in GitLab's UI.

3302
[YAML anchors for variables](#yaml-anchors-for-variables) are available.
3303

3304
Learn more about [variables and their priority](../variables/README.md).
3305

3306
### Git strategy
M
Mark Pundsack 已提交
3307

3308 3309 3310 3311 3312
> - 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 已提交
3313 3314

You can set the `GIT_STRATEGY` used for getting recent application code, either
3315 3316
globally or per-job in the [`variables`](#variables) section. If left
unspecified, the default from project settings will be used.
M
Mark Pundsack 已提交
3317

N
Nick Thomas 已提交
3318 3319 3320
There are three possible values: `clone`, `fetch`, and `none`.

`clone` is the slowest option. It clones the repository from scratch for every
3321
job, ensuring that the local working copy is always pristine.
M
Mark Pundsack 已提交
3322

3323
```yaml
M
Mark Pundsack 已提交
3324 3325 3326 3327
variables:
  GIT_STRATEGY: clone
```

3328
`fetch` is faster as it re-uses the local working copy (falling back to `clone`
3329
if it does not exist). `git clean` is used to undo any changes made by the last
N
Nick Thomas 已提交
3330
job, and `git fetch` is used to retrieve commits made since the last job ran.
M
Mark Pundsack 已提交
3331

3332
```yaml
M
Mark Pundsack 已提交
3333 3334 3335 3336
variables:
  GIT_STRATEGY: fetch
```

3337
`none` also re-uses the local working copy, but skips all Git operations
3338 3339 3340
(including GitLab Runner's pre-clone script, if present). It's mostly useful
for jobs that operate exclusively on artifacts (for examples `deploy`). Git repository
data may be present, but it's certain to be out of date, so you should only
3341
rely on files brought into the local working copy from cache or artifacts.
N
Nick Thomas 已提交
3342

3343
```yaml
N
Nick Thomas 已提交
3344 3345 3346 3347
variables:
  GIT_STRATEGY: none
```

3348
NOTE: **Note:** `GIT_STRATEGY` is not supported for
E
Evan Read 已提交
3349 3350
[Kubernetes executor](https://docs.gitlab.com/runner/executors/kubernetes.html),
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)
3351 3352
for updates.

3353
### Git submodule strategy
3354 3355 3356 3357

> Requires GitLab Runner v1.10+.

The `GIT_SUBMODULE_STRATEGY` variable is used to control if / how Git
3358 3359
submodules are included when fetching the code before a build. You can set them
globally or per-job in the [`variables`](#variables) section.
3360

3361
There are three possible values: `none`, `normal`, and `recursive`:
3362

3363
- `none` means that submodules won't be included when fetching the project
3364 3365
  code. This is the default, which matches the pre-v1.10 behavior.

3366
- `normal` means that only the top-level submodules will be included. It's
3367
  equivalent to:
3368

3369
  ```shell
M
Marcel Amirault 已提交
3370 3371 3372
  git submodule sync
  git submodule update --init
  ```
3373 3374

- `recursive` means that all submodules (including submodules of submodules)
3375 3376
  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
3377
  meets that requirement. It's equivalent to:
3378

3379
  ```shell
M
Marcel Amirault 已提交
3380 3381 3382
  git submodule sync --recursive
  git submodule update --init --recursive
  ```
3383 3384 3385

Note that for this feature to work correctly, the submodules must be configured
(in `.gitmodules`) with either:
3386

3387 3388 3389 3390
- 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.

3391
### Git checkout
3392

E
Evan Read 已提交
3393
> Introduced in GitLab Runner 9.3.
3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415

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.

If set to `false`, the Runner will:

- 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`
strategies the Runner will checkout the working copy to a revision related
to the CI pipeline:

```yaml
variables:
  GIT_STRATEGY: clone
  GIT_CHECKOUT: "false"
script:
3416 3417 3418 3419
  - git checkout -B master origin/master
  - git merge $CI_COMMIT_SHA
```

3420
### Git clean flags
3421 3422 3423 3424 3425 3426 3427

> 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.

3428
`GIT_CLEAN_FLAGS` accepts all possible options of the [`git clean`](https://git-scm.com/docs/git-clean)
3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444
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/
3445
```
3446

3447
### Job stages attempts
3448 3449 3450

> Introduced in GitLab, it requires GitLab Runner v1.9+.

3451
You can set the number for attempts the running job will try to execute each
3452 3453
of the following stages:

3454 3455 3456 3457 3458 3459
| Variable                          | Description                                                                                                                                                                                                                                                                                                        |
|-----------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **GET_SOURCES_ATTEMPTS**          | Number of attempts to fetch sources running a job                                                                                                                                                                                                                                                                  |
| **ARTIFACT_DOWNLOAD_ATTEMPTS**    | Number of attempts to download artifacts running a job                                                                                                                                                                                                                                                             |
| **RESTORE_CACHE_ATTEMPTS**        | Number of attempts to restore the cache running a job                                                                                                                                                                                                                                                              |
| **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). |
3460 3461 3462 3463 3464

The default is one single attempt.

Example:

3465
```yaml
3466
variables:
3467
  GET_SOURCES_ATTEMPTS: 3
3468 3469
```

3470
You can set them globally or per-job in the [`variables`](#variables) section.
3471

3472
### Shallow cloning
M
Mark Pundsack 已提交
3473

3474 3475 3476 3477
> Introduced in GitLab 8.9 as an experimental feature.

CAUTION: **Caution:**
May change in future releases or be removed completely.
M
Mark Pundsack 已提交
3478 3479

You can specify the depth of fetching and cloning using `GIT_DEPTH`. This allows
M
Mark Pundsack 已提交
3480 3481 3482
shallow cloning of the repository which can significantly speed up cloning for
repositories with a large number of commits or old, large binaries. The value is
passed to `git fetch` and `git clone`.
M
Mark Pundsack 已提交
3483

E
Evan Read 已提交
3484
NOTE: **Note:**
3485 3486
If you use a depth of 1 and have a queue of jobs or retry
jobs, jobs may fail.
M
Mark Pundsack 已提交
3487

3488 3489
Since Git fetching and cloning is based on a ref, such as a branch name, Runners
can't clone a specific commit SHA. If there are multiple jobs in the queue, or
3490
you're retrying an old job, the commit to be tested needs to be within the
3491
Git history that is cloned. Setting too small a value for `GIT_DEPTH` can make
M
Mark Pundsack 已提交
3492
it impossible to run these old commits. You will see `unresolved reference` in
3493
job logs. You should then reconsider changing `GIT_DEPTH` to a higher value.
M
Mark Pundsack 已提交
3494

3495 3496
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 已提交
3497 3498

To fetch or clone only the last 3 commits:
3499 3500

```yaml
M
Mark Pundsack 已提交
3501
variables:
M
Mark Pundsack 已提交
3502
  GIT_DEPTH: "3"
M
Mark Pundsack 已提交
3503 3504
```

3505 3506
You can set it globally or per-job in the [`variables`](#variables) section.

3507
### Custom build directories
3508

3509
> [Introduced](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/2211) in GitLab Runner 11.10
3510 3511 3512 3513 3514 3515

NOTE: **Note:**
This can only be used when `custom_build_dir` is enabled in the [Runner's
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 已提交
3516 3517 3518
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
A
Anthony Mastrean 已提交
3519 3520
the `GIT_CLONE_PATH` variable to tell the Runner in which directory to clone the
repository:
3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534

```yml
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.

3535
#### Handling concurrency
3536 3537 3538 3539

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.
3540
GitLab Runner does not try to prevent this situation. It's up to the administrator
3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572
and developers to comply with the requirements of Runner configuration.

To avoid this scenario, you can use a unique path within `$CI_BUILDS_DIR`, because Runner
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:

```yml
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:

```yml
variables:
  GIT_CLONE_PATH: $CI_BUILDS_DIR/$CI_CONCURRENT_ID/$CI_PROJECT_PATH

test:
  script:
    - pwd
```

3573
#### Nested paths
3574 3575

The value of `GIT_CLONE_PATH` is expanded once and nesting variables
3576
within is not supported.
3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588

For example, you define both the variables below in your
`.gitlab-ci.yml` file:

```yml
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
3589
because `$CI_BUILDS_DIR` is not expanded.
3590

3591 3592 3593 3594 3595 3596 3597 3598
## Special YAML features

It's possible to use special YAML features like anchors (`&`), aliases (`*`)
and map merging (`<<`), which will allow you to greatly reduce the complexity
of `.gitlab-ci.yml`.

Read more about the various [YAML features](https://learnxinyminutes.com/docs/yaml/).

3599 3600
### Anchors

3601
> Introduced in GitLab 8.6 and GitLab Runner v1.1.1.
3602

3603
YAML has a handy feature called 'anchors', which lets you easily duplicate
3604
content across your document. Anchors can be used to duplicate/inherit
3605
properties, and is a perfect example to be used with [hidden keys](#hide-jobs)
3606 3607 3608 3609 3610
to provide templates for your jobs.

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:
3611 3612

```yaml
3613
.job_template: &job_definition  # Hidden key that defines an anchor named 'job_definition'
3614
  image: ruby:2.6
3615 3616 3617 3618 3619
  services:
    - postgres
    - redis

test1:
3620
  <<: *job_definition           # Merge the contents of the 'job_definition' alias
3621
  script:
3622
    - test1 project
3623 3624

test2:
3625
  <<: *job_definition           # Merge the contents of the 'job_definition' alias
3626
  script:
3627 3628 3629 3630 3631 3632 3633 3634 3635
    - 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:
3636
  image: ruby:2.6
3637 3638 3639 3640 3641
  services:
    - postgres
    - redis

test1:
3642
  image: ruby:2.6
3643 3644 3645 3646 3647 3648 3649
  services:
    - postgres
    - redis
  script:
    - test1 project

test2:
3650
  image: ruby:2.6
3651 3652 3653 3654 3655
  services:
    - postgres
    - redis
  script:
    - test2 project
3656 3657
```

3658 3659 3660 3661
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:
3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672

```yaml
.job_template: &job_definition
  script:
    - test project

.postgres_services:
  services: &postgres_definition
    - postgres
    - ruby

3673
.mysql_services:
3674 3675 3676 3677 3678
  services: &mysql_definition
    - mysql
    - ruby

test:postgres:
A
Achilleas Pipinellis 已提交
3679
  <<: *job_definition
3680 3681 3682
  services: *postgres_definition

test:mysql:
A
Achilleas Pipinellis 已提交
3683
  <<: *job_definition
3684 3685 3686
  services: *mysql_definition
```

3687
The expanded version looks like this:
3688

3689 3690 3691 3692
```yaml
.job_template:
  script:
    - test project
3693

3694 3695 3696 3697
.postgres_services:
  services:
    - postgres
    - ruby
3698

3699 3700 3701 3702 3703 3704
.mysql_services:
  services:
    - mysql
    - ruby

test:postgres:
3705
  script:
3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716
    - test project
  services:
    - postgres
    - ruby

test:mysql:
  script:
    - test project
  services:
    - mysql
    - ruby
3717 3718
```

3719
You can see that the hidden keys are conveniently used as templates.
3720

3721 3722 3723 3724
NOTE: **Note:**
You can't use YAML anchors across multiple files when leveraging the [`include`](#include)
feature. Anchors are only valid within the file they were defined in.

3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793
#### YAML anchors for `before_script` and `after_script`

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

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
- echo 'something before'

.something_after: &something_after
- echo 'something after'


job_name:
  before_script:
    - *something_before
  script:
    - echo 'this is the script'
  after_script:
    - *something_after
```

#### YAML anchors for `script`

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

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
- echo 'something'

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

# 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
```

3794
### Hide jobs
3795

3796 3797 3798 3799
> 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 已提交
3800

3801 3802 3803 3804 3805
```yaml
#hidden_job:
#  script:
#    - run test
```
3806

3807
you can instead start its name with a dot (`.`) and it won't be processed by
3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826
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
[special YAML features](#special-yaml-features) and transform the hidden keys
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.
3827

3828 3829 3830 3831 3832 3833 3834 3835 3836
## Processing Git pushes

GitLab will create at most 4 branch and tags pipelines when
doing pushing multiple changes in single `git push` invocation.

This limitation does not affect any of the updated Merge Request pipelines,
all updated Merge Requests will have a pipeline created when using
[pipelines for merge requests](../merge_request_pipelines/index.md).

3837
## Deprecated parameters
3838

3839
The following parameters are deprecated.
3840

3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872
### 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/
```
3873

M
Marcia Ramos 已提交
3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884
<!-- ## 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. -->