与Arman P. 所说的一致。运行测试时,请确保您有一个 docker 映像,其中包含构建/测试所需的所有工具。
你有两个选择:
您可以使用所需的所有工具构建自己的映像,并且
随着项目的发展保持这一点;或者,
您可以简单地从 docker hub 安装一个基本映像并安装
运行作业之前的所有工具。
这两种选择各有利弊:
选项 (1) 为您提供完全控制权,但您需要将其添加到 CI 可以从中提取的私有注册表中(Gitlab 为您提供私有注册表支持)。这里唯一的小问题是您必须首先设置私有注册表(例如 Gitlab)。难度不大,只需要做一次。
但随后由您来维护图像等。
选项 (2) 允许您运行所有工具,而无需维护私有注册表或 docker 容器。正如 Arman P. 所提到的,您只需在工作之前运行安装脚本。这样做的缺点是您的作业和构建/测试需要更长的时间才能运行,因为您现在必须在每次运行之前等待安装发生。
一个简单的例子:使用选项(2)
我们需要 PHPUnit 和 composer。
因此,请使用公共 docker hub 中具有 php 的容器:选择具有您要测试的 PHP 版本(例如 5.6 或 7)的容器。让我们假设 5.6。
在该容器中,我们需要先安装 composer 和 PHPUnit,然后才能运行我们的测试。您的 CI 文件可能如下所示:
.gitlab-ci.yml
image: php:5.6.25-cli
stages:
- build
- test
.install_composer_template:&install_composer
- apt-get install -y git
- curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
before_script:
<<:*install_composer
build app:
stage: build
script:
- composer install
- composer dump-autoload -o
test app:
stage: test
before_script:
<<:*install_composer
- composer global require -q phpunit/phpunit
script:
- phpunit --colors=always
快速总结这实际上做了什么
每项工作——这里我们只有“构建应用程序”和“测试应用程序”——都将通过官方 PHP 5.6 映像运行。
我们定义了两个阶段,build和test——注意:这些是默认定义的,但在这里我们要明确说明清晰度。
运行的第一个作业将是“构建应用程序”,因为它发生在第一阶段,build。 script 在此作业中运行之前,全局 before_script 运行,它会安装 git 和 composer(Composer 需要 Git)。然后脚本运行并安装我们所有的作曲家依赖项。完毕。
然后执行下一个阶段,即测试。因此,我们的作业附加到该运行(如果我们有多个作业,则并行运行),这对我们来说只是“测试应用程序”。在这里,我们使用 YML 特性来重用安装 composer 指令:本地 before_script 覆盖全局 before_script,安装 Composer(通过 YML 模板)和 PHPUnit。然后实际的 script 运行:它运行我们的单元测试。单元测试假设您在根目录中有一个 phpunit 配置——您可以像在自己的终端上一样自定义此命令。
请注意,由于阶段设置,构建阶段的输出会自动在测试阶段可用。所以我们什么都不用做,Gitlab 会为我们传递所有的文件!
使用 install_composer 模板的主要原因是为了提高作业执行时间。大多数事情都需要 Composer。所以我们有一个全局模板和一个为每个作业运行的脚本。如果您需要更具体的东西,使用仅用于该工作的工具,例如PHPUnit,然后在作业中本地覆盖 before_script 并安装所需的工具。这样一来,我们就不必安装可能并非每项工作都需要的大量工具!