web-dev-qa-db-fra.com

Utilisation de BitBucket Pipelines pour déployer sur VPS via SSH Access

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

J'ai les étapes suivantes que je fais manuellement, que j'essaie de répliquer de manière autonome:

  • I commit mes modifications et Push au dépôt BitBucket
  • Je me connecte à mon serveur à l'aide de Terminal: ssh root@ipaddress
  • I cd dans le bon répertoire: cd /var/www/html/app/
  • J'ai ensuite pull depuis mon dépôt BitBucket: git pull Origin master
  • J'exécute ensuite quelques commandes: composer install, php artisan migrate etc..
  • Je me déconnecte ensuite: exit

Je crois comprendre que vous pouvez utiliser des 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, donc authorized_keys le fichier contient la clé publique de BitBucket Pipelines.

Mon fichier de pipelines bitbucket-pipelines.yml est comme suit:

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 'Deploy finished.'

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 action de script est exécutée dans son propre conteneur.

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

L'erreur que j'obtiens est logique si elle n'exécute pas cd /var/www/html/app dans le VPS après s'être connecté à l'aide de SSH.

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

Merci

25
Stefan Dunn

Les commandes que vous définissez sous script vont être exécutées dans un conteneur Docker et non sur votre VPS.

Au lieu de cela, placez 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 'Deploy finished.'

2 - Créez un script deploy.sh dans votre référentiel, comme ça

echo "Deploy script started"
cd /var/www/html
sh pull.sh
echo "Deploy script finished execution"

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

image: atlassian/default-image:latest

pipelines:
  default:
    - step:
        deployment: staging
        script:
          - cat ./deploy.sh | ssh <user>@<Host>
          - echo "Deploy step finished"

Je recommanderais déjà de cloner votre référentiel sur votre VPS dans /var/www/html et testez votre pull.sh fichier d'abord manuellement.

47
thomas.drbg

Le problème avec la réponse marquée comme solution est que le processus SH ne se fermera pas si l'une des commandes à l'intérieur échoue.

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 arrêt en cas d'échec.

Je ne peux pas utiliser de commande docker car après chaque, le processus CI s'arrête et je n'arrive pas à comprendre comment éviter ces commandes pour ne pas quitter le processus CI. J'utilise le SH mais je vais commencer à ajouter des conditions basées sur le code de sortie de la commande précédente, donc nous savons si quelque chose s'est mal passé pendant le déploiement.

1