web-dev-qa-db-fra.com

Suppression du référentiel local Maven sur la machine de génération

Sur un serveur de génération CI, le référentiel Maven local remplit le système de fichiers de manière répétitive (après quelques jours). Quelle stratégie les autres adoptent-ils pour rogner le référentiel local dans un tel cas? -Max

42
Max Spring

Le plugin de dépendance Maven a un objectif purge-local-repository qui vous permet de supprimer les dépendances pour un projet donné du référentiel local, si celui-ci est exécuté, disons une fois par jour sur chaque projet, les instantanés ne seront pas accumuler.


Alternativement, il existe une approche plus terre brûlée que vous pourriez adopter. Comme le problème concerne généralement les artefacts d'instantanés horodatés, vous pouvez utiliser maven-antrun-plugin pour supprimer tous les fichiers qui correspondent au modèle de collecte de ressources.

Par exemple (notez que cela pourrait nécessiter quelques ajustements comme je l'ai fait de mémoire):

<plugin>
  <artifactId>maven-antrun-plugin</artifactId>
  <executions>
    <execution>
      <phase>package</phase>
      <configuration>
        <tasks>
          <delete>
            <fileset dir="${settings.localRepository}">
              <include name="**/*.jar"/>
              <exclude name="**/*.pom"/>
              <exclude name="**/*.war"/>
              <exclude name="**/*.ear"/>
              <exclude name="**/*.md5"/>
              <exclude name="**/*.sha"/>
              <!--any other extensions?...-->
              <!--match the timestamp pattern-->
              <containsregexp expression="[0-9]{8}.[0-9]{6}-[0-9]+"/>
            </fileset>
          </delete>
        </tasks>
      </configuration>
      <goals>
        <goal>run</goal>
      </goals>
    </execution>
  </executions>
</plugin>
27
Rich Seller

Si vous utilisez hudson, vous pouvez configurer un travail planifié pour supprimer simplement le référentiel entier une fois par jour ou quelque chose comme ça. J'ai un travail appelé hudson-maven-repo-clean qui a cette configuration:

  • Build/Execute Shell: rm -rf ~hudson/.m2/repository
  • Générer des déclencheurs/Générer périodiquement: 0 0 * * *
19
Dominic Mitchell

En plus de purge-local-repository (qui se lit comme une option nucléaire, car il ne propose qu'une configuration excludes par opposition à une explicite includes), jetez un œil au - Supprimer Project Artifact mojo . Je cherche à l'implémenter maintenant, car mon cas d'utilisation exact est de supprimer les instantanés WAR et EAR volumineux qui sont construits sur mes machines CI (et parfois station de travail).

4
Justin Searls

Nous utilisons spécialement à cet effet le plugin d'aide à la construction . Dans notre société mère, pom est l'objectif supprimer-projet-artefact intégré dans le profil de nos versions hudson. De cette façon, toutes les anciennes versions de cet artefact sont supprimées avant d'installer la version actuelle.

...
<profile>
  <id>hudson</id>
  <activation>
    <property>
      <name>BUILD_TAG</name>
    </property>
  </activation>
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>1.7</version>
        <executions>
          <execution>
            <id>remove-old-artifacts</id>
            <phase>package</phase>
            <goals>
              <goal>remove-project-artifact</goal>
            </goals>
            <configuration>
              <removeAll>true</removeAll>
            </configuration>
          </execution>
        </executions>
      </plugin>
  ...

L'utilisation de removeAll définie sur true effacera tous les autres instantanés, sauf celui sur lequel vous travaillez. Cela peut être dangereux car cela peut également entraîner la suppression des instantanés d'une branche.

Par exemple, si vous avez un instantané 1.0.0.18-SNAPSHOT représentant HEAD et l'instantané 1.0.1.17-SNAPSHOT représentant une branche, l'exécution de ce plugin avec la version 1.0.0.18-SNAPSHOT effacera le 1.0.1.17 -SNAPSHOt dossier.

Pour contourner ce scénario, removeAll doit être défini sur false.

3
cemonds

Nous avons utilisé une technique légèrement différente (et sournoise). Tous les artefacts qui construisent de "grandes choses" (EAR, WAR, TAR) ont leur emplacement de déploiement remplacé comme suit:

<properties>
   <discard-me-in-bit-bucket>file://${basedir}/target/_DELETEME</discard-me-in-bit-bucket> 
</properties>

<distributionManagement>
  <repository>
    <id>upload-InternalSite</id>
    <name>SoftwareLibrary External</name>
    <url>${discard-me-in-bit-bucket}</url>
    <layout>legacy</layout>
    <uniqueVersion>false</uniqueVersion>
  </repository>
  <snapshotRepository>
    <id>upload-InternalSite</id>
    <name>Repository Name</name>
    <url>${discard-me-in-bit-bucket}</url>
    <layout>legacy</layout>
    <uniqueVersion>false</uniqueVersion>
  </snapshotRepository>
</distributionManagement>

Cette stratégie fait que l'objectif de déploiement place les choses dans le répertoire cible, qui est bien sûr détruit par la prochaine opération CLEAN. Pour devenir encore plus agressif, nous avons une étape de post-construction qui fait ceci:

find -type d -name '*_DELETEME' -exec rm -rf '{}' ';' -Prune || echo $?

Nous employons encore une stratégie de plus. Dans Hudson/Jenkins, nous fournissons un fichier de paramètres pour placer le référentiel .m2 dans l'espace de travail pour le travail. Cela nous permet de supprimer l'intégralité du référentiel avant ou après le travail. Il rend également les artefacts visibles dans l'espace de travail, ce qui facilite le débogage de certains problèmes.

1
Steven Christenson

Quelle est la taille du système de fichiers? Nous avons 10 Go alloués aux builds et aux instantanés zap de plus de 30 jours chaque nuit. Cela semble fonctionner

Faites-vous des builds toutes les X heures ou lorsque le code change? Le passage aux modifications de code réduira le nombre d'artefacts sans réduire la couverture.

Installez-vous tous les instantanés localement? Vous n'avez pas besoin de le faire dans tous les cas. Dans la plupart des cas, seuls les instantanés qui sont des dépendances développées activement doivent être installés localement.

Installez-vous des fichiers EAR/WAR localement? Vous n'en avez probablement pas besoin non plus.

Combien d'espaces de travail conservez-vous? Nous utilisons hudson et ne conservons que les 5 dernières versions.

0
sal