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

预计阅读时间:5分钟

以下选项使您可以自定义自动化构建和自动化测试过程。

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

在构建过程中设置了多个实用程序环境变量,这些变量在自动构建,自动测试以及执行挂接时可用。

注意:这些环境变量仅可用于构建和测试过程,并且不会影响服务的运行环境。

  • 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.yml文件中使用这些构建环境变量 进行自动化测试,请在sut 服务环境中声明它们,如下所示。

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

覆盖构建,测试或推送命令

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

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

要覆盖这些阶段,请hooks在源代码存储库中创建一个名为Dockerfile的目录。创建一个名为hooks/buildhooks/test或的文件 ,hooks/push并包含构建器进程可以执行的命令,例如dockerbash命令(以适当地前缀#!/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
    
  • 您还可以“取消整理”克隆,通过使用--unshallowfetch上的标志来获取整个Git历史记录(并可能花费很长时间/移动大量数据):

      git fetch --unshallow origin
    
自动化构建图像