Autobuild 和 Autotest 的高级选项

注意

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

以下选项允许您自定义 automated build 和 automated 测试过程。

用于构建和测试的环境变量

几个实用程序环境变量由构建过程设置,它们是 在自动生成、自动化测试和执行期间可用 钩。

注意

这些环境变量仅适用于 build 和 test 进程,并且不会影响服务的运行环境。

  • 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.ymlsut

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

覆盖生成、测试或推送命令

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

重要

请谨慎使用这些钩子。这些钩子文件的内容将替换 basic 命令,因此您必须包含类似的 build、test 或 push 命令,否则您的自动化过程无法完成。docker

要覆盖这些阶段,请在源代码中创建一个名为 repository 与 Dockerfile 位于同一目录级别。创建一个名为 、 或 并包含命令的文件,这些命令的 构建器进程中执行,例如 AND 命令(前缀 适当地与 )。hookshooks/buildhooks/testhooks/pushdockerbash#!/bin/bash

这些钩子在 Ubuntu 实例上运行, 其中包括口译员 如 Perl 或 Python,以及 或 等实用程序。有关可用解释器和实用程序的完整列表,请参阅 Ubuntu 文档gitcurl

自定义构建阶段钩子

您可以通过创建 钩。钩子允许你为 autobuild 提供额外的指令,并且 autotest 进程。

在源代码仓库中创建一个名为 directory 级别作为 Dockerfile 进行分配。将定义钩子的文件放入其中 文件夹。钩子文件可以包含命令,也可以包含 只要它们适当地以 .构建器执行 每个步骤之前和之后的文件中的命令。hooksdockerbash#!/bin/bash

可以使用以下钩子:

  • hooks/post_checkout
  • hooks/pre_build
  • hooks/post_build
  • hooks/pre_test
  • hooks/post_test
  • hooks/pre_push(仅在执行构建规则或 Automated build 时使用 )
  • hooks/post_push(仅在执行构建规则或 Automated build 时使用 )

构建钩子示例

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

Docker Hub 允许您在 hook 中定义构建环境变量 文件,或者从自动化构建界面,然后你可以在 hook 中引用它。

下面的示例定义了一个 build 钩子,它使用参数来 根据使用 Docker Hub 构建设置。 是您提供的变量 替换为要构建的 Dockerfile 的名称,并且是名称 正在构建的镜像中。docker buildCUSTOM$DOCKERFILE_PATH$IMAGE_NAME

$ docker build --build-arg CUSTOM=$VAR -f $DOCKERFILE_PATH -t $IMAGE_NAME .

重要

文件会覆盖构建器使用的基本命令,因此你必须在 hook 或 自动生成失败。hooks/builddocker build

请参阅 docker 构建文档以了解有关 Docker 构建时变量的更多信息。

推送到多个仓库

默认情况下,构建过程仅将镜像推送到其中 配置构建设置。如果需要将同一镜像推送到多个 repositories 中,您可以设置一个 hook 来添加其他标签并推送 到更多存储库。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 历史(以及 可能需要很长时间/移动大量数据)通过在 fetch 上使用标志:--unshallow

    $ git fetch --unshallow origin