Using Travis.ci to build Docker images

Oct 23, 2015  

Travis.ci recently released support to use Docker inside the CI pipeline and you can read the announcement here.

In this post, I will show you how to use this feature to build Docker images and store them on a Docker registry using Travis.ci.

I’ll discuss 2 methods, one using only Docker commands and another using Rocker which I recently discussed about here.

The complete source code is available here.

Storing your docker registry credentials securely

The first step is to store you docker registry credentials in the .travis.yml file. We will store them in some environment variables.

You can read more about this on Travis.ci website here.

$ travis encrypt DOCKER_EMAIL=email@gmail.com
$ travis encrypt DOCKER_USER=username
$ travis encrypt DOCKER_PASS=password

And then store the secure version in your .travis.yml file.

We will add a comment on the line to help us remember which line contains which environment variable.

We will also add an environment variable containing the 8 first characters of the git commit hash.

env:
  global:
    - secure: "UkF2CHX0lUZ...VI/LE=" # DOCKER_EMAIL
    - secure: "Z3fdBNPt5hR...VI/LE=" # DOCKER_USER
    - secure: "F4XbD6WybHC...VI/LE=" # DOCKER_PASS
    - COMMIT=${TRAVIS_COMMIT::8}

Creating and shipping the Docker image

In the after_success section of the .travis.yml file, we log on Docker Hub registry, then we build the image.

We also tag the generated image with:

  • the short git commit hash
  • the travis build number
  • latest if it is the master branch, otherwise the name of the branch

And finally we push it on the Docker Hub registry

after_success:
  - docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS
  - export REPO=sebestblog/travis-demo
  - export TAG=`if [ "$TRAVIS_BRANCH" == "master" ]; then echo "latest"; else echo $TRAVIS_BRANCH ; fi`
  - docker build -f Dockerfile -t $REPO:$COMMIT .
  - docker tag $REPO:$COMMIT $REPO:$TAG
  - docker tag $REPO:$COMMIT $REPO:travis-$TRAVIS_BUILD_NUMBER
  - docker push $REPO

The complete source code is available here.

Alternative solution using Rocker

An alternative solution is to use Rocker that we presented in a previous post.

after_success:
  - curl -O -L https://github.com/grammarly/rocker/releases/download/0.2.2/rocker-0.2.2_linux_amd64.tar.gz
  - tar xvfz rocker-0.2.2_linux_amd64.tar.gz
  - ./rocker build --auth $DOCKER_USER:$DOCKER_PASS --push -var TRAVIS_BUILD_NUMBER=$TRAVIS_BUILD_NUMBER -var COMMIT=$COMMIT