README.md 18.5 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
| script        | yes | Defines a shell script which is executed by runner |
239
| stage         | no | Defines a build stage (default: `test`) |
240 241 242 243 244 245
| 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 other builds that a build depends on so that you can pass artifacts between them|
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
`artifacts` is used to specify list of files and directories which should be
407 408 409 410
attached to build after success. To pass artifacts between different builds,
see [dependencies](#dependencies).

Below are some examples.
411

412
Send all files in `binaries` and `.config`:
413

414 415 416 417 418 419
```yaml
artifacts:
  paths:
  - binaries/
  - .config
```
420

421
Send all git untracked files:
422

423 424 425 426 427 428
```yaml
artifacts:
  untracked: true
```

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

430 431 432 433 434 435
```yaml
artifacts:
  untracked: true
  paths:
  - binaries/
```
K
Kamil Trzcinski 已提交
436

437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458
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
```

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

462 463
#### artifacts:name

464 465
>**Note:**
Introduced in GitLab 8.6 and GitLab Runner v1.1.0.
466

A
Achilleas Pipinellis 已提交
467 468 469 470
The `name` directive allows you to define the name of the created artifacts
archive. That way, you can have a unique name of 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).
471 472 473 474 475

---

**Example configurations**

A
Achilleas Pipinellis 已提交
476
To create an archive with a name of the current build:
477 478 479 480 481 482 483

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

A
Achilleas Pipinellis 已提交
484 485
To create an archive with a name of the current branch or tag including only
the files that are untracked by Git:
486 487 488 489 490 491 492 493

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

A
Achilleas Pipinellis 已提交
494 495
To create an archive with a name of the current build and the current branch or
tag including only the files that are untracked by Git:
496 497 498 499 500 501 502 503

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

A
Achilleas Pipinellis 已提交
504
To create an archive with a name of the current [stage](#stages) and branch name:
505 506 507 508 509 510 511 512

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

A
Achilleas Pipinellis 已提交
513 514
---

515 516 517 518 519 520 521 522 523 524
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
```

525 526
### dependencies

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

530 531
This feature should be used in conjunction with [`artifacts`](#artifacts) and
allows you to define the artifacts to pass between different builds.
532

533
Note that `artifacts` from previous [stages](#stages) are passed by default.
534

535
To use this feature, define `dependencies` in context of the job and pass
536
a list of all previous builds from which the artifacts should be downloaded.
537 538 539 540
You can only define builds from stages that are executed before the current one.
An error will be shown if you define builds from the current stage or next ones.

---
541

542 543 544 545 546 547 548
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`.

The job `deploy` will download artifacts from all previous builds because of
the [stage](#stages) precedence:
549 550 551 552

```
build:osx:
  stage: build
553
  script: make build:osx
554 555 556
  artifacts:
    paths:
    - binaries/
557

558 559
build:linux:
  stage: build
560
  script: make build:linux
561 562 563 564 565 566
  artifacts:
    paths:
    - binaries/

test:osx:
  stage: test
567
  script: make test:osx
568 569 570 571 572
  dependencies:
  - build:osx

test:linux:
  stage: test
573
  script: make test:linux
574 575 576 577 578
  dependencies:
  - build:linux

deploy:
  stage: deploy
579
  script: make deploy
580 581
```

582 583
### cache

584 585
>**Note:**
Introduced in GitLab Runner v0.7.0.
586

587 588
`cache` is used to specify list of files and directories which should be cached
between builds. Below are some examples:
589

590
Cache all files in `binaries` and `.config`:
591

592 593 594 595 596 597 598 599
```yaml
rspec:
  script: test
  cache:
    paths:
    - binaries/
    - .config
```
600

601
Cache all git untracked files:
602

603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619
```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/
```
620

621 622
Locally defined cache overwrites globally defined options. This will cache only
`binaries/`:
623

624 625 626 627
```yaml
cache:
  paths:
  - my/files
628

629 630 631 632 633 634
rspec:
  script: test
  cache:
    paths:
    - binaries/
```
635

636 637
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.
638

A
Achilleas Pipinellis 已提交
639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656
## Hidden jobs

>**Note:**
Introduced in GitLab 8.6 and GitLab Runner v1.1.1.

Jobs that start with a dot (`.`) will be not processed by GitLab CI. You can
use this feature to ignore jobs, or use the
[special YAML features](#special-yaml-features) and transform the hidden jobs
into templates.

In the following example, `.job_name` will be ignored:

```yaml
.job_name:
  script:
    - rake spec
```

657
## Special YAML features
658

659 660 661
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`.
662

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

665 666 667 668 669 670 671 672 673 674 675 676 677
### Anchors

>**Note:**
Introduced in GitLab 8.6 and GitLab Runner v1.1.1.

YAML also has a handy feature called 'anchors', which let you easily duplicate
content across your document. Anchors can be used to duplicate/inherit
properties, and is a perfect example to be used with [hidden jobs](#hidden-jobs)
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:
678 679

```yaml
680
.job_template: &job_definition  # Hidden job that defines an anchor named 'job_definition'
681 682 683 684 685 686
  image: ruby:2.1
  services:
    - postgres
    - redis

test1:
687
  <<: *job_definition           # Merge the contents of the 'job_definition' alias
688
  script:
689
    - test1 project
690 691

test2:
692
  <<: *job_definition           # Merge the contents of the 'job_definition' alias
693
  script:
694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722
    - 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:
  image: ruby:2.1
  services:
    - postgres
    - redis

test1:
  image: ruby:2.1
  services:
    - postgres
    - redis
  script:
    - test1 project

test2:
  image: ruby:2.1
  services:
    - postgres
    - redis
  script:
    - test2 project
723 724
```

725 726 727 728
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:
729 730 731 732 733 734 735 736 737 738 739

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

.postgres_services:
  services: &postgres_definition
    - postgres
    - ruby

740
.mysql_services:
741 742 743 744 745 746 747 748 749 750 751 752 753
  services: &mysql_definition
    - mysql
    - ruby

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

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

754
The expanded version looks like this:
755

756 757 758 759
```yaml
.job_template:
  script:
    - test project
760

761 762 763 764
.postgres_services:
  services:
    - postgres
    - ruby
765

766 767 768 769 770 771
.mysql_services:
  services:
    - mysql
    - ruby

test:postgres:
772
  script:
773 774 775 776 777 778 779 780 781 782 783
    - test project
  services:
    - postgres
    - ruby

test:mysql:
  script:
    - test project
  services:
    - mysql
    - ruby
784 785
```

786
You can see that the hidden jobs are conveniently used as templates.
787

D
Douwe Maan 已提交
788
## Validate the .gitlab-ci.yml
789

D
Douwe Maan 已提交
790
Each instance of GitLab CI has an embedded debug tool called Lint.
791
You can find the link under `/ci/lint` of your gitlab instance.
D
Douwe Maan 已提交
792 793

## Skipping builds
794 795 796

If your commit message contains `[ci skip]`, the commit will be created but the
builds will be skipped.
A
Achilleas Pipinellis 已提交
797 798 799 800 801 802 803

## Examples

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

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