Blog Posted August 19, 2016

Using the ConcourseCI pull request resource to verify Docker builds

Concourse.ci offers a free, open source continuous integration and delivery tool through which software development teams can establish and manage delivery pipelines.

Problem: TravisCI can be configured to run CI against a docker image's source code repository. But how can Concourse's pull-request resource be configured to test that docker build of a Dockerfile works as expected in a repo that houses such a Dockerfile?

Solution: Configure the Concourse's pull request verification job to use the docker-image resource type, thus performing a docker build using the Dockerfile during a pull request's continuous integration. Note line 41 in the pipeline.yml.

The pipeline.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
resources:

# source code
- name: docker-foo
  type: git
  source:
    branch: master
    uri: git@github.com:username/docker-foo.git

# foo docker image
- name: foo-docker-image
  type: docker-image
  source:
    repository: docker.your-company.com/username/foo

# docker-foo pull request resource
- name: docker-foo-pull-request
  type: pull-request
  source:
    uri: git@github.comcast.com:aae/cloud-tools.git
    repo: username/docker-foo

resource_types:

- name: pull-request
  type: docker-image
  source:
    repository: jtarchie/pr

jobs:

# verify a pull request
- name: verify-pull-request
  plan:
  - get: docker-foo-pull-request
    trigger: true
  - put: docker-foo-pull-request
    params:
      path: docker-foo-pull-request
      status: pending
  # test in ConcourseCI that the PR's `Dockerfile` edits work as expected:
  - put: foo-docker-image
    params:
      build: docker-foo-pull-request
    on_success:
      put: docker-foo-pull-request
      params:
        path: docker-foo-pull-request
        status: success
    on_failure:
      put: docker-foo-pull-request
      params:
        path: docker-foo-pull-request
        status: failure

# build foo docker image from `master`
- name: publish-docker-image
  serial: true
  plan:
  - get: docker-foo
    trigger: false
  - put: foo-docker-image
    params:
      build: foo
      tag: foo/version