开始使用 PHP
TeamCity 支持您在许多技术中进行持续集成(CI)过程。 在本教程中,我们将为 PHP 项目配置一个持续集成(CI)过程。 我们将使用开源 PHP 项目 PHPExcel 作为我们希望提供 CI 支持的示例项目。 此项目包含大量的代码,PHPUnit 测试,并使用 Phing 来创建构建工件。 使用 TeamCity,我们将自动化构建过程,并在 GitHub 上的源代码发生更改后立即做好反馈准备。
这个教程假设您已经有一个安装了 PEAR 、 PHPUnit 和 Phing 的 PHP 环境。 如果还没有,现在就是时候。 您可以在此博客文章中查找更多有关配置您的 PHP 环境的信息。
我们将从在 TeamCity 中创建新项目和构建配置开始。 这个新的构建配置的构建号将为 1.7.6.{0}
,因为 PHPExcel 目前处于 1.7.6.x
版本范围内。
PHPExcel 自带一个构建脚本,该脚本在 build/release/*
目录下创建构建工件,这意味着我们已经可以将该路径作为 TeamCity 监控的工件路径添加进去。

PHPExcel 项目有一个 GitHub repository,我们可以在版本控制系统(VCS)设置中配置这个网址。

构建配置由几个构建步骤组成,这些步骤在构建过程中执行我们所需的操作。
由于 PHP 是一种解释型语言,我们无需编译步骤,可以立即开始单位测试:我们希望确保每次源代码发生变化时,所有测试都能通过。 只要有单元测试失败,我们希望整个构建失败,而不提供任何构建工件。 TeamCity 自带了许多预定义的 Java 和 .NET 构建步骤,但由于我们正在使用 PHP,我们不得不选择 Command Line 构建运行程序。

我们希望运行与PHPExcel源代码一起提供的PHPUnit配置。 调用此操作可以通过以下命令行脚本完成:
phpunit \-c phpunit.xml
默认情况下,TeamCity 将导入 PHPUnit 提供的测试结果。 然而,我们也可以向 TeamCity 报告实时测试结果,这样我们可以在构建运行完成之前就已经看到结果了。 使用一个围绕 PHPUnit 的 封装器 ,它使用 服务消息 来报告构建结果。 将包装器放在构建代理的某个位置,或者使用第二个 VCS 根直接从上述 GitHub 存储库下载该构建代理。

我们已经可以调用我们的构建配置,并应该能看到单元测试结果的显示。 但我们还没有结束,我们希望添加更多的构建步骤。
我们下一步的构建步骤将会是调用 Phing,这是一个基于 Apache Ant 的 PHP 项目构建系统或构建工具。 PHPExcel 附带了一个 Phing 构建脚本,我们将在所有单元测试都通过后调用它。 让我们添加一个新的命令行构建步骤,使用 Phing 的命令行工具并向其传递一些参数:
phing \-f build\build.xml \-DpackageVersion=%system.build.number% \-DreleaseDate=CIbuild \-DdocumentFormat=doc release-standard
PHPExcel 定义了四个构建目标(release-standard、release-documentation、release-pear 和 release-phar),所有的构建目标都提供不同的构建工件。 我们现在在命令行中指定的发布标准目标是 PHPExcel 的默认构建,它会生成一个包含所有源代码和 phpDocumentor 输出的 ZIP 文件。
我们还通过 Phing 的 -D
命令行切换,将当前的构建号从 TeamCity 传递给 Phing。 构建脚本可以使用这些来创建正确的文件名。
如果您在创建构建项目时没有配置工件路径,最好现在就做(参见 设置项目)。 我们想确保在此构建脚本中生成的 ZIP 文件可以从 TeamCity 的网页界面获取。
当我们运行另一个构建时,您会看到正在运行的单元测试,然后是 Phing 构建脚本的运行。 一旦整个构建完成,我们可以找到由 Phing 构建脚本生成的 ZIP 文件作为可下载的构建成品。

我们创建的第一步构建步骤是使用 PHPUnit 运行单元测试。 关于 PHPUnit 的好处是,它也可以提供代码覆盖率信息,并以HTML报告的形式友好地展示。 TeamCity 能够在构建结果的自定义选项卡上显示 HTML 报告。
首先,我们确保代码覆盖率已启用。 编辑第一步建设步骤(运行 PHPUnit)并确保它使用 PHPExcel 的 phpunit-cc.xml
配置文件来配置 PHPUnit。 这个配置文件是特定于 PHPExcel 的,它的代码覆盖率报告输出在 unitTests/codeCoverage 文件夹中。 虽然可以将所有生成的文件添加到 TeamCity 作为构建工件,但将整个文件夹压缩为一个单独的文件并使其可用会更加清晰。 我们可以通过使用特殊的构建工件路径模式让 TeamCity 为我们创建这个 ZIP 文件! 再次编辑构建工件,并确定已指定以下两个产物路径:
build/release/*%system.build.number%*
unitTests/codeCoverage => coverage.zip
我们可以让 TeamCity 从 unitTests/codeCoverage 路径中创建一个 ZIP 归档文件,只需使用 => 并指定一个目标工件名称即可。
再次运行构建。 一旦完成,Artifacts 标签页应该包含我们刚刚创建的 coverage.zip 文件。 除此之外,现在应该有一个额外的选项卡 Code Coverage 可供查看,它显示代码覆盖率结果。 由于我们正在使用 TeamCity 的约定来报告代码覆盖率,即创建一个 coverage.zip 构建工件,TeamCity 将会在一个新的报告选项卡中自动展示覆盖率结果。


可以添加额外的构建报告,并展示 PHP 混乱检测器,PHPLint 或者甚至有一个可用的标签页展示 phpDocumentor 的内容,这些都是通过基于构建工件信息创建自定义报告标签页实现的。
使用 TeamCity,我们可以查看构建历史、VCS历史、提交等等。 我们以图形化的形式展示了常规的构建统计数据,如成功率、构建持续时间和测试计数。
在使用基于 IntelliJ 平台的环境时,例如 PhpStorm 或 WebStorm,很容易将 TeamCity 与 IDE 连接起来。 在将 TeamCity 插件安装到您的 IDE 之后,您会发现有一些有用的小功能,比如从 TeamCity 中打开 IDE 的单元测试:

正如我们在本教程中看到的,对 PHP 运行构建并为您的 PHP 项目提供持续集成是非常直接了当的!
构建快乐!