自动构建和自动测试的高级选项
预计阅读时间:5分钟
以下选项使您可以自定义自动化构建和自动化测试过程。
用于构建和测试的环境变量
在构建过程中设置了多个实用程序环境变量,这些变量在自动构建,自动测试以及执行挂接时可用。
注意:这些环境变量仅可用于构建和测试过程,并且不会影响服务的运行环境。
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
服务环境中声明它们,如下所示。
sut:
build: .
command: run_tests.sh
environment:
- SOURCE_BRANCH
覆盖构建,测试或推送命令
Docker Hub允许您
在使用挂钩的自动构建和测试过程中覆盖和自定义build
,test
和push
命令。例如,您可以使用构建挂钩来设置仅在构建过程中使用的构建参数。(您还可以设置自定义构建阶段挂钩,以在这些命令之间执行操作。)
请谨慎使用这些挂钩。这些挂钩文件的内容替换了基本docker
命令,因此您必须在挂钩中包含类似的build,test或push命令,否则自动过程将无法完成。
要覆盖这些阶段,请hooks
在源代码存储库中创建一个名为Dockerfile的目录。创建一个名为hooks/build
,hooks/test
或的文件
,hooks/push
并包含构建器进程可以执行的命令,例如docker
和bash
命令(以适当地前缀#!/bin/bash
)。
这些挂钩将在基于Ubuntu的发行版Amazon Linux 2的实例上运行,该实例包括诸如Perl和Python的解释器以及诸如git
或的实用程序curl
。请查看上面的链接以获取完整列表。
定制构建阶段挂钩
您可以通过创建钩子在构建过程的各个阶段之间运行自定义命令。挂钩允许您为自动构建和自动测试过程提供额外的说明。
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
参数来CUSTOM
基于我们使用Docker Hub构建设置定义的变量的值来设置变量。$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从源代码存储库中提取分支时,它将执行浅表克隆(仅指定分支的尖端)。这样做的好处是可以最大程度地减少从存储库中传输所需的数据量,并加快构建速度,因为它仅提取所需的最少代码。
因此,如果您需要执行依赖于其他分支(例如post_push
钩子)的自定义操作,则除非执行以下操作之一,否则无法签出该分支:
-
通过执行以下操作,可以对目标分支进行浅层检出:
git fetch origin branch:mytargetbranch --depth 1
-
您还可以“取消整理”克隆,通过使用
--unshallow
fetch上的标志来获取整个Git历史记录(并可能花费很长时间/移动大量数据):git fetch --unshallow origin