自動構建和自動測試的高階選項

注意

自動化構建需要 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 文件

自定義構建階段鉤子

您可以透過建立鉤子在構建過程的各個階段之間執行自定義命令。鉤子允許您為自動構建和自動測試過程提供額外的指令。

在您的原始碼倉庫中與 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
    
  • 您還可以“取消淺層”克隆,即透過在 fetch 命令中使用 --unshallow 標誌來獲取完整的 Git 歷史記錄(這可能會花費很長時間/傳輸大量資料)

    $ git fetch --unshallow origin