Testing PHP projects

原文:https://docs.gitlab.com/ee/ci/examples/php.html

Testing PHP projects

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

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

Test PHP projects using the Docker executor

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

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

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

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

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

  1. image: php:5.6

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

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

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

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

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

  1. ...
  2. before_script:
  3. - bash ci/docker_install.sh > /dev/null
  4. ...

最后一步,使用phpunit运行实际测试:

  1. ...
  2. test:app:
  3. script:
  4. - phpunit --configuration phpunit_myapp.xml
  5. ...

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

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

  1. # Select image from https://hub.docker.com/_/php
  2. image: php:5.6
  3. before_script:
  4. # Install dependencies
  5. - bash ci/docker_install.sh > /dev/null
  6. test:app:
  7. script:
  8. - phpunit --configuration phpunit_myapp.xml

Test against different PHP versions in Docker builds

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

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

Custom PHP configuration in Docker builds

有时,您需要通过将.ini文件放入/usr/local/etc/php/conf.d/来自定义 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

  1. test:app:
  2. script:
  3. - phpunit --configuration phpunit_myapp.xml

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

Test against different PHP versions in Shell builds

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

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

使用 phpenv 还可以通过以下方式轻松配置 PHP 环境:

  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 . 您应该只执行一次此命令,仅用于设置构建环境.

Extend your tests

Using atoum

除了 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

  1. ...
  2. # Composer stores all downloaded packages in the vendor/ directory.
  3. # Do not use the following if the vendor/ directory is committed to
  4. # your git repository.
  5. cache:
  6. paths:
  7. - vendor/
  8. before_script:
  9. # Install composer dependencies
  10. - wget https://composer.github.io/installer.sig -O - -q | tr -d '\n' > installer.sig
  11. - php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
  12. - php -r "if (hash_file('SHA384', 'composer-setup.php') === file_get_contents('installer.sig')) { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
  13. - php composer-setup.php
  14. - php -r "unlink('composer-setup.php'); unlink('installer.sig');"
  15. - php composer.phar install
  16. ...

Access private packages or dependencies

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

Use databases or other services

大多数时候,您将需要一个正在运行的数据库才能运行测试. 如果您使用的是 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
  3. # Check using shell executor
  4. gitlab-runner exec shell test:app

Example project

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

想要破解吗? 只需对其进行分叉,提交并推送您的更改. 稍后,公共跑步者将选择更改并开始工作.