Sous un projet Maven parent, il existe deux projets Maven enfants, le projet A et le projet B. Le projet A et le projet B sont ajoutés individuellement à CircleCI via GitHub et sont donc considérés comme des projets non pertinents (c'est-à-dire des référentiels séparés). Cependant, comme le projet A utilise les fonctions du projet B, il existe une dépendance au projet B.
Dans l'environnement local, la relation fraternelle entre les projets A et B peut être confirmée via le projet Maven parent, vous pouvez donc construire en ajoutant simplement le projet B en tant que dépendance au pom.xml du projet A. Cependant, il est considéré comme un projet non pertinent sur CircleCI, donc «Impossible de résoudre les dépendances du projet» peut se produire. ** Je veux éliminer la dépendance de dépendance sans polluer le pom.xml du projet A **.
Après de nombreux essais et erreurs de différentes manières, je pense que la méthode suivante est la plus simple et la plus facile à faire.
Placez le code suivant dans le pom.xml du projet B. Si vous ne l'utilisez pas, il est possible que la bibliothèque utilisée par le projet B ne soit pas incluse dans le fichier jar [^ fat-jar].
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- ... -->
<build>
<plugins>
<!-- ... -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.5</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>assemble-all</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- ... -->
</plugins>
</build>
<!-- ... -->
</project>
Vous devez spécifier le fichier que vous souhaitez exporter vers CircleCI sous forme d'artefact. La méthode consiste à ajouter le code suivant à circle.yml.
#...#
general:
#...#
artifacts:
#Ce nom de fichier est maven-assembly-Semble être la valeur par défaut pour le plugin
- "target/<nom de fichier>-<version>-jar-with-dependencies.jar"
#...#
#...#
À moins que quelque chose d'étrange ne se produise, vous devriez réussir. À propos, si vous spécifiez l'artefact comme artefact, vous pouvez également le télécharger à partir de la page de construction CircleCI. (Dans l'élément des artefacts)
S'il s'agit d'un projet privé, vous aurez besoin d'un jeton d'accès pour télécharger l'artefact. Les jetons d'accès peuvent être émis en sélectionnant «PARAMÈTRES DU COMPTE» -> «Jetons API personnels» -> «Créer un nouveau jeton» dans CircleCI.
Étant donné que l'API est utilisée dans la construction du projet A et que le téléchargement est effectué, si le jeton peut être émis, placez-le dans la variable d'environnement du projet A. L'emplacement est "PARAMETRES DU PROJET" -> "Variables d'environnement" -> "Ajouter une variable".
Créez un fichier appelé ʻadd_dependencies.sh` et mettez le contenu suivant (le nom du projet est project_b, veuillez remplacer la partie entourée par <> par une valeur appropriée). La bibliothèque jq ajoutée dans la première ligne permet de décrypter la réponse Json renvoyée par CircleCI [^ jq-lib].
#!/bin/sh
sudo apt-get install jq
currentDirectory=$(pwd)
echo $currentDirectory
downloadUrl=$(curl -sS "https://circleci.com/api/v1.1/project/github/<Nom de l'utilisateur / de l'organisation>/project_b/latest/artifacts?circle-token=$MY_ACCESS_TOKEN&branch=<Nom de la filiale>" | jq '.[] | .url' | grep project_b.*with-dependencies\.jar | sed -e "s/\"//g")
echo $downloadUrl
sudo wget $downloadUrl?circle-token=$MY_ACCESS_TOKEN -O project_b.jar --quiet
mvn install:install-file -Dfile=$currentDirectory/project_b.jar -DgroupId=<ID de groupe> -DartifactId=project_b -Dversion=<version> -Dpackaging=jar -DgeneratePom=true
--quite
ou -q
à wget, le jeton peut être envoyé à la console, alors assurez-vous de l'ajouter [^ silent-fetch].Une fois le script terminé, ajoutez une commande pour l'exécuter dans le fichier circle.yml du projet A. Le moment de l'exécution est avant que CircleCI ne résout la dépendance.
# ... #
dependencies:
pre:
- sudo chmod a+x add_dependencies.sh
- ./add_dependencies.sh
# ... #
Accueillons l'écran tant attendu!