Autobuild 和 Autotest 的高级选项

注意

自动化构建需要 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 文档以获取可用解释器和实用程序的完整列表。

自定义构建阶段钩子

您可以通过创建钩子(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(仅在执行构建规则或自动构建时使用)

构建钩子示例

覆盖“build”阶段以设置变量

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
    
  • 您还可以“取消浅克隆”,这将获取整个 Git 历史记录(并且可能需要很长时间/移动大量数据),方法是在获取时使用--unshallow标志。

    $ git fetch --unshallow origin