﻿# 如何快速找出 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](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/0d15e476c6ed4eae5eb1-152280764-6d915c51-bec6-4d48-9499-e9fda8b6e8a0.png)

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

先找到 [Finding Pipelines Targeting Retired Images](https://github.com/microsoft/azure-pipelines-agent/tree/master/tools/FindPipelinesUsingRetiredImages) 工具，下載專案中的 `QueryJobHistoryForRetiredImages.ps1` 檔案，接著透過以下步驟設定：

1.  先申請 Personal Access Tokens (PAT)
    
    [Use personal access tokens](https://learn.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops&tabs=preview-page&WT.mc_id=DT-MVP-4015686)
    
2.  然後用 PowerShell 執行你剛剛下載的 `QueryJobHistoryForRetiredImages.ps1` 程式
    
    ```powershell
    .\QueryJobHistoryForRetiredImages.ps1 <Azure_DevOps_Organization_URL> <PAT_Token>
    ```
    
    使用範例
    
    ```powershell
    .\QueryJobHistoryForRetiredImages.ps1 -accountUrl https://dev.azure.com/willh -pat kei3477943yldfdfy9hlisdhfgdf
    ```
    
    執行結果的示意圖如下：
    
    ![image](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/ea81ce00500f24377dab-152281861-6bcd1df1-1123-4dc4-8985-e07757c1635a.png)
    
    這支程式會透過 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 休息而已。
    

### 相關連結

-   [Hosted Pipelines Image Deprecation - Azure DevOps Blog](https://devblogs.microsoft.com/devops/hosted-pipelines-image-deprecation/?WT.mc_id=DT-MVP-4015686)
-   [Finding Pipelines Targeting Retired Images](https://github.com/microsoft/azure-pipelines-agent/tree/master/tools/FindPipelinesUsingRetiredImages)
