自动构建与自动测试的高级选项

注意

自动化构建需要 Docker Pro、Team 或 Business 订阅。

以下选项允许您自定义自动化构建和自动化测试流程。

构建和测试用的环境变量

构建过程中会设置若干实用环境变量,这些变量在自动化构建、自动化测试以及执行钩子(hooks)时均可使用。

注意

这些环境变量仅在构建和测试过程中可用,不会影响服务的运行环境。

  • SOURCE_BRANCH:当前正在测试的分支或标签的名称。
  • SOURCE_COMMIT:正在测试的提交的SHA1哈希值。
  • COMMIT_MSG:将被测试和构建的提交信息。
  • DOCKER_REPO:正在构建的 Docker 仓库的名称。
  • DOCKERFILE_PATH:当前正在构建的 Dockerfile。
  • DOCKER_TAG:正在构建的 Docker 仓库标签。
  • IMAGE_NAME:正在构建的 Docker 仓库的名称和标签。(此变量是 DOCKER_REPODOCKER_TAG 的组合。)

如果您在用于自动化测试的 docker-compose.test.yml 文件中使用这些构建环境变量,请在您的 sut 服务的环境变量中按如下方式声明它们。

services:
  sut:
    build: .
    command: run_tests.sh
    environment:
      - SOURCE_BRANCH

覆盖构建、测试或推送命令

Docker Hub 允许您在自动化构建和测试过程中,通过钩子(hooks)覆盖并自定义 buildtestpush 命令。例如,您可以使用构建钩子(build hook)来设置仅在构建过程中使用的构建参数(build arguments)。您还可以设置 自定义构建阶段钩子 ,以在这些命令之间执行其他操作。

重要

请谨慎使用这些钩子。这些钩子文件的内容会替换基础的 docker 命令,因此您必须在钩子中包含类似的构建、测试或推送命令,否则您的自动化流程将无法完成。

要覆盖这些阶段,请在源代码仓库中创建一个名为 hooks 的文件夹,该文件夹与 Dockerfile 处于同一级目录。接着创建名为 hooks/buildhooks/testhooks/push 的文件,并在其中包含构建过程可执行的命令,例如 dockerbash 命令(需用 #!/bin/bash 进行适当前缀处理)。

这些挂钩在以下实例上运行:Ubuntu,该系统包含诸如 Perl 或 Python 之类的解释器,以及诸如 gitcurl 之类的工具。有关可用解释器和工具的完整列表,请参阅 Ubuntu 文档

自定义构建阶段钩子

您可以通过创建钩子(hooks)在构建过程的各个阶段之间运行自定义命令。 钩子允许您为自动构建(autobuild)和自动测试(autotest)过程提供额外的指令。

在源代码仓库中创建一个名为 hooks 的文件夹,其层级与 Dockerfile 所在目录相同。将定义钩子(hooks)的文件放入该文件夹中。钩子文件中可包含 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 允许您在挂钩(hook)文件中或从自动化构建界面中定义构建环境变量,随后您可在挂钩脚本中引用这些变量。

以下示例定义了一个构建钩子,该钩子使用 docker build 个参数,根据 Docker Hub 构建设置中定义的变量值来设置变量 CUSTOM$DOCKERFILE_PATH 是您提供的变量,用于指定要构建的 Dockerfile 名称,而 $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 从源代码仓库拉取分支时,它会执行一次浅层克隆(shallow clone),即仅克隆指定分支的最新提交(tip)。这种做法的优点在于: 最大限度地减少了从仓库传输所需的数据量,并加快了构建速度,因为它仅拉取构建所需的最小代码量。

因此,如果您需要执行依赖于不同分支的自定义操作(例如 post_push 钩子),则必须执行以下操作之一,才能检出该分支:

  • 您可以通过以下方式获取目标分支的浅层检出(shallow checkout):

    $ git fetch origin branch:mytargetbranch --depth 1
    
  • 您还可以通过在 fetch 命令中使用 --unshallow 参数,将克隆操作“取消浅层化”(unshallow),从而获取完整的 Git 历史记录(但这可能耗时较长 / 传输大量数据):

    $ git fetch --unshallow origin