本教程包括:
- 克隆一个Laravel应用并在本地运行它
- 在Heroku上创建一个应用程序, 包括ClearDB MySQL附加组件
- 创建管道配置,将Laravel应用部署到Heroku上
在这个教程中, 我将告诉你如何设置一个持续的部署管道,以最小的麻烦将Laravel应用程序部署到Heroku平台上。自动部署可以帮助团队在部署过程中限制人工干预,减少错误的风险,简化整个软件发布过程。
前提条件
对于这个帖子, 你需要:
- 对PHP和Laravel的理解
- PHP 7.4或更高版本,最好是PHP 8
- 掌握Git
- 在你的电脑上安装Composer
- 在你的电脑上安装MySQL
- 一个GitHub账户
- 一个CircleCI账户
- 一个Heroku账户
开始使用
首先,克隆一个用Laravel构建的作者应用程序。通过这个应用程序,你可以创建一个作者列表,说明他们的name,email,github 用户名和location 。在终端, 输入这个命令来下载这个项目:
git clone --single-branch --branch template https://github.com/CIRCLECI-GWP/laravel-heroku-app.git laravel-heroku-app
移动到应用程序中,安装其依赖性,并生成应用程序的密钥。
cd laravel-heroku-app
composer install
接下来,使用这些命令创建一个.env 文件并生成应用程序的密钥。
cp .env.example .env
php artisan key:generate
在本地运行应用程序
在本地运行该应用程序,确认它正在按预期工作。但首先要更新数据库凭证。
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=YOUR_DATABASE_NAME
DB_USERNAME=YOUR_DATABASE_USERNAME
DB_PASSWORD=YOUR_DATABASE_PASSWORD
用你打算使用的值替换YOUR_DATABASE_NAME,YOUR_DATABASE_USERNAME 和YOUR_DATABASE_PASSWORD 。
接下来,创建数据库表并运行该应用程序。
php artisan migrate
php artisan serve
进入http://localhost:8000 ,查看应用程序的主页。

点击作者,查看作者列表。如果没有创建作者,列标签下面的空间将是空白。

点击创建新作者,添加一个新的作者。

输入细节,点击提交。

现在你已经确认了演示应用程序的工作,你可以开始设置部署到Heroku。
在Heroku上创建一个应用程序
要在Heroku上创建一个应用程序,进入Heroku仪表板。点击新建,然后点击新建应用程序。在表格中填写你的应用程序的名称和你的地区。

然后,点击创建应用程序。你将被重定向到你新创建的应用程序的部署视图。
添加ClearDB MySQL附加组件
默认情况下,Laravel提供了对五个数据库的第一方支持.为了保持一致性,最好在Heroku上维护与你在本地相同的MySQL数据库。Heroku默认使用PostgreSQL,但由于本教程项目使用MySQL,你需要安装一个名为ClearDB的MySQL插件。免费计划对本教程来说应该足够好用。
要安装ClearDB,点击资源,搜索ClearDB,并选择它。

选择免费计划,然后点击提交订购表。

一旦这个过程完成,ClearDB将生成一个连接字符串,并将其纳入应用程序的配置变量中。
要更新你的应用程序的其他环境变量,点击设置,然后点击揭示配置变量。复制CLEARDB_DATABASE_URL ,并粘贴到你可以轻松提取凭证的地方。
数据库的URL应该是这样的格式:mysql://YOUR_DB_USERNAME:YOUR_DB_PASSWORD@YOUR_DB_HOST/YOUR_DB_NAME?reconnect=true 。使用生成的数据库URL,添加这些变量。
APP_DEBUG打开和关闭Laravel应用程序的调试模式.APP_ENV表示一个应用程序是在本地还是在生产中。APP_KEY是生成的应用程序的密钥.你可以使用你本地机器上的副本.APP_NAME指定应用程序的名称.APP_URL是用来说明你的应用程序的URL。在这种情况下,它是我们Heroku应用程序的URL。

现在你需要一个API密钥。你将使用这个密钥和应用程序名称来连接你的CircleCI管道和Heroku。为了得到你的API密钥,打开账户设置页面。滚动到API密钥部分。

点击 "揭示"按钮,复制API密钥。把它保存在你以后能容易找到的地方。
添加CircleCI配置文件
在本教程的这一部分,我将指导你添加CircleCI的管道配置。对于这个项目,管道包括将我们的应用程序部署到Heroku的步骤。
在你项目的根部,创建一个名为.circleci 的文件夹。在该文件夹中,创建一个名为config.yml 的文件。在新创建的文件中,添加这个配置。
version: 2.1
orbs:
heroku: circleci/heroku@1.2.6
jobs:
build:
docker:
- image: cimg/php:8.0
steps:
- checkout
# Download and cache dependencies
- restore_cache:
keys:
- v1-dependencies-{{ checksum "composer.json" }}
- run:
name: "Install Dependencies"
command: composer install -n --prefer-dist
- save_cache:
key: v1-dependencies-{{ checksum "composer.json" }}
paths:
- ./vendor
deploy_app:
executor: heroku/default
steps:
- checkout
- heroku/install
- heroku/deploy-via-git:
force: true
- run:
command: |
heroku run --app=${HEROKU_APP_NAME} php artisan migrate --force
workflows:
deploy:
jobs:
- build
- deploy_app
这个配置文件为项目指定了CircleCI的版本。orbs 关键是调用写作时可用的最新版本的Heroku orb。这个orb抽象了通常在设置Heroku CLI时涉及的复杂性。orb会自动安装它,并使用它将应用程序部署到Heroku。
build 工作从CircleCI Docker Hub注册处拉入PHP Docker镜像。你的代码被从仓库中检出,项目的依赖性被安装。如果为你的项目配置了测试,这将是一个运行测试的好地方。在本教程中,我们将跳过测试,只关注在Heroku平台上的部署。
deploy_app 工作使用heroku/default 执行器来检查项目并安装Heroku CLI。应用程序被部署,迁移命令被运行,以便在Heroku上为你的应用程序创建数据库。
注意。 只运行一次migrate命令(在第一次部署时)。然后编辑配置文件,删除migrate命令。
创建Procfile
Procfile有助于定义进程类型和启动应用程序时应执行的命令。对于PHP运行时间,你可以选择使用Apache2或Nginx作为Web服务器来运行这个应用程序。在本教程中,我们将使用Apache2来服务我们的应用程序。要设置它,请浏览你的项目根目录,创建一个名为Procfile 的新文件,并在其中加入以下内容。
web: vendor/bin/heroku-php-apache2 public/
这条命令将Web服务器设置为Apache,并指定你的应用程序将从哪个文件夹中获得服务。对于这个项目,它是public 文件夹。
登录到您的CircleCI账户。如果你用你的GitHub账户注册,你所有的仓库将在你的项目仪表板上可用。
点击为您的laravel-heroku-app 项目设置项目。

你会被提示写一个新的配置文件或在你的项目中使用一个现有的配置文件。选择现有的选项。输入你的代码在GitHub上存放的分支名称,然后点击Let's Go按钮。

你的第一个工作流程将开始运行,但它会失败。

这个部署过程失败是因为你还没有提供你的Heroku API密钥。你现在可以解决这个问题。点击项目设置按钮,然后点击环境变量。添加这两个新变量。
HEROKU_APP_NAME是Heroku中的应用名称( )。laravel-heroku-applicationHEROKU_API_KEY是你从账户设置页面获取的Heroku API密钥。
选择Rerun Workflow from Failed来重新运行Heroku部署。这一次,你的工作流将成功运行。
你可以从应用的迁移中确认这一点。

为了确认你的工作流是成功的,在你的浏览器中打开你新部署的应用程序。你的应用程序的URL应该是这样的格式https://<HEROKU_APP_NAME>.herokuapp.com/

总结
在本教程中,你已经学会了使用CircleCI和Heroku为Laravel应用程序建立持续部署管道的必要步骤和过程。使用这个管道可以确保功能部署的质量,并大大降低人为错误影响生产环境的风险。