自動建置和自動測試的進階選項

注意

自動建置需要 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(僅在執行建置規則或自動建置時使用)

建置鉤子範例

覆寫「建置」階段以設定變數

Docker Hub 允許您在 hook 檔案或自動建置介面中定義建置環境變數,然後您可以在 hook 中參考這些變數。

以下範例定義了一個建置 hook,它使用 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 命令,因此您必須在 hook 或自動建置中包含類似的建置命令,否則自動建置將會失敗。

請參閱docker build 文件以深入瞭解 Docker 建置時期變數。

推送至多個儲存庫

預設情況下,建置流程僅將映像檔推送至設定建置設定的儲存庫。如果您需要將相同的映像檔推送至多個儲存庫,您可以設定 post_push hook 以新增其他標籤並推送至更多儲存庫。

$ docker tag $IMAGE_NAME $DOCKER_REPO:$SOURCE_COMMIT
$ docker push $DOCKER_REPO:$SOURCE_COMMIT

原始程式碼儲存庫或分支複製

當 Docker Hub 從原始碼儲存庫提取分支時,它會執行淺層複製,僅複製指定分支的頂端。這樣做的好處是可以最大限度地減少從儲存庫傳輸的資料量,並加快建置速度,因為它只提取必要的程式碼。

因此,如果您需要執行依賴於不同分支的自定義動作,例如 post_push hook,則除非您執行以下操作之一,否則無法簽出該分支

  • 您可以透過執行以下操作來取得目標分支的淺層簽出

    $ git fetch origin branch:mytargetbranch --depth 1
    
  • 您也可以使用 fetch 上的 --unshallow 旗標「取消淺層化」複製,這將提取整個 Git 歷史記錄(可能需要很長時間/移動大量資料)

    $ git fetch --unshallow origin