测试 PHP 项目
- Tier: Free, Premium, Ultimate (版本)
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated (提供方式)
本指南涵盖了 PHP 项目的基本构建说明。
涵盖了两种测试场景:使用 Docker 执行器和 Shell 执行器。
使用 Docker 执行器测试 PHP 项目
虽然可以在任何系统上测试 PHP 应用,但这需要开发者手动配置。为了解决这个问题,我们使用 Docker Hub 中提供的官方 PHP Docker image。
这使我们能够针对不同版本的 PHP 测试 PHP 项目。然而,并非所有东西都能即插即用,您仍然需要手动配置一些内容。
与每个作业一样,您需要创建一个有效的 .gitlab-ci.yml 文件来描述构建环境。
首先,指定用于作业进程的 PHP 镜像。 (您可以通过阅读 Using Docker images 了解更多关于镜像在 runner 术语中的含义。)
首先将镜像添加到您的 .gitlab-ci.yml 中:
image: php:5.6官方镜像很好,但它们缺少一些用于测试的有用工具。我们需要首先准备构建环境。解决此问题的一种方法是创建一个脚本,在实际测试之前安装所有先决条件。
让我们在仓库的根目录中创建一个 ci/docker_install.sh 文件,内容如下:
#!/bin/bash
# 我们只需要为 Docker 安装依赖
[[ ! -e /.dockerenv ]] && exit 0
set -xe
# 安装 git(PHP 镜像中没有它),这是 composer 所需的
apt-get update -yqq
apt-get install git -yqq
# 安装 phpunit,我们将用于测试的工具
curl --location --output /usr/local/bin/phpunit "https://phar.phpunit.de/phpunit.phar"
chmod +x /usr/local/bin/phpunit
# 安装 mysql 驱动
# 在这里您可以安装任何其他需要的扩展
docker-php-ext-install pdo_mysql您可能想知道 docker-php-ext-install 是什么。简而言之,它是官方 PHP Docker 镜像提供的一个脚本,您可以用来轻松安装扩展。更多信息请阅读 the documentation。
现在我们已经创建了包含构建环境所有先决条件的脚本,让我们将其添加到 .gitlab-ci.yml 中:
before_script:
- bash ci/docker_install.sh > /dev/null最后一步,使用 phpunit 运行实际测试:
test:app:
script:
- phpunit --configuration phpunit_myapp.xml最后,提交您的文件并将其推送到 GitLab,以查看您的构建是否成功(或失败)。
最终的 .gitlab-ci.yml 应该与此类似:
default:
# 从 https://hub.docker.com/_/php 选择镜像
image: php:5.6
before_script:
# 安装依赖
- bash ci/docker_install.sh > /dev/null
test:app:
script:
- phpunit --configuration phpunit_myapp.xml在 Docker 构建中测试不同 PHP 版本
测试多个版本的 PHP 非常简单。只需添加一个使用不同 Docker 镜像版本的作业,runner 会处理其余部分:
default:
before_script:
# 安装依赖
- bash ci/docker_install.sh > /dev/null
# 我们测试 PHP5.6
test:5.6:
image: php:5.6
script:
- phpunit --configuration phpunit_myapp.xml
# 我们测试 PHP7.0(祝你好运)
test:7.0:
image: php:7.0
script:
- phpunit --configuration phpunit_myapp.xml在 Docker 构建中自定义 PHP 配置
有时您需要通过将 .ini 文件放入 /usr/local/etc/php/conf.d/ 来自定义 PHP 环境。为此,添加一个 before_script 操作:
before_script:
- cp my_php.ini /usr/local/etc/php/conf.d/test.ini当然,my_php.ini 必须存在于您仓库的根目录中。
使用 Shell 执行器测试 PHP 项目
Shell 执行器在您服务器的终端会话中运行您的作业。要测试您的项目,您必须首先确保所有依赖都已安装。
例如,在运行 Debian 8 的虚拟机中,首先更新缓存,然后安装 phpunit 和 php5-mysql:
sudo apt-get update -y
sudo apt-get install -y phpunit php5-mysql接下来,将以下代码段添加到您的 .gitlab-ci.yml 中:
test:app:
script:
- phpunit --configuration phpunit_myapp.xml最后,推送到 GitLab,让测试开始!
在 Shell 构建中测试不同 PHP 版本
phpenv 项目允许您管理不同版本的 PHP,每个版本都有自己的配置。这在使用 Shell 执行器测试 PHP 项目时特别有用。
您必须按照 the upstream installation guide 在构建机器上的 gitlab-runner 用户下安装它。
使用 phpenv 还允许您使用以下命令配置 PHP 环境:
phpenv config-add my_config.ini重要提示:似乎 phpenv/phpenv
已被放弃。有一个分支
madumlao/phpenv 试图让项目重获新生。CHH/phpenv
也是一个不错的选择。选择任何提到的工具都可以与基本的 phpenv 命令一起工作。指导您选择正确的 phpenv 超出了本教程的范围。*
安装自定义扩展
由于这是一个相当基础的 PHP 环境安装,您可能需要一些当前在构建机器上不存在的扩展。
要安装额外的扩展,请执行:
pecl install <extension>不建议将此添加到 .gitlab-ci.yml。您应该只执行一次此命令,仅用于设置构建环境。
扩展您的测试
使用 atoum
除了 PHPUnit,您可以使用任何其他工具来运行单元测试。例如,您可以使用 atoum:
test:atoum:
before_script:
- wget http://downloads.atoum.org/nightly/mageekguy.atoum.phar
script:
- php mageekguy.atoum.phar使用 Composer
大多数 PHP 项目使用 Composer 来管理它们的 PHP 包。要在运行测试之前执行 Composer,请将以下内容添加到您的 .gitlab-ci.yml 中:
# Composer 将所有下载的包存储在 vendor/ 目录中。
# 如果 vendor/ 目录已提交到您的 git 仓库,请不要使用以下内容。
default:
cache:
paths:
- vendor/
before_script:
# 安装 composer 依赖
- wget https://composer.github.io/installer.sig -O - -q | tr -d '\n' > installer.sig
- php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
- 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;"
- php composer-setup.php
- php -r "unlink('composer-setup.php'); unlink('installer.sig');"
- php composer.phar install访问私有包或依赖
如果您的测试套件需要访问私有仓库,您需要配置 SSH keys 才能克隆它。
使用数据库或其他服务
大多数情况下,您需要一个运行中的数据库才能运行您的测试。如果您使用的是 Docker 执行器,可以利用 Docker 链接到其他容器。使用 GitLab Runner,这可以通过定义一个 service 来实现。
此功能在 the CI services 文档中有介绍。
示例项目
为了您的方便,我们设置了一个 Example PHP Project, 它使用我们公开可用的 instance runners 在 GitLab.com 上运行。
想要对其进行修改吗?分叉它,提交并推送您的更改。几秒钟内,公共 runner 就会选取这些更改并开始作业。