管線執行順序
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
執行代表管線的一個執行。 在執行期間,會處理管線,代理程式會處理一或多個作業。 管線執行包括 作業、步驟和工作。 執行持續整合 (CI) 和持續傳遞 (CD) 管線。
當您執行管線時,會發生許多情況。 雖然您通常不需要知道它們,但有時候有大圖會很有用。 概括而言,Azure Pipelines 會:
- 處理管線
- 要求一或多個代理程式執行作業
- 將作業交給代理程式並收集結果
在代理程式端,針對每個作業,代理程式將會:
作業可能會 成功、失敗或取消。 此外,工作 可能無法完成的情況。 瞭解這種情況如何協助您針對問題進行疑難排解。
讓我們逐一細分每個動作。
處理管線
若要將管線轉換成執行,Azure Pipelines 會依此循序執行數個步驟:
- 首先,展開 範本 並評估 範本運算式。
- 接下來,評估 階段 層級的相依性,以挑選要執行的第一個階段 (s) 。
- 針對選取要執行的每個階段,會發生兩件事:
- 針對選取要執行的每項作業,將 多組態 展開 (
strategy: matrix
或在strategy: parallel
YAML 中,) 展開至多個執行時間作業。 - 針對每個執行時間作業,評估 條件 以決定該作業是否符合執行資格。
- 要求每個合格執行時間作業的代理程式。
當執行時間作業完成時,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
。 - 查詢順序:定義列出管線執行的順序。 接受的值包括 FinishTimeAsc、 FinishTimeDesc、 QueueTimeAsc、 QueueTimeDesc、 StartTimeAsc和 StartTimeDesc。
- reason:僅列出基於這個指定原因的組建。 接受的值是 batchedCI、 buildCompletion、 checkInShelveset、 individualCI、 manual、 pullRequest、 schedule、 triggered、 userCreated和 validateShelveset。
- requested-for:限制為指定使用者或群組所要求的組建。
- result:限制為具有指定結果的組建。 已接受的值會 取消、 失敗、 無、 部分成功和 成功。
- status:限制為具有指定狀態的組建。 接受的值 全部都是、 取消、 已完成、 inProgress、 none、 notStarted和 延後。
- 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