README.md 12.3 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
36
image: ruby:2.2
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 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` |
| artifacts     | no | Define list build artifacts |
| cache         | no | Define list of files that should be cached between subsequent runs |
D
Douwe Maan 已提交
246 247

### script
248 249

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

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

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

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

### stage
266 267 268 269

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

### only and except

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

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

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

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

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

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

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

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

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

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

338
### when
339 340 341

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

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

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

351 352 353
For example:

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

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

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

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

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

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

The above script will:
390 391 392

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

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

396 397 398 399 400 401
_**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._
402

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

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

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

415
Send all git untracked files:
416

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

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

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

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

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

456 457
### cache

458
_**Note:** Introduced in GitLab Runner v0.7.0._
459

460 461
`cache` is used to specify list of files and directories which should be cached
between builds. Below are some examples:
462

463
Cache all files in `binaries` and `.config`:
464

465 466 467 468 469 470 471 472
```yaml
rspec:
  script: test
  cache:
    paths:
    - binaries/
    - .config
```
473

474
Cache all git untracked files:
475

476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492
```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/
```
493

494 495
Locally defined cache overwrites globally defined options. This will cache only
`binaries/`:
496

497 498 499 500
```yaml
cache:
  paths:
  - my/files
501

502 503 504 505 506 507
rspec:
  script: test
  cache:
    paths:
    - binaries/
```
508

509 510
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.
511

D
Douwe Maan 已提交
512
## Validate the .gitlab-ci.yml
513

D
Douwe Maan 已提交
514
Each instance of GitLab CI has an embedded debug tool called Lint.
515
You can find the link under `/ci/lint` of your gitlab instance.
D
Douwe Maan 已提交
516 517

## Skipping builds
518 519 520

If your commit message contains `[ci skip]`, the commit will be created but the
builds will be skipped.