I maintain a couple of Java projects that use Travis CI for automated CI. It’s great! I’m also working with SonarSource to migrate most of their internal Jenkins to Travis. That’s quite a few projects…
Java build stack on Travis CI
Most of these projects use the standard
language: java travis.yml configuration. And it works very well. Java and Maven are installed. Maven dependencies can be cached between builds to speed things up. Lot’s of services are available pre-installed in case you need them. For instance, at SonarSource, we use mysql, postgresql, xvfb…
It’s not enough
However, sometimes you’d like to tweak the environment. Maybe you’d prefer another version of Java or Maven. Or you’d like to install a service that is not white-listed on Travis’ infrastructure. Some of those tweaks are not too complicated to achieve. Some are basically not permitted.
Native Docker support on Travis CI
When native Docker support was announced on Travis blog two days ago, I was very pleased. Like dancing like crazy pleased. This could really be a game changer.
So I tested a couple of things
First, I worked on a SonarQube repository that is not a Java project but a Docker project, it hosts the sources for the official SonarQube images. Until then, it was not easy to test that our Dockerfiles were valid.
Now it’s dead simple. Here’s the
travis.yml that we might end up using:
sudo: required language: bash services: - docker script: - docker build -t sonarsource/sonar-5.1.2 5.1.1 - docker build -t sonarsource/sonar-4.5.5 4.5.5 - docker build -t sonarsource/sonar-5.1.1 5.1.1 - docker build -t sonarsource/sonar-5.1 5.1 - docker build -t sonarsource/sonar-4.5.4 4.5.4
As a HUGE bonus, we will be able to
docker run those images and test them the same way we test our software.
Let’s test something else
Then, I focused on one of my Java projects to see what could be done. I took Fluent-http, our kick-ass Java 8 web framework.
.travis.yml looked like this before:
language: java sudo: false install: true jdk: oraclejdk8 cache: directories: - '$HOME/.m2/repository'
And I tried to use official maven docker images instead. This way, I can choose the java I want, the maven I want. I can make sure I don’t rely on anything installed on the Travis host except Docker.
language: bash sudo: required services: - docker script: - docker run -it -v $(pwd):/root/sources -w /root/sources maven:3.3.3-jdk-8 mvn clean install
The important thing to remember is that now I can REPRODUCE the build on my machine. On any future service that will offer docker support. I feel at the same less tied to TravisCI and very grateful that they offer good docker support.
Things to improve
Of course there are still rough edges. The main problem is the lack of caching for both images and local disk. That should improve in a near future.