Deploy Maven SNAPSHOT with Travis CI

This post is also available in: fr

Guide to deploy SNAPSHOT binaries on OSS sonatype repository with Travis CI.

Maven configuration

Maven must be setup to use your personal account to access sonatype repository. Create a etc/deploy-settings.xml file and use variables to set username and password:


This file will be passed to mvn with the option --settings.


We have two solutions to store ours username and password for Travis CI.

Repository settings

In Travis CI repository settings, we can define environment variables OSSRH_USER and OSSRH_PASS. They will be hidden in logs by default.

Encrypt username and password

Obviously we don’t want to store our sensible data in clear text, Travis CI allow us to encrypt data.

gem install travis

And here comes Ruby… if you’re not a ruby developper, things can go wrong from here (at least with OS X).
In my case I faced the error:

> gem install travis                                                                                                                                                                             
Fetching: multipart-post-2.0.0.gem (100%)
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory.

The problem comes from the bundled version installed by Apple, Ruby users are certainly using rvm, rbenv or some other tool. But for others who don’t want to waste time trying to figure out the Ruby ecosystem, just:

brew install ruby

Relaunch a shell and travis gem installation should succeed…

We can finally ask travis to encrypt our username and password:

travis encrypt --add -r jcgay/send-notification "OSSRH_USER='toto'"
travis encrypt --add -r jcgay/send-notification "OSSRH_PASS='s3cret&'"

If commands are executed from the project folder, option -r is not necessary and you can use --add to automatically write encrypted keys in .travis.yml. jcgay/send-notification is the project you want to encrypt keys for.

Configuration de Travis CI

We don’t want to deploy SNAPSHOT when Travis is building a pull-request. We can read ${TRAVIS_PULL_REQUEST} variable to skip deployment when its value equals false. Same goes when Travis is building a release, as they are made outside Travis in my case, I don’t want a deployment when ${TRAVIS_TAG} variable is not empty.

So our .travis.yml contains:

    - secure: GT8Hi5kgx2cLAGzh2ggZNTgiLm8J5fd64SYG3bkhgwZGbV/HRD8r8a1SYv1iQ72JqrDhlHQ7q8h17nDBFLjy99h/XKN4MacBu9CZhnPO7lXpuRefD3W/db6zWSk17a5DAKAt+1UOeyfohEkzx+JHcTfbvMg6hy+3DEPaVMUtV04=
    - secure: fQ4bSOcHWEURfsDQVhWA152GCiezQfh9YC45a2zae8oOk+6bIrHmrkJSyVYpUCLGdqO3Df+JTy6bfoqyJEsX7PkzGPZ10odSHw5qDqfTIolt7UympKtUvUNi6h5G6virGhBWjjs5REGjrgWdTlqKjNT2Ax/VlzNRskqaVAhEhl0=

and one more step as after_success:

  - "[[ ${TRAVIS_PULL_REQUEST} == 'false' ]] && [[ ${TRAVIS_TAG} == '' ]] && mvn deploy -DskipTests --settings etc/deploy-settings.xml"

Enjoy fresh deployed SNAPSHOT !

comments powered by Disqus