Testing PHP projects

Testing PHP projects

本指南涵盖了 PHP 项目的基本构建说明.

涵盖了两种测试方案:使用 Docker 执行程序和使用 Shell 执行程序.

尽管可以在任何系统上测试 PHP 应用程序,但这都需要开发人员进行手动配置. 为了克服这个问题,我们将使用可在 Docker Hub 中找到的官方 .

这将使我们能够针对不同版本的 PHP 测试 PHP 项目. 但是,并非所有事情都是即插即用的,您仍然需要手动配置一些东西.

与每项工作一样,您需要创建一个描述构建环境的有效 .

首先,让我们指定将用于作业过程的 PHP 映像(您可以在 Runner 的术语中阅读有关使用 Docker 映像的更多信息,以了解映像的含义).

首先将图像添加到您的.gitlab-ci.yml

官方图片很棒,但是缺少一些有用的测试工具. 我们需要首先准备构建环境. 解决此问题的一种方法是创建一个脚本,该脚本在完成实际测试之前会安装所有必备组件.

Let’s create a ci/docker_install.sh file in the root directory of our repository with the following content:

  1. #!/bin/bash
  2. [[ ! -e /.dockerenv ]] && exit 0
  3. set -xe
  4. # Install git (the php image doesn't have it) which is required by composer
  5. apt-get update -yqq
  6. apt-get install git -yqq
  7. # Install phpunit, the tool that we will use for testing
  8. curl --location --output /usr/local/bin/phpunit https://phar.phpunit.de/phpunit.phar
  9. chmod +x /usr/local/bin/phpunit
  10. # Install mysql driver
  11. # Here you can install any other extension that you need
  12. docker-php-ext-install pdo_mysql

您可能想知道docker-php-ext-install是什么. 简而言之,它是官方 PHP Docker 映像提供的脚本,可用于轻松安装扩展. 有关更多信息,请参阅的文档.

现在,我们创建了包含构建环境的所有先决条件的脚本,让我们将其添加到.gitlab-ci.yml

  1. ...
  2. before_script:
  3. - bash ci/docker_install.sh > /dev/null
  4. ...
  1. ...
  2. test:app:
  3. script:
  4. - phpunit --configuration phpunit_myapp.xml
  5. ...

最后,提交文件并将其推送到 GitLab,以查看构建成功(或失败).

最终的.gitlab-ci.yml应该类似于以下内容:

针对多个版本的 PHP 进行测试非常容易. 只需添加另一个具有不同 Docker 映像版本的作业,即可由跑步者完成其余工作:

  1. before_script:
  2. - bash ci/docker_install.sh > /dev/null
  3. # We test PHP5.6
  4. test:5.6:
  5. image: php:5.6
  6. script:
  7. - phpunit --configuration phpunit_myapp.xml
  8. # We test PHP7.0 (good luck with that)
  9. test:7.0:
  10. image: php:7.0
  11. script:
  12. - phpunit --configuration phpunit_myapp.xml

Custom PHP configuration in Docker builds

有时,您需要通过将.ini文件放入来自定义 PHP 环境. 为此,添加一个before_script动作:

  1. before_script:
  2. - cp my_php.ini /usr/local/etc/php/conf.d/test.ini

当然, my_php.ini必须存在于存储库的根目录中.

Test PHP projects using the Shell executor

Shell 执行程序在服务器上的终端会话中运行您的作业. 因此,为了测试您的项目,您首先需要确保已安装所有依赖项.

例如,在运行 Debian 8 的 VM 中,我们首先更新缓存,然后安装phpunitphp5-mysql

  1. sudo apt-get update -y
  2. sudo apt-get install -y phpunit php5-mysql

接下来,将以下代码段添加到.gitlab-ci.yml

最后,推送到 GitLab 并开始测试!

phpenv项目使您可以轻松管理不同版本的 PHP,每个版本都有自己的配置. 当使用 Shell 执行程序测试 PHP 项目时,这特别有用.

您必须按照在gitlab-runner用户下将其安装在构建计算机 .

  1. phpenv config-add my_config.ini

*重要说明:似乎phpenv/phpenv . madumlao / phpenv上有一个分叉,试图使该项目 . CHH / phpenv似乎也是一个不错的选择. 选择任何提到的工具将与基本 phpenv 命令一起使用. 指导您选择正确的 phpenv 不在本教程的范围内.*

Install custom extensions

由于这是 PHP 环境的裸机安装,因此您可能需要一些构建机器上当前不存在的扩展.

要安装其他扩展,只需执行以下命令:

  1. pecl install <extension>

不建议将其添加到.gitlab-ci.yml . 您应该只执行一次此命令,仅用于设置构建环境.

除了 PHPUnit,您可以使用任何其他工具来运行单元测试. 例如,您可以使用atoum

  1. before_script:
  2. - wget http://downloads.atoum.org/nightly/mageekguy.atoum.phar
  3. test:atoum:
  4. script:
  5. - php mageekguy.atoum.phar

Using Composer

大多数 PHP 项目使用 Composer 来管理其 PHP 软件包. 为了在运行测试之前执行 Composer,只需在.gitlab-ci.yml添加以下.gitlab-ci.yml

Access private packages or dependencies

如果您的测试套件需要访问私有存储库,则需要配置才能克隆它.

大多数时候,您将需要一个正在运行的数据库才能运行测试. 如果您使用的是 Docker 执行器,则可以利用 Docker 链接到其他容器的功能. 使用 GitLab Runner,可以通过定义service来实现.

CI 服务文档中涵盖了此功能.

Testing things locally

使用 GitLab Runner 1.0,您还可以在本地测试所有更改. 从您的终端执行:

  1. # Check using docker executor
  2. gitlab-runner exec docker test:app

为了方便起见,我们建立了一个示例 PHP 项目 ,该使用我们的公共共享运行器在上运行.