在 IBM Cloud 上自动测试并部署 PHP 应用程序
使用集成了 GitHub 的 IBM Cloud Continuous Delivery 工具链和 Travis CI,自动将您的最新代码库部署到 IBM Cloud 环境
回想我最初作为开发人员时,测试应用程序通常涉及到将应用程序代码文件压缩成一个 ZIP 归档文件,或者将它们放在一个共享的网络文件服务器上,并将它们传输到测试环境,解压或复制到正确的位置,在必要时编译它们,然后手动运行各种测试。毋须说,这是一个耗时、令人沮丧且容易出错的过程,许多人都不喜欢这一过程。
到现在,这些操作变得容易得多。借助容易获得的新持续交付工具,只要发生了更改,就可以自动且安全地从存储库拉取应用程序代码并部署到测试或生产环境。无需手动更改 ZIP 文件、网络共享或配置文件,而且很容易检查部署的当前状态或将它回滚到以前的版本。
“IBM Cloud Continuous Delivery
提供了一种安全、自动化的方式来一致且无错误地构建、测试并部署您的 PHP 应用程序。
”
IBM Cloud® Continuous Delivery 服务很有用,因为借助该服务,您可以进行相应设置,让 GitHub 存储库中每个新提交或成功的拉取请求都能自动构建、测试您修改的应用程序代码,并将其部署到 IBM Cloud。让我展示一下如何做。
您需要做的准备工作
本文的目的是向您 — 一位希望向托管在 IBM Cloud 上的 PHP 应用程序添加持续交付功能的 PHP 开发人员 — 介绍 IBM Cloud Continuous Delivery 服务,以及它可以添加到 PHP 应用程序中的功能。我将使用一个基本 PHP 应用程序(包括单元测试)和一个简单的工具链将应用程序从 GitHub 移动到 IBM Cloud。在此场景中,目标 IBM Cloud 部署将始终反映 PHP 应用程序开发分支的已通过测试的最新版。
本文中列出的基本流程如下:
- 每次在 GitHub 源存储库中创建一个拉取请求,Travis CI 都会使用 PHPUnit 自动测试源代码,以确保所有单元测试都会通过。
- 如果单元测试通过,拉取请求会手动或自动合并到存储库的开发分支中。这次合并会自动触发使用 IBM Cloud Continuous Delivery 工具链,在 IBM Cloud 上实现对该应用程序的一次新部署。
- 如果单元测试失败,则不会合并拉取请求,IBM Cloud 上的当前部署不会受到影响。
这个简单流程应能让您的 IBM Cloud 部署始终拥有最新的开发分支。了解此流程后,您应该能顺利调整它来满足更复杂的需求。
请注意,本文中描述的方法主要用于确保您的测试和开发环境能够始终反映正在开发的应用程序代码分支中的最新更改。尽管您也可以使用这里描述的方法来自动部署到应用程序的生产环境,但如果没有事先考虑所涉及的内在风险(以及随后采取适当的控制措施来管理这些风险),不希望您这么做。
以下是您需要做的准备工作:
- 一个 IBM Cloud 帐户(在此处注册)
- 一个 GitHub 帐户(在此处注册)和一个包含一些 PHPUnit 单元测试的 PHP 应用程序
- 基本熟悉 PHP 和 PHPUnit
- 一个包含 Apache 的本地或托管 PHP 开发环境(支持 mod_rewrite 和 .htaccess 文件)
- Composer(PHP 依赖项管理器)
- Cloud Foundry
命令行工具 - Git 命令行工具(或其他任何 Git 客户端)
- 一个文本编辑器或 IDE
1
创建 PHP 应用程序
要执行本文中的步骤,您的本地开发环境中需要有一个包含 PHPUnit 单元测试的 PHP 应用程序;下面给出了创建这样一个应用程序的操作说明。如果您的本地环境或 GitHub 存储库中已经有一个满足这些要求的 PHP 应用程序,那么您可以跳过这一步。如果没有,可以按照这些操作说明进行操作,或克隆 GitHub 上的示例应用程序源代码。
首先来了解一下这个 Composer 配置文件,应该将它保存到 $APP_ROOT/composer.json($APP_ROOT 是您的项目目录)中。处理器类和名称空间尚未存在,但您很快将创建它们。
1 | swift复制代码{ |
使用 Composer 通过以下命令安装配置文件
1 | cmake复制代码shell> php composer.phar install |
接下来,设置应用程序的主要控制脚本。此脚本会加载 Slim 框架并初始化 Slim 应用程序。它还包含对应用程序的每个路径的回调,每个回调定义了在该路径与某个传入请求匹配时要执行的代码。在 $APP_ROOT/public/index.php 上创建一个包含以下内容的脚本:
1 | php复制代码<?php |
此代码是 Slim 框架的官方“Hello
world”脚本的变体。它会设置应用程序路径 /hello/$NAME,并在您浏览到此路径并提供一个名称时,通过一条欢迎消息来问候您。如果没有提供名称,则会显示一条礼貌性的错误。
该版本的脚本向 Slim 依赖注入容器添加了一个处理器类,以便对输入名称执行一些基本的字符串处理。包含这个处理器类,只是为了向 PHPUnit 单元测试添加一些有价值的内容,它看起来类似于(将它保存到 $APP_ROOT/src/app/processors/MyProcessor.php):
1 | php复制代码<?php |
最后,将推荐的
Apache 重写规则添加到 $APP_ROOT/public/.htaccess:
1 | apache复制代码<IfModule mod_rewrite.c> |
通过访问 http://localhost/hello/james(根据需要更新此 URL,以反映您的本地 Apache 环境)来确定应用程序工作正常,您会看到类似的输出:
图 1. 示例 PHP 应用程序
2
创建 PHPUnit 测试套件和 GitHub 存储库
现在,在 $APP_ROOT/tests/AppTest.php 中添加一些供您的应用程序使用的真实和虚拟的 PHPUnit 测试:
1 | php复制代码<?php |
在 $APP_ROOT/phpunit.xml 上创建一个包含以下内容的最小化 PHPUnit 配置文件:
1 | xml复制代码<?xml version="1.0" encoding="UTF-8"?> |
运行 PHPUnit 并确保您的所有测试都通过:
图 2. PHPUnit 测试运行器
最后,通过 GitHub 网站创建一个存储库,使用类似下面代码清单中所示的命令将您的代码推送到该存储库。 创建两个分支:master
用于生产代码库,dev-master
用于开发代码库。
1 | livecodeserver复制代码shell> git init |
记下 GitHub 存储库 URL,因为下一步需要使用它。
图 3. GitHub 存储库 URL
3
部署到 IBM Cloud
现在是时候将应用程序从您的本地开发环境部署到 IBM Cloud 了。如果您因为 GitHub 中已经有一个 PHP 应用程序存储库而跳过了前两步,请在继续后面的步骤之前,将您的存储库克隆到本地开发环境。
创建应用程序清单文件,请记得通过附加一个随机字符串(比如您姓名的首字母)使用唯一的主机和应用程序名称。
1 | yaml复制代码--- |
还必须配置该 buildpack 来使用该应用程序的 public/ 目录作为 Web 服务器目录。创建一个包含以下内容的 $APP_ROOT/.bp-config/options.json 文件:
1 | json复制代码{ |
现在,继续将应用程序推送到 IBM Cloud:
1 | stata复制代码shell> cf api https://api.ng.bluemix.net |
您现在应该能在 http://myapp-dev-[initials].mybluemix.net/hello/james 上浏览该应用程序,并查看您在第 1 步(您在这一步创建了 PHP 应用程序)结束后看到的欢迎消息。如果没有看到该消息,可以使用调试日志查明是哪里出了错。
4
创建 IBM Cloud Continuous Delivery 工具链
从 IBM Cloud 控制台内,单击左上角的菜单图标,然后选择 Services -> DevOps 子菜单。在服务细节页面上,单击 Create a Toolchain 并选择 Simple Cloud Foundry 工具链。
图 4. 创建工具链
这个工具链模板已预先配置为使用 GitHub 和 Delivery Pipeline 服务。在工具链配置页面上,为工具链输入一个名称。选择 GitHub 图标并授权 IBM Cloud 访问您的 GitHub 帐户。完成这个一次性授权流程后,选择一个现有存储库并输入来自第 2 步(您在这一步创建了 GitHub 存储库)的 GitHub 源存储库 URL。
图 5. 存储库集成
单击 Create 创建工具链。现在,将使用一些预先设置的默认值对工具链和 Delivery Pipeline 服务进行初始化,并向您的 GitHub 存储库添加一个 webhook,以便自动向 Delivery Pipeline 服务告知对存储库的更改。您应该在 IBM Cloud 仪表板中的工具链概述页面中看到类似图 6 的信息。
图 6. 工具链概述
单击 Delivery Pipeline 图标,您应该看到该管道已配置了两个阶段:构建和部署。
图 7. 工具链阶段
尽管这些阶段对大部分设置都使用了合理的默认值,但您仍需要按照以下步骤检查它们一次:
- 在构建阶段面板中,单击 Configure Stage 图标。在 Input 选项卡中,确认 GitHub 存储库细节是正确的,而且 Branch 字段被设置为
dev-master
。图 8. 构建阶段配置
2. 在部署阶段面板中,单击 Configure Stage 图标。在 Jobs 选项卡中,确认部署细节(地区、组织、空间和应用程序名称)是正确的。请注意,应用程序名称将被存储库中的应用程序清单文件中的设置覆盖。
图 9. 部署阶段配置
保存对这两个阶段执行的更改。
测试该工具链,方法是向 GitHub 存储库的 dev-master
分支提交一个细微更新 — 例如,将欢迎消息从“Hello…”更改为“Aloha…”。如果工具链已正确配置,IBM Cloud Delivery Pipeline 服务应该会检测到更改,从而会按顺序触发构建和部署阶段。在构建应用程序的新版本并将它部署到 IBM Cloud 时,您应该能够实时看到更改。
图 10. 工具链实战
如果发生错误,可以使用每个阶段中的 View logs and history 链接获取包含错误细节的日志。
图 11. 工具链日志
此刻,您的工具链已正常运行,向指定 GitHub 存储库和分支的每次提交都会触发在 IBM Cloud 上实现应用程序代码的一次新部署。但是您的工作还未完成!
5
配置 Travis CI 来构建和测试拉取请求
如果您在一个分布式团队工作,可能您不会直接提交到一个主要存储库分支。大部分时候,您将会创建手动或自动进行评审、测试和合并的拉取请求。
这时就需要使用 Travis CI。Travis CI 是一个可用于所有 GitHub 存储库的持续集成引擎,可以通过配置它,为每个新拉取请求构建和运行测试(包括 PHPUnit 测试),并将构建结果标记为通过或失败。然后,评审者将拉取请求手动合并到存储库中,或者可以配置 Travis CI,通过自定义脚本自动执行此任务。
您肯定能看出我在何处实现此功能。您可以执行设置,使通过拉取请求向您的应用程序建议的更改可由 Travis CI 自动测试,然后合并到您的 dev-master
分支中。请记住,此分支已由 Delivery Pipeline 服务监控,所以每次成功合并都会导致第 4 步中配置的工具链自动将应用程序的新版本部署到 IBM Cloud。
首先使用您的 GitHub 帐户凭证登录到 Travis CI 网站,授予 Travis CI 访问您的 GitHub 帐户的权限。
图 12. Travis CI-GitHub 集成
从您的 Travis CI 概况页面,为您的 GitHub 存储库打开 Travis CI 引擎。为存储库启用 Travis CI 后,在 Travis CI 界面中单击该存储库的 Settings 图标来配置构建设置。
图 13. Travis CI 引擎激活
在 General 部分,确保 Build pull request
updates 已开启。
图 14. Travis CI 配置
在 $APP_ROOT/.travis.yml 上创建一个包含以下内容的最小化 Travis CI 配置文件:
1 | nestedtext复制代码language: php |
简单讲,此配置文件告诉 Travis CI 仅构建 dev-master
分支,并使用 vendor/bin/phpunit 脚本来测试构建结果。如果成功,Travis CI 会在通过测试时标记该构建,以便可以手动合并它。
在 GitHub 存储库的 dev-master
分支中创建一个新的拉取请求来测试配置。Travis CI 应该注册该拉取请求,并构建和测试它。您将能够从 Travis CI 概况页面跟踪构建的进度。
图 15. Travis CI 实战
如果对构建进行编码并通过测试,可将它合并到您的 GitHub 存储库的 dev-master
分支中。
图 16. GitHub 合并操作
IBM Continuous Delivery 工具链现在将接管工作,并将修改后的代码库部署到 IBM Cloud,就像我在第 4 步(您在这一步创建了 IBM Cloud Continuous Delivery 工具链)中描述的那样。
如果您没有耐心,不想等待手动合并成功的构建结果,或者如果您有源源不断的拉取请求,可以让 Travis CI 自动将成功的构建结果合并到存储库中。这种无人值守、自动化的合并具有一定风险,所以您应该只考虑对您的开发分支这么做。
Travis CI 不包含任何内置的自动合并功能,所以您需要一个自定义脚本来完成此工作。有关自动合并脚本的示例,请参阅本文末尾的链接。您也可以创建自己的脚本来完成此任务和其他相关任务,比如发布通知或更新项目公告板。
创建自定义脚本后,请记住,您必须通过在 $APP_ROOT/.travis.yml 文件中添加一个与下面的示例类似的代码块,告诉 Travis CI 在构建成功时调用该脚本:
1 | stata复制代码after_success: |
结束语
在本文中,我演示了如何使用 IBM Cloud Continuous Delivery 服务让您的 IBM Cloud 应用程序部署与您的 GitHub 代码存储库保持同步。通过提供现成的工具链模板,该模板被配置为可以与GitHub即开即用,IBM Cloud Continuous Delivery 提供了一种安全的自动化方式来一致且无误地构建、测试并部署您的 PHP 应用程序。
IBM Cloud 提供了一些已准备好的工具集成,所以您也可以将您的工具链与其他流行工具相结合,比如使用 Slack 提供通知或使用 JIRA 跟踪问题。您可以自行尝试并查看结果!
致谢
感谢 Chris Down 提供了他的 Travis 自动合并脚本,这是在撰写本文时使用的脚本的修改版。
相关主题
- Slim 文档
- 针对 Apache 的 Slim 配置
- Composer 文档
- GitHub 文档
- Travis CI 文档
- 分支自动合并脚本示例(来自 Chris Down)
- 另一个分支自动合并脚本示例(来自 Brian Broll)
- 拉取请求的自动合并脚本示例
- 在 IBM Cloud 上调试 PHP 错误
本文转载自: 掘金