ECT

Etoile Cercle Triangle - Star Circle Triangle

Configurer Play Framework 2.x avec un repository Artifactory

| Comments

[Play Framework[(play2] utilise Scala SBT comme outil de build depuis la version 2.0. A la Maven, il télécharge les dépendances de votre projet Play Framework depuis des dépôts centralisés, comme Maven Central.

Cette technique est très intéressante, mais il faut bien tenir compte des inconvénients induits :

  1. Pas de maîtrise des dépendances ou des dépôts configurés par les développeurs : on télécharge n’importe quoi depuis n’importe où

  2. Gâchi de bande passante / latence : chaque développeur télécharge chaque dépendance depuis Internet, là où une mutualisation depuis un serveur localisé dans le réseau de l’entreprise ferait économiser de la bande passante et gagner en réactivité (latence réduite)

  3. Vous ne pouvez pas dépendre d’artifacts uniquement internes à votre entreprise (sans les publier sur Internet)

En entreprise, 1/ est généralement résolu par “blocage naturel” : on ne peut pas télécharger depuis Internet. 2/ et 3/ peuvent se résoudre à l’aide d’un serveur proxy dédié à Maven, SBT, … comme Sonatype Nexus ou JFrog Artifactory.

Comment paramétrer Play Framework pour utiliser Artifactory ?

[J’ai déjà expliqué comment configurer SBT pour utiliser Artifactory][/configurer-scala-sbt-repository-artifactory/], mais, bien que Play Framework utilise SBT, ces explications ne s’y appliquent pas (pour le moment). SBT étant embarqué dans Play Framework, il ne lit pas les instructions de configuration fournies en ligne de commande.

Pas de différence du côté d’Artifactory en revanche.

Par la suite, je suppose que la variable PLAY_HOME pointe vers votre installation de Play Framework 2.x.

Configurer SBT pour lire les dépôts “miroirs”

Créez le fichier ~/sbt/.repositories avec le contenu suivant :

~/sbt/.repositories
1
2
3
4
5
[repositories]
  local
  maven-local
  ivy-proxy-releases: http://localhost:8180/artifactory/ivy-remote-repos/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
  maven-proxy-releases: http://localhost:8180/artifactory/maven-remote-repos/

Ce fichier indique à SBT l’ensemble des dépôts qu’il peut consulter pour résoudre les dépendances :

  • local : dépôt Ivy local par défaut, localisé dans ~/.ivy2/

  • maven-local : dépôt Maven local par défaut, localisé dans ~/.m2/repository/

  • ivy-proxy-releases : suivi d’une URL et d’un pattern, on indique à SBT qu’il pourra trouver les artifacts qui respectent ce pattern dans ce dépôts (pattern Ivy)

  • maven-proxy-releases : suivi d’une URL, le dépôt au format Maven pour les autres dépendances

Forcer Play Framework à lire le fichier ~/sbt/.repositories

Éditez le fichier $PLAY_HOME/framework/sbt/sbt.boot.properties et complétez le bloc suivant :

$PLAY_HOME/framework/sbt/sbt.boot.properties
1
2
3
...
[ivy]
  ivy-home: ${play.home}/../repository

De cette manière :

$PLAY_HOME/framework/sbt/sbt.boot.properties
1
2
3
4
5
...
[ivy]
  ivy-home: ${play.home}/../repository
  override-build-repos: ${sbt.override.build.repos-true}
  repository-config: ${sbt.global.base-${user.home}/.sbt}/repositories

Avec ces deux instructions, on force Play Framework à utiliser uniquement les dépôts configurés dans le fichier ~/sbt/.repositories.

Tester

Commencez par nettoyer votre dépôt local de cache de Play Framework (par précaution, je vous propose de simplement le déplacer) :

1
mv $PLAY_HOME/repository/cache $PLAY_HOME/repository/cache.old

Postionnez-vous dans un projet Play, et testez :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
dlecan@portable:~/dev/projet_test$ play
[info] Loading global plugins from /home/dlecan/.sbt/plugins
[info] Updating {file:/home/dlecan/.sbt/plugins/}default-ccfcd1...
[info] Resolving org.scala-sbt#precompiled-2_10_0;0.12.2 ...
[info] downloading http://localhost:8180/artifactory/ivy-remote-repos/com.typesafe.sbt/sbt-pgp/scala_2.9.2/sbt_0.12/0.8/jars/sbt-pgp.jar ...
[info]  [SUCCESSFUL ] com.typesafe.sbt#sbt-pgp;0.8!sbt-pgp.jar (50ms)
[info] downloading http://localhost:8180/artifactory/maven-remote-repos/com/github/mpeltonen/sbt-idea_2.9.2_0.12/1.4.0/sbt-idea-1.4.0.jar ...
[info]  [SUCCESSFUL ] com.github.mpeltonen#sbt-idea;1.4.0!sbt-idea.jar (37ms)
[info] downloading http://localhost:8180/artifactory/maven-remote-repos/com/jsuereth/gpg-library_2.9.2/0.8/gpg-library_2.9.2-0.8.jar ...
[info]  [SUCCESSFUL ] com.jsuereth#gpg-library_2.9.2;0.8!gpg-library_2.9.2.jar (29ms)
[info] downloading http://localhost:8180/artifactory/maven-remote-repos/org/bouncycastle/bcpg-jdk16/1.46/bcpg-jdk16-1.46.jar ...
[info]  [SUCCESSFUL ] org.bouncycastle#bcpg-jdk16;1.46!bcpg-jdk16.jar (21ms)
[info] downloading http://localhost:8180/artifactory/maven-remote-repos/org/bouncycastle/bcprov-jdk16/1.46/bcprov-jdk16-1.46.jar ...
[info]  [SUCCESSFUL ] org.bouncycastle#bcprov-jdk16;1.46!bcprov-jdk16.jar (41ms)
[info] Done updating.
[info] Loading project definition from /home/dlecan/dev/truc/project
[info] Set current project to truc (in build file:/home/dlecan/dev/truc/)
       _            _
 _ __ | | __ _ _  _| |
| '_ \| |/ _' | || |_|
|  __/|_|\____|\__ (_)
|_|            |__/

play! 2.1.1 (using Java 1.7.0_21 and Scala 2.10.0), http://www.playframework.org

> Type "help play" or "license" for more information.
> Type "exit" or use Ctrl+D to leave this console.

[projet_test] $

Les dépendances sont téléchargées depuis http://localhost:8180/..., comme voulu.

Note : l’affichage obtenu peut varier selon vos dépendances paramétrées.

Configurer Scala SBT avec un repository Artifactory

| Comments

Scala SBT est à Scala ce que Maven est à Java : un outil de build dédié qui épouse la philosophie du langage.

Comme Gradle avec Groovy, SBT est beaucoup plus puissant que Maven, dans le sens où, par exemple, étendre le build est beaucoup plus simple que de construire systématiquement un plugin (qu’il faut versionner, déployer, …).

Cela dit, il ne faut pas occulter certains de ses inconvénients : incompatibilité des binaires de plugins entre versions de SBT, syntaxe complexe (en tout cas plus compliqué que du simple XML) …

Scala SBT se répand petit à petit, avec Play Framework 2 comme cheval de Troie. En effet, Play2 a fait le choix de Scala SBT comme système de build : - suite aux nombreuses critiques du système de build très fermé de Play 1 - car Play2 est écrit en Scala et se marrie donc naturellement avec SBT

Comme Maven, SBT se base sur le dépôt d’artifacts [Maven 2 Central]repo-maven2-central], mais aussi sur deux dépôts au format Ivy : celui de Typesafe et celui dédié à SBT.

Scala SBT à la Maven

Qui dit entreprise, dit “proxy”, “firewall”, “anti-virus”, … bref tout ce qui empêche des outils de build comme SBT ou Maven de fonctionner en standard. Vous avez alors deux possibilités : - soit paramétrer le proxy permettant à l’outil d’accéder à Internet - soit paramétrer des dépôts d’artifacts internes à l’entreprise (ce qui ne nécessite plus d’accéder à Internet)

C’est ce dernier paramétrage que je vous propose de décrire en détails.

Artifactory comme gestionnaire d’artifacts Maven et Ivy

Voici ce que nous allons configurer :

Source: documentation de Scala SBT_OPTS

Il existe plusieurs outils qui peuvent permettre de gérer des artifacts, dans différents formats (Maven, RPM, Deb, P2, …), comme Sonatype Nexus ou JFrog Artifactory.

Ce qui compte pour SBT, c’est un gestionnaire d’artifacts qui supporte les formats Ivy et Maven. J’ai donc choisi Artifactory.

Je vous passe les détails d’installation de l’outil, ils sont très bien décrits dans sa documentation.

La configuration des dépôts d’Artifactory s’effectue de la manière suivante :

  1. Ajouter les deux dépôts distants manquants, à savoir :

    • sbt-plugin-releases => http://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/

    • typesafe-ivy-releases => http://repo.typesafe.com/typesafe/ivy-releases/

  2. Ajouter un nouveau dépôt virtuel de type “Ivy” qui pointe sur sbt-plugin-releases et typesafe-ivy-releases. Je l’ai nommé ivy-remote-repos.

    Fusionner les dépôts Maven et Ivy en un seul est l’erreur à ne pas commettre (au format Maven par exemple). En effet, le format Ivy est plus riche que celui de Maven et des informations essentielles pour la résolution des plugins SBT seraient perdues.

  3. (Optionnel) Si vous développez pour Play Framework, rajouter le dépôt Maven des releases Typesafe http://repo.typesafe.com/typesafe/maven-releases/ à votre dépôt virtuel Maven peut être une bonne idée.

A ce stade de la configuration d’Artifactory, ces trois paramètres sont disponibles :

  • L’URL d’accès à votre instance d’Artifactory : http://localhost:8180/artifactory/ par exemple
  • Le nom du dépôt Maven 2 virtuel qui agrège vos dépôts Maven 2 : maven-remote-repos
  • Le nom du dépôt Ivy virtuel qui agrège vos dépôts Ivy : ivy-remote-repos

Configurer Scala SBT

La configuration de SBT s’effectue en deux temps.

Ajouter les nouveaux dépôts à la configuration générale de SBT

Pour cela, créez le fichier ~/sbt/.repositories avec le contenu suivant :

~/sbt/.repositories
1
2
3
4
5
[repositories]
  local
  maven-local
  ivy-proxy-releases: http://localhost:8180/artifactory/ivy-remote-repos/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
  maven-proxy-releases: http://localhost:8180/artifactory/maven-remote-repos/

Ce fichier indique à SBT l’ensemble des dépôts qu’il peut consulter pour résoudre les dépendances :

  • local : dépôt Ivy local par défaut, localisé dans ~/.ivy2/

  • maven-local : dépôt Maven local par défaut, localisé dans ~/.m2/repository/

  • ivy-proxy-releases : suivi d’une URL et d’un pattern, on indique à SBT qu’il pourra trouver les artifacts qui respectent ce pattern dans ce dépôts (pattern Ivy)

  • maven-proxy-releases : suivi d’une URL, le dépôt au format Maven pour les autres dépendances

Bloquer tous les dépôts configurés dans les builds projets

La configuration précédente permet d’ajouter des dépôts à la configuration de SBT. Mais des dépôts peuvent être paramétrés dans chaque projet SBT, ce qui ne fonctionnera pas si vous n’avez pas accès à Internet. Si vous désirez que toutes les demandes de dépendances SBT passent par votre proxy Artifactory, il vous faut le paramétrage complémentaire suivant :

1
-Dsbt.override.build.repos=true

A passer directement en argument à la ligne de commande Java qui lance SBT ou bien à rajouter à la variable SBT_OPTS par exemple.

Tester

Un simple sbt update dans un projet SBT suffit à vérifier la bonne mise à jour des dépendances de SBT au travers d’Artifactory. Pour un projet Play2, la commande play update aura le même effet.

Et pour Play Framework 2 ?

Cette configuration ne fonctionnant pas pour Play Framework 2, [consultez cet article dédié][/configurer-play-framework-repository-artifactory/].