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 允许您使用钩子在自动构建和测试过程中覆盖和自定义 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 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 build 文档。
推送到多个仓库
默认情况下,构建过程只会将镜像推送到配置了构建设置的仓库。如果您需要将同一镜像推送到多个仓库,可以设置 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