自动化构建和自动化测试的高级选项

注意

自动化构建需要 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 允许您在使用钩子进行自动化构建和测试过程中,覆盖和自定义 buildtestpush 命令。例如,您可以使用构建钩子设置仅在构建过程中使用的构建参数。您还可以设置自定义构建阶段钩子,以在这些命令之间执行操作。

重要

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

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

这些钩子运行在 Ubuntu 实例上,该实例包含 Perl 或 Python 等解释器,以及 gitcurl 等工具。请参阅 Ubuntu 文档 以获取可用解释器和工具的完整列表。

自定义构建阶段钩子

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

在您的源代码仓库中与您的 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 允许您在钩子文件或通过自动化构建界面定义构建环境变量,然后您可以在钩子中引用它们。

以下示例定义了一个构建钩子,它使用 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 build 文档以了解更多关于 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
    
  • 您也可以通过在 fetch 时使用 --unshallow 标志来“取消浅层化”克隆,这将获取完整的 Git 历史记录(这可能会花费很长时间并传输大量数据)

    $ git fetch --unshallow origin
    
页面选项