管線執行順序 \(部分機器翻譯\)

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

執行代表管線的一個執行。 執行期間會處理管線,而代理程式會處理一或多個作業。 管線執行包括 作業、步驟和工作。 執行持續整合 (CI) 和持續傳遞 (CD) 管線。

管線概觀

當您執行管線時,實際上會發生許多事。 雖然您通常不需要知道它們,但偶爾會有大圖片會很有用。 概括而言,Azure Pipelines 會:

在代理程式端,針對每個作業,代理程式會:

作業可能會 成功、失敗或取消。 在某些情況下,工作 可能無法完成。 瞭解這種情況如何協助您針對問題進行疑難排解。

讓我們逐一細分每個動作。

處理管線

展開 YAML 範本

若要將管線轉換成執行,Azure Pipelines 會依此循序執行數個步驟:

  1. 首先,展開 範本 並評估 範本運算式
  2. 接下來,評估 階段 層級的相依性,以挑選要執行的第一個階段 () 。
  3. 針對選取要執行的每個階段,會發生兩件事:
    • 收集並驗證所有作業中使用的所有資源,以供 授權 執行。
    • 評估 作業層級的相依性 ,以挑選要執行的第一個作業 () 。
  4. 針對選取要執行的每個作業,展開 多組態 (strategy: matrix 或在 strategy: parallel YAML) 中展開為多個執行時間作業。
  5. 針對每個執行時間作業,評估 條件 以判斷該作業是否符合執行資格。
  6. 要求每個合格執行時間作業的代理程式

當執行時間作業完成時,Azure Pipelines 會查看是否有符合執行資格的新作業。 如果是,步驟 4 - 6 會重複執行新的作業。 同樣地,當階段完成時,步驟 2 - 6 將會在任何新階段重複。

此排序有助於回答常見問題:為什麼無法在 範本參數中使用特定變數? 步驟 1 的範本擴充只會在 YAML 文件的文字上運作。 執行階段變數不存在於該步驟期間。 在步驟 1 之後,範本參數已經過解析且已不再存在。

它也會回答另一個常見的問題:為什麼我無法使用 變數 來解析服務連線/環境名稱? 資源必須先獲得授權,階段才能開始執行,因此無法使用階段和作業層級變數。 您可以使用管線層級變數,但只有管線中明確包含的變數。 變數群組本身是受限於授權的資源,因此在檢查資源授權時,其資料同樣無法使用。

要求代理程式

每當 Azure Pipelines 需要執行作業時,就會要求 區提供 代理程式。 (伺服器作業 是例外狀況,因為它們會在 Azure Pipelines 伺服器本身上執行。) Microsoft 裝載和 自我裝載 代理程式組件區的運作方式稍有不同。

Microsoft 裝載的代理程式組件區要求

首先,服務會檢查貴組織的平行作業。 它會在所有 Microsoft 裝載的代理程式上加總所有執行中的作業,並與購買的平行作業數目進行比較。 如果沒有可用的平行位置,作業必須等候位置釋放。

一旦平行位置可供使用,作業就會路由傳送至要求的代理程式類型。 就概念上,Microsoft 裝載的集區是一個大型的全域電腦集區。 (事實上,根據 YAML) 中的 (vmImage 或集區名稱,已選取代理程式,依地理位置和作業系統類型分割許多不同的實體集區) (。) 。

集區選取

Microsoft 集區中的所有代理程式都是全新、尚未執行任何管線的新虛擬機器。 當作業完成時,將會捨棄代理程式 VM。

自我裝載代理程式組件區要求

Microsoft 裝載的集區類似,服務會先檢查您組織的平行作業。 它會在所有自我裝載代理程式上加總所有執行中的作業,並與購買的平行作業數目進行比較。 如果沒有可用的平行位置,作業必須等候位置釋放。

一旦有平行位置可用,就會檢查自我裝載集區是否有相容的代理程式。 自我裝載代理程式提供 功能,也就是字串,指出已安裝特定軟體或設定。 管線具有 需求,這是執行作業所需的功能。 如果找不到符合管線需求的免費代理程式,作業會繼續等候。 如果集區中沒有符合需求的代理程式,作業將會失敗。

自我裝載代理程式通常會從執行重複使用來執行。 針對自我裝載的代理程式,管線作業可能會有副作用,例如啟動快取,或在本機存放庫中已提供大部分的認可。

準備執行作業

一旦代理程式接受作業,它就會有一些準備工作要執行。 代理程式會在下次) 執行 作業所需的所有工作 下載 (和快取。 它會在磁片上建立工作區,以保存執行中使用的原始程式碼、成品和輸出。 然後,它會開始 執行步驟

執行每個步驟

步驟會依序執行,逐一執行。 在步驟可以開始之前,必須先完成所有先前的步驟 (或略過) 。

執行每個工作

步驟是由 工作實作。 工作本身會實作為Node.js或 PowerShell 腳本。 工作系統會將輸入和輸出路由傳送至備份腳本。 它也提供一些常見的服務,例如改變系統路徑和建立新的 管線變數

每個步驟都會在自己的進程中執行,並將它與先前步驟所留下的環境隔離。 由於此每個步驟的程式模型,因此不會在步驟之間保留環境變數。 不過,工作和腳本有一個機制可向代理程式通訊: 記錄命令。 當工作或腳本將記錄命令寫入標準輸出時,代理程式會採取所要求的任何動作。

有代理程式命令可建立新的管線變數。 管線變數會在下一個步驟中自動轉換成環境變數。 若要設定值為 myValue 的新變數 myVar ,腳本可以執行此動作:

echo '##vso[task.setVariable variable=myVar]myValue'
Write-Host "##vso[task.setVariable variable=myVar]myValue"

報告並收集結果

每個步驟都可以報告警告、錯誤和失敗。 錯誤和警告會回報給管線摘要頁面,將工作標示為「問題成功」。 失敗也會回報給摘要頁面,但會將工作標示為「失敗」。 如果步驟使用命令) 明確報告失敗 (##vso ,或以非零結束代碼結束腳本,則步驟是失敗。

記錄和結果會從代理程式流向服務

執行步驟時,代理程式會持續將輸出行傳送至服務。 這就是您看到主控台即時摘要的原因。 在每個步驟結束時,步驟的整個輸出也會上傳為記錄檔。 管線完成後,即可下載記錄。 代理程式可以上傳的其他專案包括 成品測試結果。 這些在管線完成之後也可供使用。

狀態和條件

代理程式會持續追蹤每個步驟的成功或失敗。 隨著問題或失敗的步驟成功,作業的狀態將會更新。 作業一律會反映每個步驟的「最差」結果:如果步驟失敗,作業也會失敗。

在執行步驟之前,代理程式會檢查該步驟 的條件 ,以判斷它是否應該執行。 根據預設,只有在作業的狀態成功或問題成功時,才會執行步驟。 許多作業都有清除步驟,無論發生什麼事,都需要執行,因此他們可以指定 「always () 」 的條件。 清除步驟也可能設定為只在 取消時執行。 成功的清除步驟無法儲存作業失敗;輸入失敗之後,工作永遠無法返回成功。

逾時和中斷連線

每個作業都有逾時。 如果作業未在指定時間內完成,伺服器將會取消作業。 它會嘗試通知代理程式停止,並將作業標示為已取消。 在代理程式端,這表示取消所有剩餘的步驟,並上傳任何剩餘 的結果

作業的寬限期稱為取消逾時,用來完成任何取消工作。 (請記住, 即使在 cancel.) 逾時加上取消逾時之後,如果代理程式尚未回報工作已停止,則伺服器會將作業標示為失敗。

因為 Azure Pipelines 會隨時將工作散發給代理程式電腦,所以代理程式可能會停止回應伺服器。 如果代理程式的主機電腦因為電源遺失 (而消失、VM 關閉) 或網路故障,就會發生這種情況。 為了協助偵測這些狀況,代理程式每分鐘傳送一次活動訊號訊息,讓伺服器知道它仍在運作中。 如果伺服器連續五分鐘未收到活動訊號,則會假設代理程式不會返回。 作業標示為失敗,讓使用者知道他們應該重試管線。

透過 CLI 管理執行

使用 Azure DevOps CLI,您可以在專案中列出管線執行,並檢視特定執行的詳細資料。 您也可以在管線執行中新增和刪除標籤。

必要條件

  • 您必須已安裝 Azure DevOps CLI 擴充功能,如 開始使用 Azure DevOps CLI中所述。
  • 使用 az login 登入 Azure DevOps。
  • 如需本文中的範例,請使用 az devops configure --defaults organization=YourOrganizationURL 設定預設組織。

列出管線執行

使用 az pipelines runs list 命令,列出專案中的管線執行。 若要開始使用,請參閱 開始使用 Azure DevOps CLI

az pipelines runs list [--branch]
                       [--org]
                       [--pipeline-ids]
                       [--project]
                       [--query-order {FinishTimeAsc, FinishTimeDesc, QueueTimeAsc, QueueTimeDesc, StartTimeAsc, StartTimeDesc}]
                       [--reason {all, batchedCI, buildCompletion, checkInShelveset, individualCI, manual, pullRequest, schedule, triggered, userCreated, validateShelveset}]
                       [--requested-for]
                       [--result {canceled, failed, none, partiallySucceeded, succeeded}]
                       [--status {all, cancelling, completed, inProgress, none, notStarted, postponed}]
                       [--tags]
                       [--top]

選擇性參數

  • branch:依此分支的組建進行篩選。
  • 組織:Azure DevOps 組織 URL。 您可以使用 來設定預設組織 az devops configure -d organization=ORG_URL 。 如果未設定為預設或使用 挑選 git config ,則為必要專案。 範例: --org https://dev.azure.com/MyOrganizationName/.
  • pipeline-ids:要列出組建之定義的空間分隔識別碼。
  • 專案:專案的名稱或識別碼。 您可以使用 來設定預設專案 az devops configure -d project=NAME_OR_ID 。 如果未設定為預設或使用 挑選 git config ,則為必要專案。
  • 查詢順序:定義管線執行列出的順序。 接受的值包括 FinishTimeAscFinishTimeDescQueueTimeAscQueueTimeDescStartTimeAscStartTimeDesc
  • reason:僅列出基於這個指定原因的組建。 接受的值是 batchedCIbuildCompletioncheckInShelvesetindividualCImanualpullRequestscheduletriggereduserCreatedvalidateShelveset
  • requested-for:限制為指定使用者或群組要求的組建。
  • result:限制為具有指定結果的組建。 已接受的值 會取消失敗partiallySucceededsucceeded
  • status:限制為具有指定狀態的組建。 接受的值 全部都是、 取消已完成inProgressnonenotStarted延後
  • 標記:使用每個指定的標籤限制組建。 空格分隔。
  • top:要列出的最大組建數目。

範例

下列命令會列出前三個管線執行的狀態為 已完成 ,且結果 為成功,並以資料表格式傳回結果。

az pipelines runs list --status completed --result succeeded --top 3 --output table

Run ID    Number      Status     Result     Pipeline ID    Pipeline Name               Source Branch    Queued Time                 Reason
--------  ----------  ---------  ---------  -------------  --------------------------  ---------------  --------------------------  ------
125       20200124.1  completed  succeeded  12             Githubname.pipelines-java  master           2020-01-23 18:56:10.067588  manual
123       20200123.2  completed  succeeded  12             Githubname.pipelines-java  master           2020-01-23 11:55:56.633450  manual
122       20200123.1  completed  succeeded  12             Githubname.pipelines-java  master           2020-01-23 11:48:05.574742  manual

顯示管線執行詳細資料

使用 az pipelines run show 命令,在專案中顯示管線執行的詳細資料。 若要開始使用,請參閱 開始使用 Azure DevOps CLI

az pipelines runs show --id
                       [--open]
                       [--org]
                       [--project]

參數

  • id:必要。 管線執行的識別碼。
  • open:選擇性。 在網頁瀏覽器中開啟組建結果頁面。
  • 組織:Azure DevOps 組織 URL。 您可以使用 來設定預設組織 az devops configure -d organization=ORG_URL 。 如果未設定為預設或使用 挑選 git config ,則為必要專案。 範例: --org https://dev.azure.com/MyOrganizationName/.
  • 專案:專案的名稱或識別碼。 您可以使用 來設定預設專案 az devops configure -d project=NAME_OR_ID 。 如果未設定為預設或使用 挑選 git config ,則為必要專案。

範例

下列命令顯示識別碼 為 123 的管線執行詳細資料,並以資料表格式傳回結果。 它也會將您的網頁瀏覽器開啟至 [建置結果] 頁面。

az pipelines runs show --id 122 --open --output table

Run ID    Number      Status     Result     Pipeline ID    Pipeline Name               Source Branch    Queued Time                 Reason
--------  ----------  ---------  ---------  -------------  --------------------------  ---------------  --------------------------  --------
123       20200123.2  completed  succeeded  12             Githubname.pipelines-java  master           2020-01-23 11:55:56.633450  manual

將標籤新增至管線執行

使用 az pipelines run tag add 命令,將標籤新增至專案中的管線執行。 若要開始使用,請參閱 開始使用 Azure DevOps CLI

az pipelines runs tag add --run-id
                          --tags
                          [--org]
                          [--project]

參數

  • run-id:必要專案。 管線執行的識別碼。
  • 標記:必要。 要新增至管線執行的標記 (逗號分隔值) 。
  • 組織:Azure DevOps 組織 URL。 您可以使用 來設定預設組織 az devops configure -d organization=ORG_URL 。 如果未設定為預設或使用 挑選 git config ,則為必要專案。 範例: --org https://dev.azure.com/MyOrganizationName/.
  • 專案:專案的名稱或識別碼。 您可以使用 來設定預設專案 az devops configure -d project=NAME_OR_ID 。 如果未設定為預設或使用 挑選 git config ,則為必要專案。

範例

下列命令會將 標記 YAML 新增至識別碼 為 123 的管線執行,並以 JSON 格式傳回結果。

az pipelines runs tag add --run-id 123 --tags YAML --output json

[
  "YAML"
]

列出管線執行標籤

使用 az pipelines run tag list 命令,列出專案中管線執行的標記。 若要開始使用,請參閱 開始使用 Azure DevOps CLI

az pipelines runs tag list --run-id
                           [--org]
                           [--project]

參數

  • run-id:必要專案。 管線執行的識別碼。
  • 組織:Azure DevOps 組織 URL。 您可以使用 來設定預設組織 az devops configure -d organization=ORG_URL 。 如果未設定為預設或使用 挑選 git config ,則為必要專案。 範例: --org https://dev.azure.com/MyOrganizationName/.
  • 專案:專案的名稱或識別碼。 您可以使用 來設定預設專案 az devops configure -d project=NAME_OR_ID 。 如果未設定為預設或使用 挑選 git config ,則為必要專案。

範例

下列命令會列出識別碼 為 123 的管線執行標記,並以資料表格式傳回結果。

az pipelines runs tag list --run-id 123 --output table

Tags
------
YAML

從管線執行中刪除標籤

使用 az pipelines run tag delete 命令,從專案中的管線執行中刪除標籤。 若要開始使用,請參閱 開始使用 Azure DevOps CLI

az pipelines runs tag delete --run-id
                             --tag
                             [--org]
                             [--project]

參數

  • run-id:必要專案。 管線執行的識別碼。
  • tag:必要。 要從管線執行中刪除的標記。
  • 組織:Azure DevOps 組織 URL。 您可以使用 來設定預設組織 az devops configure -d organization=ORG_URL 。 如果未設定為預設或使用 挑選 git config ,則為必要專案。 範例: --org https://dev.azure.com/MyOrganizationName/.
  • 專案:專案的名稱或識別碼。 您可以使用 來設定預設專案 az devops configure -d project=NAME_OR_ID 。 如果未設定為預設或使用 挑選 git config ,則為必要專案。

範例

下列命令會從識別碼為 123的管線執行中刪除YAML標記。

az pipelines runs tag delete --run-id 123 --tag YAML