由於我在 Azure Pipelines 設定的 CI 有整合 Telegram Notification,但我希望依據前一個建置步驟 (Task) 的執行狀態,動態決定要不要執行這個 Telegram 訊息推播步驟,嘗試了好些時間,終於可以理解正確設定的方法。
早期錯誤的設定
早期我是從 StackOverflow 查到一則解答,原本的想法很簡單,就是直接設定 Azure Pipelines 預先定義好的 Agent 變數 agent.jobstatus,將其值設定為 canceled,試圖中斷 Agent 的執行,讓 Agent 不再繼續執行接下來的 Tasks。
echo "##vso[task.setvariable variable=agent.jobstatus;]canceled"
echo "##vso[task.complete result=Canceled;]DONE"
這個方法雖然還有效果,但是在 Azure DevOps Services 上面,執行 Pipelines 的過程中已經開始看到明顯的錯誤訊息,日後某天肯定會發生錯誤,必須趁早改掉。
##[warning]Overwriting readonly task variable 'agent.jobstatus'. This behavior will be disabled in the future. See https://github.com/microsoft/azure-pipelines-yaml/blob/master/design/readonly-variables.md for details.

因為 agent.jobstatus 屬於 Read-only variables (唯讀變數),不能在 Task 執行的過程中被修改。
正確的設定步驟
-
先理解 如何從 Azure Pipelines 的 Task 設定一個變數給下一個 Task 使用
-
想辦法在主要的建置步驟動態設定一個變數,該變數可以讓下一個 Task 判斷是否需要執行
echo "##vso[task.setvariable variable=NGCLIVersions]canceled"
echo "##vso[task.complete result=Canceled;]DONE"
這裡的 echo "##vso[task.complete result=Canceled;]DONE" 主要用來設定目前工作的狀態是否要標示為 Canceled 狀態。即便 Canceled 狀態出現,由於並非 Failed 失敗狀態,所以接下來的 Tasks 還是會正常執行,因此還需要將接下來的每個 Tasks 設定 Conditions 自訂執行條件,才能讓需要跳過的 Task 產生 Skipped 狀態。
-
設定後面要接續執行的 Tasks,展開 Control Options,將 Run this task 下拉選單調整為 Custom conditions,然後設定 Custom condition 自訂條件。
and(succeeded(), ne(variables['NGCLIVersions'], 'canceled'))

注意:如果你想取消後面所有 Tasks 執行,每個 Tasks 都需要做一樣的設定!
以下是 Pipelines 執行完後的結果畫面:

相關連結