The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

如何快速找出 Azure Pipelines 中使用到即將退役的 Hosted Pipelines Images

Azure DevOps Services 的 Hosted Agent (vs2017-win2016) 與 GitHub Actions 的 Runner (windows-2016) 即將在 2022/03/15 正式移除對 Windows Server 2016 的支援,屆時使用這些 Hosted Agents 的 Pipelines 將無法執行。但我們公司使用 Azure DevOps Services 多年,數百個專案的 CI/CD 很難一個專案一個專案檢查是否選用的 Hosted Agents 即將退役,這篇文章我將分享怎樣可以批次找出有問題的 Pipelines 設定。

其實即將退役的 Hosted Agents 不是只有 Windows Server 2016 而已,目前這個時間點,即將要退役的還有 macOS-10.14, macOS 10.14, MacOS 1014, MacOS-1014, Ubuntu16, ubuntu-16.04, DefaultHosted, VS2017, vs2017 win2016, vs2017-win2016, windows-2016-vs2017 等等,一個一個肉眼檢查實在太累了,但如果你的專案並不多,其實也是可以一個一個慢慢看。

這裡的 Hosted Agents 所代表的意思是「託管的代理程式」,簡單來說就是在 Azure Pipelines 上透過微軟提供的 Agents 代理程式。

基本上,你無法從 Pipelines 本身去查找是否有舊的設定,因為 Pipelines 本身有很多種定義方法,你可能用傳統的線上編輯器,也有可能用 YAML 的方式定義,且 YAML 可能存在於 Git 不同分支下,所以很難透過一個簡單的方法找出所有的 Pipelines Definition 是否還有設定使用舊版的 Hosted Agents。因此,你只能從 Jobs 來找出「曾經執行過」的作業 (Jobs),來判斷特定 Pipelines 是否還使用即將退役的 Hosted Agents!

人工查找特定專案下是否有用到退役的 Hosted Agents

你可以直接從瀏覽器輸入以下網址結構,請將 {organization} 替換成你的組織名稱,將 {project} 替換成你的專案名稱

https://dev.azure.com/{organization}/{project}/_settings/agentqueues

開啟網頁後,使用篩選功能,找出所有即將退役的 Jobs 清單,點進 Job 之後,就可以找到 Pipelines,編輯一下就可以變更 Agent 設定:

image

使用 PowerShell 查找所有專案是否有用到退役的 Hosted Agents

先找到 Finding Pipelines Targeting Retired Images 工具,下載專案中的 QueryJobHistoryForRetiredImages.ps1 檔案,接著透過以下步驟設定:

  1. 先申請 Personal Access Tokens (PAT)

    Use personal access tokens

  2. 然後用 PowerShell 執行你剛剛下載的 QueryJobHistoryForRetiredImages.ps1 程式

    .\QueryJobHistoryForRetiredImages.ps1 <Azure_DevOps_Organization_URL> <PAT_Token>
    

    使用範例

    .\QueryJobHistoryForRetiredImages.ps1 -accountUrl https://dev.azure.com/willh -pat kei3477943yldfdfy9hlisdhfgdf
    

    執行結果的示意圖如下:

    image

    這支程式會透過 Azure DevOps REST APIs 取出所有執行過的 Jobs 清單,並找出這些 Jobs 是透過哪個 Pipelines 執行的,所以最終在畫面上列出來的就是篩選過所有「有問題」的 Build / Release 連結,點開之後你就知道要修改哪些 Pipelines 了!

    畫面上出現的 Query next 200 jobs? (y/n): 意味著,這個命令預設只會取得 最近 200 次的 Jobs 執行記錄,如果你還想繼續分析是否有更多的歷史紀錄,可以按下 y 繼續分析,但其結果可能會跟第一頁的記錄差不多,畢竟經常在 CI/CD 的專案應該蠻固定的,像我們有些老舊專案的 Pipelines 可能老早就沒在執行了,只是躺在 Azure DevOps Services 休息而已。

相關連結