管線執行順序

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

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

管線概觀

當您執行管線時,會發生許多情況。 雖然您通常不需要知道它們,但有時候有大圖會很有用。 概括而言,Azure Pipelines 會:

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

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

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

處理管線

展開 YAML 範本

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

  1. 首先,展開 範本 並評估 範本運算式
  2. 接下來,評估 階段 層級的相依性,以挑選要執行的第一個階段 (s) 。
  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 裝載的集區是電腦的全球集區。 (事實上,它是依地理位置和作業系統類型分割的許多不同的實體集區。) 根據 vmImage YAML) 中的 () 或集區名稱 (,) 所要求的傳統編輯器中選取代理程式。

集區選取

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:限制為具有指定結果的組建。 已接受的值會 取消失敗部分成功成功
  • status:限制為具有指定狀態的組建。 接受的值 全部都是、 取消已完成inProgressnonenotStarted延後
  • tags:限制每個指定標記的組建。 空格分隔。
  • 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