doc-locale/fr-fr/ci/examples/deployment/composer-npm-deploy.md
{{< details >}}
{{< /details >}}
Ce guide traite de la construction des dépendances d'un projet PHP tout en compilant des ressources via un script npm à l'aide de GitLab CI/CD.
Il est possible de créer votre propre image avec des versions personnalisées de PHP et de Node.js. Par souci de concision, ce guide utilise une image Docker existante avec PHP et Node.js installés.
image: tetraweb/php
L'étape suivante consiste à installer les paquets zip/unzip et à rendre composer disponible. Placez ces éléments dans la section before_script :
before_script:
- apt-get update
- apt-get install zip unzip
- php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
- php composer-setup.php
- php -r "unlink('composer-setup.php');"
Cela garantit que toutes les conditions requises sont prêtes. Ensuite, exécutez composer install pour récupérer toutes les dépendances PHP et npm install pour charger les paquets Node.js. Puis exécutez le script npm. Ajoutez les commandes à la section before_script :
before_script:
# ...
- php composer.phar install
- npm install
- npm run deploy
Dans ce cas particulier, le script npm deploy est un script Gulp qui effectue les opérations suivantes :
Toutes ces opérations placent l'ensemble des fichiers dans un dossier build, prêt à être déployé sur un serveur en production.
Vous disposez de plusieurs options telles que rsync, SCP ou SFTP. Pour l'instant, utilisez SCP.
Pour que cela fonctionne, vous devez ajouter une variable CI/CD GitLab (accessible sur gitlab.example/your-project-name/variables). Nommez cette variable CI/CD STAGING_PRIVATE_KEY et définissez-la sur la clé SSH privée de votre serveur.
Créez un utilisateur qui a accès uniquement au dossier qui doit être mis à jour.
Une fois cette variable créée, assurez-vous que la clé est ajoutée au conteneur Docker lors de l'exécution :
before_script:
# - ....
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
- mkdir -p ~/.ssh
- eval $(ssh-agent -s)
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
Ce script effectue les actions suivantes :
ssh-agent est disponible et l'installer dans le cas contraire.~/.ssh.C'est essentiellement tout ce dont vous avez besoin dans la section before_script.
Pour déployer le dossier build depuis l'image Docker vers votre serveur, créez un nouveau job :
stage_deploy:
artifacts:
paths:
- build/
rules:
- if: $CI_COMMIT_BRANCH == "dev"
script:
- ssh-add <(echo "$STAGING_PRIVATE_KEY")
- ssh -p22 server_user@server_host "mkdir htdocs/wp-content/themes/_tmp"
- scp -P22 -r build/* server_user@server_host:htdocs/wp-content/themes/_tmp
- ssh -p22 server_user@server_host "mv htdocs/wp-content/themes/live htdocs/wp-content/themes/_old && mv htdocs/wp-content/themes/_tmp htdocs/wp-content/themes/live"
- ssh -p22 server_user@server_host "rm -rf htdocs/wp-content/themes/_old"
Voici le détail :
rules:if: $CI_COMMIT_BRANCH == "dev" signifie que cette build ne s'exécute que lorsqu'un élément est poussé vers la branche dev. Vous pouvez supprimer ce bloc entièrement et faire en sorte que tout s'exécute à chaque push (mais ce n'est probablement pas ce que vous souhaitez).ssh-add ... ajoute la clé privée que vous avez ajoutée dans l'interface web au conteneur Docker.ssh et créer un nouveau dossier _tmp.scp et téléverser le dossier build (généré par un script npm) dans le dossier _tmp créé précédemment.ssh et déplacer le dossier live vers un dossier _old, puis déplacer _tmp vers live._old.La section artifacts indique à GitLab CI/CD de conserver le répertoire build (vous pourrez le télécharger ultérieurement si nécessaire).
Si vous utilisez ceci uniquement pour un serveur de recette, vous pouvez le faire en deux étapes :
- ssh -p22 server_user@server_host "rm -rf htdocs/wp-content/themes/live/*"
- scp -P22 -r build/* server_user@server_host:htdocs/wp-content/themes/live
Le problème est qu'il existe une courte période pendant laquelle l'application n'est pas disponible sur votre serveur.
Par conséquent, pour un environnement de production, les étapes supplémentaires garantissent qu'une application fonctionnelle est disponible à tout moment.
Comme il s'agissait d'un projet WordPress, il inclut de vrais extraits de code. Voici quelques idées supplémentaires que vous pouvez explorer :
Le fichier .gitlab-ci.yml final ressemble à ceci :
stage_deploy:
image: tetraweb/php
artifacts:
paths:
- build/
rules:
- if: $CI_COMMIT_BRANCH == "dev"
before_script:
- apt-get update
- apt-get install zip unzip
- php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
- php composer-setup.php
- php -r "unlink('composer-setup.php');"
- php composer.phar install
- npm install
- npm run deploy
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
- mkdir -p ~/.ssh
- eval $(ssh-agent -s)
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
script:
- ssh-add <(echo "$STAGING_PRIVATE_KEY")
- ssh -p22 server_user@server_host "mkdir htdocs/wp-content/themes/_tmp"
- scp -P22 -r build/* server_user@server_host:htdocs/wp-content/themes/_tmp
- ssh -p22 server_user@server_host "mv htdocs/wp-content/themes/live htdocs/wp-content/themes/_old && mv htdocs/wp-content/themes/_tmp htdocs/wp-content/themes/live"
- ssh -p22 server_user@server_host "rm -rf htdocs/wp-content/themes/_old"