README.md 16.6 KB
Newer Older
D
Douwe Maan 已提交
1 2
# Configuration of your builds with .gitlab-ci.yml

3 4 5 6 7 8 9
From version 7.12, GitLab CI uses a [YAML](https://en.wikipedia.org/wiki/YAML)
file (`.gitlab-ci.yml`) for the project configuration. It is placed in the root
of your repository and contains definitions of how your project should be built.

The YAML file defines a set of jobs with constraints stating when they should
be run. The jobs are defined as top-level elements with a name and always have
to contain the `script` clause:
D
Douwe Maan 已提交
10 11 12 13 14 15 16 17 18

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

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

19 20 21 22 23
The above example is the simplest possible CI configuration with two separate
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 已提交
24

25 26 27 28
Jobs are used to create builds, which are then 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 已提交
29 30

## .gitlab-ci.yml
31 32 33

The YAML syntax allows for using more complex job specifications than in the
above example:
D
Douwe Maan 已提交
34 35

```yaml
J
James Lopez 已提交
36
image: ruby:2.1
D
Douwe Maan 已提交
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
services:
  - postgres

before_script:
  - bundle_install

stages:
  - build
  - test
  - deploy

job1:
  stage: build
  script:
    - execute-script-for-job1
  only:
    - master
  tags:
    - docker
```

58
There are a few reserved `keywords` that **cannot** be used as job names:
D
Douwe Maan 已提交
59

60
| Keyword       | Required | Description |
D
Douwe Maan 已提交
61
|---------------|----------|-------------|
62 63 64 65 66 67 68
| image         | no | Use docker image, covered in [Use Docker](../docker/README.md) |
| services      | no | Use docker services, covered in [Use Docker](../docker/README.md) |
| stages        | no | Define build stages |
| types         | no | Alias for `stages` |
| before_script | no | Define commands that run before each job's script |
| variables     | no | Define build variables |
| cache         | no | Define list of files that should be cached between subsequent runs |
D
Douwe Maan 已提交
69 70

### image and services
71 72 73 74

This allows to specify a custom Docker image and a list of services that can be
used for time of the build. The configuration of this feature is covered in
separate document: [Use Docker](../docker/README.md).
D
Douwe Maan 已提交
75 76

### before_script
77 78 79

`before_script` is used to define the command that should be run before all
builds, including deploy builds. This can be an array or a multi-line string.
D
Douwe Maan 已提交
80 81

### stages
82

D
Douwe Maan 已提交
83 84 85 86 87 88 89 90 91
`stages` is used to define build stages that can be used by jobs.
The specification of `stages` allows for having flexible multi stage pipelines.

The ordering of elements in `stages` defines the ordering of builds' execution:

1. Builds of the same stage are run in parallel.
1. Builds of next stage are run after success.

Let's consider the following example, which defines 3 stages:
92 93

```yaml
D
Douwe Maan 已提交
94 95 96 97 98 99 100 101 102 103
stages:
  - build
  - test
  - deploy
```

1. First all jobs of `build` are executed in parallel.
1. If all jobs of `build` succeeds, the `test` jobs are executed in parallel.
1. If all jobs of `test` succeeds, the `deploy` jobs are executed in parallel.
1. If all jobs of `deploy` succeeds, the commit is marked as `success`.
104 105
1. If any of the previous jobs fails, the commit is marked as `failed` and no
   jobs of further stage are executed.
D
Douwe Maan 已提交
106 107 108

There are also two edge cases worth mentioning:

109 110
1. If no `stages` is defined in `.gitlab-ci.yml`, then by default the `build`,
   `test` and `deploy` are allowed to be used as job's stage by default.
D
Douwe Maan 已提交
111 112 113
2. If a job doesn't specify `stage`, the job is assigned the `test` stage.

### types
114

D
Douwe Maan 已提交
115 116 117 118
Alias for [stages](#stages).

### variables

119 120
>**Note:**
Introduced in GitLab Runner v0.5.0.
121 122 123 124

GitLab CI allows you to add to `.gitlab-ci.yml` variables that are set in build
environment. The variables are stored in the git repository and are meant to
store non-sensitive project configuration, for example:
D
Douwe Maan 已提交
125 126 127 128 129 130 131 132

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

These variables can be later used in all executed commands and scripts.

133 134
The YAML-defined variables are also set to all created service containers,
thus allowing to fine tune them.
D
Douwe Maan 已提交
135

136 137
### cache

138
`cache` is used to specify a list of files and directories which should be
139 140 141
cached between builds.

**By default the caching is enabled per-job and per-branch.**
142 143 144

If `cache` is defined outside the scope of the jobs, it means it is set
globally and all jobs will use its definition.
145 146

To cache all git untracked files and files in `binaries`:
147 148

```yaml
149 150 151 152 153 154
cache:
  untracked: true
  paths:
  - binaries/
```

155 156
#### cache:key

157 158
>**Note:**
Introduced in GitLab Runner v1.0.0.
159 160 161 162 163

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 you deem proper.

164 165
This allows you to fine tune caching, allowing you to cache data between
different jobs or even different branches.
166

167 168 169 170 171
The `cache:key` variable can use any of the [predefined variables](../variables/README.md).

---

**Example configurations**
172 173 174

To enable per-job caching:

175 176 177 178 179
```yaml
cache:
  key: "$CI_BUILD_NAME"
  untracked: true
```
180 181 182

To enable per-branch caching:

183 184 185 186 187
```yaml
cache:
  key: "$CI_BUILD_REF_NAME"
  untracked: true
```
188 189 190

To enable per-job and per-branch caching:

191 192 193 194 195
```yaml
cache:
  key: "$CI_BUILD_NAME/$CI_BUILD_REF_NAME"
  untracked: true
```
196 197 198

To enable per-branch and per-stage caching:

199 200 201 202 203
```yaml
cache:
  key: "$CI_BUILD_STAGE/$CI_BUILD_REF_NAME"
  untracked: true
```
204

205 206
If you use **Windows Batch** to run your shell scripts you need to replace
`$` with `%`:
207

208 209 210 211 212
```yaml
cache:
  key: "%CI_BUILD_STAGE%/%CI_BUILD_REF_NAME%"
  untracked: true
```
213

D
Douwe Maan 已提交
214
## Jobs
215 216 217 218

`.gitlab-ci.yml` allows you to specify an unlimited number of jobs. Each job
must have a unique name, which is not one of the Keywords mentioned above.
A job is defined by a list of parameters that define the build behavior.
D
Douwe Maan 已提交
219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235

```yaml
job_name:
  script:
    - rake spec
    - coverage
  stage: test
  only:
    - master
  except:
    - develop
  tags:
    - ruby
    - postgres
  allow_failure: true
```

236
| Keyword       | Required | Description |
D
Douwe Maan 已提交
237
|---------------|----------|-------------|
238 239 240 241 242 243 244 245
| script        | yes | Defines a shell script which is executed by runner |
| stage         | no (default: `test`) | Defines a build stage |
| type          | no | Alias for `stage` |
| only          | no | Defines a list of git refs for which build is created |
| except        | no | Defines a list of git refs for which build is not created |
| tags          | no | Defines a list of tags which are used to select runner |
| allow_failure | no | Allow build to fail. Failed build doesn't contribute to commit status |
| when          | no | Define when to run build. Can be `on_success`, `on_failure` or `always` |
246
| dependencies  | no | Define a builds that this build depends on |
247 248
| artifacts     | no | Define list build artifacts |
| cache         | no | Define list of files that should be cached between subsequent runs |
D
Douwe Maan 已提交
249 250

### script
251 252

`script` is a shell script which is executed by the runner. For example:
D
Douwe Maan 已提交
253 254 255 256 257 258 259

```yaml
job:
  script: "bundle exec rspec"
```

This parameter can also contain several commands using an array:
260

D
Douwe Maan 已提交
261 262 263 264 265 266 267 268
```yaml
job:
  script:
    - uname -a
    - bundle exec rspec
```

### stage
269 270 271 272

`stage` allows to group build into different stages. Builds of the same `stage`
are executed in `parallel`. For more info about the use of `stage` please check
[stages](#stages).
D
Douwe Maan 已提交
273 274 275

### only and except

276 277
`only` and `except` are two parameters that set a refs policy to limit when
jobs are built:
D
Douwe Maan 已提交
278

279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294
1. `only` defines the names of branches and tags for which the job will be
    built.
2. `except` defines the names of branches and tags for which the job will
    **not** be built.

There are a few rules that apply to the usage of refs policy:

* `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.
* `only` and `except` allow the use of special keywords: `branches` and `tags`.
* `only` and `except` allow to specify a repository path to filter jobs for
   forks.

In the example below, `job` will run only for refs that start with `issue-`,
whereas all branches will be skipped.
D
Douwe Maan 已提交
295 296 297

```yaml
job:
298
  # use regexp
D
Douwe Maan 已提交
299
  only:
300 301
    - /^issue-.*$/
  # use special keyword
D
Douwe Maan 已提交
302
  except:
303
    - branches
D
Douwe Maan 已提交
304 305
```

306 307
The repository path can be used to have jobs executed only for the parent
repository and not forks:
308 309 310 311 312 313 314 315

```yaml
job:
  only:
    - branches@gitlab-org/gitlab-ce
  except:
    - master@gitlab-org/gitlab-ce
```
316 317 318

The above example will run `job` for all branches on `gitlab-org/gitlab-ce`,
except master.
319

D
Douwe Maan 已提交
320 321
### tags

322 323
`tags` is used to select specific runners from the list of all runners that are
allowed to run this project.
D
Douwe Maan 已提交
324

325 326 327 328 329 330 331
During the registration of a runner, you can specify the runner's tags, for
example `ruby`, `postgres`, `development`.

`tags` allow you to run builds with runners that have the specified tags
assigned to them:

```yaml
D
Douwe Maan 已提交
332 333 334 335 336 337
job:
  tags:
    - ruby
    - postgres
```

338 339
The specification above, will make sure that `job` is built by a runner that
has both `ruby` AND `postgres` tags defined.
D
Douwe Maan 已提交
340

341
### when
342 343 344

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

R
Robert Speicher 已提交
346 347
`when` can be set to one of the following values:

348 349 350 351
1. `on_success` - execute build only when all builds from prior stages
    succeeded. This is the default.
1. `on_failure` - execute build only when at least one build from prior stages
    failed.
352 353
1. `always` - execute build despite the status of builds from prior stages.

354 355 356
For example:

```yaml
357 358 359 360 361 362 363
stages:
- build
- cleanup_build
- test
- deploy
- cleanup

364
build_job:
365 366 367 368
  stage: build
  script:
  - make build

369
cleanup_build_job:
370 371 372 373 374
  stage: cleanup_build
  script:
  - cleanup build when failed
  when: on_failure

375
test_job:
376 377 378 379
  stage: test
  script:
  - make test

380
deploy_job:
381 382 383 384
  stage: deploy
  script:
  - make deploy

385
cleanup_job:
386 387 388 389 390 391 392
  stage: cleanup
  script:
  - cleanup after builds
  when: always
```

The above script will:
393 394 395

1. Execute `cleanup_build_job` only when `build_job` fails
2. Always execute `cleanup_job` as the last step in pipeline.
396

K
Kamil Trzcinski 已提交
397 398
### artifacts

399 400 401 402 403 404
>**Notes:**
>
> - Introduced in GitLab Runner v0.7.0 for non-Windows platforms.
> - Limited Windows support was added in GitLab Runner v.1.0.0.
> - Currently not all executors are supported.
> - Build artifacts are only collected for successful builds.
405

406 407
`artifacts` is used to specify list of files and directories which should be
attached to build after success. Below are some examples.
408

409
Send all files in `binaries` and `.config`:
410

411 412 413 414 415 416
```yaml
artifacts:
  paths:
  - binaries/
  - .config
```
417

418
Send all git untracked files:
419

420 421 422 423 424 425
```yaml
artifacts:
  untracked: true
```

Send all git untracked files and files in `binaries`:
K
Kamil Trzcinski 已提交
426

427 428 429 430 431 432
```yaml
artifacts:
  untracked: true
  paths:
  - binaries/
```
K
Kamil Trzcinski 已提交
433

434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455
You may want to create artifacts only for tagged releases to avoid filling the
build server storage with temporary build artifacts.

Create artifacts only for tags (`default-job` will not create artifacts):

```yaml
default-job:
  script:
    - mvn test -U
  except:
    - tags

release-job:
  script:
    - mvn package -U
  artifacts:
    paths:
    - target/*.war
  only:
    - tags
```

456 457
The artifacts will be sent to GitLab after a successful build and will
be available for download in the GitLab UI.
K
Kamil Trzcinski 已提交
458

459 460
#### artifacts:name

461 462
>**Note:**
Introduced in GitLab 8.6 and GitLab Runner v1.1.0.
463 464 465

The `name` directive allows you to define the name of created artifacts archive.

466 467
Currently the `artifacts` is used.
It may be useful when you will want to download the archive from GitLab.
468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520
You could possible have the unique name of every archive.

The `artifacts:name` variable can use any of the [predefined variables](../variables/README.md).

---

**Example configurations**

To create a archive with a name of current build:

```yaml
job:
  artifacts:
    name: "$CI_BUILD_NAME"
```

To create a archive with a name of current branch or tag:

```yaml
job:
   artifacts:
     name: "$CI_BUILD_REF_NAME"
     untracked: true
```

To create a archive with a name of current branch or tag:

```yaml
job:
  artifacts:
    name: "${CI_BUILD_NAME}_${CI_BUILD_REF_NAME}"
    untracked: true
```

To create a archive with a name of stage and branch name:

```yaml
job:
  artifacts:
    name: "${CI_BUILD_STAGE}_${CI_BUILD_REF_NAME}"
    untracked: true
```

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

```yaml
job:
  artifacts:
    name: "%CI_BUILD_STAGE%_%CI_BUILD_REF_NAME%"
    untracked: true
```

521 522
### dependencies

523 524
>**Note:**
Introduced in GitLab 8.6 and GitLab Runner v1.1.1.
525 526 527 528 529

This feature should be used with `artifacts` and allows to define artifacts passing between different builds.

`artifacts` from previous stages are passed by default.

530
To use a feature define `dependencies` in context of the build and pass
531 532 533 534 535 536 537 538 539 540 541 542 543
a list of all previous builds from which the artifacts should be downloaded.
You can only define a builds from stages that are executed before this one.
Error will be shown if you define builds from current stage or next stages.

How to use artifacts passing between stages:

```
build:osx:
  stage: build
  script: ...
  artifacts:
    paths:
    - binaries/
544

545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575
build:linux:
  stage: build
  script: ...
  artifacts:
    paths:
    - binaries/

test:osx:
  stage: test
  script: ...
  dependencies:
  - build:osx

test:linux:
  stage: test
  script: ...
  dependencies:
  - build:linux

deploy:
  stage: deploy
  script: ...
```

The above will create a build artifacts for two jobs: `build:osx` and `build:linux`.
When executing the `test:osx` the artifacts for `build:osx` will be downloaded and extracted in context of the build.
The same happens for `test:linux` and artifacts from `build:linux`.

The job `deploy` will download artifacts from all previous builds.
However, only the `build:osx` and `build:linux` exports artifacts so only these will be downloaded.

576 577
### cache

578 579
>**Note:**
Introduced in GitLab Runner v0.7.0.
580

581 582
`cache` is used to specify list of files and directories which should be cached
between builds. Below are some examples:
583

584
Cache all files in `binaries` and `.config`:
585

586 587 588 589 590 591 592 593
```yaml
rspec:
  script: test
  cache:
    paths:
    - binaries/
    - .config
```
594

595
Cache all git untracked files:
596

597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613
```yaml
rspec:
  script: test
  cache:
    untracked: true
```

Cache all git untracked files and files in `binaries`:

```yaml
rspec:
  script: test
  cache:
    untracked: true
    paths:
    - binaries/
```
614

615 616
Locally defined cache overwrites globally defined options. This will cache only
`binaries/`:
617

618 619 620 621
```yaml
cache:
  paths:
  - my/files
622

623 624 625 626 627 628
rspec:
  script: test
  cache:
    paths:
    - binaries/
```
629

630 631
The cache is provided on best effort basis, so don't expect that cache will be
always present. For implementation details please check GitLab Runner.
632

633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672
## Special features

It's possible special YAML features like anchors and map merging.
Thus allowing to greatly reduce the complexity of `.gitlab-ci.yml`.

#### Anchors

You can read more about YAML features [here](https://learnxinyminutes.com/docs/yaml/).

```yaml
.job_template: &job_definition
  image: ruby:2.1
  services:
    - postgres
    - redis

test1:
  << *job_definition
  script:
    - test project

test2:
  << *job_definition
  script:
    - test project
```

The above example uses anchors and map merging.
It will create a two jobs: `test1` and `test2` that will have the parameters of `.job_template` and custom `script` defined.

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

.postgres_services:
  services: &postgres_definition
    - postgres
    - ruby

673
.mysql_services:
674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703
  services: &mysql_definition
    - mysql
    - ruby

test:postgres:
  << *job_definition
  services: *postgres_definition

test:mysql:
  << *job_definition
  services: *mysql_definition
```

The above example uses anchors to define two set of services.
It will create a two jobs: `test:postgres` and `test:mysql` that will have the script defined in `.job_template`
and one, the service defined in `.postgres_services` and second the services defined in `.mysql_services`.

### Hidden jobs

The jobs that start with `.` will be not processed by GitLab.

Example of such hidden jobs:
```yaml
.job_name:
  script:
    - rake spec
```

The `.job_name` will be ignored. You can use this feature to ignore jobs, or use them as templates with special YAML features.

D
Douwe Maan 已提交
704
## Validate the .gitlab-ci.yml
705

D
Douwe Maan 已提交
706
Each instance of GitLab CI has an embedded debug tool called Lint.
707
You can find the link under `/ci/lint` of your gitlab instance.
D
Douwe Maan 已提交
708 709

## Skipping builds
710 711 712

If your commit message contains `[ci skip]`, the commit will be created but the
builds will be skipped.
A
Achilleas Pipinellis 已提交
713 714 715 716 717 718 719

## Examples

Visit the [examples README][examples] to see a list of examples using GitLab
CI with various languages.

[examples]: ../examples/README.md