Skip to content

Instantly share code, notes, and snippets.

@letmaik
Last active September 12, 2024 10:41
Show Gist options
  • Save letmaik/4060735 to your computer and use it in GitHub Desktop.
Save letmaik/4060735 to your computer and use it in GitHub Desktop.
Deploy snapshots to Sonatype after Travis CI build
language: java
env:
global:
- SONATYPE_USERNAME=yourusername
- secure: "your encrypted SONATYPE_PASSWORD=pass"
after_success:
- python addServer.py
- mvn clean deploy --settings ~/.m2/mySettings.xml
  1. encrypt your sonatype oss password with travis encrypt -r user/repo SONATYPE_PASSWORD=pass
  2. put addServer.py somewhere in your repository
  3. add the relevant lines to your .travis.yml

Deployment will only happen when the build was successful and the encrypted variables are available (= no deployment for pull requests etc.). If the deployment itself was unsuccessful, then the build still passes.

If you only want to deploy for certain branches, use shell scripting like:

after_success:
  - "[[ $TRAVIS_BRANCH == \"master\" ]] && { python travis/addServer.py; mvn clean deploy --settings ~/.m2/mySettings.xml; };"

Warning: This will deploy multiple times if you use the matrix functionality, see the issue.

#!/usr/bin/env python
import sys
import os
import os.path
import xml.dom.minidom
if os.environ["TRAVIS_SECURE_ENV_VARS"] == "false":
print "no secure env vars available, skipping deployment"
sys.exit()
homedir = os.path.expanduser("~")
m2 = xml.dom.minidom.parse(homedir + '/.m2/settings.xml')
settings = m2.getElementsByTagName("settings")[0]
serversNodes = settings.getElementsByTagName("servers")
if not serversNodes:
serversNode = m2.createElement("servers")
settings.appendChild(serversNode)
else:
serversNode = serversNodes[0]
sonatypeServerNode = m2.createElement("server")
sonatypeServerId = m2.createElement("id")
sonatypeServerUser = m2.createElement("username")
sonatypeServerPass = m2.createElement("password")
idNode = m2.createTextNode("sonatype-nexus-snapshots")
userNode = m2.createTextNode(os.environ["SONATYPE_USERNAME"])
passNode = m2.createTextNode(os.environ["SONATYPE_PASSWORD"])
sonatypeServerId.appendChild(idNode)
sonatypeServerUser.appendChild(userNode)
sonatypeServerPass.appendChild(passNode)
sonatypeServerNode.appendChild(sonatypeServerId)
sonatypeServerNode.appendChild(sonatypeServerUser)
sonatypeServerNode.appendChild(sonatypeServerPass)
serversNode.appendChild(sonatypeServerNode)
m2Str = m2.toxml()
f = open(homedir + '/.m2/mySettings.xml', 'w')
f.write(m2Str)
f.close()
@phax
Copy link

phax commented Jan 14, 2016

@eeichinger I like your approach - it's basically much simpler and works also nicely :)
The only suggestion for improvement I have is to change the deploy command to

mvn deploy --settings travis-settings.xml -DskipTests=true -B

so that tests are not executed (again) and to use Maven Batch mode (-B)

@edit: maybe adding a special Maven profile might also be a good idea in certain cases (add e.g. -P travis-deploy)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment