自動建置和自動測試的進階選項
注意
自動建置需要 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 允許您使用鉤子在自動建置和測試流程中覆寫和自訂 build
、test
和 push
指令。例如,您可以使用建置鉤子來設定僅在建置過程中使用的建置引數。您也可以設定 自訂建置階段鉤子,以便在這些指令之間執行動作。
重要
請謹慎使用這些鉤子。這些鉤子檔案的內容會取代基本的
docker
指令,因此您必須在鉤子中包含類似的建置、測試或推送指令,否則您的自動化流程將無法完成。
要覆寫這些階段,請在您的原始程式碼儲存庫中,與 Dockerfile 位於相同目錄層級的位置,建立一個名為 hooks
的資料夾。建立一個名為 hooks/build
、hooks/test
或 hooks/push
的檔案,並在其中包含建置器流程可以執行的指令,例如 docker
和 bash
指令(並在前面加上適當的 #!/bin/bash
)。
這些鉤子會在 Ubuntu 的執行個體上執行,其中包含 Perl 或 Python 等直譯器,以及 git
或 curl
等公用程式。請參閱 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