{"id":31377,"date":"2019-10-31T21:40:57","date_gmt":"2019-10-31T18:40:57","guid":{"rendered":"https:\/\/prohoster.info\/blog\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika\/"},"modified":"2019-10-31T21:40:57","modified_gmt":"2019-10-31T18:40:57","slug":"nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","title":{"rendered":"Notre mise en \u0153uvre du d\u00e9ploiement continu sur la plateforme du client","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Chez True Engineering, nous avons mis en place un processus de livraison continue pour les mises \u00e0 jour sur les serveurs de nos clients et nous souhaitons partager cette exp\u00e9rience.<\/p>\n<p>Tout d'abord, nous avons d\u00e9velopp\u00e9 un syst\u00e8me en ligne pour le client et l'avons d\u00e9ploy\u00e9 dans notre propre cluster Kubernetes. Maintenant, notre solution \u00e0 fort trafic a \u00e9t\u00e9 transf\u00e9r\u00e9e sur la plateforme du client, pour laquelle nous avons configur\u00e9 un processus enti\u00e8rement automatis\u00e9 de Continuous Deployment. Gr\u00e2ce \u00e0 cela, nous avons acc\u00e9l\u00e9r\u00e9 le time-to-market \u2013 la livraison des modifications dans l'environnement de production. <\/p>\n<p>Dans cet article, nous allons vous parler de toutes les \u00e9tapes du processus de Continuous Deployment (CD) ou de livraison de mises \u00e0 jour sur la plateforme du client : <\/p>\n<ol>\n<li>comment ce processus d\u00e9marre, <\/li>\n<li>synchronisation avec le d\u00e9p\u00f4t Git du client,<\/li>\n<li>compilation du backend et du frontend,<\/li>\n<li>d\u00e9ploiement automatique de l'application dans l'environnement de test, <\/li>\n<li>d\u00e9ploiement automatique en production. <\/li>\n<\/ol>\n<p>\nAu cours du processus, nous partagerons les d\u00e9tails de la configuration.<\/p>\n<p><img decoding=\"async\" alt=\"Notre mise en \u0153uvre du d\u00e9ploiement continu sur la plateforme du client\" src=\"\/wp-content\/uploads\/2019\/04\/54be580319906344a6e2f091395ea7a7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>1. D\u00e9marrage du CD<\/h3>\n<p>\nLe Continuous Deployment commence lorsque le d\u00e9veloppeur pousse les modifications dans la branche de release de notre d\u00e9p\u00f4t Git. <\/p>\n<p>Notre application fonctionne sur une architecture microservices et tous ses composants sont stock\u00e9s dans un seul d\u00e9p\u00f4t. Gr\u00e2ce \u00e0 cela, tous les microservices sont compil\u00e9s et install\u00e9s, m\u00eame si l'un d'eux a \u00e9t\u00e9 modifi\u00e9. <\/p>\n<p>Nous avons organis\u00e9 le travail via un seul d\u00e9p\u00f4t pour plusieurs raisons : <\/p>\n<ul>\n<li>Convivialit\u00e9 du d\u00e9veloppement \u2013 l'application est en constante \u00e9volution, ce qui permet de travailler directement sur tout le code. <\/li>\n<li>Un pipeline CI\/CD unique, qui garantit que l'application comme un syst\u00e8me unique passe tous les tests et est livr\u00e9e dans l'environnement de production du client. <\/li>\n<li>\u00c9limination de la confusion dans les versions \u2013 nous n'avons pas besoin de conserver une carte des versions des microservices ni de d\u00e9crire la configuration de chaque microservice dans les scripts Helm.<\/li>\n<\/ul>\n<h3>2. Synchronisation avec le d\u00e9p\u00f4t Git du code source du client<\/h3>\n<p>\nLes modifications apport\u00e9es sont automatiquement synchronis\u00e9es avec le d\u00e9p\u00f4t Git du client. Une compilation de l'application est configur\u00e9e, qui se lance apr\u00e8s la mise \u00e0 jour de la branche, ainsi que le d\u00e9ploiement en production. Les deux processus se d\u00e9roulent dans leur environnement \u00e0 partir du d\u00e9p\u00f4t Git. <\/p>\n<p>Nous ne pouvons pas travailler directement avec le d\u00e9p\u00f4t du client, car nous avons besoin de nos propres environnements de d\u00e9veloppement et de test. Pour cela, nous utilisons notre propre d\u00e9p\u00f4t Git, qui est synchronis\u00e9 avec leur d\u00e9p\u00f4t Git. D\u00e8s qu'un d\u00e9veloppeur pousse des modifications dans la branche correspondante de notre d\u00e9p\u00f4t, GitLab envoie imm\u00e9diatement ces modifications au client.<\/p>\n<p><img decoding=\"async\" alt=\"Notre mise en \u0153uvre du d\u00e9ploiement continu sur la plateforme du client\" src=\"\/wp-content\/uploads\/2019\/04\/9e704f112649b77f0522fa60cfcfc2bb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEnsuite, il faut proc\u00e9der \u00e0 la construction. Cela se compose de plusieurs \u00e9tapes : la construction du backend et du frontend, des tests et la livraison en production.<\/p>\n<h3>3. Construction du backend et du frontend<\/h3>\n<p>\nLa construction du backend et du frontend est une t\u00e2che parall\u00e8le qui s'ex\u00e9cute dans le syst\u00e8me GitLab Runner. Sa configuration de construction source r\u00e9side dans ce m\u00eame d\u00e9p\u00f4t.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ce\/ci\/yaml\/\">Tutoriel pour \u00e9crire un script YAML pour la construction dans GitLab<\/a><\/noindex>.<\/p>\n<p>GitLab Runner r\u00e9cup\u00e8re le code du d\u00e9p\u00f4t requis, construit l'application Java \u00e0 l'aide de la commande et l'envoie au registre Docker. Ici, nous construisons le backend et le frontend, obtenons des images Docker que nous rangeons dans le d\u00e9p\u00f4t du c\u00f4t\u00e9 du client. Pour g\u00e9rer les images Docker, nous utilisons <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/palantir\/gradle-docker\">le plugin Gradle<\/a><\/noindex>.<\/p>\n<p>Nous synchronisons les versions de nos images avec la version de la release qui sera publi\u00e9e dans Docker. Pour un fonctionnement sans accroc, nous avons effectu\u00e9 plusieurs configurations :<\/p>\n<p>1. Entre l'environnement de test et le conteneur de production, les conteneurs ne sont pas reconstruits. Nous avons effectu\u00e9 des param\u00e9trages afin qu'un m\u00eame conteneur puisse fonctionner sans reconstruction avec tous les param\u00e8tres, variables d'environnement et services tant dans l'environnement de test que dans la production. <\/p>\n<p>2. Pour mettre \u00e0 jour l'application via Helm, il est n\u00e9cessaire d'indiquer sa version. Pour nous, la construction du backend, du frontend et la mise \u00e0 jour de l'application sont trois t\u00e2ches distinctes, donc il est important d'utiliser partout la m\u00eame version de l'application. Pour cela, nous utilisons des donn\u00e9es de l'historique Git, puisque notre configuration du cluster K8S et de l'application se trouve dans un m\u00eame d\u00e9p\u00f4t Git.<\/p>\n<p>Nous obtenons la version de l'application \u00e0 partir des r\u00e9sultats de l'ex\u00e9cution de la commande<br \/>\n<code>git describe --tags --abbrev=7<\/code>.<\/p>\n<h3>4. D\u00e9ploiement automatique de toutes les modifications dans l'environnement de test (UAT) <\/h3>\n<p>\nL'\u00e9tape suivante dans ce script de construction consiste \u00e0 mettre \u00e0 jour automatiquement le cluster K8S. Cela se produit \u00e0 condition que toute l'application ait \u00e9t\u00e9 construite et que tous les artefacts aient \u00e9t\u00e9 publi\u00e9s dans le Docker Registry. Ensuite, le mise \u00e0 jour de l'environnement de test commence.<\/p>\n<p>La mise \u00e0 jour du cluster est lanc\u00e9e \u00e0 l'aide de <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/helm\/#helm-upgrade\">Mise \u00e0 jour de Helm<\/a><\/noindex>. En cas de probl\u00e8me, Helm annulera automatiquement toutes ses modifications. Aucune surveillance de son fonctionnement n'est n\u00e9cessaire. <\/p>\n<p>Nous fournissons avec l'assemblage la configuration du cluster K8S. L'\u00e9tape suivante consiste donc \u00e0 la mettre \u00e0 jour : configMaps, d\u00e9ploiements, services, secrets et toute autre configuration K8S que nous avons modifi\u00e9e. <\/p>\n<p>Apr\u00e8s cela, Helm lance une mise \u00e0 jour RollOut de l'application dans l'environnement de test. Avant que l'application ne soit d\u00e9ploy\u00e9e en production. Cela permet aux utilisateurs de v\u00e9rifier manuellement les fonctionnalit\u00e9s business que nous avons mises \u00e0 disposition dans l'environnement de test.<\/p>\n<h3>5. D\u00e9ploiement automatique de toutes les modifications en Prod <\/h3>\n<p>\nPour d\u00e9ployer la mise \u00e0 jour dans l'environnement de production, il suffit d'appuyer sur un bouton dans GitLab \u2014 et les conteneurs sont imm\u00e9diatement livr\u00e9s dans l'environnement de production.<\/p>\n<p>La m\u00eame application peut fonctionner sans recompilation dans diff\u00e9rents environnements \u2014 test et production. Nous utilisons les m\u00eames artefacts, sans modifier quoi que ce soit dans l'application, et les param\u00e8tres sont d\u00e9finis de l'ext\u00e9rieur. <\/p>\n<p>La param\u00e9trisation flexible des param\u00e8tres de l'application d\u00e9pend de l'environnement dans lequel cette application sera ex\u00e9cut\u00e9e. Nous avons externalis\u00e9 tous les param\u00e8tres des environnements : tout est param\u00e9tr\u00e9 via la configuration K8S et les param\u00e8tres Helm. Lorsque Helm d\u00e9ploie l'assemblage dans l'environnement de test, il applique des param\u00e8tres de test, tandis que dans l'environnement de production \u2014 des param\u00e8tres de production.<\/p>\n<p>Le plus difficile a \u00e9t\u00e9 de param\u00e9trer tous les services utilis\u00e9s et les variables qui d\u00e9pendent de l'environnement, puis de les convertir en variables d'environnement et en descriptions de configuration de param\u00e8tres d'environnement pour Helm. <\/p>\n<p>Dans les param\u00e8tres de l'application, des variables d'environnement sont utilis\u00e9es. Leurs valeurs sont d\u00e9finies dans des conteneurs \u00e0 l'aide de K8S configmap, qui est mod\u00e9lis\u00e9 \u00e0 l'aide de mod\u00e8les Go. Par exemple, pour d\u00e9finir une variable d'environnement pour le nom de domaine, cela peut se faire ainsi :<\/p>\n<p><code>APP_EXTERNAL_DOMAIN: {{ (pluck .Values.global.env .Values.app.properties.app_external_domain | first) }}<\/code><\/p>\n<p><b>.Values.global.env <\/b>\u2013 cette variable contient le nom de l'environnement (prod, stage, UAT).<br \/>\n<b>.Values.app.properties.app_external_domain<\/b> \u2013 dans cette variable, nous d\u00e9finissons le domaine appropri\u00e9 dans le fichier .Values.yaml <\/p>\n<p>Lors de la mise \u00e0 jour de l'application, Helm cr\u00e9e \u00e0 partir des mod\u00e8les le fichier configmap.yaml et remplit la valeur APP_EXTERNAL_DOMAIN avec la valeur appropri\u00e9e en fonction de l'environnement dans lequel la mise \u00e0 jour de l'application commence. Cette variable est d\u00e9finie directement dans le conteneur. L'application y a acc\u00e8s ; par cons\u00e9quent, la valeur de cette variable sera diff\u00e9rente dans chaque environnement de l'application. <\/p>\n<p>R\u00e9cemment, Spring Cloud a ajout\u00e9 la prise en charge de K8S, y compris le travail avec les configMaps : <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-kubernetes\">Spring Cloud Kubernetes<\/a><\/noindex>. Tant que le projet \u00e9volue activement et change radicalement, nous ne pouvons pas l'utiliser en production. Cependant, nous surveillons son \u00e9tat de pr\u00e8s et l'utilisons dans les configurations DEV. D\u00e8s qu'il se stabilisera, nous passerons de l'utilisation des variables d'environnement \u00e0 son utilisation.<\/p>\n<h3>Au total<\/h3>\n<p>\nAinsi, le Continuous Deployment est configur\u00e9 et fonctionne. Toutes les mises \u00e0 jour se font d'un simple clic. La livraison des modifications vers l'environnement de production est automatique. Et, ce qui est important, les mises \u00e0 jour ne stoppent pas le fonctionnement du syst\u00e8me. <\/p>\n<p><img decoding=\"async\" alt=\"Notre mise en \u0153uvre du d\u00e9ploiement continu sur la plateforme du client\" src=\"\/wp-content\/uploads\/2019\/04\/07d609d9a40f644cfdad2bdb88652af2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Plans pour l'avenir : migration automatique de la base de donn\u00e9es<\/h3>\n<p>\nNous avons envisag\u00e9 de mettre \u00e0 niveau la base de donn\u00e9es et de pouvoir annuler ces modifications. En effet, deux versions diff\u00e9rentes de l'application fonctionnent simultan\u00e9ment : l'ancienne est en fonctionnement, tandis que la nouvelle est en cours de d\u00e9ploiement. Nous n'\u00e9teindrons l'ancienne que lorsque nous aurons v\u00e9rifi\u00e9 que la nouvelle version fonctionne. La migration de la base de donn\u00e9es doit permettre de faire fonctionner les deux versions de l'application. <\/p>\n<p>Par cons\u00e9quent, nous ne pouvons pas simplement changer le nom d'une colonne ou d'autres donn\u00e9es. Mais nous pouvons cr\u00e9er une nouvelle colonne, copier les donn\u00e9es de l'ancienne colonne et \u00e9crire des triggers qui, lors de la mise \u00e0 jour des donn\u00e9es, copieront et mettront simultan\u00e9ment \u00e0 jour celles de l'autre colonne. Une fois le d\u00e9ploiement de la nouvelle version de l'application r\u00e9ussi, apr\u00e8s la p\u00e9riode de support post-lancement, nous pourrons supprimer l'ancienne colonne et le trigger devenu inutile. <\/p>\n<p>Si la nouvelle version de l'application ne fonctionne pas correctement, nous pouvons revenir \u00e0 la version pr\u00e9c\u00e9dente, y compris \u00e0 la version ant\u00e9rieure de la base de donn\u00e9es. En r\u00e9sum\u00e9, nos modifications permettront de faire fonctionner simultan\u00e9ment plusieurs versions de l'application. <\/p>\n<p>Nous pr\u00e9voyons d'automatiser la migration de la base de donn\u00e9es via un job K8S, int\u00e9grant cela dans le processus de CD. Et nous partagerons certainement cette exp\u00e9rience sur Habr.<br \/>\n<br \/>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/true_engineering\/blog\/447812\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u044b \u0432 True Engineering \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043e\u043d\u043b\u0430\u0439\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0435\u0451 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u043e \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043c\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 Continuous Deployment. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443, \u043c\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0438 time-to-market \u2013 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":23342,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-31377","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=\"description\" content=\"\u041c\u044b \u0432 True Engineering \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043e\u043d\u043b\u0430\u0439\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0435\u0451 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c.\" \/>\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\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika\" \/>\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\udd47\u041d\u0430\u0448\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Continuous Deployment \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u044b \u0432 True Engineering \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043e\u043d\u043b\u0430\u0439\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0435\u0451 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika\" \/>\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=\"2019-10-31T18:40:57+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:40:57+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\udd47Notre mise en \u0153uvre du Continuous Deployment sur la plateforme du client | ProHoster","description":"Chez True Engineering, nous avons mis en place un processus de livraison continue des mises \u00e0 jour vers les serveurs des clients et souhaitons partager cette exp\u00e9rience. Pour commencer, nous avons d\u00e9velopp\u00e9 un syst\u00e8me en ligne pour le client et l'avons d\u00e9ploy\u00e9 dans notre propre infrastructure.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","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\udd47\u041d\u0430\u0448\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Continuous Deployment \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 | ProHoster","og:description":"\u041c\u044b \u0432 True Engineering \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043e\u043d\u043b\u0430\u0439\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0435\u0451 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","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":"2019-10-31T18:40:57+00:00","article:modified_time":"2019-10-31T18:40:57+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"31377","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":"2026-01-21 05:52:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:18:39","updated":"2026-01-21 05:52:19","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\/31377","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=31377"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/31377\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/23342"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=31377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=31377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=31377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}