使用BitBucket管道通过SSH访问部署到VPS

Ste*_*unn 20 ssh vps bitbucket bitbucket-pipelines

我一直试图围绕如何利用BitBucket的Pipelines将我的(Laravel)应用程序自动部署到Vultr Server实例上.

我手动执行以下步骤,我试图自动复制:

  • commit我的变化,并push以回购到位桶
  • 我使用终端登录我的服务器: ssh root@ipaddress
  • cd到正确的目录:cd /var/www/html/app/
  • 然后pull我从我的BitBucket回购:git pull origin master
  • 我再运行一些命令:composer install,php artisan migrate等等.
  • 然后我退出: exit

我的理解是你可以使用Pipelines自动化这个,这是真的吗?

到目前为止,我已经为管道和我的服务器设置了一个SSH密钥对,因此我的服务器authorized_keys文件包含来自BitBucket Pipelines的公钥.

我的管道文件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.'
Run Code Online (Sandbox Code Playgroud)

当管道执行时,我得到错误:bash: cd: /var/www/html/app/: No such file or directory.

我读到每个脚本步骤都在它自己的容器中运行.

管道中的每个步骤都将启动一个单独的Docker容器来运行脚本中配置的命令

如果cd /var/www/html/app在使用SSH登录后未在VPS内执行,我得到的错误是有意义的.

有人可以引导我进入正确的方向吗?

谢谢

tho*_*rbg 36

您定义的命令script将运行到Docker容器而不是VPS.

而是将所有命令放在服务器上的bash文件中.

1 - pull.sh在VPS上创建bash文件,以执行所有部署任务

#/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.'
Run Code Online (Sandbox Code Playgroud)

2 - deploy.sh在您的存储库中创建一个脚本,就像这样

echo "Deploy script started"
cd /var/www/html
sh pull.sh
echo "Deploy script finished execution"
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

我建议你已经在你的VPS上克隆你的repo /var/www/htmlpull.sh首先手动测试你的文件.

  • 太棒了 因为我只需要运行几行,所以我跳过了步骤#1,并将所有内容放入`deploy.sh`中。同样,图像确实需要是Atlassian的,如图所示。对于那些想要在特定分支上运行其部署的人,这显示了语法示例:https://confluence.atlassian.com/bitbucket/branch-workflows-856697482.html (2认同)

Pab*_*one 6

标记为解决方案的答案的问题是,如果其中的任何命令失败,SH 进程将不会退出。

php artisan route:cache例如,这个命令很容易失败!更别说拉了!

更糟糕的是,如果有任何失败,SH 脚本将不间断地执行其余命令。

我不能使用任何 docker 命令,因为在每个命令之后,CI 进程都会停止,我无法弄清楚如何避免这些命令不退出 CI 进程。我正在使用 SH,但我将根据上一个命令的退出代码开始添加一些条件,因此我们知道在部署过程中是否出现任何问题。