Help us learn about your current experience with the documentation. Take the survey.

测试 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 的虚拟机中,首先更新缓存,然后安装 phpunitphp5-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 runnersGitLab.com 上运行。

想要对其进行修改吗?分叉它,提交并推送您的更改。几秒钟内,公共 runner 就会选取这些更改并开始作业。