使用 GitHub Actions 来自动部署你的 Laravel 项目
我的艺术家们,大家好!!
在本文中,我将逐步介绍如何在 VPS 上免费自动部署您的 Laravel 应用程序。
场景设置...#
我是一个部署在 VPS 上的 Laravel 项目的小团队的一员。我们的每个团队成员都将从事一项特定的任务,当它准备好投入生产时,总是需要有人访问服务器来部署正在推送到我们的 GitHub Repo 的每个更改。
这对我们所有人来说都是一项非常重复和令人不快的任务,需要在我们的规模和预算范围内找到解决方案,这就是我们求助于强大的 Github Actions 来自动化我们的工作流程的时候。
让我们深入了解我们的工作流程设置指南的简化版本。
假设#
在本指南中,我假设您检查了以下几点。
-
你有一个配置好的 Linux 服务器,它能够运行 Laravel 应用程序,并且上面安装了 Git。
-
你有一个 Laravel 应用程序 Github 存储库。你可以按照我上一篇文章的前 2 部分在这里 free-serverless-laravel-deployment。
这个怎么运作#
在典型的工作流程中,开发人员将为给定任务创建一个新分支,并向 main/master
分支发出拉取请求,或自行在 main/master
分支上进行更改 (不可取) 并推送。
pull request
和 push
都是我们可以通过 Github Actions 订阅的给定分支上的事件。因此,我们可以定义一组指令,当给定事件在我们的仓库上发生时应该执行这些指令。这些指令可能正在运行我们的 Tests
,Builds
, 和 Deployments
。
创建部署脚本#
我们要做的第一件事是创建一个部署脚本,其中包含部署和运行我们的应用程序所需的所有命令。
在应用程序的根目录中创建一个名为 .scripts
的文件夹。
在 .scripts
目录中创建一个名为 deploy.sh
的文件,其内容如下。
#!/bin/bash
set -e
echo "Deployment started ..."
# Enter maintenance mode or return true
# if already is in maintenance mode
(php artisan down) || true
# Pull the latest version of the app
git pull origin production
# Install composer dependencies
composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader
# Clear the old cache
php artisan clear-compiled
# Recreate cache
php artisan optimize
# Compile npm assets
npm run prod
# Run database migrations
php artisan migrate --force
# Exit maintenance mode
php artisan up
echo "Deployment finished!"
请参阅脚本的注释以了解我们在每一行上所做的事情。
创建工作流#
Github 操作工作流是一组指令,其中包含可以在我们上面提到的事件上触发的不同任务作业和步骤。
仓库的工作流存储在应用程序根目录的 .github/workflows
中。
在 .github/workflows
文件夹中创建一个名为 deploy.yml
的文件,其中包含以下内容。
name: Deploy
# Trigger the workflow on push and
# pull request events on the production branch
on:
push:
branches:
- production
pull_request:
branches:
- production
# Authenticate to the the server via ssh
# and run our deployment script
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Deploy to server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
port: ${{ secrets.PORT }}
key: ${{ secrets.SSHKEY }}
script: "cd /var/www/html && ./.scripts/deploy.sh"
提交新创建的文件#
现在我们已经为我们的自动化创建了所有必要的文件,让我们使用以下命令提交它们。
$ git add deploy.sh deploy.yml
$ git commit -m "Deployment automation"
创建部署分支并推送到 Github#
如果您注意到我们的 deploy.sh
和 deploy.yml
文件,我们提到了一个名为 production
的分支。我们将使用此分支添加通过 push
或 pull request
可用于生产的提交。
使用以下 git 命令为您的存储库创建此分支并将它们推送到 GitHub。
$ git checkout -b production
$ git push -u origin production
设置 ssh 密钥#
是时候在我们的服务器和 Github 之间建立连接了。
为此,我们首先需要在我们的服务器上生成一个新的 ssh 密钥对。
在您的服务器上运行此命令以生成 ssh 密钥。
$ ssh-keygen -t rsa -b 4096 -C "email@example.com"
当提示输入文件名和密码时,只需按 Enter 并接受默认值。
这将在您的根目录 .ssh/
文件夹中创建 2 个 ssh 密钥,公钥和私钥。
现在使用以下命令将新生成的 ssh 私钥添加到 ssh-agent。
$ eval "$(ssh-agent -s)"
$ ssh-add ~/.ssh/id_rsa
让我们使用以下命令将我们的公钥添加到我们服务器上的 authorized_keys
文件中。
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
复制 ssh 密钥到 Github#
我们的上述设置将允许:-
1\。 Github Actions 向我们的服务器验证自己并运行我们的 deploy.sh
脚本。
为此,我们必须让 Github 知道如何对我们的服务器进行身份验证。
当我们准备好上面的 ssh 密钥时,它将与服务器的 HOST
, ssh PORT
, ssh 私钥的 KEY
, 以及服务器的 USERNAME
一起提供给 GitHub。
为此,请在浏览器上访问您的 Github 帐户并打开您的仓库。
点击 settings,如下图
在侧边栏菜单上单击 secrets
在 Action Secret 页面上,单击 new repository secret。
在 new secret 页面上,逐个添加以下密钥。
HOST
#
HOST
是您的服务器 IP 地址,在名称字段中输入 HOST
关键字,在值中输入您的服务器 IP 地址。
PORT
#
PORT
是您的 ssh 端口。在名称中使用 PORT
关键字并在值中使用 22
以使用默认 ssh 端口。
SSHKEY
#
SSHKEY
是我们在服务器上生成的私有 ssh 密钥。通常您不会与任何人共享您的私人 ssh 密钥,但由于我们正在进行自动化,因此这是必需的。
使用 SSHKEY
关键字作为名称字段。
要复制您的私钥值,请转到您的服务器并运行以下命令。
$ cat ~/.ssh/id_rsa
这将在您的终端上打印您的私人 ssh 密钥,将其复制并粘贴到值字段中。
USERNAME
#
最后一个是您要进行身份验证的 USERNAME
。
为此,您可以在服务器上运行 whoami
并获取值。然后在名称字段中使用 USERNAME
关键字并在值中添加过去。
完成后,您的秘密应该看起来像这样
2\。我们的服务器向 Github 进行身份验证并获取我们存储库中的最新提交。
为了让 Github 允许访问我们的服务器,我们必须提供我们之前生成的 ssh 公钥。
如果我们有多个仓库,我们可以在帐户级别提供公钥,但如果它只是一个仓库,我们可以在仓库中提供它,并且只允许访问我们帐户上的那个仓库。
为此,请再次转到您的仓库设置并单击部署密。
添加部署密钥..
给它起一个有助于记住服务器的标题,例如 PROD_SERVER
。
对于关键字段值,转到您的服务器并使用以下命令打印您的公钥并复制它。
$ cat ~/.ssh/id_rsa.pub
不要检查允许写访问,只需单击添加密钥按钮。
最后一件事是更改我们服务器上的远程源以使用 SSH 而不是 HTTPS 并执行获取以获取服务器上的新提交。
为此,请转到您的 Github 存储库并单击 code
按钮并复制 ssh 选项卡上的链接。
然后在您的服务器上转到您部署的应用程序目录,最常见的是 /var/html/www
并运行以下命令。
git remote set-url origin git@github.com:USERNAME/REPOSITORY.git
git fetch
将 URL 替换为您复制的 URL。
好了,我的朋友们,你现在有了 Laravel 应用程序部署自动化。 创建一个测试提交并将其推送到您的 production
分支,以见证奇迹发生。
您可以通过为您的测试构建、暂存环境等添加更多工作流来为它疯狂……
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: