{"id":93885,"date":"2020-09-10T19:42:23","date_gmt":"2020-09-10T17:42:23","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov"},"modified":"2020-09-10T19:42:23","modified_gmt":"2020-09-10T17:42:23","slug":"continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","title":{"rendered":"L'int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/ed8a32ae63b8dccfc8b4893ab27f1527.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Discutons pourquoi les outils CI et CI sont en r\u00e9alit\u00e9 deux choses diff\u00e9rentes.<\/p>\n<p><\/p>\n<p>Quel probl\u00e8me CI cherche-t-il \u00e0 r\u00e9soudre, d'o\u00f9 vient l'id\u00e9e, quelles sont les derni\u00e8res validations prouvant son efficacit\u00e9, comment savoir si vous appliquez r\u00e9ellement une pratique et non juste un Jenkins install\u00e9.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>L'id\u00e9e de faire une pr\u00e9sentation sur l'int\u00e9gration continue est n\u00e9e il y a un an, lorsque je passais des entretiens de recherche d'emploi. J'ai discut\u00e9 avec 10-15 entreprises, et une seule a pu r\u00e9pondre clairement \u00e0 ce qu'est le CI et expliquer comment elles ont compris qu'elles n'en avaient pas. Les autres disaient des absurdit\u00e9s incompr\u00e9hensibles sur Jenkins \ud83d\ude42 Eh bien, nous avons Jenkins, il fait des builds, donc c'est du CI ! Dans ma pr\u00e9sentation, je vais essayer d'expliquer ce qu'est r\u00e9ellement l'int\u00e9gration continue et pourquoi Jenkins et des outils similaires ont une relation tr\u00e8s limit\u00e9e avec cela.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/a57813a652c0d788e5a927dc8a7130ba.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Alors, qu'est-ce qui vient g\u00e9n\u00e9ralement \u00e0 l'esprit lorsque l'on \u00e9voque le CI ? La plupart des gens penseront \u00e0 Jenkins, Gitlab CI, Travis, etc.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/c9799c11ba7bb7bbdb2048c2f314b22a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>M\u00eame si nous faisons une recherche sur Google, ces outils nous seront pr\u00e9sent\u00e9s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/028ef088b28b73e7905b1666d9d53d1b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Si vous demandez aux personnes qui s'y connaissent, d\u00e8s qu'elles \u00e9num\u00e8rent les outils, elles vous diront que le CI est lorsque, dans une Pull Request pour un commit, une build est effectu\u00e9e et que des tests sont ex\u00e9cut\u00e9s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/f37ba8f985c10900f669540e063c5e43.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L'int\u00e9gration continue, ce n'est pas une question d'outils, ni de builds avec des tests dans une branche ! L'int\u00e9gration continue est une pratique d'int\u00e9gration tr\u00e8s fr\u00e9quente de nouveau code et pour l'appliquer, il n'est pas du tout n\u00e9cessaire de se lancer dans des Jenkins, des GitLabs, etc.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/c3a12b4a875050550b42714607e787c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Avant de comprendre \u00e0 quoi ressemble un CI complet, plongeons d'abord dans le contexte des personnes qui l'ont invent\u00e9 et ressentons la douleur qu'elles ont tent\u00e9 de r\u00e9soudre.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/2ab9c0f4dba2887fed5744c8b021b424.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et ils ont cherch\u00e9 \u00e0 r\u00e9soudre la douleur du travail d'\u00e9quipe !<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/11a5f3b1075f8b8d0f169fe07adf6c91.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Regardons des exemples des difficult\u00e9s rencontr\u00e9es par les d\u00e9veloppeurs lors du d\u00e9veloppement en \u00e9quipe. Nous avons un projet, une branche master dans git et deux d\u00e9veloppeurs.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/8138a52376e87239ff5f7b0af5cd8fee.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et ils ont commenc\u00e9 \u00e0 travailler comme tout le monde en a l'habitude. Ils ont pris une t\u00e2che dans JIRA, cr\u00e9\u00e9 une branche feature et ont commenc\u00e9 \u00e0 \u00e9crire du code.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/54720c40d9bbd9631b411a2a26c4083f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L'un a termin\u00e9 sa fonctionnalit\u00e9 plus rapidement et l'a fusionn\u00e9e dans master.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/4593dc3cf33a44bf3a4d8166be9bc5da.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Le second a besoin de plus de temps, il a fusionn\u00e9 plus tard et a rencontr\u00e9 un conflit. Maintenant, au lieu d'\u00e9crire les fonctionnalit\u00e9s n\u00e9cessaires au business, le d\u00e9veloppeur consacre son temps et ses efforts \u00e0 r\u00e9soudre des conflits.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/c947601fb1dd3b3dd64bac455dc6691a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Plus il est difficile d'int\u00e9grer votre fonctionnalit\u00e9 dans le master, plus nous perdons de temps. Et c'est un exemple assez simple que j'ai pr\u00e9sent\u00e9. C'est un cas o\u00f9 il n'y a que 2 d\u00e9veloppeurs. Imaginez maintenant si 10, 15 ou 100 personnes dans l'entreprise \u00e9crivent dans le m\u00eame d\u00e9p\u00f4t. Vous perdrez la t\u00eate \u00e0 r\u00e9soudre tous ces conflits. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/16c6b8b51ae462f1e0acb966a93c0ae5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il y a un autre cas l\u00e9g\u00e8rement diff\u00e9rent. Nous avons un master et plusieurs d\u00e9veloppeurs qui travaillent sur quelque chose.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/21b78ad8d0cb7cb5bded6ef9d49707c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ils ont cr\u00e9\u00e9 une branche chacun.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/b85d8aa0080f08c1ad8ad83f3a9ab084.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L'un d'eux a fait un merge, tout va bien, il a termin\u00e9 sa t\u00e2che.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/e96d4fd52c39089e3377ed85adeeb591.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Entre-temps, le deuxi\u00e8me d\u00e9veloppeur a \u00e9galement termin\u00e9 sa t\u00e2che. Supposons qu'il l'a soumise pour r\u00e9vision. Dans de nombreuses entreprises, il y a cette pratique de la r\u00e9vision. D'une part, c'est une bonne et utile pratique, d'autre part, cela nous ralentit souvent. Nous ne plongerons pas dans ce sujet, mais voici un excellent exemple de ce \u00e0 quoi peut conduire une histoire tortueuse de r\u00e9vision. Vous avez soumis une demande de tirage pour r\u00e9vision. Le d\u00e9veloppeur n'a plus rien \u00e0 faire. Que commence-t-il \u00e0 faire ? Il commence \u00e0 prendre d'autres t\u00e2ches. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/7b8e121be99432606056acf11e20f518.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pendant ce temps, le deuxi\u00e8me d\u00e9veloppeur a \u00e9galement travaill\u00e9 sur autre chose. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/ceaa5ba5b3b5014fad527362f5794e94.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Le premier a termin\u00e9 une troisi\u00e8me t\u00e2che. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/9c27663e63bb9489ecffc5a1f73abb87.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et apr\u00e8s un certain temps, sa r\u00e9vision a \u00e9t\u00e9 approuv\u00e9e, et il essaie de faire un merge. Et que se passe-t-il ? Il rencontre un grand nombre de conflits. Pourquoi ? Parce que pendant que sa demande de tirage \u00e9tait en r\u00e9vision, beaucoup de choses ont d\u00e9j\u00e0 chang\u00e9 dans le code. <\/p>\n<p><\/p>\n<p>En plus de cette histoire de conflits, il y a une question de communication. Tant que votre branche est en r\u00e9vision, tant qu'elle attend quelque chose, tant que vous peinez \u00e0 terminer la fonctionnalit\u00e9, vous cessez de suivre les changements dans la base de code de votre service. Peut-\u00eatre que ce que vous essayez de r\u00e9soudre maintenant a d\u00e9j\u00e0 \u00e9t\u00e9 r\u00e9solu hier, et vous pourriez r\u00e9utiliser une m\u00e9thode. Mais vous ne le verrez pas, car vous travaillez toujours avec une branche obsol\u00e8te. Et cette branche obsol\u00e8te conduit toujours \u00e0 devoir r\u00e9soudre des conflits de merge. <\/p>\n<p><\/p>\n<p>Ainsi, si nous travaillons en \u00e9quipe, c'est-\u00e0-dire que ce n'est pas une seule personne qui fouille dans le d\u00e9p\u00f4t, mais 5 \u00e0 10 personnes, alors plus nous tardons \u00e0 ajouter notre code dans le master, plus nous souffrons du fait qu'\u00e0 la fin, quelque chose doit \u00eatre fusionn\u00e9. Plus nous avons de conflits, et plus nous travaillons avec une version ancienne, plus nous aurons de probl\u00e8mes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/55c070f65a4d3838fb8c02bb9684c76b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Faire quelque chose ensemble, c'est douloureux ! Nous nous g\u00eanerons toujours les uns les autres. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/b914c50aad6f3c9f97edcad7e71ba627.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ce probl\u00e8me a \u00e9t\u00e9 soulev\u00e9 il y a plus de 20 ans. La premi\u00e8re mention de la pratique de l'Int\u00e9gration Continue que j'ai trouv\u00e9e se situe dans le cadre de la programmation extr\u00eame.<\/p>\n<p><\/p>\n<p>La programmation extr\u00eame est le premier cadre agile. La page est apparue en 1996. L'id\u00e9e \u00e9tait d'utiliser certaines pratiques de programmation, de planification et d'autres, afin que le d\u00e9veloppement soit le plus flexible possible, pour que nous puissions r\u00e9agir plus rapidement \u00e0 des changements ou aux exigences de nos clients. Ils ont commenc\u00e9 \u00e0 s'en rendre compte il y a 24 ans, que si vous faites quelque chose pendant longtemps et \u00e0 l'\u00e9cart, vous y passez plus de temps \u00e0 cause des conflits. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/93a80838bdb3b297557dbf2ac7587965.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Maintenant, nous allons analyser le terme \u00ab Int\u00e9gration Continue \u00bb mot par mot. Si l'on traduit litt\u00e9ralement, cela donne une int\u00e9gration continue. Mais \u00e0 quel point est-elle continue n'est pas tr\u00e8s clair, elle est en r\u00e9alit\u00e9 plut\u00f4t intermittente. Et dans quelle mesure l'int\u00e9gration est-elle \u00e9vidente \u00e9galement ? <\/p>\n<p><\/p>\n<p>C'est pourquoi je vous pr\u00e9sente maintenant des citations de la programmation extr\u00eame. Nous allons examiner les deux mots s\u00e9par\u00e9ment. <\/p>\n<p><\/p>\n<p>Int\u00e9gration \u2014 Comme je l'ai d\u00e9j\u00e0 dit, nous visons \u00e0 ce que chaque ing\u00e9nieur travaille avec la version de code la plus r\u00e9cente, afin qu'il tente d'ajouter son code aussi souvent que possible dans la branche principale, pour que ce soient de petites branches. Parce que si elles sont grandes, nous pouvons facilement rester bloqu\u00e9s pendant une semaine \u00e0 cause des conflits de fusion. Surtout si nous avons un cycle de d\u00e9veloppement long, comme le mod\u00e8le en cascade, o\u00f9 le d\u00e9veloppeur parts pendant un mois pour r\u00e9aliser une grande fonctionnalit\u00e9. Et il peut se retrouver bloqu\u00e9 longtemps au stade de l'int\u00e9gration. <\/p>\n<p><\/p>\n<p>L'int\u00e9gration, c'est quand nous prenons notre branche et l'int\u00e9grons avec la branche principale, nous la fusionnons. Il existe une version ultime o\u00f9 nous d\u00e9veloppons en faisant directement des commits dans la branche principale sans cr\u00e9er de branches suppl\u00e9mentaires.<\/p>\n<p><\/p>\n<p>En r\u00e9sum\u00e9, l'int\u00e9gration consiste \u00e0 prendre son code et \u00e0 le fusionner dans la branche principale. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/8950103e6a59ed7132ec321ac6abe600.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Que signifie le mot \u00ab continu \u00bb, qu'est-ce qui est appel\u00e9 continuit\u00e9 ? La pratique implique que le d\u00e9veloppeur cherche \u00e0 int\u00e9grer son code le plus rapidement possible. C'est son objectif lors de l'ex\u00e9cution de toute t\u00e2che : faire en sorte que son code apparaisse dans la branche principale le plus vite possible. Dans un monde id\u00e9al, les d\u00e9veloppeurs feraient cela toutes les quelques heures. C'est-\u00e0-dire que vous prenez une petite t\u00e2che, vous la fusionnez dans la branche principale. Tout va bien. Vous aspirez \u00e0 cela. Et vous devez le faire de mani\u00e8re continue. D\u00e8s que vous avez fait quelque chose, vous l'int\u00e9grez imm\u00e9diatement dans la branche principale. <\/p>\n<p><\/p>\n<p>Et le d\u00e9veloppeur qui fait quelque chose est responsable de ce qu'il a fait pour que cela fonctionne et ne casse rien. C'est ici qu'appara\u00eet g\u00e9n\u00e9ralement l'histoire des tests. Nous voulons ex\u00e9cuter certains tests sur notre engagement, sur notre fusion, pour nous assurer que cela fonctionne. Et c'est ici que Jenkins peut vraiment vous aider.<\/p>\n<p><\/p>\n<p>Mais concernant les histoires : faisons en sorte que les changements soient petits, que les t\u00e2ches soient petites, et essayons de fusionner la t\u00e2che dans la branche principale imm\u00e9diatement \u2013 c'est l\u00e0 que Jenkins ne vous aidera pas. Parce que Jenkins ne vous aidera qu'\u00e0 ex\u00e9cuter les tests. <\/p>\n<p><\/p>\n<p>Vous pouvez vous en passer. Cela ne vous d\u00e9rangera absolument pas. Parce que l'objectif de la pratique est de se fusionner le plus souvent possible, afin de ne pas perdre beaucoup de temps sur des conflits futurs. <\/p>\n<p><\/p>\n<p>Imaginons que nous sommes en 2020, pour une raison quelconque, sans Internet. Et nous travaillons localement. Nous n'avons pas Jenkins. C'est normal. Vous pouvez tout de m\u00eame cr\u00e9er une branche locale. Vous y avez \u00e9crit du code. Vous avez r\u00e9alis\u00e9 une t\u00e2che en 3-4 heures. Vous passez \u00e0 la branche principale, faites un git pull, fusionnez votre branche. C'est fait. Si vous faites cela souvent \u2013 f\u00e9licitations, vous avez l'Int\u00e9gration Continue !<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/1f2117b65994b940edb04e0e119f6e8a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quelles sont les preuves dans le monde moderne indiquant que cela vaut la peine de d\u00e9penser des efforts ? Parce qu'en g\u00e9n\u00e9ral, c'est compliqu\u00e9. Si vous essayez de travailler ainsi, vous comprendrez que vous devez traiter une certaine planification, vous passerez plus de temps \u00e0 d\u00e9composer les t\u00e2ches. Parce que si vous faites man..., vous ne pourrez pas fusionner rapidement et, par cons\u00e9quent, vous vous retrouverez dans l'embarras. Vous n'aurez plus de pratique. <\/p>\n<p><\/p>\n<p>Et cela va co\u00fbter cher. Il ne sera pas possible de travailler avec l'int\u00e9gration continue d\u00e8s demain. Vous allez tous mettre beaucoup de temps \u00e0 vous habituer, beaucoup de temps \u00e0 apprendre \u00e0 d\u00e9composer les t\u00e2ches, beaucoup de temps \u00e0 vous habituer \u00e0 revoir votre pratique de r\u00e9vision, si vous en avez une. Parce que notre objectif est que cela soit fusionn\u00e9 aujourd'hui. Et si vous passez trois jours \u00e0 faire une r\u00e9vision, alors vous avez des probl\u00e8mes et l'int\u00e9gration continue ne fonctionne pas. <\/p>\n<p><\/p>\n<p>Mais avons-nous des preuves concr\u00e8tes en ce moment qui nous disent qu'il est judicieux d'investir dans cette pratique ?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/2026a8f1d72fb05613511e7bab57e8ec.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La premi\u00e8re chose qui m'est venue \u00e0 l'esprit est l'\u00c9tat du DevOps. C'est une \u00e9tude que les gars r\u00e9alisent depuis 7 ans. Ils le font maintenant en tant qu'organisation ind\u00e9pendante, mais sous Google.<\/p>\n<p><\/p>\n<p>Et leur \u00e9tude de 2018 a montr\u00e9 une corr\u00e9lation entre les entreprises qui essaient d'utiliser des branches \u00e0 courte dur\u00e9e de vie, qui s'int\u00e8grent rapidement, qui s'int\u00e8grent fr\u00e9quemment, elles ont de bien meilleurs indicateurs de performance IT.<\/p>\n<p><\/p>\n<p>Quels sont ces indicateurs ? Ce sont 4 m\u00e9triques qu'ils recueillent aupr\u00e8s de toutes les entreprises dans leurs sondages : fr\u00e9quence de d\u00e9ploiement, d\u00e9lai pour les changements, temps de restauration du service, taux d'\u00e9chec des changements.<\/p>\n<p><\/p>\n<p>Et tout d'abord, il y a cette corr\u00e9lation, nous savons que les entreprises qui fusionnent souvent ont des m\u00e9triques bien meilleures. Et ils classifient les entreprises en plusieurs cat\u00e9gories : les entreprises lentes, qui produisent lentement, les performers moyens, les performers \u00e9lev\u00e9s et l'\u00e9lite. L'\u00e9lite comprend Netflix, Amazon, qui sont tr\u00e8s rapides, font tout rapidement, avec \u00e9l\u00e9gance et qualit\u00e9.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/4fd98ef48a5cffdd6ae2ceea93dbb0bf.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Une autre histoire, qui s'est produite il y a \u00e0 peine un mois. Le Technology Radar a publi\u00e9 un excellent article sur Gitflow. Gitflow se distingue des autres en ce sens que ses branches vivent longtemps. Il y a des branches de version qui vivent longtemps, des branches de fonctionnalit\u00e9s qui vivent \u00e9galement longtemps. Cette pratique a \u00e9t\u00e9 plac\u00e9e en HOLD dans le Technology Radar. Pourquoi ? Parce que les gens rencontrent des difficult\u00e9s d'int\u00e9gration. <\/p>\n<p><\/p>\n<p>Si votre branche vit tr\u00e8s longtemps, elle commence \u00e0 prendre du retard, nous commen\u00e7ons \u00e0 passer plus de temps \u00e0 y apporter un changement. <\/p>\n<p><\/p>\n<p>R\u00e9cemment, l'auteur de Gitflow a d\u00e9clar\u00e9 que si vous aspirez \u00e0 l'int\u00e9gration continue, si vous souhaitez effectuer des mises \u00e0 jour aussi souvent que possible, alors Gitflow est une mauvaise id\u00e9e. Il a \u00e9galement mentionn\u00e9 dans un article s\u00e9par\u00e9 que si vous avez un backend o\u00f9 vous pouvez faire cela, Gitflow est superflu pour vous, car il vous ralentira et causera des probl\u00e8mes d'int\u00e9gration. <\/p>\n<p><\/p>\n<p>Cela ne signifie pas que Gitflow est mauvais et qu'il ne faut pas l'utiliser. Il est adapt\u00e9 \u00e0 d'autres cas. Par exemple, lorsque vous devez maintenir plusieurs versions d'un service ou d'une application, c'est-\u00e0-dire lorsque vous devez fournir un support sur une p\u00e9riode prolong\u00e9e. <\/p>\n<p><\/p>\n<p>Mais si vous parlez \u00e0 des personnes qui maintiennent de tels services, vous entendrez beaucoup de plaintes sur le fait que cette version \u00e9tait 3.2, qui a \u00e9t\u00e9 publi\u00e9e il y a 4 mois, et que ce correctif n'y figurait pas, et maintenant, pour l'int\u00e9grer, il faut apporter beaucoup de modifications. Et les voil\u00e0 de nouveau bloqu\u00e9s, et ils passent une semaine \u00e0 essayer de fusionner une nouvelle fonctionnalit\u00e9. <\/p>\n<p><\/p>\n<p>Comme Alexander Kovalev l'a justement not\u00e9 dans le chat, la corr\u00e9lation n'est pas \u00e9quivalente \u00e0 la causalit\u00e9. C'est vrai. C'est-\u00e0-dire qu'il n'y a pas de lien direct selon lequel si vous avez une int\u00e9gration continue, alors toutes les m\u00e9triques seront excellentes, non. Mais il existe une corr\u00e9lation positive, c'est-\u00e0-dire que si l'un est vrai, l'autre est probablement \u00e9galement vrai. Ce n'est pas un fait, mais c'est fort probable. Ce n'est qu'une corr\u00e9lation. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"L&#039;int\u00e9gration continue en tant que pratique, et non Jenkins. Andre\u00ef Alexandrov.\" src=\"\/wp-content\/uploads\/2020\/09\/d5fc050550b0e9f86a1fdf85fff32fa5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>On dirait que nous faisons d\u00e9j\u00e0 quelque chose, que nous fusionnons d\u00e9j\u00e0, mais comment savoir si nous avons r\u00e9ellement l'int\u00e9gration continue et que nous fusionnons suffisamment souvent ?<\/p>\n<p><\/p>\n<p>Jez Humble est l'auteur du Handbook, Accelerate, du site Continuous Delivery et du livre \u00ab Continuous Delivery \u00bb. Il propose un test comme celui-ci :<\/p>\n<p><\/p>\n<ul>\n<li>Le code de l'ing\u00e9nieur est int\u00e9gr\u00e9 dans la branche principale chaque jour. <\/li>\n<li>Pour chaque commit, vous ex\u00e9cutez des tests unitaires.<\/li>\n<li>Si le build dans la branche principale \u00e9choue, il est r\u00e9par\u00e9 environ 10 minutes.<\/li>\n<\/ul>\n<p><\/p>\n<p>Il propose d'utiliser ce test pour s'assurer que vous avez bien cette pratique. <\/p>\n<p><\/p>\n<p>Je trouve cela un peu discutable. C'est-\u00e0-dire que si vous pouvez r\u00e9parer en 10 minutes, cela signifie que vous avez une int\u00e9gration continue, ce qui semble un peu \u00e9trange, \u00e0 mon avis, mais cela a un sens. Pourquoi ? Parce que si vous fusionnez souvent, cela signifie que vos changements sont petits. Si un petit changement entra\u00eene la rupture de la compilation principale, vous pourrez trouver l'exemple rapidement, car le changement est minime. Vous avez r\u00e9alis\u00e9 une petite fusion, qui a modifi\u00e9 20-30 lignes. Par cons\u00e9quent, vous pouvez rapidement comprendre la cause, car les changements sont minuscules, vous avez une tr\u00e8s petite zone de recherche du probl\u00e8me. <\/p>\n<p><\/p>\n<p>Et m\u00eame si notre production s'effondre apr\u00e8s la mise en ligne, si nous avons la pratique de l'int\u00e9gration continue, il est beaucoup plus facile d'agir, car les changements sont minuscules. Oui, cela affectera la planification. Cela sera douloureux. Et probablement, la chose la plus difficile dans cette pratique est de s'habituer \u00e0 d\u00e9composer les t\u00e2ches, c'est-\u00e0-dire comment faire en sorte de prendre quelque chose et de le r\u00e9aliser en quelques heures tout en passant en revue, si vous en avez une. La r\u00e9vision est une douleur \u00e0 part. <\/p>\n<p><\/p>\n<p>Les tests unitaires sont simplement des assistants qui vous aident \u00e0 comprendre si votre int\u00e9gration a r\u00e9ussi, si rien n'est cass\u00e9. \u00c0 mon avis, ce n'est pas non plus un point obligatoire, car le sens de la pratique n'est pas l\u00e0. <\/p>\n<p><\/p>\n<p>C'est un bref aper\u00e7u de l'int\u00e9gration continue. C'est tout ce qu'il y a dans cette pratique. Je suis pr\u00eat pour vos questions. <\/p>\n<p><\/p>\n<p>Pour r\u00e9sumer bri\u00e8vement encore une fois :<\/p>\n<p><\/p>\n<ul>\n<li>L'int\u00e9gration continue n'est pas Jenkins, ce n'est pas Gitlab.<\/li>\n<li>Ce n'est pas un outil, c'est une pratique qui consiste \u00e0 fusionner notre code dans la branche principale aussi souvent que possible. <\/li>\n<li>Nous le faisons pour \u00e9viter la grande douleur qui survient avec les fusions \u00e0 l'avenir, c'est-\u00e0-dire que nous \u00e9prouvons une petite douleur maintenant afin de ne pas en \u00e9prouver une grande plus tard. C'est tout le sens. <\/li>\n<li>Il y a une communication par le biais du code, mais je ne le vois que tr\u00e8s rarement, mais c'est aussi pour cela qu'elle a \u00e9t\u00e9 con\u00e7ue.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Questions<\/strong><\/p>\n<p><\/p>\n<p><em>Que faire avec des t\u00e2ches non d\u00e9compos\u00e9es ?<\/em><\/p>\n<p><\/p>\n<p>D\u00e9composer. Quel est le probl\u00e8me ? Pouvez-vous donner un exemple d'une t\u00e2che qui ne peut pas \u00eatre d\u00e9compos\u00e9e ?<\/p>\n<p><\/p>\n<p><em>Il existe des t\u00e2ches qui sont impossibles \u00e0 d\u00e9composer au sens propre, par exemple, celles qui n\u00e9cessitent une expertise tr\u00e8s approfondie et qui peuvent r\u00e9ellement prendre plusieurs mois pour aboutir \u00e0 un r\u00e9sultat acceptable.<\/em> <\/p>\n<p><\/p>\n<p>Si je te comprends bien, il y a une grande et complexe t\u00e2che dont le r\u00e9sultat ne sera visible que dans un mois?<\/p>\n<p><\/p>\n<p><em>Oui, c'est exact. Oui, le r\u00e9sultat ne pourra \u00eatre \u00e9valu\u00e9 au plus t\u00f4t qu'au bout d'un mois.<\/em> <\/p>\n<p><\/p>\n<p>Bien. En g\u00e9n\u00e9ral, ce n'est pas un probl\u00e8me. Pourquoi ? Parce que dans ce cas, quand nous parlons de branches, nous ne parlons pas d'une branche avec une fonctionnalit\u00e9. Les fonctionnalit\u00e9s peuvent \u00eatre grandes et complexes. Elles peuvent toucher un grand nombre de composants. Et, peut-\u00eatre, nous ne pouvons pas les r\u00e9aliser enti\u00e8rement dans une seule branche. C'est normal. Nous devons juste d\u00e9couper cette histoire. Si la fonctionnalit\u00e9 n'est pas enti\u00e8rement pr\u00eate, cela ne signifie pas que certaines parties de son code ne peuvent pas \u00eatre fusionn\u00e9es. Par exemple, tu as ajout\u00e9 une migration et il y a des \u00e9tapes \u00e0 l'int\u00e9rieur de la fonctionnalit\u00e9. Tu as, par exemple, une \u00e9tape \u2013 faire la migration, ajouter une nouvelle m\u00e9thode. Et tu peux d\u00e9j\u00e0 fusionner ces \u00e9l\u00e9ments quotidiennement. <\/p>\n<p><\/p>\n<p><em>Bien. Quel est alors le sens de cela?<\/em><\/p>\n<p><\/p>\n<p>Quel est l'int\u00e9r\u00eat de fusionner de petites choses chaque jour?<\/p>\n<p><\/p>\n<p><em>Oui.<\/em><\/p>\n<p><\/p>\n<p>S'il y en a un qui te casse quelque chose, tu le vois tout de suite. Tu as un petit morceau qui a cass\u00e9 quelque chose, il est plus facile de le corriger. L'id\u00e9e est que fusionner une petite partie maintenant est beaucoup plus simple que de fusionner quelque chose de grand dans quelques semaines. Et le troisi\u00e8me aspect est que d'autres ing\u00e9nieurs travailleront avec la version actuelle du code. Ils verront qu'il y a eu des migrations ajout\u00e9es ici, et qu'il y a une nouvelle m\u00e9thode qui pourrait \u00e9galement les int\u00e9resser. Tout le monde pourra voir ce qui se passe dans ton code. C'est pr\u00e9cis\u00e9ment pour ces trois raisons que cette pratique est mise en \u0153uvre. <\/p>\n<p><\/p>\n<p><em>Merci, la question est r\u00e9gl\u00e9e !<\/em><\/p>\n<p><\/p>\n<p><em>(Oleg Soroka) Puis-je ajouter quelque chose ? Tu as tout \u00e0 fait raison, je ne veux qu'ajouter une phrase.<\/em><\/p>\n<p><\/p>\n<p>D'accord.<\/p>\n<p><\/p>\n<p><em>Avec l'int\u00e9gration continue, le code est fusionn\u00e9 dans la branche principale non pas lorsque la fonctionnalit\u00e9 est compl\u00e8tement pr\u00eate, mais lorsque le build cesse d'\u00eatre cass\u00e9. Et vous pouvez commettre dans la branche principale autant de fois que vous le souhaitez chaque jour. Deuxi\u00e8me aspect \u2013 si pour une raison quelconque vous ne pouvez pas d\u00e9composer une t\u00e2che mensuelle en t\u00e2ches d'au moins trois jours, je ne parle m\u00eame pas de trois heures, cela signifie que vous avez un \u00e9norme probl\u00e8me. Et le fait que vous n'ayez pas d'int\u00e9gration continue est le moindre de ces probl\u00e8mes. Cela signifie que vous avez des probl\u00e8mes d'architecture et que vos pratiques d'ing\u00e9nierie sont au niveau z\u00e9ro. Parce que m\u00eame si c'est de la recherche, il faut en tout cas la formuler sous forme d'hypoth\u00e8ses ou de cycles.<\/em> <\/p>\n<p><\/p>\n<p><em>Nous avons parl\u00e9 de 4 m\u00e9triques qui distinguent les entreprises performantes de celles en difficult\u00e9. Il faut d'abord atteindre ces 4 m\u00e9triques. Si une t\u00e2che moyenne prend un mois, je me concentrerais d'abord sur cette m\u00e9trique. Je viserais d'abord \u00e0 r\u00e9duire ce d\u00e9lai \u00e0 3 jours. Une fois cela fait, je commencerais \u00e0 penser \u00e0 l'Int\u00e9gration Continue.<\/em><\/p>\n<p><\/p>\n<p>Ai-je bien compris que tu penses qu'il n'est pas encore utile d'investir dans des pratiques d'ing\u00e9nierie si n'importe quelle t\u00e2che prend un mois ?<\/p>\n<p><\/p>\n<p><em>Tu as l'Int\u00e9gration Continue. Et il y a un aspect o\u00f9, en 10 minutes, tu peux soit corriger un probl\u00e8me soit le r\u00e9tablir. Imagine, tu as d\u00e9ploy\u00e9 quelque chose. En fait, tu as m\u00eame un d\u00e9ploiement continu, tu l'as mis en production et tu as remarqu\u00e9 seulement apr\u00e8s que quelque chose n'allait pas. Et tu dois le r\u00e9tablir, mais ta base de donn\u00e9es a d\u00e9j\u00e0 migr\u00e9. La structure de ta base de donn\u00e9es est maintenant \u00e0 la version suivante, en plus, une sauvegarde a eu lieu et des donn\u00e9es y ont d\u00e9j\u00e0 \u00e9t\u00e9 enregistr\u00e9es.<\/em><\/p>\n<p><\/p>\n<p><em>Et quelle est ton alternative ? Si tu reverts le code, il ne peut plus fonctionner avec cette base de donn\u00e9es mise \u00e0 jour.<\/em><\/p>\n<p><\/p>\n<p>La base n'avance que vers l'avant, oui. <\/p>\n<p><\/p>\n<p><em>Les personnes ayant de mauvaises pratiques d'ing\u00e9nierie n'ont probablement pas non plus lu ce gros livre sur\u2026 Que faire avec une sauvegarde ? Si tu te r\u00e9tablis \u00e0 partir d'une sauvegarde, cela signifie que tu perds les donn\u00e9es accumul\u00e9es pendant cette p\u00e9riode. Par exemple, tu as travaill\u00e9 trois heures avec la nouvelle version de la base de donn\u00e9es, des utilisateurs se sont inscrits. Si tu reviens \u00e0 une ancienne sauvegarde, car la nouvelle version ne fonctionne pas avec la structure, tu as donc perdu ces utilisateurs. Et ils ne sont pas contents, ils se plaignent.<\/em><\/p>\n<p><\/p>\n<p><em>Pour ma\u00eetriser l'ensemble des pratiques soutenant l'int\u00e9gration continue et la livraison continue, il ne suffit pas d'apprendre simplement \u00e0 \u00e9crire\u2026 D'abord, il peut y en avoir beaucoup trop, ce qui serait impraticable. De plus, il existe de nombreuses autres pratiques, comme la pratique scientifique. Il y a une pratique que GitHub a popularis\u00e9e \u00e0 un moment donn\u00e9. C'est lorsque tu ex\u00e9cutes \u00e0 la fois du code ancien et du nouveau code. C'est quand tu as une fonctionnalit\u00e9 inachev\u00e9e qui peut renvoyer une certaine valeur : soit comme fonction, soit comme API Rest. Tu ex\u00e9cutes \u00e0 la fois le nouveau code et l'ancien code, et tu compares la diff\u00e9rence entre les deux. Et s'il y a une diff\u00e9rence, tu enregistres cet \u00e9v\u00e9nement. Ainsi, tu sais que ta nouvelle fonctionnalit\u00e9 est pr\u00eate \u00e0 \u00eatre mise en \u0153uvre au-dessus de l'ancienne, si tu n'as pas eu de divergence entre ces deux-l\u00e0 pendant un certain temps.<\/em> <\/p>\n<p><\/p>\n<p><em>Il existe des centaines de telles pratiques. Je te sugg\u00e9rerais de commencer par le d\u00e9veloppement transbase. Ce n'est pas enti\u00e8rement bas\u00e9 sur l'int\u00e9gration continue, mais les pratiques sont les m\u00eames, l'un ne peut pas bien vivre sans l'autre.<\/em> <\/p>\n<p><\/p>\n<p>Tu as mentionn\u00e9 le d\u00e9veloppement transbase comme exemple, o\u00f9 l'on peut observer des pratiques, ou tu proposes aux gens de commencer \u00e0 utiliser le d\u00e9veloppement transbase ?<\/p>\n<p><\/p>\n<p><em>Regarder, car ils ne pourront pas l'utiliser. Pour pouvoir l'utiliser, il faut lire beaucoup de choses. Et lorsque la question se pose : \u00ab Que faire avec une fonctionnalit\u00e9 qui prend un mois ? \u00bb, cela signifie qu'il n'a pas lu sur le d\u00e9veloppement transbase. Je ne le conseillerais pas pour le moment. Je conseillerais de se concentrer exclusivement sur le th\u00e8me de la bonne fa\u00e7on d'architecturer la d\u00e9composition de grandes t\u00e2ches en t\u00e2ches plus petites. C'est l\u00e0 l'essence de la d\u00e9composition.<\/em><\/p>\n<p><\/p>\n<p><em>La d\u00e9composition est un des outils de l'architecte. Nous faisons d'abord l'analyse, puis la d\u00e9composition, ensuite la synth\u00e8se, puis l'int\u00e9gration. Et ainsi, tout se met en place. Et il faut encore progresser vers l'int\u00e9gration continue \u00e0 travers la d\u00e9composition. Des questions se posent \u00e0 la premi\u00e8re \u00e9tape, alors que nous parlons d\u00e9j\u00e0 de la quatri\u00e8me \u00e9tape, c'est-\u00e0-dire que plus tu fais souvent d'int\u00e9gration, mieux c'est. Il est encore un peu t\u00f4t pour le faire, il serait bon de commencer par d\u00e9couper ton monolithe.<\/em> <\/p>\n<p><\/p>\n<p><em>Il faut dessiner plusieurs fl\u00e8ches et carr\u00e9s sur un sch\u00e9ma. On ne peut pas dire que je vais montrer l'architecture de la nouvelle application en pr\u00e9sentant un seul carr\u00e9 avec un bouton vert pour l'application \u00e0 l'int\u00e9rieur. De toute fa\u00e7on, il y aura plus de carr\u00e9s et de fl\u00e8ches. Dans n'importe quel sch\u00e9ma que j'ai vu, il y en avait plus d'un. Et la d\u00e9composition est d\u00e9j\u00e0 effectu\u00e9e m\u00eame au niveau de la repr\u00e9sentation graphique. Ainsi, les carr\u00e9s peuvent \u00eatre ind\u00e9pendants. Sinon, j'ai de grandes questions \u00e0 poser \u00e0 l'architecte.<\/em> <\/p>\n<p><\/p>\n<p>Il y a une question du chat : \u00ab Si la r\u00e9vision est obligatoire et prend longtemps, un jour ou plus ? \u00bb.<\/p>\n<p><\/p>\n<p>Vous avez des probl\u00e8mes avec la pratique. Une r\u00e9vision ne devrait pas prendre un jour ou plus. C'est une histoire similaire \u00e0 la question pr\u00e9c\u00e9dente, juste un peu plus douce. Si la r\u00e9vision prend un jour, cela signifie probablement qu'il s'agit d'une r\u00e9vision d'un changement tr\u00e8s important. Donc, il faut la rendre plus petite. Dans le d\u00e9veloppement transbase, que Oleg a recommand\u00e9, il existe une m\u00e9thode appel\u00e9e r\u00e9vision continue. Le principe est que nous faisons des pull requests d\u00e9lib\u00e9r\u00e9ment tr\u00e8s petites, car nous cherchons \u00e0 fusionner constamment et par petites touches. Ainsi, une pull request modifie une seule abstraction ou 10 lignes. Gr\u00e2ce \u00e0 cela, la r\u00e9vision ne prend que quelques minutes. <\/p>\n<p><\/p>\n<p>Si la r\u00e9vision prend un jour ou plus, cela signifie que quelque chose ne va pas. Premi\u00e8rement, il se peut que vous ayez des probl\u00e8mes avec l'architecture. Ou alors c'est un gros morceau de code, disons 1 000 lignes, par exemple. Ou votre architecture est tellement complexe qu'une personne ne peut pas la comprendre. C'est un probl\u00e8me \u00e0 part, mais il faudra aussi le r\u00e9soudre. Peut-\u00eatre que la r\u00e9vision n'est m\u00eame pas n\u00e9cessaire. Il faut aussi y r\u00e9fl\u00e9chir. La r\u00e9vision est cette chose qui vous freine. Elle a ses avantages en g\u00e9n\u00e9ral, mais il faut comprendre pourquoi vous le faites. Est-ce pour vous un moyen de transmettre rapidement des informations, un moyen d'\u00e9tablir des normes internes ou quoi ? Pourquoi avez-vous besoin de cela ? Parce que la r\u00e9vision doit \u00eatre soit tr\u00e8s rapide, soit compl\u00e8tement annul\u00e9e. C'est comme le d\u00e9veloppement transbase - une belle histoire, mais seulement pour des \u00e9quipes matures. <\/p>\n<p><\/p>\n<p>Concernant les 4 m\u00e9triques, je recommanderais plut\u00f4t de les prendre, afin de comprendre o\u00f9 cela m\u00e8ne. Regarder les chiffres, voir l'image, \u00e0 quel point tout cela est mauvais. <\/p>\n<p><\/p>\n<p><em>(Dmitri) Je suis pr\u00eat \u00e0 discuter de cela avec toi. Les chiffres et les m\u00e9triques, c'est super, les pratiques, c'est g\u00e9nial. Mais il faut comprendre si cela est n\u00e9cessaire pour l'entreprise. Il existe des entreprises qui n'ont pas besoin d'un rythme de changement aussi rapide. Je connais des soci\u00e9t\u00e9s o\u00f9 il est impossible de faire des changements toutes les 15 minutes. Et ce n'est pas parce qu'elles sont mauvaises. C'est juste leur cycle de vie. Et pour r\u00e9aliser la fonctionnalit\u00e9 des branches, la fonctionnalit\u00e9 toggle, il faut des connaissances approfondies.<\/em> <\/p>\n<p><\/p>\n<p>C'est compliqu\u00e9. Si tu souhaites lire plus en d\u00e9tail l'histoire sur la fonctionnalit\u00e9 toggle, je te recommande vivement. <noindex><a rel=\"nofollow\" href=\"https:\/\/trunkbaseddevelopment.com\/\">https:\/\/trunkbaseddevelopment.com\/<\/a><\/noindex>. Et il y a un excellent article de Martin Fowler sur les fonctionnalit\u00e9s toggle : les types, les cycles de vie, etc. La fonctionnalit\u00e9 toggle, c'est complexe. <\/p>\n<p><\/p>\n<p><em>Et tu n'as toujours pas r\u00e9pondu \u00e0 la question : \u00ab Jenkins est-il n\u00e9cessaire ou non ? \u00bb<\/em><\/p>\n<p><\/p>\n<p>Jenkins n'est en r\u00e9alit\u00e9 n\u00e9cessaire dans aucun cas. Pour \u00eatre s\u00e9rieux, des outils comme Jenkins et GitLab vous apporteront du confort. Vous verrez si la construction a r\u00e9ussi ou non. Ils peuvent vous aider, mais ils ne vous garantiront pas la pratique. Ils vous fourniront juste un petit rond \u2014 Ok, pas Ok. Et \u00e7a, si vous \u00e9crivez encore des tests, parce que s'il n'y a pas de tests, c'est presque inutile. Par cons\u00e9quent, c'est n\u00e9cessaire parce que c'est plus pratique, mais en gros, on peut vivre sans, vous ne perdrez pas beaucoup. <\/p>\n<p><\/p>\n<p><em>C'est-\u00e0-dire que si vous avez des pratiques, cela signifie que vous n'en avez pas besoin ?<\/em><\/p>\n<p><\/p>\n<p>Exactement. Je recommande le test de Jez Humble. J'ai un avis mitig\u00e9 sur le dernier point. Mais globalement, si vous avez trois choses : vous fusionnez constamment, vous ex\u00e9cutez des tests sur les commits dans la branche ma\u00eetresse, vous r\u00e9parez rapidement le build dans la branche ma\u00eetresse, alors peut-\u00eatre que vous n'avez besoin de rien d'autre. <\/p>\n<p><\/p>\n<p><em>En attendant les questions des participants, j'ai une question. Nous avons parl\u00e9 du code produit. As-tu utilis\u00e9 cela pour du code d'infrastructure ? Est-ce le m\u00eame code, a-t-il les m\u00eames principes et le m\u00eame cycle de vie, ou y a-t-il d'autres cycles de vie et principes ? D'habitude, quand on parle de Continuous Integration et Development, tout le monde oublie qu'il existe aussi du code d'infrastructure. Et cela prend de plus en plus d'importance derni\u00e8rement. Devrait-on y appliquer toutes ces r\u00e8gles ?<\/em><\/p>\n<p><\/p>\n<p>Ce n'est m\u00eame pas question de devoir, ce serait super, car cela simplifierait la vie. D\u00e8s que nous travaillons avec du code, pas avec des scripts en bash, mais avec un code normal.<\/p>\n<p><\/p>\n<p><em>Attends, attends, un script en bash, c'est aussi du code. Ne touche pas \u00e0 mon vieux amour.<\/em> <\/p>\n<p><\/p>\n<p>D'accord, je ne vais pas pi\u00e9tiner tes souvenirs. J'ai une aversion personnelle envers bash. Il se casse de mani\u00e8re laide et effrayante tout le temps. Et il tombe souvent de mani\u00e8re impr\u00e9visible, c'est pourquoi je ne l'aime pas beaucoup. Mais bien, supposons que tu aies du code en bash. Peut-\u00eatre que je ne m'y connais pas bien et qu'il existe de bons frameworks de test. Je ne suis tout simplement pas au courant. Et nous avons les m\u00eames avantages.<\/p>\n<p><\/p>\n<p>D\u00e8s que nous travaillons avec l'infrastructure comme du code, nous rencontrons les m\u00eames probl\u00e8mes que les d\u00e9veloppeurs. Il y a quelques mois, j'ai \u00e9t\u00e9 confront\u00e9 \u00e0 une situation o\u00f9 un coll\u00e8gue m'a envoy\u00e9 un pull request de 1 000 lignes en bash. Et tu te retrouves \u00e0 passer 4 heures en r\u00e9vision. Les probl\u00e8mes sont les m\u00eames. C'est toujours du code. Et c'est toujours un travail collaboratif. Nous sommes coinc\u00e9s avec le pull request et nous rencontrons les m\u00eames conflits de fusion du m\u00eame bash, par exemple. <\/p>\n<p><\/p>\n<p>Je suis actuellement tr\u00e8s actif sur cette notion de programmation d'infrastructure de la mani\u00e8re la plus esth\u00e9tique possible. J'ai int\u00e9gr\u00e9 Pulumi dans l'infrastructure. C'est de la programmation pure. C'est encore plus agr\u00e9able car j'ai toutes les possibilit\u00e9s du langage de programmation, c'est-\u00e0-dire que j'ai cr\u00e9\u00e9 de jolis toggles avec les m\u00eames if, et tout est en ordre. Donc, ma modification est d\u00e9j\u00e0 dans la branche principale. Tout le monde peut le voir. D'autres ing\u00e9nieurs sont au courant. Cela a d\u00e9j\u00e0 eu un impact. Mais en m\u00eame temps, cela ne s'est pas activ\u00e9 pour toutes les infrastructures. Cela s'est activ\u00e9 pour mes environnements de test, par exemple. Donc, pour r\u00e9pondre \u00e0 ta question une fois de plus, oui, cela nous simplifie la vie en tant qu'ing\u00e9nieurs travaillant avec du code. <\/p>\n<p><\/p>\n<p><em>Y a-t-il d'autres questions ?<\/em> <\/p>\n<p><\/p>\n<p>J'ai une question. Je veux poursuivre la discussion avec Oleg. Dans l'ensemble, je pense que tu as raison : si une t\u00e2che prend un mois, c'est qu'il y a un probl\u00e8me d'architecture, un probl\u00e8me d'analyse, de d\u00e9composition, de planification, etc. Mais j'ai le sentiment que si tu commences \u00e0 essayer de vivre selon l'int\u00e9gration continue, tu vas commencer \u00e0 corriger les douleurs li\u00e9es \u00e0 la planification, car tu ne peux pas vraiment y \u00e9chapper. <\/p>\n<p><\/p>\n<p><em>(Oleg) Oui, c'est tout \u00e0 fait \u00e7a. En termes d'effort, cette pratique est comparable \u00e0 toute autre pratique s\u00e9rieuse qui change la culture. La chose la plus difficile \u00e0 surmonter, ce sont les habitudes, en particulier les mauvaises habitudes. Et si la mise en \u0153uvre de cette pratique n\u00e9cessite un changement s\u00e9rieux des habitudes des personnes autour de vous : d\u00e9veloppeurs, direction, chef de production, alors vous pouvez vous attendre \u00e0 des surprises.<\/em> <\/p>\n<p><\/p>\n<p><em>Quelles surprises peuvent survenir ? Supposons que vous ayez d\u00e9cid\u00e9 de faire plus souvent des int\u00e9grations. Et pour les int\u00e9grations, vous avez d'autres \u00e9l\u00e9ments, par exemple, des artefacts. Et dans votre entreprise, il y a une politique stipulant que chaque artefact doit \u00eatre enregistr\u00e9 d'une mani\u00e8re ou d'une autre dans un syst\u00e8me de stockage d'artefacts. Cela prend un certain temps. La personne doit cocher que, en tant que manager de version, elle a test\u00e9 cet artefact pour qu'il soit pr\u00eat \u00e0 \u00eatre d\u00e9ploy\u00e9 en production. Si cela prend 5-10-15 minutes, mais que vous faites des d\u00e9ploiements une fois par semaine, alors consacrer une demi-heure chaque semaine n'est pas une grande charge.<\/em> <\/p>\n<p><\/p>\n<p><em>Si vous effectuez une int\u00e9gration continue 10 fois par jour, alors il faut multiplier 10 fois par 30 minutes. Cela d\u00e9passe le temps de travail de ce manager de version. Il finit simplement par \u00eatre fatigu\u00e9 de le faire. Il y a des co\u00fbts constants associ\u00e9s \u00e0 certaines pratiques. Voil\u00e0 tout.<\/em> <\/p>\n<p><\/p>\n<p><em>Il vous faut donc soit annuler cette r\u00e8gle, pour ne plus vous engager dans des absurdit\u00e9s, c'est-\u00e0-dire ne pas valider manuellement la conformit\u00e9 de quelque chose. Vous devez compter enti\u00e8rement sur un ensemble de tests automatis\u00e9s de pr\u00e9paration.<\/em> <\/p>\n<p><\/p>\n<p><em>Et si vous avez besoin d'une approbation de quelqu'un pour que le responsable signe, et que vous n'entrez pas en production sans avoir le feu vert de Vasya, etc. \u2013 toutes ces absurdit\u00e9s se mettent en travers des pratiques. Parce que si certaines activit\u00e9s sont li\u00e9es comme une charge, alors tout se multiplie par 100. Par cons\u00e9quent, le changement sera souvent mal re\u00e7u par tout le monde. Car il est difficile de corriger les habitudes des gens.<\/em> <\/p>\n<p><\/p>\n<p><em>Lorsque quelqu'un effectue un travail habituel, il le fait pratiquement sans y penser. La charge cognitive est \u00e9gale \u00e0 z\u00e9ro. Il r\u00e9alise simplement des t\u00e2ches pr\u00e9\u00e9tablies, il a d\u00e9j\u00e0 une check-list dans la t\u00eate, il l'a faite mille fois. Et d\u00e8s que vous arrivez et lui dites : \u00ab Abandonnons cette pratique et mettons en \u0153uvre une nouvelle d\u00e8s lundi \u00bb, cela devient une lourde charge cognitive pour lui. Et cela arrive imm\u00e9diatement pour tout le monde.<\/em> <\/p>\n<p><\/p>\n<p><em>C'est donc la chose la plus simple, mais il est vrai que tout le monde ne peut pas se permettre ce luxe. C'est toujours comme \u00e7a que je proc\u00e8de. Si un nouveau projet d\u00e9marre, on y int\u00e8gre g\u00e9n\u00e9ralement toutes les pratiques non \u00e9prouv\u00e9es. Tant que le projet est jeune, nous ne risquons pas grand-chose. Il n'y a pas encore de production, donc il n'y a rien \u00e0 casser. C'est une opportunit\u00e9 d'exp\u00e9rimentation. Cette approche fonctionne. Cependant, toutes les entreprises n'ont pas la possibilit\u00e9 de lancer souvent de tels projets. Bien que cela semble un peu \u00e9trange, car actuellement c'est la transformation digitale, et tout le monde doit mener des exp\u00e9riences pour rester comp\u00e9titif.<\/em> <\/p>\n<p><\/p>\n<p>Ici, tu fais face au fait que tu dois d'abord comprendre ce que tu dois faire. Le monde n'est pas parfait et la production non plus. <\/p>\n<p><\/p>\n<p><em>Oui, ces choses sont interconnect\u00e9es.<\/em><\/p>\n<p><\/p>\n<p>Les entreprises n'ont pas toujours conscience qu'elles doivent aller dans telle ou telle direction. <\/p>\n<p><\/p>\n<p><em>Il existe des situations o\u00f9 aucun changement n'est possible. Cela se produit lorsque la pression sur l'\u00e9quipe est plus forte. L'\u00e9quipe est d\u00e9j\u00e0 en burn-out. Elle n'a aucun temps libre pour des exp\u00e9riences. Ils passent leurs journ\u00e9es \u00e0 d\u00e9velopper des fonctionnalit\u00e9s. Et la direction en veut toujours plus. Dans cette situation, aucun changement n'est envisageable. L'\u00e9quipe ne peut recevoir que l'instruction de faire demain ce qu'ils ont fait hier, juste en produisant un peu plus de fonctionnalit\u00e9s. Aucun passage \u00e0 d'autres pratiques n'est possible dans ce sens. C'est une situation classique o\u00f9 il n'y a pas de temps pour aiguiser la hache, il faut couper du bois, donc on coupe avec une hache \u00e9mouss\u00e9e. Il n'y a pas de conseils simples ici.<\/em> <\/p>\n<p><\/p>\n<p><em>(Dmitry) Je vais lire une pr\u00e9cision du chat : \u00ab Mais il faut une large couverture de tests \u00e0 diff\u00e9rents niveaux. Combien de temps est consacr\u00e9 aux tests ? \u00c7a co\u00fbte cher et \u00e7a prend beaucoup de temps. \u00bb<\/em><\/p>\n<p><\/p>\n<p><em>(Oleg) C'est une id\u00e9e re\u00e7ue classique. Il doit y avoir suffisamment de tests pour que vous ayez vous-m\u00eame confiance. L'int\u00e9gration continue n'est pas quelque chose o\u00f9 vous devez d'abord avoir 100 % de tests avant de commencer \u00e0 l'appliquer. L'int\u00e9gration continue r\u00e9duit votre charge cognitive car chaque modification que vous voyez est tellement \u00e9vidente que vous comprenez si cela va casser quelque chose ou non, m\u00eame sans tests. Vous pouvez rapidement le tester mentalement car ce sont de petites modifications. M\u00eame si vous n'avez que des testeurs manuels, c'est plus simple pour eux. Vous d\u00e9ployez et dites : \u00ab Regarde, rien n'est cass\u00e9 ? \u00bb. Ils v\u00e9rifient et disent : \u00ab Non, rien n'est cass\u00e9 \u00bb. Parce que le testeur sait o\u00f9 regarder. Un de vos commits est li\u00e9 \u00e0 un fragment de code. Et cela exploite un comportement sp\u00e9cifique.<\/em><\/p>\n<p><\/p>\n<p>L\u00e0, tu as bien embellit. <\/p>\n<p><\/p>\n<p><em>(Dmitry) Je ne suis pas d'accord ici. Il existe une pratique \u2013 le d\u00e9veloppement dirig\u00e9 par les tests, qui va pr\u00e9cis\u00e9ment sauver de cela.<\/em> <\/p>\n<p><\/p>\n<p><em>(Oleg) Voil\u00e0, je n'en \u00e9tais pas encore l\u00e0. La premi\u00e8re illusion est que vous devez \u00e9crire 100 % de tests ou ne pas vous occuper de l'int\u00e9gration continue. C'est faux. Ce sont deux pratiques parall\u00e8les. Et elles ne d\u00e9pendent pas directement l'une de l'autre. Votre couverture de tests doit \u00eatre optimale. Optimale signifie que vous \u00eates vous-m\u00eame convaincu que la qualit\u00e9 du ma\u00eetre, apr\u00e8s votre commit, vous permet de cliquer avec confiance sur le bouton \u00ab D\u00e9ployer \u00bb un vendredi soir dans un \u00e9tat d'ivresse. Comment y parvenez-vous ? Gr\u00e2ce \u00e0 la r\u00e9vision, \u00e0 la couverture, \u00e0 un bon monitoring.<\/em> <\/p>\n<p><\/p>\n<p><em>Un bon monitoring est indistinguable des tests. Si vous ex\u00e9cutez vos tests une fois en pr\u00e9-prod, alors ils v\u00e9rifient vos sc\u00e9narios utilisateur une seule fois, c'est tout. Mais si vous les ex\u00e9cutez en boucle infinie, alors c'est votre syst\u00e8me de monitoring d\u00e9ploy\u00e9, qui teste tout en permanence \u2013 cela a-t-il \u00e9chou\u00e9 ou non. Dans ce cas, la diff\u00e9rence ne r\u00e9side que dans le caract\u00e8re unique ou r\u00e9p\u00e9titif. Un tr\u00e8s bon ensemble de tests \u2026, ex\u00e9cut\u00e9s ind\u00e9finiment, c'est du monitoring. Et le bon monitoring doit \u00eatre ainsi.<\/em> <\/p>\n<p><\/p>\n<p><em>Et donc, la mani\u00e8re dont vous atteindrez cet \u00e9tat o\u00f9 vous d\u00e9ployez un vendredi soir et rentrez chez vous, c'est une autre question. Peut-\u00eatre que vous \u00eates juste un aventurier audacieux.<\/em> <\/p>\n<p><\/p>\n<p>Retournons un peu en arri\u00e8re sur l\u2019int\u00e9gration continue. Nous nous sommes un peu \u00e9loign\u00e9s vers une autre pratique complexe. <\/p>\n<p><\/p>\n<p><em>Et la deuxi\u00e8me illusion est que le MVP, on dit qu'il faut le faire rapidement, donc les tests ne sont pas du tout n\u00e9cessaires. Ce n'est pas tout \u00e0 fait \u00e7a. En fait, lorsque vous r\u00e9digez une user story pour le MVP, vous pouvez soit la d\u00e9velopper \u00e0 l'aveuglette, c'est-\u00e0-dire que vous avez entendu qu'il y a une user story, et vous vous pr\u00e9cipitez \u00e0 la coder, soit travailler selon le TDD. Et selon le TDD, comme montre la pratique, cela ne prend pas plus de temps ; les tests sont en fait un effet secondaire. La pratique du TDD ne consiste pas \u00e0 tester. Malgr\u00e9 le fait que cela s'appelle le d\u00e9veloppement pilot\u00e9 par les tests, il ne s'agit pas de tests. C'est en fait plut\u00f4t une approche architecturelle. C'est une mani\u00e8re d'\u00e9crire pr\u00e9cis\u00e9ment ce qui est n\u00e9cessaire et de ne pas \u00e9crire ce qui ne l'est pas. Cette pratique se concentre sur la prochaine it\u00e9ration de votre r\u00e9flexion en mati\u00e8re de cr\u00e9ation de l'architecture de l'application.<\/em> <\/p>\n<p><\/p>\n<p><em>Il n'est donc pas si facile de se d\u00e9barrasser de ces illusions. MVP et tests ne s'opposent pas. Au contraire, si vous r\u00e9alisez un MVP selon la pratique du TDD, vous le ferez mieux et plus rapidement que si vous n'appliquez aucune m\u00e9thode, en agissant \u00e0 l'aveuglette.<\/em><\/p>\n<p><\/p>\n<p>C'est une pens\u00e9e tr\u00e8s peu \u00e9vidente et complexe. Quand on entend que maintenant je vais encore \u00e9crire des tests et que je vais faire quelque chose plus rapidement, \u00e7a semble totalement inappropri\u00e9. <\/p>\n<p><\/p>\n<p><em>(Dmitry) Beaucoup de gens, quand ils parlent de MVP, c'est parce qu'ils n'ont pas envie d'\u00e9crire quelque chose de correct. Et ce sont quand m\u00eame des choses diff\u00e9rentes. Ne transformez pas le MVP en quelque chose de mauvais qui ne fonctionne pas.<\/em> <\/p>\n<p><\/p>\n<p>Oui, oui, tu as raison.<\/p>\n<p><\/p>\n<p><em>Et puis soudainement le MVP en prod.<\/em><\/p>\n<p><\/p>\n<p>Pour toujours. <\/p>\n<p><\/p>\n<p>Et le TDD semble tr\u00e8s inhabituel quand on entend que vous \u00e9crivez des tests et que vous apparemment effectuez plus de travail. Cela semble tr\u00e8s \u00e9trange, mais en r\u00e9alit\u00e9, cela se fait plus rapidement et de mani\u00e8re plus \u00e9l\u00e9gante. Quand vous \u00e9crivez un test, vous r\u00e9fl\u00e9chissez d\u00e9j\u00e0 beaucoup aux types de code et \u00e0 la fa\u00e7on dont il sera appel\u00e9, ainsi qu'au comportement que nous attendons de lui. Vous ne dites pas simplement que vous avez \u00e9crit une fonction qui fait quelque chose. D'abord, vous pensez que c'est sous certaines conditions, elle sera appel\u00e9e de cette mani\u00e8re. Vous le couvrez avec des tests et \u00e0 partir de l\u00e0, vous comprenez \u00e0 quoi ressembleront les interfaces dans votre code. Cela a un impact tr\u00e8s fort sur l'architecture. Votre code devient automatiquement plus modulaire, car vous essayez d'abord de comprendre comment vous allez le tester, et seulement ensuite vous l'\u00e9crivez. <\/p>\n<p><\/p>\n<p>Avec TDD, j'ai eu une exp\u00e9rience o\u00f9, \u00e0 un moment donn\u00e9, j'ai engag\u00e9 un mentor en Ruby alors que j'\u00e9tais encore d\u00e9veloppeur Ruby. Il m'a dit : \u00ab Commen\u00e7ons \u00e0 travailler avec TDD \u00bb. Et je me suis dit : \u00ab Oh non, maintenant il faut encore \u00e9crire quelque chose de plus \u00bb. Nous avons convenu que pendant deux semaines, j'\u00e9crirais tout le code fonctionnel en Python en suivant TDD. Au bout de deux semaines, je me suis rendu compte que je ne voulais plus revenir en arri\u00e8re. Apr\u00e8s deux semaines \u00e0 essayer de l'appliquer partout, j'ai constat\u00e9 \u00e0 quel point il \u00e9tait devenu plus facile de r\u00e9fl\u00e9chir. Mais ce n'est pas \u00e9vident, donc je recommande \u00e0 tout le monde que si vous pensez que TDD est compliqu\u00e9, long et superflu, essayez de vous y tenir pendant deux semaines. Pour moi, deux semaines ont suffi.<\/p>\n<p><\/p>\n<p><em>(Dmitri) Nous pouvons d\u00e9velopper cette id\u00e9e du point de vue de l'exploitation de l'infrastructure. Avant de lancer quelque chose de nouveau, nous r\u00e9alisons une surveillance, puis nous lan\u00e7ons. Dans ce cas, notre surveillance devient un test normal. Et il y a le d\u00e9veloppement par la surveillance. Mais presque tout le monde dit que c'est long, que \u00e7a les ennuie, qu'ils ont fait un brouillon temporaire. Si nous avons r\u00e9alis\u00e9 une bonne surveillance, nous comprenons l'\u00e9tat du syst\u00e8me CI. Et dans le syst\u00e8me CI, il y a beaucoup de surveillance. Nous comprenons l'\u00e9tat du syst\u00e8me, nous savons ce qu'il y a \u00e0 l'int\u00e9rieur. Et pendant le d\u00e9veloppement, nous r\u00e9alisons pr\u00e9cis\u00e9ment un syst\u00e8me qui parvienne \u00e0 l'\u00e9tat d\u00e9sir\u00e9.<\/em> <\/p>\n<p><\/p>\n<p><em>Ces pratiques sont connues depuis longtemps. Nous en avons discut\u00e9 il y a environ 4 ans. Mais en 4 ans, pratiquement rien n'a chang\u00e9.<\/em> <\/p>\n<p><\/p>\n<p><em>Sur cette note, je propose de mettre fin \u00e0 la discussion officielle.<\/em><\/p>\n<p><\/p>\n<p>Vid\u00e9o (ins\u00e9r\u00e9e comme \u00e9l\u00e9ment multim\u00e9dia, mais apparemment non fonctionnelle) :<\/p>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/zZ3qXVN3Oic\">https:\/\/youtu.be\/zZ3qXVN3Oic<\/a><\/noindex><br \/>\n<br \/>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/518406\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041e\u0431\u0441\u0443\u0434\u0438\u043c \u043f\u043e\u0447\u0435\u043c\u0443 CI-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 CI \u2013 \u044d\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e \u0440\u0430\u0437\u043d\u043e\u0435. \u041a\u0430\u043a\u0443\u044e \u0431\u043e\u043b\u044c CI \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c, \u043e\u0442\u043a\u0443\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0434\u0435\u044f, \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0447\u0442\u043e \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043a\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 Jenkins. \u041c\u044b\u0441\u043b\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e Continuous Integration \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0435\u0449\u0435 \u0433\u043e\u0434 \u043d\u0430\u0437\u0430\u0434, \u043a\u043e\u0433\u0434\u0430 \u044f \u0445\u043e\u0434\u0438\u043b \u043f\u043e \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0438\u0441\u043a\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0443. \u041f\u043e\u043e\u0431\u0449\u0430\u043b\u0441\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":93886,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-93885","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Continuous Integration \u043a\u0430\u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0430 \u043d\u0435 Jenkins. \u0410\u043d\u0434\u0440\u0435\u0439 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u043e\u0432 | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-09-10T17:42:23+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-09-10T17:42:23+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Int\u00e9gration Continue en tant que pratique, pas seulement Jenkins. Andrei Alexandrov | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Continuous Integration \u043a\u0430\u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0430 \u043d\u0435 Jenkins. \u0410\u043d\u0434\u0440\u0435\u0439 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u043e\u0432 | ProHoster","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-09-10T17:42:23+00:00","article:modified_time":"2020-09-10T17:42:23+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"93885","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 11:37:31","updated":"2022-09-27 15:57:30","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/93885","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=93885"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/93885\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/93886"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=93885"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=93885"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=93885"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}