22 votes

Utilisation des pipelines BitBucket pour déployer sur un VPS via l'accès SSH

J'ai essayé de comprendre comment utiliser les Pipelines de BitBucket pour déployer automatiquement mon application (Laravel) sur une instance de serveur Vultr.

Voici les étapes que je fais manuellement et que j'essaie de reproduire de manière autonome:

  • Je fais un commit de mes modifications et je push vers le dépôt BitBucket
  • Je me connecte à mon serveur en utilisant le Terminal: ssh root@ipaddress
  • Je me déplace vers le répertoire correct: cd /var/www/html/app/
  • Ensuite, je fais un pull depuis mon dépôt BitBucket: git pull origin master
  • Ensuite, j'exécute quelques commandes: composer install, php artisan migrate etc..
  • Ensuite, je me déconnecte: exit

J'ai l'impression que vous pouvez utiliser les Pipelines pour automatiser cela, est-ce vrai?

Jusqu'à présent, j'ai configuré une paire de clés SSH pour les Pipelines et mon serveur, de sorte que le fichier authorized_keys de mon serveur contient la clé publique des Pipelines de BitBucket.

Mon fichier pipelines bitbucket-pipelines.yml est le suivant:

 image: atlassian/default-image:latest

pipelines:
  default:
    - step:
        deployment: staging
        caches:
          - composer
        script:
          - ssh root@ipaddress
          - cd /var/www/html/app/
          - git pull origin master
          - php artisan down
          - composer install --no-dev --prefer-dist
          - php artisan cache:clear
          - php artisan config:cache
          - php artisan route:cache
          - php artisan migrate
          - php artisan up
          - echo 'Déploiement terminé.'

Lorsque le pipeline s'exécute, j'obtiens l'erreur: bash: cd: /var/www/html/app/: No such file or directory.

J'ai lu que chaque étape de script est exécutée dans son propre conteneur.

Chaque étape de votre pipeline démarrera un conteneur Docker séparé pour exécuter les commandes configurées dans le script

L'erreur que je reçois a du sens si elle n'exécute pas cd /var/www/html/app à l'intérieur du VPS après s'être connectée via SSH.

Quelqu'un pourrait-il me guider dans la bonne direction?

Merci

40voto

thomas.drbg Points 663

Les commandes que vous définissez sous script s'exécuteront dans un conteneur Docker et non sur votre VPS.

À la place, mettez toutes vos commandes dans un fichier bash sur votre serveur.

1 - Créez un fichier bash pull.sh sur votre VPS, pour effectuer toutes vos tâches de déploiement

#/var/www/html
php artisan down
git pull origin master
composer install --no-dev --prefer-dist
php artisan cache:clear
php artisan config:cache
php artisan route:cache
php artisan migrate
php artisan up
echo 'Déploiement terminé.'

2 - Créez un script deploy.sh dans votre dépôt, comme ceci

echo "Début du script de déploiement"
cd /var/www/html
sh pull.sh
echo "Fin de l'exécution du script de déploiement"

3 - Enfin, mettez à jour votre fichier bitbucket-pipelines.yml

image: atlassian/default-image:latest

pipelines:
  default:
    - step:
        deployment: staging
        script:
          - cat ./deploy.sh | ssh @
          - echo "Étape de déploiement terminée"

Je vous recommande d'avoir déjà cloné votre dépôt sur votre VPS dans /var/www/html et de tester votre fichier pull.sh manuellement d'abord.

0voto

Le problème avec la réponse marquée comme la solution est que le processus SH ne se terminera pas s'il y a une erreur dans l'une des commandes à l'intérieur.

Cette commande php artisan route:cache par exemple, peut échouer facilement ! sans parler du pull !

Et pire encore, le script SH exécutera le reste des commandes sans s'arrêter si l'une échoue.

Je ne peux pas utiliser de commande docker car après chaque commande, le processus CI s'arrête et je ne sais pas comment éviter que ces commandes ne mettent fin au processus CI. J'utilise le SH mais je vais commencer à ajouter des conditionnels basés sur le code de sortie de la commande précédente, pour savoir si quelque chose s'est mal passé lors du déploiement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X