9
votes

Comment arrêter la reconstruction de la phase de vérification de Maven à la reconstruction de l'artefact?

Imaginez un projet Java construit à l'aide de Maven pour lequel j'ai:

  • Quelques tests d'unité de course rapide qui:
    • Les développeurs doivent courir avant de commettre
    • Mon serveur CI (Hudson, FWIW) devrait s'exécuter lors de la détection d'un nouveau commit, donnant des commentaires presque instantanés en cas d'échecs
    • Quelques tests d'acceptation automatisés lents qui suivent:
      • Les développeurs peuvent courir s'ils le souhaitent, par ex. reproduire et réparer les échecs
      • Mon serveur CI doit fonctionner après avoir exécuté avec succès les tests de l'unité

        Cela ressemble à un scénario typique. Actuellement, je cours:

        • Les tests de l'unité dans la phase "Test"
        • Les tests d'acceptation dans la phase "Vérifier"

          Il existe deux travaux CI configurés, les deux pointant vers la branche VCS du projet:

          1. "Stade de commettre", qui exécute "Package MVN" (Compiler et Unité Test du code, construisez l'artefact), qui se déclenche:
          2. "Tests d'acceptation automatisés", qui exécute "MVN Vérifier" (configuré, exécuter et abattre les tests d'acceptation)

            Le problème est que le travail 2 Unité teste et construit l'artefact-sous-test de nouveau (car la phase de vérification invoque automatiquement la phase d'emballage). Cela n'est pas souhaitable pour plusieurs raisons (en importance décroissante):

            • L'artefact créé par Job 2 pourrait ne pas être identique à celui créé par le travail 1 (par exemple, s'il y a eu un nouveau commit en attendant)
            • allonge la boucle de rétroaction au développeur qui a fait le commit (c'est-à-dire qu'il faut plus de plus pour eux pour savoir qu'ils ont cassé la construction)
            • Déchets des ressources sur le serveur CI

              Donc, ma question est, comment puis-je configurer le travail 2 pour utiliser l'artefact créé par le travail 1?

              Je me rendais compte que je pouvais juste avoir un travail CI qui fonctionne "MVN Vérifier ", qui créerait l'artefact une seule fois, mais je souhaite avoir les travaux de CI séparés décrits ci-dessus afin de mettre en œuvre un pipeline de déploiement de style farley.


              au cas où il aide n'importe qui, voici le complète maven 2 pom de "projet 2" dans la réponse acceptée: xxx

              Notez que même si ce projet "Tests" ne crée pas d'artefact, Il doit utiliser une sorte d'emballage (j'ai utilisé "JAR" ici), sinon aucun test n'est exécuté dans la phase de vérification.


2 commentaires

Juste au profit de ceux qui souhaitent mieux comprendre l'approche, voir la livraison continue de Jez Humble et David Farley.


Exactement le livre qui a motivé cet effort! Vaut bien le prix.


5 Réponses :


0
votes

Donc, ma question est, comment puis-je configurer Job 2 pour utiliser l'artefact créé par Job 1?

vous ne pouvez pas.

Vous n'avez pas besoin de. Le Maven Cuild Cuildecycle est configuré d'une manière qui sonne Comme si cela répondra à vos besoins. Le cycle de vie des tests ne fonctionnera que les junits rapides. Package Créez votre état de fin sans exécuter la vérification.

Vous n'avez besoin que d'un emploi CI. Lorsque le CI exécute votre cycle de vie du déploiement / installation Maven, si les junits échouent à la construction échoue, les scripts de vérification n'exécuteront pas.


1 commentaires

Ce que vous dites est vrai, mais ne répond pas à mon exigence (certes incontestée) qu'il y ait deux emplois CI distincts, car je construisais un pipeline de déploiement et que je dois avoir une visibilité dans laquelle les révisions ont adopté la phase de validation et qui ont également adopté l'acceptation automatisée. organiser. J'ai clarifié la question.



4
votes

Essayez deux projets maven. Le premier contient les tests de construction et d'unité. Vous installez les artefacts dans votre référentiel local. Le deuxième emploi exécute le deuxième projet Maven qui déclare les artefacts du premier projet en tant que dépendances et exécute les tests fonctionnels.

Vous ne savez pas si le scénario que je viens de décrire est possible, mais je pense que c'est.

Pour une amélioration rapide, vous pouvez contourner le test de l'unité avec -dmaven.test.skip = true . Si vous transmettez le numéro de révision de votre code dans votre SCM au deuxième travail, vous devriez être en mesure de vérifier le même code source.

Vous pouvez également vérifier dans le plugin SCM de l'espace de travail Clone. Cela pourrait vous proposer des options supplémentaires.


2 commentaires

J'aime l'idée "Deux projets mavenaires"; Je vais lui donner un tourbillon. Cela ressemble à quelque chose de John Smart recommandé dans un diaporama sur CI d'environ il y a environ deux ans, mais je n'étais pas sûr des détails ou si cela était toujours considéré comme une meilleure pratique.


Cela a fonctionné bien; J'ai ajouté le POM du deuxième projet à la question, pour que quiconque souhaite l'essayer.



0
votes

Vous pouvez définir un profil maven qui sera utilisé pour n'exécuter que les tests d'intégration. Je fais ça beaucoup.

quelque chose comme ceci: xxx

vous invoqueriez avec: xxx

malheureusement Le plug-in de guerre ne peut pas être ignoré, mais vous pouvez envoyer sa sortie à quelque part sur le chemin (j'ai utilisé / TMP). Si vous voulez vraiment sauver des millisecondes, vous pouvez également le faire ignorer les ressources Web (sauf web.xml, cela ne fonctionnera pas sans cela).

Vous pouvez également utiliser le profil pour ignorer tous les autres plugins. que vous pouvez courir, par exemple le plugin d'assemblage, la coobertura, le PMD, etc.


0 commentaires

0
votes

Profil Maven qui n'exécute que les tests d'intégration ( comme suggéré ici ) n'est pas suffisant. Vous devez également vous assurer que la configuration de Maven-compiler-plugin a utilité d'utilisation = false . Exécution du profil de cette façon, ne sera pas automatiquement compilé, par exemple: xxx


0 commentaires

1
votes

Je sais que cela fait longtemps, mais cela est bien indexé et aucune des réponses ne fait ce qui a été posée, mais j'ai trouvé quelque chose qui fonctionne: XXX

Ceci exécute directement les tests directement. , sans passer à travers toutes les étapes intermédiaires de la construction du projet. Vous voudrez peut-être ajouter FAilsafe: vérifiez après elle.


0 commentaires