与Arman P.所说的一致。运行测试时,请确保您有一个 docker 映像,其中包含构建/测试所需的所有工具。
你有两个选择:
您可以使用所需的所有工具构建自己的映像,并随着项目的发展对其进行维护;或者,
您可以简单地从 docker hub 安装一个基本映像并在运行作业之前安装所有工具。
这两种选择各有利弊:
选项 (1) 为您提供完全控制权,但您需要将其添加到 CI 可以从中提取的私有注册表中(Gitlab 为您提供私有注册表支持)。这里唯一的小问题是您必须首先设置私有注册表(例如Gitlab)。难度不大,只需要做一次。
但是然后由您来维护图像等。
选项 (2) 允许您运行所有工具,而无需维护私有注册表或 docker 容器。正如 Arman P. 所提到的,您只需在工作之前运行安装脚本。这样做的缺点是您的作业和构建/测试需要更长的时间才能运行,因为您现在必须在每次运行之前等待安装发生。
一个简单的例子:使用选项(2)
我们需要 PHPUnit 和作曲家。
因此,请使用来自公共 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中。在这个作业中运行脚本之前,全局before_script运行,它安装了 git 和 composer(Composer 需要 Git)。然后脚本运行并安装我们所有的作曲家依赖项。完毕。
然后执行下一阶段,即test。因此,我们的作业附加到该运行(如果我们有多个作业,则并行运行),这对我们来说只是“测试应用程序”。在这里,我们使用 YML 特性来重用安装 composer 指令:本地before_script覆盖全局before_script,安装 Composer(通过 YML 模板)和 PHPUnit。然后实际的脚本运行:它运行我们的单元测试。单元测试假设您在根目录中有一个 phpunit 配置——您可以像在自己的终端上一样自定义此命令。
请注意,由于阶段设置,构建阶段的输出在测试阶段自动可用。所以我们什么都不用做,Gitlab 会为我们传递所有的文件!
使用install_composer模板的主要原因是为了提高作业执行时间。大多数事情都需要 Composer。所以我们有一个全局模板和一个为每个作业运行的脚本。如果您需要一些更具体的东西,使用该作业仅需要的工具,例如 PHPUnit,然后在作业中本地覆盖before_script并安装所需的工具。这样,我们就不必安装我们可能在每项工作中都不需要的全部工具!