# Testing PHP projects > 原文:[https://docs.gitlab.com/ee/ci/examples/php.html](https://docs.gitlab.com/ee/ci/examples/php.html) * [Test PHP projects using the Docker executor](#test-php-projects-using-the-docker-executor) * [Test against different PHP versions in Docker builds](#test-against-different-php-versions-in-docker-builds) * [Custom PHP configuration in Docker builds](#custom-php-configuration-in-docker-builds) * [Test PHP projects using the Shell executor](#test-php-projects-using-the-shell-executor) * [Test against different PHP versions in Shell builds](#test-against-different-php-versions-in-shell-builds) * [Install custom extensions](#install-custom-extensions) * [Extend your tests](#extend-your-tests) * [Using atoum](#using-atoum) * [Using Composer](#using-composer) * [Access private packages or dependencies](#access-private-packages-or-dependencies) * [Use databases or other services](#use-databases-or-other-services) * [Testing things locally](#testing-things-locally) * [Example project](#example-project) # Testing PHP projects[](#testing-php-projects "Permalink") 本指南涵盖了 PHP 项目的基本构建说明. 涵盖了两种测试方案:使用 Docker 执行程序和使用 Shell 执行程序. ## Test PHP projects using the Docker executor[](#test-php-projects-using-the-docker-executor "Permalink") 尽管可以在任何系统上测试 PHP 应用程序,但这都需要开发人员进行手动配置. 为了克服这个问题,我们将使用可在 Docker Hub 中找到的官方[PHP Docker 映像](https://hub.docker.com/_/php) . 这将使我们能够针对不同版本的 PHP 测试 PHP 项目. 但是,并非所有事情都是即插即用的,您仍然需要手动配置一些东西. 与每项工作一样,您需要创建一个描述构建环境的有效`.gitlab-ci.yml` . 首先,让我们指定将用于作业过程的 PHP 映像(您可以在 Runner 的术语中阅读有关[使用 Docker 映像的](../docker/using_docker_images.html#what-is-an-image)更多信息,以了解映像的含义). 首先将图像添加到您的`.gitlab-ci.yml` : ``` image: php:5.6 ``` 官方图片很棒,但是缺少一些有用的测试工具. 我们需要首先准备构建环境. 解决此问题的一种方法是创建一个脚本,该脚本在完成实际测试之前会安装所有必备组件. Let’s create a `ci/docker_install.sh` file in the root directory of our repository with the following content: ``` #!/bin/bash # We need to install dependencies only for Docker [[ ! -e /.dockerenv ]] && exit 0 set -xe # Install git (the php image doesn't have it) which is required by composer apt-get update -yqq apt-get install git -yqq # Install phpunit, the tool that we will use for testing curl --location --output /usr/local/bin/phpunit https://phar.phpunit.de/phpunit.phar chmod +x /usr/local/bin/phpunit # Install mysql driver # Here you can install any other extension that you need docker-php-ext-install pdo_mysql ``` 您可能想知道`docker-php-ext-install`是什么. 简而言之,它是官方 PHP Docker 映像提供的脚本,可用于轻松安装扩展. 有关更多信息,请参阅[https://hub.docker.com/_/php 上](https://hub.docker.com/_/php)的文档. 现在,我们创建了包含构建环境的所有先决条件的脚本,让我们将其添加到`.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`应该类似于以下内容: ``` # Select image from https://hub.docker.com/_/php image: php:5.6 before_script: # Install dependencies - bash ci/docker_install.sh > /dev/null test:app: script: - phpunit --configuration phpunit_myapp.xml ``` ### Test against different PHP versions in Docker builds[](#test-against-different-php-versions-in-docker-builds "Permalink") 针对多个版本的 PHP 进行测试非常容易. 只需添加另一个具有不同 Docker 映像版本的作业,即可由跑步者完成其余工作: ``` before_script: # Install dependencies - bash ci/docker_install.sh > /dev/null # We test PHP5.6 test:5.6: image: php:5.6 script: - phpunit --configuration phpunit_myapp.xml # We test PHP7.0 (good luck with that) test:7.0: image: php:7.0 script: - phpunit --configuration phpunit_myapp.xml ``` ### Custom PHP configuration in Docker builds[](#custom-php-configuration-in-docker-builds "Permalink") 有时,您需要通过将`.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`必须存在于存储库的根目录中. ## Test PHP projects using the Shell executor[](#test-php-projects-using-the-shell-executor "Permalink") Shell 执行程序在服务器上的终端会话中运行您的作业. 因此,为了测试您的项目,您首先需要确保已安装所有依赖项. 例如,在运行 Debian 8 的 VM 中,我们首先更新缓存,然后安装`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 并开始测试! ### Test against different PHP versions in Shell builds[](#test-against-different-php-versions-in-shell-builds "Permalink") [phpenv](https://github.com/phpenv/phpenv)项目使您可以轻松管理不同版本的 PHP,每个版本都有自己的配置. 当使用 Shell 执行程序测试 PHP 项目时,这特别有用. 您必须按照[上游安装指南](https://github.com/phpenv/phpenv#installation)在`gitlab-runner`用户下将其安装在构建计算机[上](https://github.com/phpenv/phpenv#installation) . 使用 phpenv 还可以通过以下方式轻松配置 PHP 环境: ``` phpenv config-add my_config.ini ``` ***重要说明:**似乎`phpenv/phpenv` [被放弃了](https://github.com/phpenv/phpenv/issues/57) . [madumlao / phpenv](https://github.com/madumlao/phpenv)上有一个分叉,试图使该项目[复活](https://github.com/madumlao/phpenv) . [CHH / phpenv](https://github.com/CHH/phpenv)似乎也是一个不错的选择. 选择任何提到的工具将与基本 phpenv 命令一起使用. 指导您选择正确的 phpenv 不在本教程的范围内.* ### Install custom extensions[](#install-custom-extensions "Permalink") 由于这是 PHP 环境的裸机安装,因此您可能需要一些构建机器上当前不存在的扩展. 要安装其他扩展,只需执行以下命令: ``` pecl install ``` 不建议将其添加到`.gitlab-ci.yml` . 您应该只执行一次此命令,仅用于设置构建环境. ## Extend your tests[](#extend-your-tests "Permalink") ### Using atoum[](#using-atoum "Permalink") 除了 PHPUnit,您可以使用任何其他工具来运行单元测试. 例如,您可以使用[atoum](https://github.com/atoum/atoum) : ``` before_script: - wget http://downloads.atoum.org/nightly/mageekguy.atoum.phar test:atoum: script: - php mageekguy.atoum.phar ``` ### Using Composer[](#using-composer "Permalink") 大多数 PHP 项目使用 Composer 来管理其 PHP 软件包. 为了在运行测试之前执行 Composer,只需在`.gitlab-ci.yml`添加以下`.gitlab-ci.yml` : ``` ... # Composer stores all downloaded packages in the vendor/ directory. # Do not use the following if the vendor/ directory is committed to # your git repository. cache: paths: - vendor/ before_script: # Install composer dependencies - 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 ... ``` ## Access private packages or dependencies[](#access-private-packages-or-dependencies "Permalink") 如果您的测试套件需要访问私有存储库,则需要配置[SSH 密钥](../ssh_keys/README.html)才能克隆它. ## Use databases or other services[](#use-databases-or-other-services "Permalink") 大多数时候,您将需要一个正在运行的数据库才能运行测试. 如果您使用的是 Docker 执行器,则可以利用 Docker 链接到其他容器的功能. 使用 GitLab Runner,可以通过定义`service`来实现. [CI 服务](../services/README.html)文档中涵盖了此功能. ## Testing things locally[](#testing-things-locally "Permalink") 使用 GitLab Runner 1.0,您还可以在本地测试所有更改. 从您的终端执行: ``` # Check using docker executor gitlab-runner exec docker test:app # Check using shell executor gitlab-runner exec shell test:app ``` ## Example project[](#example-project "Permalink") 为了方便起见,我们建立了一个[示例 PHP 项目](https://gitlab.com/gitlab-examples/php) ,该[项目](https://gitlab.com/gitlab-examples/php)使用我们的公共[共享](../runners/README.html)运行器在[GitLab.com](https://gitlab.com)上运行. 想要破解吗? 只需对其进行分叉,提交并推送您的更改. 稍后,公共跑步者将选择更改并开始工作.