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

Posted

技术标签:

【中文标题】使用 BitBucket Pipelines 通过 SSH 访问部署到 VPS【英文标题】:Using BitBucket Pipelines to Deploy onto VPS via SSH Access 【发布时间】:2018-10-07 18:50:12 【问题描述】:

我一直在努力思考如何利用 BitBucket 的管道将我的 (Laravel) 应用程序自动部署到 Vultr 服务器实例上。

我有以下手动执行的步骤,我正在尝试自主复制:

commit 我的更改和 push 到 BitBucket 回购 我使用终端登录到我的服务器:ssh root@ipaddresscd 到正确的目录:cd /var/www/html/app/ 然后我从我的 BitBucket 存储库中pullgit pull origin master 然后我运行一些命令:composer installphp 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.'

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

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

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

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

谁能指引我正确的方向?

谢谢

【问题讨论】:

我不明白为什么你的服务器会是一个拥有公钥的服务器。您不想使用公钥 ssh 进入服务器,反之亦然吗? 【参考方案1】:

您在script 下定义的命令将在 Docker 容器中运行,而不是在您的 VPS 上。

相反,将所有命令放在服务器上的 bash 文件中。

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

#/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"

我建议您已经在您的 VPS 上的 /var/www/html 中克隆您的 repo,并首先手动测试您的 pull.sh 文件。

【讨论】:

非常感谢!通过一些调整,我让它工作了。缺少git pull 命令。 太棒了。因为我只需要运行几行代码,所以我跳过了第 1 步,将所有内容放入 deploy.sh。此外,图像确实需要是 atlassian,如图所示。对于那些想要在特定分支上运行部署的人,这显示了语法示例:confluence.atlassian.com/bitbucket/… 我刚刚登录以支持这个答案!无论如何,为了使这个评论有用,我从这里找到了这个 *** 线程community.atlassian.com/t5/Bitbucket-questions/… 从 v5.1 开始,您可以添加以下命令:php artisan view:clear 我知道这已经过时了,但是最初在 VPS 上获取文件呢?我的意思是,这是否适用于 VPS 上还没有 repo 的新服务器?【参考方案2】:

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

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

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

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

【讨论】:

以上是关于使用 BitBucket Pipelines 通过 SSH 访问部署到 VPS的主要内容,如果未能解决你的问题,请参考以下文章

Bitbucket Pipelines - 具有相同步骤的多个分支

使用 Bitbucket Pipelines 和 Docker 的 Android CI

Bitbucket Pipelines apt-get 停止工作

如何在 Bitbucket-Pipelines 中保存工件

如何从 bitbucket-pipelines.yml 执行 git push?

Docker BitBucket管道中缺少区域设置nl_NL