自动构建和自动测试的高级选项
笔记
自动构建需要 Docker Pro、Team 或 Business 订阅。
以下选项允许您自定义自动化构建和自动化测试流程。
用于构建和测试的环境变量
几个实用程序环境变量由构建过程设置,并且在自动构建、自动化测试和执行挂钩期间可用。
笔记
这些环境变量仅适用于构建和测试进程,不会影响服务的运行环境。
SOURCE_BRANCH
:当前正在测试的分支或标签的名称。SOURCE_COMMIT
:正在测试的提交的 SHA1 哈希值。COMMIT_MSG
:来自正在测试和构建的提交的消息。DOCKER_REPO
:正在构建的 Docker 存储库的名称。DOCKERFILE_PATH
:当前正在构建的 dockerfile。DOCKER_TAG
:正在构建的 Docker 存储库标签。IMAGE_NAME
:正在构建的 Docker 存储库的名称和标签。 (此变量是DOCKER_REPO
:的组合DOCKER_TAG
。)
如果您在文件中使用这些构建环境变量
docker-compose.test.yml
进行自动化测试,请在您的sut
服务环境中声明它们,如下所示。
services:
sut:
build: .
command: run_tests.sh
environment:
- SOURCE_BRANCH
覆盖构建、测试或推送命令
Docker Hub 允许您
在使用挂钩的自动构建和测试过程中覆盖和自定义build
、test
和命令。push
例如,您可以使用构建挂钩来设置仅在构建过程中使用的构建参数。您还可以设置
自定义构建阶段挂钩
以在这些命令之间执行操作。
重要的
小心使用这些挂钩。这些挂钩文件的内容替换了基本
docker
命令,因此您必须在挂钩中包含类似的构建、测试或推送命令,否则您的自动化过程将无法完成。
要覆盖这些阶段,请hooks
在与 Dockerfile 相同的目录级别创建一个在源代码存储库中调用的文件夹。创建一个名为hooks/build
、hooks/test
、 或 的文件
hooks/push
,并包含构建器进程可以执行的命令,例如docker
和bash
命令(适当地带有 前缀#!/bin/bash
)。
这些挂钩在Ubuntu实例上运行
,其中包括 Perl 或 Python 等解释器以及git
或 等实用程序curl
。请参阅
Ubuntu 文档
以获取可用解释器和实用程序的完整列表。
自定义构建阶段挂钩
您可以通过创建挂钩在构建过程的各个阶段之间运行自定义命令。挂钩允许您为自动构建和自动测试过程提供额外的说明。
hooks
在与 Dockerfile 相同的目录级别创建一个在源代码存储库中调用的文件夹。将定义挂钩的文件放置在该文件夹中。挂钩文件可以同时包含docker
命令和bash
命令,只要它们带有适当的前缀即可#!/bin/bash
。构建器在每个步骤之前和之后执行文件中的命令。
以下挂钩可用:
hooks/post_checkout
hooks/pre_build
hooks/post_build
hooks/pre_test
hooks/post_test
hooks/pre_push
(仅在执行构建规则或自动构建时使用)hooks/post_push
(仅在执行构建规则或自动构建时使用)
构建钩子示例
覆盖“构建”阶段来设置变量
Docker Hub 允许您在钩子文件中或从自动构建界面定义构建环境变量,然后您可以在钩子中引用这些变量。
以下示例定义了一个构建挂钩,该挂钩使用参数根据使用 Docker Hub 构建设置定义的变量值docker build
来设置变量。是您提供的变量,其中包含要构建的 Dockerfile 的名称,并且是正在构建的映像的名称。CUSTOM
$DOCKERFILE_PATH
$IMAGE_NAME
$ docker build --build-arg CUSTOM=$VAR -f $DOCKERFILE_PATH -t $IMAGE_NAME .
重要的
文件
hooks/build
会覆盖构建器使用的基本 docker build命令,因此您必须在挂钩中包含类似的构建命令,否则自动构建会失败。
请参阅 docker 构建文档 以了解有关 Docker 构建时变量的更多信息。
推送到多个存储库
默认情况下,构建过程仅将映像推送到配置了构建设置的存储库。如果您需要将相同的图像推送到多个存储库,您可以设置一个post_push
钩子来添加额外的标签并推送到更多存储库。
$ docker tag $IMAGE_NAME $DOCKER_REPO:$SOURCE_COMMIT
$ docker push $DOCKER_REPO:$SOURCE_COMMIT
源存储库或分支克隆
当 Docker Hub 从源代码存储库拉取分支时,它会执行浅克隆,它仅克隆指定分支的尖端。这样做的优点是可以最大限度地减少存储库中所需的数据传输量并加快构建速度,因为它只提取所需的最少代码。
因此,如果您需要执行依赖于不同分支的自定义操作(例如挂钩)post_push
,则无法签出该分支,除非执行以下操作之一:
您可以通过执行以下操作来浅检出目标分支:
$ git fetch origin branch:mytargetbranch --depth 1
--unshallow
您还可以“浅化”克隆,它通过使用获取上的标志来获取整个 Git 历史记录(并且可能需要很长时间/移动大量数据) :$ git fetch --unshallow origin