{"id":129007,"date":"2021-03-30T13:11:02","date_gmt":"2021-03-30T12:11:02","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=space&#038;p=129007"},"modified":"2021-03-30T13:11:02","modified_gmt":"2021-03-30T12:11:02","slug":"prise-en-charge-des-builds-multi-referentiels-dans-space-automation","status":"publish","type":"space","link":"https:\/\/blog.jetbrains.com\/fr\/space\/2021\/03\/30\/prise-en-charge-des-builds-multi-referentiels-dans-space-automation\/","title":{"rendered":"Prise en charge des builds multi-r\u00e9f\u00e9rentiels dans Space Automation"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2021\/03\/title_image.png\" alt=\"Prise en charge des builds multi-r\u00e9f\u00e9rentiels dans Space Automation\" \/><\/p>\n<p>Nous avons r\u00e9cemment ajout\u00e9 de nouvelles fonctionnalit\u00e9s \u00e0 Space Automation (la partie de <a href=\"https:\/\/www.jetbrains.com\/space\/\" target=\"_blank\" rel=\"noopener\">JetBrains Space<\/a> responsable de l&#8217;int\u00e9gration et du d\u00e9ploiement continus) qui permettent \u00e0 vos scripts d&#8217;automatisation de fonctionner avec plusieurs r\u00e9f\u00e9rentiels Git.<\/p>\n<p>Voici en r\u00e9sum\u00e9 ce qui a chang\u00e9\u00a0:<\/p>\n<ol>\n<li>\n<p>Une t\u00e2che (job) peut maintenant copier n&#8217;importe quel r\u00e9f\u00e9rentiel au sein du projet (pas seulement celui qui contient le script d&#8217;automatisation en cours).<\/p>\n<\/li>\n<li>\n<p>L&#8217;automatisation peut d\u00e9sormais d\u00e9clencher l&#8217;ex\u00e9cution d&#8217;une t\u00e2che en cas de changements dans un r\u00e9f\u00e9rentiel, une branche, un r\u00e9pertoire ou un fichier.<\/p>\n<\/li>\n<\/ol>\n<p><span id=\"more-124852\"><\/span><\/p>\n<p>Dans quels cas est-ce utile\u00a0? Par exemple, vous avez un projet bas\u00e9 sur des microservices (chacun dans un r\u00e9f\u00e9rentiel s\u00e9par\u00e9) et un r\u00e9f\u00e9rentiel s\u00e9par\u00e9 avec des tests d&#8217;int\u00e9gration qui s&#8217;ex\u00e9cutent dans tout le projet. Un autre exemple concret\u00a0: un projet qui se compose de plusieurs r\u00e9f\u00e9rentiel, chaque r\u00e9f\u00e9rentiel ayant son propre dossier <code>doc\/<\/code> avec sa documentation. En utilisant Automation, vous pouvez configurer une t\u00e2che qui suit les changements dans les dossiers <code>doc\/<\/code> de tous ces r\u00e9f\u00e9rentiels, construit et un site web de documentation interne et le d\u00e9ploie.<\/p>\n<p>Poursuivez votre lecture pour en savoir plus !<\/p>\n<h2>Copier du code source<\/h2>\n<p>Normalement, dans Space Automation, vous n&#8217;avez pas \u00e0 copier &quot;de code source&quot;. Chaque fois qu&#8217;une t\u00e2che est lanc\u00e9e, Automation clone la branche actuelle du r\u00e9f\u00e9rentiel qui contient le script en cours d&#8217;ex\u00e9cution.<br \/>\nMaintenant, si une t\u00e2che requiert du contenu d&#8217;un autre r\u00e9f\u00e9rentiel dans un projet, vous pouvez copier de ce r\u00e9f\u00e9rentiel en plus du r\u00e9f\u00e9rentiel principal. Il vous suffit de sp\u00e9cifier le nom du second r\u00e9f\u00e9rentiel dans le bloc <code>git<\/code>\u00a0:<\/p>\n<pre><code class=\"language-kotlin\">job(&quot;check out second repo&quot;) {\n    \/\/ check out second-repo to \/mnt\/space\/work\/repo-2\n    git(&quot;second-repository&quot;) {\n        \/\/ the default path is \/mnt\/space\/work\/$repoName\n        \/\/ but you can change it with cloneDir\n        cloneDir = &quot;repo-2&quot;\n    }\n\n    container(&quot;ubuntu&quot;) {\n        shellScript {\n            content = &quot;&quot;&quot;\n                echo Directory structure\n                ls -R \/mnt\n                echo Working dir is\n                pwd\n            &quot;&quot;&quot;\n        }\n    }\n}\n\/\/ the \/mnt\/space\/work dir will contain the current and the second repo\n\/\/ \/mnt\/space\/work\/main-repo ; \/mnt\/space\/work\/repo-2\n\/\/ Working dir is \/mnt\/space\/work\/main-repo<\/code><\/pre>\n<p>Ce n&#8217;est pas tout\u00a0! Maintenant, vous avez \u00e9galement choisir quelles donn\u00e9es du r\u00e9f\u00e9rentiel vous voulez r\u00e9cup\u00e9rer : vous pouvez ainsi extraire des balises, des branches sp\u00e9cifiques ou des r\u00e9visions. <a href=\"https:\/\/jetbrains.com\/help\/space\/check-out-project-sources.html#fetching-data-on-other-branches-and-revisions\" target=\"_blank\" rel=\"noopener\">Vous trouverez plus d&#8217;informations \u00e0 ce sujet dans la documentation sur Automation<\/a><\/p>\n<h2>D\u00e9clencher l&#8217;ex\u00e9cution d&#8217;une t\u00e2che en cas de changements dans une branche, un dossier ou un fichier<\/h2>\n<p>Par d\u00e9faut, lorsqu&#8217;un commit est pouss\u00e9 vers une branche sp\u00e9cifique du r\u00e9f\u00e9rentiel, Automation d\u00e9clenche l&#8217;ex\u00e9cution d&#8217;un script dans cette branche. \u00c9videmment, cela fonctionne pour toutes les branches du r\u00e9f\u00e9rentiel. Pour ex\u00e9cuter le script uniquement dans certains r\u00e9f\u00e9rentiels, utilisez le param\u00e8tre <code>branchFilter<\/code> \u00e0 l&#8217;int\u00e9rieur du bloc <code>gitPush<\/code>.<\/p>\n<p>Par exemple, pour d\u00e9clencher des t\u00e2ches uniquement dans la branche <code>my-feature<\/code>\u00a0:<\/p>\n<pre><code class=\"language-kotlin\">job(&quot;Run on git push&quot;) {\n    startOn {\n        gitPush {\n            branchFilter {\n                +&quot;refs\/heads\/my-feature&quot;\n            }\n        }\n    }\n}<\/code><\/pre>\n<p>Notez que <code>branchFilter<\/code> prend en charge <a href=\"https:\/\/jetbrains.com\/help\/space\/run-a-job-on-event-trigger.html#branchFilter\" target=\"_blank\" rel=\"noopener\">Regex, les r\u00e8gles d&#8217;exclusion et d&#8217;inclusion et les m\u00e9tacaract\u00e8res<\/a>.<\/p>\n<p>Pour d\u00e9clencher l&#8217;ex\u00e9cution d&#8217;une t\u00e2che en cas de modification des fichiers et des dossiers, utilisez le bloc <code>pathFilter<\/code> (comme <code>bran\u0441hFilter<\/code>, il prend en charge <a href=\"https:\/\/jetbrains.com\/help\/space\/run-a-job-on-event-trigger.html#filter-by-path\" target=\"_blank\" rel=\"noopener\">la cr\u00e9ation de filtres complexes<\/a>)\u00a0:<\/p>\n<pre><code class=\"language-kotlin\">job(&quot;Run on git push&quot;) {\n    startOn {\n        gitPush {\n            pathFilter {\n                \/\/ include all from &#039;targets&#039; directory\n                +&quot;targets\/**&quot;\n                \/\/ exclude &#039;targets\/main&#039; directory\n                -&quot;targets\/main\/**&quot;\n                \/\/ include all &#039;Main.kt&#039; files in the project\n                \/\/ As this rule is more specific,\n                \/\/ &#039;Main.kt&#039; will be included even if\n                \/\/ it&#039;s located in &#039;targets\/main&#039;\n                +&quot;**\/Main.kt&quot;\n            }\n        }\n    }\n}<\/code><\/pre>\n<h2>D\u00e9clencher l&#8217;ex\u00e9cution d&#8217;une t\u00e2che en cas de changements dans un autre dossier<\/h2>\n<p>Il peut arriver que vous ayez besoin de configurer un build qui utilise le code source de plusieurs r\u00e9f\u00e9rentiels de projets. Par exemple, vous pouvez cr\u00e9er un r\u00e9f\u00e9rentiel s\u00e9par\u00e9 qui contiendra le script de build pour l&#8217;ensemble du projet tandis que les autres r\u00e9f\u00e9rentiels n&#8217;auront aucun fichier <code>.space.kts<\/code>.<\/p>\n<p>Prenons l&#8217;exemple le plus simple possible. Disons que vous avez un projet avec deux r\u00e9f\u00e9rentiels\u00a0: <code>first-repository<\/code> et <code>second-repository<\/code>. Vous ajoutez le fichier <code>.space.kts<\/code> suivant au r\u00e9f\u00e9rentiel <code>first-repository<\/code>\u00a0:<\/p>\n<pre><code class=\"language-kotlin\">job(&quot;Run on change in second-repository&quot;) {\n    startOn {\n       gitPush {\n            repository = &quot;second-repository&quot;\n        }\n    }\n\n    \/\/ don&#039;t forget to check out \n    \/\/ the content of second-repo\n    git(&quot;second-repository&quot;)\n\n    container(&quot;alpine&quot;) {\n        shellScript {\n            content = &quot;ls \/mnt\/space\/work&quot;\n        }\n    }\n}<\/code><\/pre>\n<p>Comment cela se pr\u00e9sente-t-il dans l&#8217;interface utilisateur\u00a0? Si vous ouvrez la page <strong>Jobs<\/strong> pour <code>first-repository<\/code>, vous ne verrez rien de nouveau, juste une ex\u00e9cution normale de la t\u00e2che\u00a0:<\/p>\n<p><a href=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2021\/03\/gitPush-multiRepo-UI-firstRepo.png\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2021\/03\/gitPush-multiRepo-UI-firstRepo.png\" alt=\"Space Automation. Prise en charge multi-r\u00e9f\u00e9rentielle dans le d\u00e9clencheur gitPush\" \/><\/a><\/p>\n<p>Mais si vous passez \u00e0 la liste des t\u00e2ches pour <code>second-repository<\/code>, vous verrez qu&#8217;elle comprend des <strong>t\u00e2ches cross-r\u00e9f\u00e9renc\u00e9es<\/strong> \u2013 des t\u00e2ches d&#8217;autres r\u00e9f\u00e9rentiels li\u00e9es au r\u00e9f\u00e9rentiel actuellement s\u00e9lectionn\u00e9. Dans notre cas, cette t\u00e2che est celle du <code>first-repository<\/code>\u00a0:<\/p>\n<p><a href=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2021\/03\/gitPush-multiRepo-UI-crossRefJobs_2.png\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2021\/03\/gitPush-multiRepo-UI-crossRefJobs_2.png\" alt=\"Space Automation. Prise en charge multi-r\u00e9f\u00e9rentielle dans le d\u00e9clencheur gitPush\" \/><\/a><\/p>\n<p>Bien s\u00fbr, vous pouvez aller plus loin et ajouter un niveau suppl\u00e9mentaire au d\u00e9clencheur du r\u00e9f\u00e9rentiel : filtrer par une branche ou un chemin. Retrouvez plus de d\u00e9tails dans la <a href=\"https:\/\/jetbrains.com\/help\/space\/run-a-job-on-event-trigger.html#triggering-a-job-run-on-changes-in-certain-project-repositories\" target=\"_blank\" rel=\"noopener\">documentation pour Automation<\/a>.<\/p>\n<p>N&#8217;h\u00e9sitez pas \u00e0 nous faire part de vos commentaires et \u00e0 essayer ces nouvelles fonctionnalit\u00e9s\u00a0!<\/p>\n<p><em>Auteur de l&#8217;article original en anglais : <a href=\"https:\/\/blog.jetbrains.com\/author\/alexey-totin\/\" target=\"_blank\" rel=\"noopener noreferrer\">Alexey Totin<\/a><\/em><\/p>\n","protected":false},"author":813,"featured_media":124991,"comment_status":"closed","ping_status":"closed","template":"","categories":[1401,4331],"tags":[4068,164,285,6495,6438],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/space\/129007"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/space"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/types\/space"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/users\/813"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/comments?post=129007"}],"version-history":[{"count":1,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/space\/129007\/revisions"}],"predecessor-version":[{"id":129008,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/space\/129007\/revisions\/129008"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media\/124991"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media?parent=129007"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/categories?post=129007"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/tags?post=129007"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/cross-post-tag?post=129007"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}