逐步在 Google Cloud Run 上配置 Laravel 6 并实现持续集成 (CI)
Laravel在过去几年里人气飙升。Laravel 社区甚至表示,Laravel 让编写 PHP 代码从痛苦变成了乐趣。Laravel 6 带来了一些有趣的新特性。为应用程序获取一个高度可扩展的可用 URL 可能需要数小时甚至数天。搭建像 Kubernetes 这样的环境是一项艰巨的任务。而 Google Cloud Run 正好弥补了这一不足,只需几分钟即可为任何容器化应用程序获得可用的 HTTPS URL。
Google Cloud Run是无服务器且完全由 Google 管理的云服务,它提供超大规模扩展、按秒计费、HTTPS URL 和自定义域名映射。如果您想运行无状态容器,Cloud Run 无疑是最简便的方法。本文将详细介绍如何让您的 Laravel 6 应用在 Google Cloud Run 上运行,并支持持续集成 (CI)。
先决条件
-
您熟悉 PHP/Composer 并且了解 Laravel(如果您来到这里,我想您应该已经了解了)。
-
您知道如何通过命令行界面使用 Git。
-
您的代码托管在 GitHub 上用于持续集成/持续交付 (CI/CD),并且您熟悉 GitHub。
-
对 Docker 有一定了解,甚至可能了解多阶段构建。
-
拥有一个可用的谷歌云账户(他们会免费赠送300 美元额度,有效期一年,所以没有理由不注册一个账户)。
为什么 Cloud Run 是初学者的绝佳选择?
原因如下:
-
了解最佳实践和软件,例如 Docker 和 CI/CD。
-
最基本的操作就是点击一个按钮,选择两项内容,等待5分钟,就能获得一个可用的HTTPS网址。还有比这更简单的吗?:)
部署步骤
以下是在 Cloud Run 上设置和部署 Laravel 6 的步骤:
1. 克隆 Laravel 或新建一个 Laravel 项目
首先,按照官方安装指南中的说明,克隆 Laravel 项目,或者使用 Composer 或 Laravel CLI 。我使用 Composer 获取最新版本的 Laravel,如下所示:
命令
我运行了以下命令来获取最新版本的 Laravel:
composer create-project --prefer-dist laravel/laravel laravel6-on-google-cloud-run
2. 先在本地测试一下。
然后运行 `cd laravel6-on-google-cloud-run`,再运行 `php artisan serve` 来查看是否正常工作。对我来说,在浏览器中访问`http://localhost:8000`时一切正常。我本地安装的是 PHP 7.2。
Laravel 6 在本地运行,使用 artisan serve 命令。
3. 创建一个新的 GitHub 仓库
在Github上创建一个新的仓库,如下所示:
您可以使用任何 Git 托管提供商,在本示例中,我将使用Github Actions来运行测试,Github 也是最流行的 Git 托管服务。
4. 添加仓库,推送 README 文件
现在仓库已经创建完成,请将其添加到本地 Laravel 副本并推送 Readme 文件。为此,请在命令行界面 (CLI) 中运行以下命令:
git init
code . *# I used VS code to change the readme* git add readme.md
git commit -m "Initial commit -- App Readme"
git remote add origin git@github.com:geshan/laravel6-on-google-cloud-run.git
git push -u origin master
运行上述命令后,我的 GitHub 仓库中出现了以下内容。
5. 添加完整的 Laravel 功能,提交 PR
现在,让我们通过执行以下命令,将整个应用程序作为 PR 添加到 Github 仓库中:
git checkout -b laravel6-full-app
git add .gitignore
git add .
git commit -m "Add the whole Laravel 6 app"
git push origin laravel6-full-app
之后,像这样在仓库里提交一个拉取请求(PR)。你可能会想,只有我一个人在做这个项目,为什么还需要提交 PR 呢?嗯,即使只有一个人在做项目,按部就班地做事也总是更好的。
之后合并你的拉取请求。
6. 使用GitHub Actions设置测试
合并 PR 后,GitHub 就知道这是一个 Laravel 项目了,这可不是什么轻松有趣的事情。点击仓库页面上的“操作”选项卡,你应该能看到类似下面的内容:
在 Laravel 下点击“设置此工作流”,然后在下一页点击右上角的“开始提交”按钮。之后,添加如下所示的提交消息,然后点击“提交新文件”。
好了,你的 CI 配置完成了。现在每次 git 推送都会运行 Laravel 的默认测试。是不是很简单?感谢 GitHub 提供的强大功能。以后再也不用创建 .myCIname.yml 文件了 :)。
7. 添加 Docker 和 Docker Compose 以在本地运行应用程序
现在,让我们添加 Docker 和 Docker Compose,以便在本地运行应用程序,而无需 PHP 或 Artisan serve。我们也需要容器在 Google Cloud Run 上运行 Laravel。这部分内容的灵感来自Nicolas 的文章《Google Cloud Run 上的 Laravel》。如果您想了解更多关于Docker和 Laravel 的信息,请参阅这篇文章。
请先运行以下命令,将主分支更新到最新版本,因为我们已从 GitHub 界面添加了工作流文件:
git checkout master
git fetch
git pull --rebase origin master
git checkout -b docker
在 .env.example 文件中添加一个键,从 .env 文件复制如下内容:
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:DJkdj8L5Di3rUkUOwmBFCrr5dsIYU/s7s+W52ClI4AA= **
APP_DEBUG=true
APP_URL=http://localhost
由于这只是一个演示程序,这样做没问题;但对于真正的应用程序,务必谨慎处理密钥。对于已投入生产环境的应用程序,请关闭调试和其他开发相关的功能。
在项目根目录下添加以下 Dockerfile:
FROM composer:1.9.0 as build
WORKDIR /app
COPY . /app
RUN composer global require hirak/prestissimo **&&** composer install
FROM php:7.3-apache-stretch
RUN docker-php-ext-install pdo pdo_mysql
EXPOSE 8080
COPY --from**=**build /app /var/www/
COPY docker/000-default.conf /etc/apache2/sites-available/000-default.conf
COPY .env.example /var/www/.env
RUN chmod 777 -R /var/www/storage/ **&&** \
echo "Listen 8080" >> /etc/apache2/ports.conf **&&** \
chown -R www-data:www-data /var/www/ **&&** \
a2enmod rewrite
然后,在 docker/000-default.conf 中添加以下文件。
<VirtualHost *:8080>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/public/
<Directory /var/www/>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
之后添加以下 docker-compose.yml 文件
version: '3'
services:
app:
build:
context: ./
volumes:
- .:/var/www
ports:
- "8080:8080"
environment:
- APP_ENV**=**local
归根结底,就是最重要的事
如果你试图理解这里的所有内容,可能会感到不知所措,让我来概括一下主要部分:
-
我们使用官方的 PHP Apache Docker 镜像来运行 Laravel,其 PHP 版本为 7.3。
-
我们使用多阶段构建,通过 Composer 获取依赖项,然后将它们复制到包含 PHP 7.3 和 Apache 的主 docker 镜像中。
-
由于 Google Cloud Run 要求 Web 服务器监听 8080 端口,我们使用 000-default.conf 进行配置。
-
为了方便使用单个命令 docker-compose up 运行,我们使用了 docker-compose。
-
既然你已经读到这里,请在根目录下运行 `docker-compose up` 命令,然后在所有操作完成后访问http://localhost:8080,查看 Laravel 6 是否已在本地 Docker 容器中运行。以下是我最后运行 `docker-compose up` 命令的输出结果:
由于 Laravel 在 Docker 下运行良好,我们不妨像这样提交一个 PR ,将 Docker 添加到我们的项目中。在提交拉取请求 (PR) 之前,我在项目根目录下运行了以下命令:
git status
它应该会显示类似下面的内容:
On branch docker
Untracked files:
**(**use "git add <file>..." to include in what will be committed)
Dockerfile
docker-compose.yml
docker/
nothing added to commit but untracked files present **(**use "git add" to track**)**
现在运行以下命令:
git add .
git commit -m "Add docker and docker compose"
git push origin docker
此外,它还会在推送时运行 Laravel 默认测试,如下所示:
在 GitHub 上运行的测试,使用 GitHub Actions
只有仓库所有者才能访问“操作”选项卡,因此其他人不一定需要知道您的测试构建结果 :)。
8. 添加“部署到Google Cloud”按钮
现在让我们以最简单的方式将此 Laravel 配置部署到 Google Cloud Run。假设您已合并了来自 docker 分支的 PR,请运行以下命令:
git checkout master
git fetch
git pull --rebase origin master
git checkout -b cloud-run-button
然后将以下内容添加到您的 readme.md 文件中:
*### Run on Google cloud run* **[**!**[**Run on Google Cloud**](**https://storage.googleapis.com/cloudrun/button.svg**)](**https://console.cloud.google.com/cloudshell/editor?shellonly**=**true&cloudshell_image**=**gcr.io/cloudrun/button&cloudshell_git_repo**=https://github.com/geshan/laravel6-on-google-cloud-run.git)**
请注意,将最后一部分替换为您的仓库的 HTTPS URL,例如,如果您的仓库位于https://github.com/ghaleroshan/laravel6-on-google-cloud-run,则应替换为https://github.com/ghaleroshan/laravel6-on-google-cloud-run.git,然后提交并推送。您的 PR 应该类似于这样。
9. 在 Google Cloud Run 上部署
合并 Pull Request (PR) 后,转到您的仓库页面,然后点击“在 Google Cloud 上运行”按钮。
之后,如果您已登录 Google 帐户并已设置包含 1 个项目的 Google 云,请点击“继续”。您可能需要稍等片刻。
-
选择项目 — 选择要部署此应用程序的项目
-
选择区域 — 选择要部署此应用程序的区域,我通常选择 us-central-1。
-
然后等待容器构建和部署完成,您可以在下面看到我的操作流程:
如果 Google Cloud Shell 一切正常,您将看到一个 HTTPS URL,点击该 URL 即可查看正在运行的 Laravel 应用,如下所示:
刚才发生的事情是:
-
选择区域后,脚本会根据仓库中的 Dockerfile 构建 Docker 容器镜像。
-
然后它将构建好的镜像推送到Google Container Registry。
-
之后,使用gcloud CLI 将构建好的镜像部署到 Cloud Run,并返回了 URL。
10. 太棒了,你的应用运行正常
获取 URL 后,您应该可以在 Google Cloud Run 上看到您的应用运行情况,如下所示:
Laravel 6 运行在 Google Cloud Run 上
如果你想部署另一个版本,你可以将你的 PR 合并到 master 分支,然后再次点击按钮进行部署。
更多关于 Google Cloud Run 的信息
Google Cloud Run 的定价非常优惠。你可以在 Google Cloud Run 上运行任何容器化应用或 Web 应用。我曾经运行过一个个人项目,每分钟大约只有 1 个请求,但我完全免费。
它在底层使用了Knative和Kubernetes。它也可以运行在你的 Kubernetes 集群上,但是如果只需推送就能获得可扩展的无服务器全托管应用程序,谁还会选择管理 K8s 集群呢?
TLDR
要在 Google Cloud Run 上快速运行 Laravel 6,请按照以下步骤操作:
-
请确保您已登录Google Cloud 帐户。
-
点击“在 Google Cloud 上运行”蓝色按钮
-
选择您的项目
-
选择您的地区
-
请稍等片刻,即可获取您的 Laravel 应用的 URL,如下所示,尽情享用吧!
结论
瞧,在 Google Cloud Run 上运行 Laravel 应用非常简单。你甚至已经通过 GitHub Actions 在 GitHub 上运行了测试。希望对你有帮助。要实现 CI/CD,你可以查看这篇文章,它展示了如何使用 Cloud Build 进行部署。由于本地环境和生产环境(Google Cloud Run)运行的是同一个容器,因此你无需学习新的框架即可实现无服务器架构。所有代码都开源在这个GitHub 仓库中。
任何容器化的 Web 应用都可以在 Google Cloud Run 上运行,这是一项非常棒的服务。
原文发表于https://geshan.com.np,日期为 2019 年 10 月 21 日。
文章来源:https://dev.to/geshan/set-up-laravel-6-on-google-cloud-run-step-by-step-with-continuous-integration-ci-3ilo









