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 121 122 123
_**Note:** Introduced in GitLab Runner v0.5.0._

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 已提交
124 125 126 127 128 129 130 131

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

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

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

135 136
### cache

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

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

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

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

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

154 155 156 157 158 159 160 161
#### cache:key

_**Note:** Introduced in GitLab Runner v1.0.0._

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.

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

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

---

**Example configurations**
170 171 172

To enable per-job caching:

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

To enable per-branch caching:

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

To enable per-job and per-branch caching:

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

To enable per-branch and per-stage caching:

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

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

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

D
Douwe Maan 已提交
212
## Jobs
213 214 215 216

`.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 已提交
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233

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

234
| Keyword       | Required | Description |
D
Douwe Maan 已提交
235
|---------------|----------|-------------|
236 237 238 239 240 241 242 243
| 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` |
244
| dependencies  | no | Define a builds that this build depends on |
245 246
| artifacts     | no | Define list build artifacts |
| cache         | no | Define list of files that should be cached between subsequent runs |
D
Douwe Maan 已提交
247 248

### script
249 250

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

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

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

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

### stage
267 268 269 270

`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 已提交
271 272 273

### only and except

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

277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292
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 已提交
293 294 295

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

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

```yaml
job:
  only:
    - branches@gitlab-org/gitlab-ce
  except:
    - master@gitlab-org/gitlab-ce
```
314 315 316

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

D
Douwe Maan 已提交
318 319
### tags

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

323 324 325 326 327 328 329
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 已提交
330 331 332 333 334 335
job:
  tags:
    - ruby
    - postgres
```

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

339
### when
340 341 342

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

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

346 347 348 349
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.
350 351
1. `always` - execute build despite the status of builds from prior stages.

352 353 354
For example:

```yaml
355 356 357 358 359 360 361
stages:
- build
- cleanup_build
- test
- deploy
- cleanup

362
build_job:
363 364 365 366
  stage: build
  script:
  - make build

367
cleanup_build_job:
368 369 370 371 372
  stage: cleanup_build
  script:
  - cleanup build when failed
  when: on_failure

373
test_job:
374 375 376 377
  stage: test
  script:
  - make test

378
deploy_job:
379 380 381 382
  stage: deploy
  script:
  - make deploy

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

The above script will:
391 392 393

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

K
Kamil Trzcinski 已提交
395 396
### artifacts

397 398 399 400 401 402
_**Note:** Introduced in GitLab Runner v0.7.0 for non-Windows platforms._

_**Note:** Limited Windows support was added in GitLab Runner v.1.0.0. 
Currently not all executors are supported._ 

_**Note:** Build artifacts are only collected for successful builds._
403

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

407
Send all files in `binaries` and `.config`:
408

409 410 411 412 413 414
```yaml
artifacts:
  paths:
  - binaries/
  - .config
```
415

416
Send all git untracked files:
417

418 419 420 421 422 423
```yaml
artifacts:
  untracked: true
```

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

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

432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453
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
```

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

457 458 459 460 461 462 463 464 465 466 467 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
#### artifacts:name

_**Note:** Introduced in GitLab 8.6 and GitLab Runner v1.1.0._

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

Currently the `artifacts` is used. 
It may be useful when you will want to download the archive from GitLab. 
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
```

518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 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
### dependencies

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

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

`artifacts` from previous stages are passed by default.

To use a feature define `dependencies` in context of the build and pass 
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/
    
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.

572 573
### cache

574
_**Note:** Introduced in GitLab Runner v0.7.0._
575

576 577
`cache` is used to specify list of files and directories which should be cached
between builds. Below are some examples:
578

579
Cache all files in `binaries` and `.config`:
580

581 582 583 584 585 586 587 588
```yaml
rspec:
  script: test
  cache:
    paths:
    - binaries/
    - .config
```
589

590
Cache all git untracked files:
591

592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608
```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/
```
609

610 611
Locally defined cache overwrites globally defined options. This will cache only
`binaries/`:
612

613 614 615 616
```yaml
cache:
  paths:
  - my/files
617

618 619 620 621 622 623
rspec:
  script: test
  cache:
    paths:
    - binaries/
```
624

625 626
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.
627

628 629 630 631 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 673 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
## 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

.mysql_services: 
  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 已提交
699
## Validate the .gitlab-ci.yml
700

D
Douwe Maan 已提交
701
Each instance of GitLab CI has an embedded debug tool called Lint.
702
You can find the link under `/ci/lint` of your gitlab instance.
D
Douwe Maan 已提交
703 704

## Skipping builds
705 706 707

If your commit message contains `[ci skip]`, the commit will be created but the
builds will be skipped.
A
Achilleas Pipinellis 已提交
708 709 710 711 712 713 714

## Examples

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

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