web-dev-qa-db-ja.com

BitBucketパイプラインを使用してSSHアクセス経由でVPSにデプロイする

BitBucketのパイプラインを使用して(Laravel)アプリケーションをVultrサーバーインスタンスに自動デプロイする方法に頭を悩ませています。

手動で行う次の手順があります。これは自律的に複製しようとしています。

  • commit自分の変更とBitBucketリポジトリへのPush
  • ターミナルを使用してサーバーにログインします:ssh root@ipaddress
  • 私は正しいディレクトリにcdcd /var/www/html/app/
  • 次に、BitBucketリポジトリからpullgit pull Origin master
  • 次に、いくつかのコマンドを実行します:composer installphp artisan migrateなど。
  • 次にログアウトします:exit

私の理解では、パイプラインを使用してこれを自動化できますが、これは本当ですか?

これまでのところ、パイプラインとサーバーにSSHキーペアを設定しているため、サーバーのauthorized_keysファイルには、BitBucketパイプラインからの公開キーが含まれています。

私のパイプラインファイルbitbucket-pipelines.ymlは次のとおりです。

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

パイプラインが実行されると、エラーbash: cd: /var/www/html/app/: No such file or directoryが発生します。

各スクリプトステップは独自のコンテナで実行されると読みました。

パイプラインの各ステップは、スクリプトで構成されたコマンドを実行するための個別のDockerコンテナーを開始します

SSHを使用してVPSにログインした後、VPS内でcd /var/www/html/appを実行していない場合、このエラーは理にかなっています。

誰かが正しい方向に案内してくれませんか?

ありがとう

25
Stefan Dunn

scriptで定義するコマンドは、VPSではなくDockerコンテナーで実行されます。

代わりに、すべてのコマンドをサーバーのbashファイルに入れます。

1-bashファイルを作成するpull.sh VPSで、すべての展開タスクを実行します

#/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-スクリプトを作成するdeploy.shリポジトリのように

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

3-最後にbitbucket-pipelines.ymlファイル

image: atlassian/default-image:latest

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

/var/www/htmlをテストしてpull.shファイルを最初に手動で。

47
thomas.drbg

ソリューションとしてマークされた回答の問題は、内部のコマンドのいずれかが失敗した場合、SHプロセスが終了しないことです。

このコマンドphp artisan route:cacheたとえば、簡単に失敗する可能性があります。プルは言うまでもありません!

さらに悪いことに、SHスクリプトは、失敗しても残りのコマンドを停止せずに実行します。

毎回、CIプロセスが停止し、それらのコマンドがCIプロセスを終了しないようにする方法を理解できないため、どのdockerコマンドも使用できません。 SHを使用していますが、前のコマンドの終了コードに基づいていくつかの条件を追加します。これにより、デプロイ中に問題が発生したかどうかがわかります。