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 允許您使用鉤子在自動構建和測試過程中覆蓋和自定義 buildtestpush 命令。例如,您可能使用構建鉤子來設定僅在構建過程中使用的構建引數。您還可以設定 自定義構建階段鉤子 來在這些命令之間執行操作。

重要

謹慎使用這些鉤子。這些鉤子檔案的內容會替換基本的 docker 命令,因此您必須在鉤子中包含類似的構建、測試或推送命令,否則您的自動過程將無法完成。

要覆蓋這些階段,請在您的原始碼倉庫中建立名為 hooks 的資料夾,該資料夾與您的 Dockerfile 位於同一目錄級別。建立名為 hooks/buildhooks/testhooks/push 的檔案,並在其中包含構建器過程可以執行的命令,例如 dockerbash 命令(以 #!/bin/bash 作為字首)。

這些鉤子在 Ubuntu 的例項上執行,其中包括 Perl 或 Python 等直譯器,以及 gitcurl 等實用程式。有關可用直譯器和實用程式的完整列表,請參閱 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