{"id":3406,"date":"2023-11-08T09:43:48","date_gmt":"2023-11-08T07:43:48","guid":{"rendered":"https:\/\/www.h-hennes.fr\/blog\/?p=3406"},"modified":"2023-11-09T15:02:09","modified_gmt":"2023-11-09T13:02:09","slug":"prestashop-est-ce-que-mon-site-fonctionne-toujours-apres-ma-livraison-de-code","status":"publish","type":"post","link":"https:\/\/www.h-hennes.fr\/blog\/2023\/11\/08\/prestashop-est-ce-que-mon-site-fonctionne-toujours-apres-ma-livraison-de-code\/","title":{"rendered":"Prestashop : Est-ce que mon site fonctionne toujours apr\u00e8s ma livraison de code."},"content":{"rendered":"\n<p>Cet article est le 5\u00e8me de la s\u00e9rie sur le d\u00e9ploiement et l\u2019int\u00e9gration continu dans Prestashop.<br>Les autres articles de cette s\u00e9rie sont les suivants :<\/p>\n\n\n\n<ul>\n<li><a title=\"Prestashop : Aller plus loin dans le d\u00e9ploiement continu\" href=\"https:\/\/www.h-hennes.fr\/blog\/2023\/09\/11\/prestashop-aller-plus-loin-dans-le-deploiement-continu\/\">Introduction<\/a><\/li>\n<li><a href=\"https:\/\/www.h-hennes.fr\/blog\/2023\/09\/16\/prestashop-deploiement-continu-initialisation-du-projet\/\">Initialisation du projet<\/a><\/li>\n<li><a title=\"Prestashop : D\u00e9ploiement continu, qui peut livrer du code et ou\" href=\"https:\/\/www.h-hennes.fr\/blog\/2023\/09\/18\/prestashop-deploiement-continu-qui-peut-livrer-du-code-et-ou\/\">Qui peut livrer du code et ou<\/a><\/li>\n<li><a title=\"Prestashop : D\u00e9ploiement continu, v\u00e9rifier la qualit\u00e9 du code\" href=\"https:\/\/www.h-hennes.fr\/blog\/2023\/09\/22\/prestashop-deploiement-continu-verifier-la-qualite-du-code\/\">Est-ce que la qualit\u00e9 du code livr\u00e9e est correcte<\/a><\/li>\n<li><a title=\"Prestashop : Comment limiter les interactions manuelles avec le d\u00e9ploiement continu\" href=\"https:\/\/www.h-hennes.fr\/blog\/2023\/11\/06\/prestashop-comment-limiter-les-interactions-manuelles-avec-le-deploiement-continu\/\">Comment limiter les interactions manuelles<\/a><\/li>\n<li><a title=\"Prestashop : Est-ce que mon site fonctionne toujours apr\u00e8s ma livraison de code.\" href=\"https:\/\/www.h-hennes.fr\/blog\/2023\/11\/08\/prestashop-est-ce-que-mon-site-fonctionne-toujours-apres-ma-livraison-de-code\/\">Est-ce que mon site fonctionne toujours apr\u00e8s ma livraison de code.<\/a><\/li>\n<\/ul>\n\n\n\n<p>Pour finir nos \u00e9tapes de d\u00e9ploiement continu, une question se pose toujours apr\u00e8s la livraison du code.<br>Est-ce que mon site fonctionne toujours ? <br>Est-ce que le module que j&rsquo;ai install\u00e9 ne casse rien ?<\/p>\n<p>Pour r\u00e9pondre \u00e0 cette question, il est souvent n\u00e9cessaire de faire des tests manuels des parcours critiques.<br>C&rsquo;est long et r\u00e9p\u00e9titif, mais nous allons voir \u00e0 travers cette \u00e9tape comment mettre en place des tests fonctionnels qui vont v\u00e9rifier ce comportement pour nous \ud83d\ude42<br><br>Pour cela nous allons utiliser la librairie playwright : <a href=\"https:\/\/playwright.dev\/\" target=\"_blank\" rel=\"noopener\">https:\/\/playwright.dev\/&nbsp;<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Playwright<\/h2>\n\n\n\n<p>Cette librairie est utilis\u00e9e par Prestashop pour faire l&rsquo;ensemble des tests automatis\u00e9s de la solution.<br>Il existe d\u00e9j\u00e0 des tests qui couvrent de grandes parties de la solution.<br><br>Pour autant ils sont beaucoup trop nombreux pour \u00eatre lanc\u00e9s \u00e0 chaque d\u00e9ploiement de code.<br>C&rsquo;est pourquoi nous allons uniquement nous concentrer sur les parcours critiques.<br><br>Pour l&rsquo;exemple de ce tutoriel nous v\u00e9rifierons 3 sc\u00e9narios :<\/p>\n<ul>\n<li>Recherche produit<\/li>\n<li>Login en front office<\/li>\n<li>Ajout d&rsquo;un produit au panier<\/li>\n<\/ul>\n<p>Libre \u00e0 vous ensuite de vous en inspirer pour ajouter d&rsquo;autres cas, la librairie est tr\u00e8s simple \u00e0 prendre en main.<\/p>\n<p>Nous allons ajouter la librairie dans un dossier <strong>tests\/e2e<\/strong> ( end to end ) en suivant la documentation officielle :&nbsp; <a href=\"https:\/\/playwright.dev\/docs\/intro\" target=\"_blank\" rel=\"noopener\">https:\/\/playwright.dev\/docs\/intro<\/a><br>Pour ma part je suis sous linux et j&rsquo;installe l&rsquo;ensemble des d\u00e9pendances dont les diff\u00e9rents navigateurs.<br>Ceci prends quelques minutes le temps de tout t\u00e9l\u00e9charger.<br>Pour ceux qui ne connaissent pas encore la librairie je vous conseille de prendre ce temps \u00e0 lire la documentation qui est tr\u00e8s bien r\u00e9alis\u00e9e pour comprendre comment fonctionne cette librairie.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-13.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"171\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-13-1024x171.png\" alt=\"\" class=\"wp-image-3468\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-13-1024x171.png 1024w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-13-300x50.png 300w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-13-768x128.png 768w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-13.png 1237w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Une fois la librairie install\u00e9e, vous pouvez lancer la commande : npx playwright test.<br>Si tout fonctionne vous devriez avoir le r\u00e9sultat suivant :<br>Dans le cas contraire je vous renvoie \u00e0 la documentation.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-14.png\"><img loading=\"lazy\" decoding=\"async\" width=\"699\" height=\"207\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-14.png\" alt=\"\" class=\"wp-image-3469\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-14.png 699w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-14-300x89.png 300w\" sizes=\"auto, (max-width: 699px) 100vw, 699px\" \/><\/a><\/figure>\n\n\n\n<p>Ces tests ne sont absolument pas li\u00e9 \u00e0 notre instance.<br>On va maintenant commencer \u00e0 les faire.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Configuration <\/h2>\n\n\n\n<p>Pour g\u00e9rer la configuration, installer la librairie dotenv via la commande suivante :&nbsp;<br>npm install dotenv &#8211;save<br><br>Puis cr\u00e9er un fichier <em>.env<\/em> et rajouter une variable<em> WEBSITE_URL<\/em> avec l&rsquo;url de votre instance locale de test<br><br>\u00c9diter ensuite le fichier <em>playwright.config.ts <\/em>avec le contenu suivant :<\/p>\n\n\n\n<pre lang=\"javascript\">\nimport { defineConfig, devices } from '@playwright\/test';\nrequire('dotenv').config();\nexport default defineConfig({\n  testDir: '.\/tests',\n  fullyParallel: true,\n  forbidOnly: !!process.env.CI,\n  retries: process.env.CI ? 2 : 0,\n  workers: process.env.CI ? 1 : undefined,\n  \/\/On modifie ICI les rapports, pour ajouter le format junit qui sera ensuite utilis\u00e9 dans la CI\n  reporter: [ ['html'], ['junit', { outputFile: 'results.xml' }] ], \n  use: {\n    baseURL: process.env.WEBSITE_URL, \/\/On modifie ici l'url pour prendre celle du .env ou de la CI\n    trace: 'on-first-retry',\n    screenshot: 'only-on-failure', \/\/On ajoute une capture dans l'erreur\n  },\n  projects: [\n    \/\/ {\n    \/\/   name: 'chromium',\n    \/\/   use: { ...devices['Desktop Chrome'] },\n    \/\/ },\n      \/\/On active uniquement un navigateur pour gagner du temps, pour ma part je fais sur firefox \n      \/\/mais vous pouvez le faire \u00e9galement sous chrome ou safari\n    {\n      name: 'firefox',\n      use: { ...devices['Desktop Firefox'] },\n    },\n  ],\n});\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Premier test<\/h2>\n\n\n\n<p>Notre premier test va \u00eatre tr\u00e8s basique, on va v\u00e9rifier le bon fonctionnement du formulaire de recherche.<br>Pour cela on va r\u00e9aliser les \u00e9tapes suivantes :<\/p>\n<ol>\n<li>Se rendre sur la homepage du site<\/li>\n<li>Taper \u00ab\u00a0Mug\u00a0\u00bb dans le formulaire de recherche.<\/li>\n<li>Appuyer sur le bouton \u00ab\u00a0Entrer\u00a0\u00bb<\/li>\n<li>V\u00e9rifier qu&rsquo;on arrive bien sur le page de recherche<\/li>\n<li>V\u00e9rifier qu&rsquo;on a bien des r\u00e9sultats<\/li>\n<\/ol>\n<p>Pour cela on va cr\u00e9er un fichier <strong>search.spec.ts<\/strong> dans notre dossier <em>e2e\/tests<\/em> avec le contenu suivant :<\/p>\n\n\n\n<pre lang=\"javascript\">\nimport { test, expect } from '@playwright\/test';\n\ntest('Product search', async ({ page }) => {\n    let searchTerm = 'Mug'; \/\/D\u00e9finition du terme de recherche\n    await page.goto('fr\/'); \/\/On se rends sur la homepage\n    await page.locator('#search_widget .ui-autocomplete-input').fill(searchTerm);\/\/On saisi le terme de recherche\n    await page.locator('#search_widget .ui-autocomplete-input').press('Enter');\/\/On valide la recherche\n    \/\/On v\u00e9rifie ensuite qu'on est bien sur la page de la recherche\n    await expect(page.locator('h1')).toHaveText('R\u00e9sultats de la recherche'); \/\/Via le titre de la page\n    \/\/On s'assure que le bloc \"Aucun produit ne correspond \u00e0 votre recherche\" n'est pas affich\u00e9\n    await expect(await page.locator('section.page-not-found').count()).toEqual(0);\n});\n<\/pre>\n\n\n\n<p>On va ensuite v\u00e9rifier que ce test fonctionne via la commande suivante : npx playwright test &#8211;headed <br>(En rajoutant l&rsquo;option headed on peut voir ce qui se passe durant le test )<br>Si le test fonctionne, avant&nbsp; de faire les suivants on va mettre tout \u00e7a dans notre int\u00e9gration continue<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ajout dans l&rsquo;int\u00e9gration continue<\/h2>\n\n\n\n<p>Pour commencer rajouter une variable <strong>WEBSITE_URL<\/strong> dans gitlab avec l&rsquo;url de votre boutique ( de test )<br>Puis nous allons ajouter le contenu suivant dans le fichier <em>.gitlab-ci.yml<\/em><br>Les tests seront uniquement lanc\u00e9s sur la branche dev pour l&rsquo;instant ( et donc sur le site de preprod )<\/p>\n\n\n\n<pre lang=\"yaml\">\n#Rajouter une \u00e9tape post_deploy en haut du fichier ( existe d\u00e9j\u00e0 sans post_deploy)\nstages:\n    - test\n    - deploy\n    - post_deploy\n\n# Nouvelle \u00e9tape des Tests automatiques\ntest:e2e:\n  stage: post_deploy\n  image: mcr.microsoft.com\/playwright:v1.38.1-focal\n  only:\n    - dev # Uniquement la branche dev\n  artifacts: # On g\u00e9n\u00e9re des artifacts avec les r\u00e9sultats des tests\n    when: always\n    paths:\n      - tests\/e2e\/playwright-report\/\n      - tests\/e2e\/test-results\/\n      - tests\/e2e\/results.xml\n    reports:\n      junit: tests\/e2e\/results.xml\n  script:\n    - cd tests\/e2e\n    - npm ci\n    - npx playwright test --url=$WEBSITE_URL\n<\/pre>\n\n\n\n<p>Si on pousse ces changements, on peut voir qu&rsquo;une nouvelle \u00e9tape appara\u00eet dans le pipeline.<br>Ainsi qu&rsquo;un nouvel onglet \u00ab\u00a0Tests\u00a0\u00bb qui nous permets de voir les r\u00e9sultats de nos tests .<br>Dans notre cas tout \u00e0 fonctionn\u00e9 comme pr\u00e9vu<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-15.png\"><img loading=\"lazy\" decoding=\"async\" width=\"978\" height=\"360\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-15.png\" alt=\"\" class=\"wp-image-3473\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-15.png 978w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-15-300x110.png 300w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-15-768x283.png 768w\" sizes=\"auto, (max-width: 978px) 100vw, 978px\" \/><\/a><\/figure>\n\n\n\n<p>La base technique est maintenant fonctionnelle, on a bien des tests automatiques qui se lancent apr\u00e8s la livraison de notre code.<br>On va pouvoir ajouter de nouveaux tests pour v\u00e9rifier si cela fonctionne.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ajout de nouveaux tests et analyse des erreurs<\/h2>\n\n\n\n<p>Comme \u00e9voqu\u00e9 plus haut on va ajouter 2 nouveaux tests<\/p>\n<p>Login customer dans le fichier <em>customer.spec.ts<\/em> avec le contenu suivant :<\/p>\n\n\n\n<pre lang=\"javascript\">\nimport { test, expect } from '@playwright\/test';\n\ntest('Test customer login', async ({ page }) => {\n\n    await page.goto('fr\/'); \/\/On se rend sur la homepage\n    await page.locator('.user-info a').click()\/\/On clique sur le bouton \"Connexion\"\n\n    \/\/On remplit le formulaire de connexion\n    await page.locator('#field-email').fill('pub@prestashop.com')\/\/Login\n    await page.locator('#field-password').fill('123456789')\/\/Password\n    await page.locator('#submit-login').click()\/\/On clique sur le bouton \"Connexion\"\n\n    \/\/On v\u00e9rifie que l'utilisateur est bien connect\u00e9\n    await expect(page.locator('h1')).toHaveText('Votre compte'); \/\/Via le titre de la page\n    await expect(page.locator('.user-info')).toContainText('D\u00e9connexion');\/\/et via les informations du compte en haut de page\n});\n<\/pre>\n\n\n\n<p>Et un fichier d&rsquo;ajout au panier <em><span class=\"text-break\">catalog.<wbr>spec.<wbr>ts&nbsp;<\/span><\/em><span class=\"text-break\">dans lequel je vais volontairement faire une erreur ( Mauvaise url )<\/span> <br>Avec le contenu suivant :<\/p>\n\n\n\n<pre lang=\"javascript\">\nimport { test, expect } from '@playwright\/test';\n\ntest('Assert that a product can be added to cart', async ({ page }) => {\n        \/\/Ouverture de la page produit\n        await page.goto('\/ERROR-URL');\n        \/\/Clic sur le bouton d'ajout au panier\n        await page.locator('[data-button-action=\"add-to-cart\"]').click();\n        \/\/On v\u00e9rifie que la popin d'ajout au panier est bien affich\u00e9e\n        await expect(page.locator('#blockcart-modal')).toBeVisible();\n        \/\/Et que le message \"Produit ajout\u00e9 au panier avec succ\u00e8s\" est pr\u00e9sent\n        await expect(page.locator('#myModalLabel')).toContainText(\"Produit ajout\u00e9 au panier avec succ\u00e8s\");\n        \/\/Clic sur le bouton \"Continuer mes achats\"\n        await page.locator('.cart-content-btn .btn-secondary').click();\n});\n<\/pre>\n\n\n\n<p>On peut pousser le code, et si on retourne dans notre onglet \u00ab\u00a0Test\u00a0\u00bb on va voir qu&rsquo;il y&rsquo;a&nbsp; bien une erreur \u00e0 pr\u00e9sent.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-16.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1021\" height=\"506\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-16.png\" alt=\"\" class=\"wp-image-3474\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-16.png 1021w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-16-300x149.png 300w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-16-768x381.png 768w\" sizes=\"auto, (max-width: 1021px) 100vw, 1021px\" \/><\/a><\/figure>\n\n\n\n<p>Il est possible de voir les d\u00e9tails de l&rsquo;erreur en cliquant sur le bouton \u00ab\u00a0View details\u00a0\u00bb.<br>Mais \u00e9galement de voir les rapports complets d&rsquo;erreurs en parcourant les artefacts du build.<br>Pour cela il faut aller dans l&rsquo;onglet \u00ab\u00a0Jobs\u00a0\u00bb puis visualiser les d\u00e9tails.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-17.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"480\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-17-1024x480.png\" alt=\"\" class=\"wp-image-3475\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-17-1024x480.png 1024w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-17-300x140.png 300w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-17-768x360.png 768w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-17-1536x719.png 1536w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-17.png 1623w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Puis ensuite aller dans le dossier tests\/e2e\/playwrigt-report et cliquer sur le lien \u00ab\u00a0index.html\u00a0\u00bb<br>Ceci nous permets ensuite d&rsquo;acc\u00e9der au rapport playwright et de visualiser les captures d&rsquo;erreur.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-18.png\"><img loading=\"lazy\" decoding=\"async\" width=\"988\" height=\"855\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-18.png\" alt=\"\" class=\"wp-image-3476\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-18.png 988w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-18-300x260.png 300w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/09\/image-18-768x665.png 768w\" sizes=\"auto, (max-width: 988px) 100vw, 988px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>Corriger ce test en mettant l&rsquo;url d&rsquo;un produit valide, et tout devrait ensuite rentrer dans l&rsquo;ordre.<br \/><br \/>Nous arrivons au bout de cette partie de mise en place d&rsquo;une base de tests automatiques.<br \/>Vous n&rsquo;avez ensuite plus qu&rsquo;\u00e0 cr\u00e9er des tests de vos autres comportements critiques.( Passage de commandes \/ Formulaires de contact &#8230; ).<br \/><br \/>Les tests pr\u00e9sent\u00e9s ici sont volontairement simples et minimalistes, dans le cadre d&rsquo;une utilisation plus avanc\u00e9e je vous invite \u00e0 structurer vos tests en utilisant le Page Object Model ( <a href=\"https:\/\/playwright.dev\/docs\/pom\" target=\"_blank\" rel=\"noopener\">https:\/\/playwright.dev\/docs\/pom<\/a> ) et \u00e0 faire des dossiers pour mieux les ranger.<br \/><br \/>Vous pouvez \u00e9galement pr\u00e9voir des tests uniquement pour les environnements de preprod ou de prod, mais tout ces \u00e9l\u00e9ments sortent du cadre de cette introduction \ud83d\ude42<\/p>\n<p>Nous sommes \u00e9galement \u00e0 la fin de cette s\u00e9rie sur le d\u00e9ploiement automatique pour votre projet prestashop.<br \/>Ceci fait un grand nombre d&rsquo;informations \u00e0 enregistrer et sans doute \u00e9galement un temps assez important de mise en place, mais j&rsquo;esp\u00e8re que cela vous fera gagner du temps dans le futur.<br \/><br \/>Je r\u00e9fl\u00e9chis encore \u00e0 faire une solution finale qui permettrais de mettre en place rapidement la structure du projet avec l&rsquo;ensemble des \u00e9l\u00e9ments pr\u00e9sent\u00e9s.<br \/>Mais le format n&rsquo;est pas encore arr\u00eat\u00e9 ( Script bash \/ d\u00e9p\u00f4t github ), je mettrais \u00e0 jour l&rsquo;article en cons\u00e9quence.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cet article est le 5\u00e8me de la s\u00e9rie sur le d\u00e9ploiement et l\u2019int\u00e9gration continu dans Prestashop.Les autres articles de cette s\u00e9rie sont les suivants : Pour finir nos \u00e9tapes de d\u00e9ploiement continu, une question se pose toujours apr\u00e8s la livraison du code.Est-ce que mon site fonctionne toujours ? Est-ce que le module que j&rsquo;ai install\u00e9 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[245],"tags":[597,484,104],"class_list":["post-3406","post","type-post","status-publish","format-standard","hentry","category-prestashop-2","tag-ci-cd","tag-gitlab","tag-prestashop"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/3406","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/comments?post=3406"}],"version-history":[{"count":13,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/3406\/revisions"}],"predecessor-version":[{"id":4679,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/3406\/revisions\/4679"}],"wp:attachment":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/media?parent=3406"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/categories?post=3406"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/tags?post=3406"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}