Intégration continue: quelle fréquence?

20

J'ai toujours lancé des builds après chaque commit, mais sur ce nouveau projet, les architectes m'ont juste demandé de changer la fréquence en "un build toutes les 15 minutes", et je ne comprends pas pourquoi ce serait une bonne raison vs " en s'appuyant sur chaque commit ".

Tout d'abord, quelques détails:

  • Projet Objective-C (iOS 5)
  • 10 développeurs
  • chaque build prend en fait ~ 1 min et comprend des tests de build et d'unité.
  • le serveur d'intégration est un Mac Mini, donc la puissance de calcul n'est pas vraiment un problème ici
    • nous utilisons Jenkins avec le plugin XCode

Mes arguments étaient que si vous construisez à chaque commit, vous pouvez voir dès maintenant ce qui s'est mal passé et corriger directement vos erreurs, sans déranger trop souvent les autres développeurs. De plus, notre testeur est moins gêné par les erreurs UT de cette façon. Ses arguments étaient que les développeurs seront submergés par des e-mails "d'erreur de build" (ce qui n'est pas complètement vrai, car Jenkins peut être configuré pour envoyer un e-mail uniquement pour la première build cassée), et que les mesures ne peuvent pas être effectuées correctement si la fréquence de builds est trop élevé.

Alors, quelle est votre opinion à ce sujet?

Valentin Rocher
la source
Vous êtes sûr que votre temps de construction sera d'environ 1 min en 2 ou 3 mois, avec 10 développeurs ajoutant continuellement plus de code, y compris des tests unitaires à votre projet?
Doc Brown
Il serait intéressant d'explorer le raisonnement des architectes pour demander le changement; vos points sont bons, mais répondent-ils au problème réel?

Réponses:

32

Échouer rapidement est un bon principe - plus tôt vous savez que la version est rompue, plus tôt le commit incriminé peut être identifié et la version corrigée.

Construire sur chaque commit est la bonne chose à faire.

Construire toutes les 15 minutes peut être inutile si le projet a un volume élevé de validations dans un tel délai - la recherche de la mauvaise validation prendrait plus de temps et pourrait être difficile à déterminer (on pourrait également être dans une situation où plusieurs validations ont des choses différentes qui casser la construction). Il y a aussi la possibilité qu'en temps calme (nuit?) Vous finissiez par reconstruire bien qu'aucun changement n'ait été fait.

Si la construction se brise si souvent que c'est un problème, répondez-y pour rééduquer l'équipe sur l'importance de ne pas casser la construction et sur les techniques qui garantissent que cela ne se produise pas (récupérations fréquentes, checkin dance, compilation et exécution de tests unitaires). localement etc ...).

Oded
la source
16
+1. La réponse aux messages "échec de construction" fréquemment ennuyeux est de ne pas interrompre la génération de manière ennuyeuse fréquemment.
suszterpatt
3
Dans les moments calmes - la troisième option de Jenkins, "Poll SCM", est juste pour ça. Il ne mettra à jour / exécutera les tests que lorsque des modifications seront trouvées dans le référentiel. Par exemple, nous avons un ensemble de travaux à exécuter toutes les 5 minutes s'il y a des changements (tests unitaires) et un deuxième ensemble à exécuter toutes les 3 heures s'il y a des changements (tests d'intégration). Les deux sont silencieux la nuit / le week-end car personne ne commet quoi que ce soit.
Izkata
5

Il n'y a littéralement aucun intérêt à faire un build toutes les 15 minutes si rien n'a changé. Mais il n'y a pas non plus d'inconvénient, afaik, jenkins enverra uniquement des e-mails en cas d'échec puis de réussite et pas tout le reste (par exemple, 10 échecs).

Nous le faisons à chaque validation. Cependant, nous interrogeons le référentiel toutes les quinze minutes et vérifions les changements, c'est peut-être à cela que vos collègues font référence.

Vous vous attendez à ce que vos 10 développeurs s'engagent plus d'une fois toutes les quinze minutes? Cela ressemble plutôt à une estimation élevée. 10 dev signifie qu'après toutes les 150 minutes, la même personne s'engage à nouveau, donc c'est 2,5 heures. Donc, dans votre journée moyenne, chaque développeur s'engage 3 fois. Personnellement je fais un commit ~ 2 jours ... parfois plus parfois moins.

NimChimpsky
la source
1
En fait, les commits vont assez vite ici, donc c'est tout à fait possible, mais oui, je vois ce que tu veux dire.
Valentin Rocher
3
@NimChimpsky: vous faites un commit tous les 3 jours? Si c'est vrai, je vous suggère de reconsidérer sérieusement votre stratégie de validation. Chaque fois que vous allez réinitialiser quelque chose à un état précédent, vous perdrez jusqu'à 3 jours de travail! Comment décrivez-vous les changements de 3 jours complets en quelques mots dans votre journal des changements? Cela semble très absurde. Personnellement, je fais un commit chaque fois que j'ai ajouté une tranche de fonctionnalité fonctionnelle à mon programme, généralement plusieurs fois par jour.
Doc Brown
2
@DocBrown est loin d'être absurde. Je pourrais m'engager dans différents projets et différents référentiels trois fois en une minute. D'un autre côté, je pourrais ne pas écrire de code du tout pendant une semaine entière. Je vous suggère de considérer sérieusement votre stratégie de commentaires.
NimChimpsky
1
@NumChimpsky: Je supposais que vous parliez d'une situation comparable à celle décrite par le PO. Nous parlons de 10 développeurs travaillant sur le même projet. Si le temps médian entre les validations par dev est de 3 jours, alors quelque chose se passe très, très mal dans ce projet.
Doc Brown
2
@DocBrown wtf? Vous ne savez pas de quoi vous parlez ... Je suppose que vous ne travaillez pas sur plusieurs projets simultanément.
NimChimpsky
3

Cela va inonder davantage les développeurs de courrier si c'est toutes les 15 minutes seulement. C'est parce qu'il ne saura pas avec certitude qui a cassé la construction et donc envoyer plus de personnes.

En ce qui concerne les métriques, si c'est vraiment un problème - que je ne peux pas dire parce que je ne sais pas avec quelles métriques ils pensent qu'il y a un problème -, vous pouvez toujours faire un autre travail pour collecter les métriques.

Jan Hudec
la source
2

Peut-être que l'exigence doit être "construire au plus une fois toutes les 15 minutes". Cela pourrait avoir un sens pour les projets avec une activité de validation très fréquente (c'est-à-dire plusieurs validations en quelques minutes) et peut-être de longs délais de construction. Bien sûr, cela dépend aussi de la façon dont les versions sont utilisées. Pour les testeurs, il peut être un peu déroutant d'obtenir plusieurs versions en 15 minutes ...

Mais je suis d'accord que cela n'a aucun sens de construire si rien n'a changé.

MartinStettner
la source
2

Certains développeurs veulent être autorisés à effectuer des validations d'une manière où les fichiers appartenant à un changement fonctionnel ne sont pas validés dans une seule procédure atomique. Ils ont besoin de deux ou trois minutes pour effectuer un "commit logique", qui consiste en quelques "commit physiques". C'est généralement le cas lorsque vos développeurs s'engagent directement dans un référentiel central, sans utiliser de DVCS.

Dans ce cas, il peut être judicieux de laisser votre serveur CI attendre un certain temps après le dernier commit avant de démarrer une nouvelle build. Mais 15 minutes semblent être un nombre très élevé, 5 minutes ou moins devraient suffire.

Ou, mieux (!), Essayez de guider vos développeurs pour qu'ils ne fonctionnent que par petites portions, une seule chose à la fois, ce qui rend beaucoup plus facile de ne faire que des validations physiques "complètes et fonctionnelles". Ensuite, une build après chaque commit fonctionnera sans aucun doute.

Doc Brown
la source
0

Même si Jenkins est configuré pour s'appuyer sur une validation de contrôle de code source pour un projet ou l'une de ses dépendances, cela n'empêche pas un développeur de se déployer dans le référentiel d'artefacts sans d'abord s'engager sur le contrôle de code source. S'ils déploient une modification d'API non coordonnée ou un bogue dans une dépendance vers le référentiel d'artefacts, cela peut interrompre votre build sans déclencher le travail Jenkins. Personnellement, je voudrais en savoir plus sur cet ASAP.

Idéalement, vous construirez pour chaque commit et également selon un calendrier pour vérifier les situations comme je viens de le décrire. Cela signifierait conceptuellement que vous construisez au moins une fois toutes les 15 minutes .

Si vos travaux Jenkins sont configurés pour s'exécuter sur des déploiements d'artefacts de dépendance (et si vous le faites ... Bravo), vous pouvez tester la construction planifiée si vos tests unitaires sont solides (ce qui signifie qu'ils ne testent pas les dépendances) et votre l'intégration / les tests fonctionnels ne font pas partie du travail Jenkins.

En ce qui concerne le problème de «l'inondation d'e-mails», je dis qu'être inondé d'e-mails sur une version cassée est une bonne chose. Assurez-vous de forcer les développeurs à répondre à l'e-mail avec une description et vous verrez vos versions cassées descendre, croyez-moi.

smp7d
la source
0

Vous avez dit que vous ne compreniez pas leur raisonnement, vous devez donc leur demander. Ne vous contentez pas de deviner ce qu'ils veulent et essayez de mettre en œuvre cela, et certainement ne mettez pas simplement en œuvre ce qu'ils ont demandé sans comprendre pourquoi ils l'ont demandé.

Cela dit, pour répondre à la question générale, cela dépend de la philosophie de développement que vous utilisez. Si chaque validation devrait fonctionner, chaque validation doit être testée. Si vous utilisez un DVCS avec la philosophie que chaque push doit fonctionner, testez chaque push.

En général, il vaut mieux dire aux gens quelque chose qu'ils ne savent pas, puis répéter ce qu'ils savent. Par exemple, s'ils souhaitent réduire le nombre d'e-mails redondants qu'ils reçoivent, modifiez les paramètres d'e-mail et non la fréquence de génération.

Paul Biggar
la source