{"id":248102,"date":"2022-04-14T10:04:46","date_gmt":"2022-04-14T09:04:46","guid":{"rendered":"https:\/\/blog.jetbrains.com\/qodana\/2022\/04\/why-do-testers-need-ci-cd\/"},"modified":"2025-09-18T13:43:24","modified_gmt":"2025-09-18T12:43:24","slug":"pourquoi-adopter-lapproche-ci-cd-pour-les-tests","status":"publish","type":"qodana","link":"https:\/\/blog.jetbrains.com\/fr\/qodana\/2022\/04\/pourquoi-adopter-lapproche-ci-cd-pour-les-tests\/","title":{"rendered":"Pourquoi adopter l&#8217;approche CI\/CD pour les tests ?"},"content":{"rendered":"\n<p>Avoir des comp\u00e9tences en TestOps est aujourd&#8217;hui une n\u00e9cessit\u00e9 pour les ing\u00e9nieurs assurance qualit\u00e9, au m\u00eame titre que la capacit\u00e9 \u00e0 \u00e9crire des tests automatis\u00e9s. Cela est d\u00fb \u00e0 l&#8217;am\u00e9lioration continue de l&#8217;approche CI\/CD et au nombre croissant d&#8217;ing\u00e9nieurs assurance qualit\u00e9 qui travaillent avec des pipelines (s\u00e9quence des \u00e9tapes de CI\/CD) et impl\u00e9mentent leurs propres pipelines. Pourquoi le CI\/CD est-il aussi efficace pour le contr\u00f4le de la qualit\u00e9&nbsp;? C&#8217;est ce que nous allons voir dans cet article.<\/p>\n\n\n\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/OtG44KqsW2bqQvcGbjAXFzjAwUX-H4LnhzqNKFp8Ey-KZQBughAsV8OeVQmqUOaVXa238O9AMbWk4zmn25XzGwca78GKRodkn5sJOc9Al1c_3qan7_CP1r7DHblnvptfZ4Eyfrwl.jpg\" width=\"598\" height=\"533\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ex\u00e9cution automatique des tests<\/h2>\n\n\n\n<p>Les tests automatis\u00e9s ne sont plus ex\u00e9cut\u00e9s localement depuis bien longtemps. De nos jours, l&#8217;ex\u00e9cution automatique des tests est l&#8217;une des principales fonctions des pipelines de CI\/CD.<\/p>\n\n\n\n<p>La configuration du pipeline peut \u00eatre assign\u00e9e au DevOps. Mais il serait dommage de se priver de la deuxi\u00e8me fonction du CI\/CD&nbsp;: le contr\u00f4le de la qualit\u00e9, ou plus pr\u00e9cis\u00e9ment, les \u00ab&nbsp;murs qualit\u00e9&nbsp;\u00bb.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Le contr\u00f4le de la qualit\u00e9 \u00e0 l&#8217;aide des murs qualit\u00e9<\/h2>\n\n\n\n<p>Mais, que sont les murs qualit\u00e9&nbsp;? Imaginons que le code d&#8217;un produit constitue un ch\u00e2teau. Chaque jour, les d\u00e9veloppeurs \u00e9crivent du nouveau code, ce qui est susceptible de fragiliser les fondations du ch\u00e2teau, voire de les d\u00e9t\u00e9riorer. L&#8217;objectif d&#8217;un ing\u00e9nieur assurance qualit\u00e9 est de tester chaque fonctionnalit\u00e9 et de r\u00e9duire la probabilit\u00e9 que des bugs se retrouvent dans le code du produit. Le manque d&#8217;automatisation du processus d&#8217;assurance qualit\u00e9 peut faire passer des nuits blanches aux ing\u00e9nieurs car il n&#8217;y a personne pour surveiller les diff\u00e9rents indicateurs, surtout \u00e0 des moments critiques comme le vendredi soir, lorsque tout le monde a envie de quitter le travail au plus vite. Une mauvaise fusion \u00e0 ce moment-l\u00e0 peut engendrer beaucoup de probl\u00e8mes par la suite.<\/p>\n\n\n\n<p><em>Ce probl\u00e8me peut \u00eatre r\u00e9solu par la cr\u00e9ation de contr\u00f4les de la qualit\u00e9 pour les indicateurs importants.<\/em><\/p>\n\n\n\n<p>Chaque contr\u00f4le porte sur une m\u00e9trique diff\u00e9rente. Si le code ne passe pas un contr\u00f4le, le mur emp\u00eache la fonctionnalit\u00e9 d&#8217;entrer. Une fonctionnalit\u00e9 est int\u00e9gr\u00e9e au produit seulement si elle passe tous les contr\u00f4les et si les bugs potentiels ont \u00e9t\u00e9 \u00e9vit\u00e9s.<\/p>\n\n\n\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/xvVYg4Iv5QvdnY9m0t1jFHbQQBCCuqkcgHjkogmQihNIy9Bmf5xnk1cDKjJGJke0FpMJcVoyzSjkQyJh2giCPo9GErs68FgXWU2186k16L-xxou5LGhFm4H0mN4QNhqKe_x7KB2D.jpg\" width=\"587\" height=\"555\"><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Quels contr\u00f4les de la qualit\u00e9 peuvent \u00eatre inclus dans le CI\/CD&nbsp;?<\/h3>\n\n\n\n<p>Il faut \u00e9laborer une liste de v\u00e9rifications pour s&#8217;assurer que le processus soit aussi automatis\u00e9 que possible. Elle peut \u00eatre organis\u00e9e de fa\u00e7on \u00e0 ce que les v\u00e9rifications cruciales aient lieu en premier. Une fonctionnalit\u00e9 doit passer toutes les v\u00e9rifications pour arriver au terme du pipeline avec succ\u00e8s. Les v\u00e9rifications initiales permettent de s&#8217;assurer que l&#8217;application est capable de fonctionner&nbsp;: build, v\u00e9rification du style de code et analyse statique.&nbsp;<\/p>\n\n\n\n<p>S&#8217;agissant du \u00ab&nbsp;build&nbsp;\u00bb : si la phase de construction de l&#8217;application ne se passe pas bien, la fonctionnalit\u00e9 ne progresse pas. Il est important d&#8217;int\u00e9grer une v\u00e9rification du style du code dans votre pipeline de CI\/CD pour vous assurer que le code r\u00e9ponde bien aux standards de votre entreprise : cela vous \u00e9vitera de perdre du temps sur ce type de bugs lors des r\u00e9visions de code.<\/p>\n\n\n\n<p>L&#8217;analyse statique est un outil extr\u00eamement important pour \u00e9valuer la qualit\u00e9 du code. Elle permet de mettre en \u00e9vidence un grand nombre d&#8217;erreurs critiques pouvant provoquer des bugs.<\/p>\n\n\n\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/JOj7Yn_ie9RqZWOePgNEhL6Vb-24W6J92TcRTOV4WfTJ_uop5FtG8SHS2zHQ75ZZjy6D1eljT1YpXklbUVIKKL83vVW6MaQOaZyNcGJtXRqZAKX8eXUWvFoMDY3fPLJK8fsXzOh0.jpg\" style=\"\"><\/p>\n\n\n\n<p>Continuons avec les v\u00e9rifications de la deuxi\u00e8me \u00e9tape&nbsp;: les tests unitaires avec analyse de la couverture et contr\u00f4le de la qualit\u00e9 de la couverture, les tests d&#8217;int\u00e9gration et les tests syst\u00e8mes. Nous examinons ensuite les rapports d\u00e9taill\u00e9s des r\u00e9sultats pour nous assurer que rien n&#8217;a \u00e9t\u00e9 oubli\u00e9. \u00c0 ce stade, on peut aussi effectuer une s\u00e9rie de tests non fonctionnels pour v\u00e9rifier les performances, la facilit\u00e9 d&#8217;utilisation et la s\u00e9curit\u00e9, ainsi que des tests de capture d&#8217;\u00e9cran.&nbsp;<\/p>\n\n\n\n<p>Lors du d\u00e9veloppement d&#8217;un pipeline, nous devons pr\u00eater attention \u00e0 deux exigences contradictoires&nbsp;:&nbsp;<\/p>\n\n\n\n<ul>\n<li>Le pipeline doit garantir la meilleure qualit\u00e9 possible pour les fonctionnalit\u00e9s compte tenu de vos besoins.<\/li>\n\n\n\n<li>Le temps consacr\u00e9 \u00e0 l&#8217;ex\u00e9cution du pipeline ne doit pas ralentir votre workflow. G\u00e9n\u00e9ralement, cela ne doit pas prendre plus de 20 minutes.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Exemples d&#8217;outils \u00e0 int\u00e9grer dans vos contr\u00f4les de la qualit\u00e9<\/h3>\n\n\n\n<p><strong>Mise en \u00e9vidence du style de code<\/strong><\/p>\n\n\n\n<p>Un style de code est un ensemble de r\u00e8gles qui doivent \u00eatre suivies dans chaque ligne de code d&#8217;un projet, qui vont des r\u00e8gles d&#8217;alignement \u00e0 des r\u00e8gles comme \u00ab&nbsp;ne jamais utiliser de variables globales&nbsp;\u00bb.<br><br>Vous vous demandez peut-\u00eatre ce que le style a \u00e0 voir avec les testeurs. Eh bien beaucoup en fait&nbsp;! Une v\u00e9rification du style pr\u00e9sente plusieurs avantages pour les experts de l&#8217;assurance qualit\u00e9, mais aussi pour le reste de l&#8217;\u00e9quipe&nbsp;:<\/p>\n\n\n\n<ul>\n<li>Un style unifi\u00e9 facilite le travail des d\u00e9veloppeurs avec le code et leur permet d&#8217;avoir plus de temps \u00e0 consacrer \u00e0 l&#8217;impl\u00e9mentation de nouvelles fonctionnalit\u00e9s et \u00e0 la correction des bugs.<\/li>\n\n\n\n<li>Un style unifi\u00e9 vous permet de vous dispenser des v\u00e9rifications du code manuelles et d&#8217;utiliser un outil de CI\/CD pour ex\u00e9cuter les v\u00e9rifications \u00e0 la place.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>Les grandes entreprises ont g\u00e9n\u00e9ralement leurs propres guides de style qui peuvent servir d&#8217;exemples. Par exemple, Airbnb dispose d&#8217;un <a href=\"https:\/\/github.com\/airbnb\/javascript\" target=\"_blank\" rel=\"noreferrer noopener\">guide de style JavaScript<\/a> et Google a \u00e9galement <a href=\"https:\/\/google.github.io\/styleguide\/\" target=\"_blank\" rel=\"noreferrer noopener\">plusieurs guides<\/a>. Vous pouvez m\u00eame \u00e9crire votre propre guide.<\/p>\n\n\n\n<p>Le choix des outils pour les v\u00e9rifications de code d\u00e9pend du langage. Vous pouvez trouver un outil adapt\u00e9 sur <a href=\"https:\/\/github.com\/collections\/clean-code-linters\" target=\"_blank\" rel=\"noreferrer noopener\">GitHub<\/a> ou d\u00e9couvrir les outils utilis\u00e9s par d&#8217;autres \u00e9quipes. Les linters utilisent un ensemble de r\u00e8gles et mettent en \u00e9vidence le code qui ne les respecte pas. Quelques exemples : <a href=\"https:\/\/github.com\/pinterest\/ktlint\" target=\"_blank\" rel=\"noreferrer noopener\">ktlint<\/a> pour Kotlin, <a href=\"https:\/\/github.com\/checkstyle\/checkstyle\" target=\"_blank\" rel=\"noreferrer noopener\">checkstyle<\/a> pour Java et <a href=\"https:\/\/github.com\/eslint\/eslint\" target=\"_blank\" rel=\"noreferrer noopener\">eslint<\/a> pour JavaScript.<\/p>\n\n\n\n<p><strong>Analyse de code statique<\/strong><\/p>\n\n\n\n<p>L&#8217;analyse du code statique est une m\u00e9thode de d\u00e9bogage qui consiste \u00e0 examiner le code source sans ex\u00e9cuter le programme. Il existe de nombreux analyseurs de code statique diff\u00e9rents sur le march\u00e9. Nous allons examiner plus en d\u00e9tail la plateforme que nous sommes en train de d\u00e9velopper nous-m\u00eame&nbsp;: <a href=\"https:\/\/www.jetbrains.com\/fr-fr\/qodana\/\" target=\"_blank\" rel=\"noreferrer noopener\">Qodana<\/a>. Le principal avantage de cet analyseur de code est qu&#8217;il inclut un certain nombre d&#8217;inspections disponibles dans les environnements de d\u00e9veloppement JetBrains lorsque nous \u00e9crivons du code.<\/p>\n\n\n\n<p>Beaucoup d&#8217;entre vous utilisent probablement une approche dans laquelle l&#8217;IDE vous aide \u00e0 \u00e9crire le code et vous signale les bugs tels que l&#8217;utilisation sous-optimale du code, les exceptions NullPointerExceptions, les doublons, etc.<\/p>\n\n\n\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/l2spCDgt3blzH9VthoB_x9Ggu2LPZeoFb1xXu2qCWtxiJmRyvFlz3kroFxXMt56ZG5xxavyJHvqbrsStGSiuNyN32d-28i2heLtb8sXVYMHcFwBVXHxBXtIlsQ68EgrQyJIQEO-nXXz_Es4_yQQ.png\" style=\"\"><\/p>\n\n\n\n<p>Mais malheureusement, on ne peut jamais garantir que tous les probl\u00e8mes critiques identifi\u00e9s par l&#8217;IDE aient \u00e9t\u00e9 corrig\u00e9s avant le commit. <strong>L&#8217;int\u00e9gration de Qodana dans votre pipeline de CI\/CD<\/strong> vous assure que tous les probl\u00e8mes soient bien trait\u00e9s. Si l&#8217;ensemble des probl\u00e8mes ne peuvent \u00eatre r\u00e9solus en une seule fois, vous pouvez s\u00e9lectionner les plus importants, les ajouter \u00e0 la base de r\u00e9f\u00e9rence et r\u00e9duire progressivement la dette technique. Vous \u00e9vitez ainsi de ralentir le processus de d\u00e9veloppement tout en gardant les probl\u00e8mes identifi\u00e9s sous contr\u00f4le.<\/p>\n\n\n\n<p><strong>Couverture de tests<\/strong><\/p>\n\n\n\n<p>La couverture du code est une m\u00e9trique qui vous aide \u00e0 comprendre dans quelle mesure votre code a \u00e9t\u00e9 couvert par vos tests (g\u00e9n\u00e9ralement des tests unitaires).<br><br>Ici, vous devez d\u00e9finir le pourcentage de couverture minimum qui doit \u00eatre pris en charge. Le code ne peut \u00eatre mis en production que lorsqu&#8217;il a \u00e9t\u00e9 suffisamment couvert par les tests. Le pourcentage minimum est \u00e9tabli de mani\u00e8re empirique, mais il faut garder \u00e0 l&#8217;esprit que m\u00eame avec une couverture de 100&nbsp;%, tous les bugs ne peuvent pas \u00eatre \u00e9vit\u00e9s. Selon <a href=\"https:\/\/www.atlassian.com\/continuous-delivery\/software-testing\/code-coverage\" target=\"_blank\" rel=\"noreferrer noopener\">cet article<\/a> d&#8217;Atlassian, une couverture de 80&nbsp;% constitue un bon objectif \u00e0 viser.<br><br>Il existe diff\u00e9rents analyseurs de couverture pour diff\u00e9rents langages, tels que <a href=\"https:\/\/github.com\/jacoco\/jacoco\" target=\"_blank\" rel=\"noreferrer noopener\">Jacoco<\/a> pour Java, <a href=\"https:\/\/github.com\/istanbuljs\" target=\"_blank\" rel=\"noreferrer noopener\">Istanbul<\/a> pour JavaScript ou <a href=\"https:\/\/github.com\/nedbat\/coveragepy\" target=\"_blank\" rel=\"noreferrer noopener\">Coverage.py<\/a> pour Python. Vous pouvez int\u00e9grer tous ces analyseurs dans votre pipeline de CI\/CD et suivre facilement les m\u00e9triques.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fa\u00e7onnage du processus de publication<\/h2>\n\n\n\n<p>En plus d&#8217;ex\u00e9cuter automatiquement les tests et d&#8217;assurer que certaines exigences de qualit\u00e9 du code soient respect\u00e9es, le CI\/CD permet aux testeurs d&#8217;organiser le processus de publication.<\/p>\n\n\n\n<p>Ce processus peut \u00eatre complexe et d\u00e9pendre d&#8217;un grand nombre d&#8217;actions manuelles diff\u00e9rentes. Il s&#8217;agit souvent d&#8217;un processus enti\u00e8rement manuel&nbsp;: l&#8217;artefact est cr\u00e9\u00e9 par un d\u00e9veloppeur, puis transmis aux testeurs pour v\u00e9rification, et enfin \u00e0 la personne charg\u00e9e de le d\u00e9ployer. Une fois encore, il existe de nombreux goulots d&#8217;\u00e9tranglement potentiels. Par exemple, il est possible que l&#8217;une de ces personnes tombe malade ou parte en vacances.&nbsp;<\/p>\n\n\n\n<p>Les crit\u00e8res d&#8217;efficacit\u00e9 du processus de publication diff\u00e8rent en fonction des \u00e9quipes, mais il comprend g\u00e9n\u00e9ralement les \u00e9tapes suivantes&nbsp;:&nbsp;<\/p>\n\n\n\n<ol>\n<li>Chaque modification dans la branche Git d\u00e9clenche un build de l&#8217;application.<\/li>\n\n\n\n<li>Le build est soumis \u00e0 des contr\u00f4les de la qualit\u00e9 et ne devient pas une partie de la branche principale tant qu&#8217;il n&#8217;a pas pass\u00e9 tous les contr\u00f4les avec succ\u00e8s.<\/li>\n\n\n\n<li>Une version candidate stable est extraite de la branche de version ou de la branche principale : cela fixe la version et garantit que rien ne sera publi\u00e9 sans avoir \u00e9t\u00e9 test\u00e9 et qu&#8217;il n&#8217;y aura pas de modification ult\u00e9rieure. Il est ainsi plus facile de contr\u00f4ler les versions et toutes les modifications qu&#8217;elles contiennent. En outre, en stockant les artefacts de la version stable, vous permettez d&#8217;y revenir rapidement si la version publi\u00e9e ne fonctionne pas correctement.<\/li>\n\n\n\n<li>La version stable est test\u00e9e et fait l&#8217;objet de v\u00e9rifications finales.<\/li>\n\n\n\n<li>La version candidate stable est publi\u00e9e. Il peut s&#8217;agir d&#8217;un lancement de pipeline manuelle ou automatis\u00e9, si la version candidate a pass\u00e9 tous les contr\u00f4les de l&#8217;\u00e9tape pr\u00e9c\u00e9dente. Le choix entre un processus de publication automatique et manuel d\u00e9pend de la fr\u00e9quence et de l&#8217;importance des publications, ainsi que des pr\u00e9f\u00e9rences des membres de l&#8217;\u00e9quipe et de la facilit\u00e9 du d\u00e9ploiement.<\/li>\n<\/ol>\n\n\n\n<p>Tout syst\u00e8me de CI\/CD vous permet de configurer ce type de processus. Le processus doit \u00eatre pratique pour tous les membres l&#8217;\u00e9quipe, y compris pour les personnes qui sont charg\u00e9es des tests.<\/p>\n\n\n\n<p><em>Compte tenu des diff\u00e9rents facteurs d\u00e9crits ci-dessus, il nous semble important de respecter les r\u00e8gles de base suivantes pour garantir la fluidit\u00e9 et l&#8217;efficacit\u00e9 du processus de publication :<\/em><\/p>\n\n\n\n<ul>\n<li>Les artefacts doivent \u00eatre pr\u00eats \u00e0 \u00eatre t\u00e9l\u00e9charg\u00e9s et test\u00e9s, id\u00e9alement au m\u00eame endroit.<\/li>\n\n\n\n<li>Il faut automatiser le plus grand nombre de contr\u00f4les et de tests possibles. Ils doivent se d\u00e9rouler sans intervention humaine.<\/li>\n\n\n\n<li>Toutes les op\u00e9rations complexes avec les builds doivent \u00eatre aussi automatis\u00e9es que possible.<\/li>\n\n\n\n<li>Tous les builds mis en production doivent \u00eatre enregistr\u00e9s et rester disponibles pendant un certain temps apr\u00e8s leur publication. Cela vous sera utile si vous devez rechercher des erreurs dans la version de production, reproduire des bugs ou simplement faire un suivi de l&#8217;historique.<\/li>\n<\/ul>\n\n\n\n<p>Les m\u00e9triques de qualit\u00e9 sont inutiles si elles ne sont pas contr\u00f4l\u00e9es automatiquement et n&#8217;ont d&#8217;impact sur aucun \u00e9l\u00e9ment, car il n&#8217;y a aucun moyen de garantir qu&#8217;elles seront respect\u00e9es.&nbsp;<\/p>\n\n\n\n<p>Impl\u00e9mentez des pipelines, automatisez vos processus et utilisez l&#8217;analyse statique du code&nbsp;!<\/p>\n\n\n\n<p><em>L&#8217;\u00c9quipe Qodana<\/em><\/p>\n\n\n\n<p><em>Auteur de l&#8217;article original en anglais<\/em> :<\/p>\n\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":813,"featured_media":249641,"comment_status":"closed","ping_status":"closed","template":"","categories":[4089,89],"tags":[165,4068,228,6359,2538],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/qodana\/248102"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/qodana"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/types\/qodana"}],"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=248102"}],"version-history":[{"count":10,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/qodana\/248102\/revisions"}],"predecessor-version":[{"id":632427,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/qodana\/248102\/revisions\/632427"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media\/249641"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media?parent=248102"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/categories?post=248102"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/tags?post=248102"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/cross-post-tag?post=248102"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}