使用 BitBucket 管道通过 SSH 访问部署到 VPS
Using BitBucket Pipelines to Deploy onto VPS via SSH Access
我一直在思考如何利用 BitBucket 的管道将我的 (Laravel) 应用程序自动部署到 Vultr 服务器实例上。
我有以下手动执行的步骤,我正在尝试自主复制这些步骤:
- 我
commit
我的更改和 push
到 BitBucket 存储库
- 我使用终端登录我的服务器:
ssh root@ipaddress
- 我
cd
到正确的目录:cd /var/www/html/app/
- 然后我从我的 BitBucket 存储库
pull
:git pull origin master
- 然后我 运行 一些命令:
composer install
、php artisan migrate
等。
- 然后我注销:
exit
我的理解是,您可以使用管道将其自动化,这是真的吗?
到目前为止,我已经为管道和我的服务器设置了 SSH 密钥对,因此我服务器的 authorized_keys
文件包含来自 BitBucket Pipelines 的 public 密钥。
我的管道文件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
。
我读到每个脚本步骤 运行 在它自己的容器中。
Each step in your pipeline will start a separate Docker container to
run the commands configured in the script
如果在使用 SSH 登录后 VPS 中没有执行 cd /var/www/html/app
,我得到的错误是有道理的。
有人可以指导我正确的方向吗?
谢谢
您在 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"
我建议在 /var/www/html
中将您的存储库克隆到您的 VPS 并首先手动测试您的 pull.sh
文件。
答案标记为解决方案的问题是,如果其中的任何命令失败,SH 进程将不会退出。
例如这个命令php artisan route:cache
,很容易失败!更不用说拉了!
更糟糕的是,如果任何命令失败,SH 脚本将不停地执行其余命令。
我无法使用任何 docker 命令,因为在每个命令之后,CI 进程都会停止,我不知道如何避免这些命令不退出 CI过程。我正在使用 SH,但我将根据上一个命令的退出代码开始添加一些条件,这样我们就知道在部署期间是否出现任何问题。
我一直在思考如何利用 BitBucket 的管道将我的 (Laravel) 应用程序自动部署到 Vultr 服务器实例上。
我有以下手动执行的步骤,我正在尝试自主复制这些步骤:
- 我
commit
我的更改和push
到 BitBucket 存储库 - 我使用终端登录我的服务器:
ssh root@ipaddress
- 我
cd
到正确的目录:cd /var/www/html/app/
- 然后我从我的 BitBucket 存储库
pull
:git pull origin master
- 然后我 运行 一些命令:
composer install
、php artisan migrate
等。 - 然后我注销:
exit
我的理解是,您可以使用管道将其自动化,这是真的吗?
到目前为止,我已经为管道和我的服务器设置了 SSH 密钥对,因此我服务器的 authorized_keys
文件包含来自 BitBucket Pipelines 的 public 密钥。
我的管道文件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
。
我读到每个脚本步骤 运行 在它自己的容器中。
Each step in your pipeline will start a separate Docker container to run the commands configured in the script
如果在使用 SSH 登录后 VPS 中没有执行 cd /var/www/html/app
,我得到的错误是有道理的。
有人可以指导我正确的方向吗?
谢谢
您在 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"
我建议在 /var/www/html
中将您的存储库克隆到您的 VPS 并首先手动测试您的 pull.sh
文件。
答案标记为解决方案的问题是,如果其中的任何命令失败,SH 进程将不会退出。
例如这个命令php artisan route:cache
,很容易失败!更不用说拉了!
更糟糕的是,如果任何命令失败,SH 脚本将不停地执行其余命令。
我无法使用任何 docker 命令,因为在每个命令之后,CI 进程都会停止,我不知道如何避免这些命令不退出 CI过程。我正在使用 SH,但我将根据上一个命令的退出代码开始添加一些条件,这样我们就知道在部署期间是否出现任何问题。