IV. CREATION DE PROJETS D'EXEMPLE SOUS ECLIPSE▲
IV-A. Différents projets d'exemple▲
Pour les besoins de cet article, il est nécessaire de créer des projets d'exemple correspondants aux cas qui peuvent se présenter lors de l'intégration continue.
- NeCompilePas : projet qui ne compile pas.
- SansTests : projet qui compile et qui n'a pas de tests.
- TestsCompileKO : projet qui compile et qui a des tests qui ne compilent pas.
- TestsKO : projet qui compile et qui a des tests qui compilent, mais ne passent pas.
- TestsOK : projet qui compile et qui a des tests qui compilent et passent.
IV-A-1. Structure des projets d'exemple▲
Les différents projets d'exemple ont une structure similaire :
Conformément à l'arborescence projet préconisée par Maven, les sources du projet sont dans "src/main/java". Les sources des tests du projet sont dans "src/test/java" et le pom.xml est à la racine du projet.
Chaque projet ne contiendra qu'une seule classe "ClasseDuProjet" dans le package "com.developpez.rpouiller.continuum" et si le projet comporte des tests, ceux-ci seront dans la classe "CasDeTestDuProjet" du même package.
IV-A-2. Contenu du fichier Maven pom.xml▲
Le fichier Maven "pom.xml" de chaque projet comporte un contenu comme ci-dessous. Les valeurs "[groupe]", "[projet]", "[Projet]" et "[projetSurSVN]" sont à remplacer par le groupe auquel appartient le projet, l'identifiant du projet, le nom du projet et le nom du projet sur Subversion.
<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/maven-v4_0_0.xsd"
>
<modelVersion>
4.0.0</modelVersion>
<groupId>
[groupe]</groupId>
<artifactId>
[projet]</artifactId>
<packaging>
jar</packaging>
<version>
1.0-SNAPSHOT</version>
<name>
[Projet]</name>
<scm>
<connection>
scm:svn:svn://localhost/[projetSurSVN]/trunk</connection>
</scm>
<ciManagement>
<system>
continuum</system>
<url>
http://localhost:8080/continuum</url>
<notifiers>
<notifier>
<type>
mail</type>
<sendOnError>
true</sendOnError>
<sendOnFailure>
true</sendOnFailure>
<sendOnSuccess>
true</sendOnSuccess>
<sendOnWarning>
true</sendOnWarning>
<configuration>
<address>
tutoriel.continuum@gmail.com</address>
</configuration>
</notifier>
</notifiers>
</ciManagement>
<developers>
<developer>
<id>
regis.pouiller</id>
<name>
Régis POUILLER</name>
<url>
http://rpouiller.developpez.com</url>
<roles>
<role>
Rédacteur du tutoriel</role>
</roles>
<timezone>
1</timezone>
</developer>
</developers>
<contributors>
<contributor>
<name>
Continuum</name>
<url>
http://continuum.apache.org/</url>
<roles>
<role>
Sujet de l'article</role>
</roles>
<timezone>
0</timezone>
</contributor>
</contributors>
<build>
<plugins>
<plugin>
<artifactId>
maven-site-plugin</artifactId>
<configuration>
<locales>
fr</locales>
</configuration>
<executions>
<execution>
<phase>
deploy</phase>
<goals>
<goal>
site</goal>
<goal>
deploy</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>
org.apache.maven.plugins</groupId>
<artifactId>
maven-compiler-plugin</artifactId>
<configuration>
<source>
1.5</source>
<target>
1.5</target>
</configuration>
</plugin>
<plugin>
<groupId>
org.apache.maven.plugins</groupId>
<artifactId>
maven-surefire-plugin</artifactId>
<configuration>
<includes>
<include>
**/*.java</include>
</includes>
</configuration>
</plugin>
</plugins>
</build>
<reporting>
<plugins>
<plugin>
<groupId>
org.apache.maven.plugins</groupId>
<artifactId>
maven-surefire-report-plugin</artifactId>
</plugin>
</plugins>
</reporting>
<dependencies>
<dependency>
<groupId>
junit</groupId>
<artifactId>
junit</artifactId>
<version>
4.8.1</version>
<scope>
test</scope>
</dependency>
</dependencies>
<distributionManagement>
<site>
<id>
sites</id>
<name>
Site du projet</name>
<url>
dav://localhost/tutoriel/sites/${project.name}-${project.version}</url>
</site>
<repository>
<id>
releases</id>
<name>
Repository du projet</name>
<url>
dav://localhost/tutoriel/releases/</url>
</repository>
</distributionManagement>
</project>
La partie "scm" indique la connexion à Subversion. La documentation sur cette balise est disponible ici.
La partie "ciManagement" indique les notifications à envoyer selon les cas rencontrés lors de l'intégration continue. La documentation sur cette balise est disponible ici.
La partie "developers" contient la liste des personnes du projet, leurs rôles et leur adresse mail. La documentation sur cette balise est disponible ici.
La partie "contributors" contient la liste contributeurs au projet. La documentation sur cette balise est disponible ici.
La partie "build/plugins" contient le plugin "site" (documentation du plugin ici) qui est paramétré pour générer et déployer le site en français lorsque la phase "deploy" est déclenchée, le plugin "compiler" (documentation du plugin ici) qui est paramétré pour compiler en Java5 et le plugin "surefire" (documentation du plugin ici) qui est paramétré pour lancer toutes les classes de tests qu'il trouve (par défaut il s'agit des classes commençant par "Test" ou finissant par "Test" ou "TestCase", la documentation est disponible ici). La documentation sur cette balise est disponible ici.
La partie "reporting/plugins" contient le plugin "surefire-report" (documentation du plugin ici) qui crée, lors de la génération du site, le rapport lié aux tests par SureFire. La documentation sur cette balise est disponible ici.
La partie "dependencies" contient la liste des dépendances du projet (ici c'est juste la version 4.5 de JUnit). La documentation sur cette balise est disponible ici.
La partie "distributionManagement" indique où les sites et les releases sont déposés. La documentation sur cette balise est disponible ici.
IV-A-3. Génération des fichiers d'Eclipse (.classpath et .project) grâce au fichier Maven pom.xml▲
La commande "mvn eclipse:eclipse" exécutée dans le dossier d'un projet permet de mettre à jour le classpath du projet (elle génère des fichiers .project et .classpath) après téléchargement des dépendances si besoin. Il faut rafraîchir le projet dans la vue Eclipse pour recharger le classpath généré. Le classpath généré utilise la variable "M2_REPO" (voir les "Referenced Libraries" dans la structure des projets). Cette variable est à configurer dans les préférences d'Eclipse "Java/Build Path/Classpath Variables" avec le chemin du repository Maven ("dossierUtilisateur\.m2\repository").
IV-A-4. Classe du projet▲
Chaque projet d'exemple comporte une seule classe (dans ce cas, une classe sans erreur de compilation), qui correspond au code ci-dessous (avec les différences nécessaires à l'exemple).
package
com.developpez.rpouiller.continuum;
public
class
ClasseDuProjet {
public
int
methode
(
) {
return
0
;
}
}
IV-A-5. Cas de tests du projet▲
Chaque projet d'exemple avec tests comporte une seule classe de tests (dans ce cas des tests qui compilent et qui passent), qui correspond au code ci-dessous (avec les différences nécessaires à l'exemple).
package
com.developpez.rpouiller.continuum;
import
static
org.junit.Assert.assertEquals;
import
org.junit.Test;
public
class
CasDeTestsDuProjet {
@Test
public
void
controleMethode
(
) {
assertEquals
(
0
, new
ClasseDuProjet
(
).methode
(
));
}
}
IV-A-6. Implémentation des projets▲
IV-A-6-a. Implémentation du projet "NeCompilePas"▲
<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/maven-v4_0_0.xsd"
>
<modelVersion>
4.0.0</modelVersion>
<groupId>
sanstests</groupId>
<artifactId>
necompilepas</artifactId>
<packaging>
jar</packaging>
<version>
1.0-SNAPSHOT</version>
<name>
NeCompilePas</name>
<scm>
<connection>
scm:svn:svn://localhost/NeCompilePas/trunk</connection>
</scm>
.........
</project>
package
com.developpez.rpouiller.continuum;
public
class
ClasseDuProjet {
public
int
methode
(
) {
// Erreur de compilation.
// return 0;
}
}
IV-A-6-b. Implémentation du projet "SansTests"▲
<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/maven-v4_0_0.xsd"
>
<modelVersion>
4.0.0</modelVersion>
<groupId>
sanstests</groupId>
<artifactId>
sanstests</artifactId>
<packaging>
jar</packaging>
<version>
1.0-SNAPSHOT</version>
<name>
SansTests</name>
<scm>
<connection>
scm:svn:svn://localhost/SansTests/trunk</connection>
</scm>
.........
</project>
Ce projet et les suivants comportent une "ClasseDuProjet" identique à celle présentée dans le IV-A-4. Classe du projet.
IV-A-6-c. Implémentation du projet "TestsCompileKO"▲
<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/maven-v4_0_0.xsd"
>
<modelVersion>
4.0.0</modelVersion>
<groupId>
avectests</groupId>
<artifactId>
testscompileko</artifactId>
<packaging>
jar</packaging>
<version>
1.0-SNAPSHOT</version>
<name>
TestsCompileKO</name>
<scm>
<connection>
scm:svn:svn://localhost/TestsCompileKO/trunk</connection>
</scm>
.........
</project>
package
com.developpez.rpouiller.continuum;
import
org.junit.Test;
public
class
CasDeTestsDuProjet {
@Test
public
void
controleMethode
(
) {
// Erreur de compilation (pas d'import de "assertEquals")
assertEquals
(
0
, new
ClasseDuProjet
(
).methode
(
));
}
}
IV-A-6-d. Implémentation du projet "TestsKO"▲
<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/maven-v4_0_0.xsd"
>
<modelVersion>
4.0.0</modelVersion>
<groupId>
avectests</groupId>
<artifactId>
testsko</artifactId>
<packaging>
jar</packaging>
<version>
1.0-SNAPSHOT</version>
<name>
TestsKO</name>
<scm>
<connection>
scm:svn:svn://localhost/TestsKO/trunk</connection>
</scm>
.........
</project>
package
com.developpez.rpouiller.continuum;
import
static
org.junit.Assert.assertEquals;
import
org.junit.Test;
public
class
CasDeTestsDuProjet {
@Test
public
void
controleMethode
(
) {
// Erreur dans les tests : la méthode retourne 0
assertEquals
(
1
, new
ClasseDuProjet
(
).methode
(
));
}
}
IV-A-6-e. Implémentation du projet "TestsOK"▲
<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/maven-v4_0_0.xsd"
>
<modelVersion>
4.0.0</modelVersion>
<groupId>
avectests</groupId>
<artifactId>
testsok</artifactId>
<packaging>
jar</packaging>
<version>
1.0-SNAPSHOT</version>
<name>
TestsOK</name>
<scm>
<connection>
scm:svn:svn://localhost/TestsOK/trunk</connection>
</scm>
.........
</project>
Ce projet comporte un "CasDeTestsDuProjet" identique à celui présenté dans le IV-A-5. Cas de tests du projet.
IV-A-6-f. Téléchargement des projets▲
Les fichiers zip téléchargeables ici contiennent uniquement les sources et le pom.xml de chaque projet. Ce sont les seuls éléments qui doivent être commités(1) sous SVN pour l'intégration continue.
Les fichiers ".project" et ".classpath" nécessaires à Eclipse peuvent être générés grâce à la commande "mvn eclipse:eclipse", comme indiqué en info dans le IV-A-3. Génération des fichiers d'Eclipse (.classpath et .project) grâce au pom.xml.
IV-B. Partage du projet sur Subversion▲
IV-B-1. Choix de l'emplacement du référentiel Subversion▲
Effectuer un clic droit sur le projet, puis choisir "Team"/"Share Project...".
Choisir "SVN", puis cliquer sur "Next >".
Saisir "svn://localhost/" dans "URL". Saisir le compte utilisateur SVN et le mot de passe qui ont été entrés dans le fichier "passwd" du dossier "C:\svn_repos\conf" dans "User" et "Password", puis cliquer sur "Next".
Sélectionner "Advanced Mode" et "Use single project layout", puis cliquer sur "Finish".
Cliquer sur "Cancel".
IV-B-2. Commit du projet sur Subversion▲
Pour commiter des ressources sur Subversion, il faut les sélectionner (ici le dossier "src" et le fichier "pom.xml", juste après le partage) puis effectuer un clic droit et choisir "Team"/"Commit...".
Saisir un commentaire, puis valider le commit en cliquant sur "OK".