自動構建和自動測試的高階選項
注意自動化構建需要 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
(僅在執行構建規則或自動化構建時使用)
構建鉤子示例
覆蓋“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