Aller au contenu
  1. Articles/

Déployer ses SNAPSHOT avec Travis CI

Article publié il y a 11 ans : les outils et les commandes décrits ont pu changer depuis.

Mini guide pour déployer des binaires SNAPSHOT sur le repository OSS sonatype avec Travis CI.

Configuration de Maven
#

Il faut configurer Maven pour utiliser votre compte pour uploader des artifacts sur OSSRH.
Créer un fichier etc/deploy-settings.xml et utiliser des variables pour référencer vos identifiants :

<settings>
    <servers>
        <server>
            <id>ossrh</id>
            <username>${env.OSSRH_USER}</username>
            <password>${env.OSSRH_PASS}</password>
        </server>
    </servers>
</settings>

Ce fichier sera par la suite utilisé par mvn grâce à l’option --settings.

Identification
#

On a deux solutions pour stocker ses identifiants et les utiliser avec Travis CI.

Stockage dans les paramètres du repository
#

Dans les options de Travis CI https://travis-ci.org/user/repository/settings, on peut définir les variables d’environnements OSSRH_USER et OSSRH_PASS. Par défaut celles-ci seront masquées dans les logs.

Chiffrer ses identifiants
#

Il semble évident qu’on ne va pas sauvegarder ses identifiants en clair, Travis CI permet de chiffrer des données sensibles.

gem install travis

Et là on doit faire face à Ruby… Si vous ne développez pas dans cet eco-système, il y a des chances que celà se passe mal à partir de maintenant :( (en tout cas avec OS X)
Dans mon cas j’ai eu le droit à l’erreur suivante :

> 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.

Le problème vient de la version installée par Apple, les utilisateurs de ruby utiliseront surement rvm, rbenv ou je ne sais quelle autre joyeuseté. Pour le commun des mortels qui ne veulent pas y passer une demi heure et qui n’ont pas envie de tout casser :

brew install ruby

Relancer un shell et l’installation du gem travis devrait mieux se passer…

On peut maintenant envoyer nos données importantes à travis :

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

Si les commandes sont lancées depuis le dossier qui contient le projet l’option -r n’est pas nécessaire et l’option --add ajoutera automatiquement les clefs cryptées dans le fichier .travis.yml.
jcgay/send-notification correspond bien entendu au projet pour lequel ont veut chiffrer des données.

Configuration de Travis CI
#

On veut déployer les SNAPSHOT sauf si Travis est en train de builder une pull-request. On peut pour cela utiliser la variable ${TRAVIS_PULL_REQUEST}.
La variable ${TRAVIS_TAG} permet de ne pas non plus déployer les releases (qui ne sont pas faites avec Travis dans mon cas).

On se retrouve donc avec les variables d’environnement cryptées au sein de .travis.yml :

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

et une étape de plus dans la section after_success:

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

Et voilà tout roule !

Partager

Articles connexes

Le cycle de vie de son build Maven

·3 mins
Avec Maven, je me suis souvent retrouvé un peu seul devant un POM en me demandant ce que pouvait bien exécuter mon build sans devoir aller lister toutes les exécutions déclarées. Depuis Maven 3 il est possible de prévoir ce qu’un build va exécuter au sein de son cycle de vie. Etrangement il n’y a rien qui permet d’afficher facilement ce plan de build calculé. Voici le buildplan-maven-plugin.

Commentaires archivés (8)

Discussion d'origine, conservée telle quelle. Elle est close.

Rémi Alvergnat

Merci, super article ! Pour éviter d'avoir à installer ruby et le client travisCI pour chiffrer l'identifiant, on peut utiliser docker.

alias travis='docker run --rm -v $PWD:/repo -v ~/.travis:/travis andredumas/travis-ci-cli'

travis encrypt ...

Jean-Christophe GAY

Merci :)

Très cool l'idée docker pour ne pas installer ruby, je n'y pense jamais :p

Par contre je ne sais pas s'il existe des versions plus récentes de l'image mais j'ai un message de warning quand je l'utilise :

Outdated CLI version, run `gem install travis`.

A tester peut-être avec https://hub.docker.com/r/tr... ou https://hub.docker.com/r/ub...

Merci pour l'astuce !

David Pilato

Fantastique ! Exactement ce dont j'avais besoin...
Merci pour le partage !

A noter qu'il faut utiliser l'option --add pour que cela soit ajouté au fichier travis

travis encrypt "OSSRH_USER='toto'" --add

Je pense qu'il faudrait aussi modifier l'article pour dire qu'on écrit un fichier `etc/deploy-settings.xml`

David Pilato

Néanmoins, avec l'utilisation de sonatype-nexus-snapshots au lieu de ossrh, Nexus supporte maintenant des key/secrets déjà encodés.

Peut-être utiliser donc:

```
<settings>
<servers>
<server>
<id>sonatype-nexus-snapshots</id>
<username>${env.OSSRH_USER}</username>
<password>${env.OSSRH_PASS}</password>
</server>
</servers>
</settings>
```

Si on a mis ça dans le `pom.xml`:

```
<distributionmanagement>
<snapshotrepository>
<id>sonatype-nexus-snapshots</id>
<url>https://oss.sonatype.org/co...
</snapshotrepository>
<repository>
<id>sonatype-nexus-staging</id>
<url>https://oss.sonatype.org/se...
</repository>
</distributionmanagement>
```

David Pilato

A noter également, qu'on peut dans l'interface https://travis-ci.org/usern... envoyer ses credentials sans besoin de les stocker dans le fichier travis. Donc impossible pour un hacker de tenter de récupérer les valeurs.

Jean-Christophe GAY

Oui et c'est même plus simple au final 👍

Jean-Christophe GAY

Oui en effet l'id du server configuré dans les settings dépends de la configuration du projet. Perso j'avais suivi le guide http://central.sonatype.org... après l'abandon du pom oss-parent, celui-ci montre la déclaration des repositories avec l'id ossrh


<distributionmanagement>
<snapshotrepository>
<id>ossrh</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotrepository>
<repository>
<id>ossrh</id>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionmanagement>
Jean-Christophe GAY

Merci pour les retours, je vais mettre à jour l'article !