關於 Azure DevOps 中的 YAML Pipeline
關於 Azure DevOps 中的 YAML Pipeline
最近在上課上到 Azure DevOps Pipeline 的時候,發現有些技術人員對 ADO 的 YAML Pipeline 有個小小的誤會。
很多人以為,只要是 Azure DevOps 的 YAML Pipeline,就一定要放在 repo root 底下,然後檔名一定要叫:
azure-pipelines.yml
其實,不是的。
這個檔名只是 Azure DevOps 預設最容易被偵測到的慣例,並不是限制。
換句話說,你的 repo 裡可以有:
/azure-pipelines.yml
也可以有:
/pipelines/ci.yml
/pipelines/deploy-dev.yml
/pipelines/deploy-prod.yml
/pipelines/security-scan.yml
/.azuredevops/agentic-dev.yml
真正的重點不是檔名,而是:
Azure DevOps 裡的 Pipeline Definition
必須指向 repo 中的某一個 YAML 檔案
也就是說,Pipeline 不是靠檔名自動決定要跑哪一份 YAML,而是 Azure DevOps 裡面那條 Pipeline 本身記住了它要使用哪一個 YAML file path。
建立新的 YAML Pipeline,並指定特定的 yml 檔案
假設你的 repo 裡已經有一份 YAML:
/pipelines/ci.yml
那麼你可以這樣建立一條新的 Pipeline,連結到既有的 yaml 檔案,作法是在新增 yml pipeline 的時候,選擇 Select an existing YAML file:

接著選擇你的程式碼中的 yml 來源即可,這樣一來,你就在 Azure DevOps 裡建立了一條新的 Pipeline,而這條 Pipeline 使用的 YAML 內容,就是:
/pipelines/ci.yml
一個 repo 可以有多個 YAML Pipeline
這也是另一個常見誤會。
很多人以為一個 repo 只能有一個 YAML Pipeline。
當然不是。
當你知道可以在建立 Yaml Pipeline 的時候,指定到不同的 yml file,那大概也已經發現,同一個repo中配置多個 Yaml Pipeline當然也是可以的。
例如:
/
├─ src/
├─ tests/
├─ pipelines/
│ ├─ ci.yml
│ ├─ deploy-dev.yml
│ ├─ deploy-test.yml
│ └─ deploy-prod.yml
然後在 Azure DevOps 裡建立:
Pipeline: MyApp - CI
YAML: /pipelines/ci.yml
Pipeline: MyApp - Deploy Dev
YAML: /pipelines/deploy-dev.yml
Pipeline: MyApp - Deploy Test
YAML: /pipelines/deploy-test.yml
Pipeline: MyApp - Deploy Prod
YAML: /pipelines/deploy-prod.yml
這樣的好處是,每一條 Pipeline 可以有自己的目的、自己的 trigger、自己的變數與自己的執行條件。
例如 CI Pipeline 可以這樣:
trigger:
branches:
include:
- main
- develop
pr:
branches:
include:
- main
- develop
部署測試環境的 Pipeline 可以只在 develop 分支觸發:
trigger:
branches:
include:
- develop
正式環境部署則可以不要自動觸發,只允許手動執行:
trigger: none
pr: none
所以你不一定要把所有事情都塞在同一份 azure-pipelines.yml 裡面。
有些團隊會把 Build、Test、Deploy 全部放在同一份 YAML 裡,這當然可以。但當 Pipeline 越來越多、環境越來越複雜、權限與觸發條件越來越不一樣的時候,把不同用途拆成不同 YAML,反而會比較清楚。
多個 YAML,不代表自動變成多條 Pipeline
不過這裡要特別提醒一件事。
你在 repo 裡放了很多 YAML 檔案,不代表 Azure DevOps 會自動幫你建立很多條 Pipeline。
也就是說,底下這樣:
/pipelines/ci.yml
/pipelines/deploy-dev.yml
/pipelines/deploy-prod.yml
只是代表 repo 裡有三份 YAML 檔案。
你仍然要到 Azure DevOps 的 Pipelines 裡面,分別建立三條 Pipeline,並且讓它們各自指向對應的 YAML 檔案。
可以把它想成:
YAML 檔案 👉 Pipeline 的定義內容
而
Azure DevOps Pipeline 👉 則是配置實際可以被執行、被排程、被授權、被觸發的那條管線(連結到 YAML檔案)
所以,並不是有 YAML 檔案就等於有 Pipeline。
而是:
建立 Pipeline
→ 指定 repo
→ 指定 branch
→ 指定 YAML file path
→ 之後這條 Pipeline 才知道要跑哪一份 YAML
如何修改既有 Pipeline,讓它改用另一份 YAML?
假設你原本有一條 Pipeline,是指向:
/azure-pipelines.yml
後來你想整理 repo 結構,把它改成:
/pipelines/ci.yml
這時候,光是把 repo 裡面的檔案改名或搬移是不夠的。
因為 Azure DevOps 裡的 Pipeline Definition 還是記著原本的 YAML 路徑。
你需要進入 Azure DevOps:
Pipelines
→ 選擇那條既有的 Pipeline
→ 右上角 ...
→ Settings

在 Settings 裡面找到:

改成新的 yml 檔案路徑,儲存之後,這條 Pipeline 之後就會改用新的 YAML 檔案。
我建議的 Repo 結構
如果是一個比較標準的專案,我通常不會把所有 Pipeline 都塞在 root。
我會比較偏向這樣:
/
├─ src/
├─ tests/
├─ pipelines/
│ ├─ ci.yml
│ ├─ deploy-dev.yml
│ ├─ deploy-test.yml
│ └─ deploy-prod.yml
如果你的團隊有比較多 DevOps 相關設定,也可以這樣:
/
├─ src/
├─ tests/
├─ .azuredevops/
│ ├─ pipelines/
│ │ ├─ ci.yml
│ │ ├─ deploy-dev.yml
│ │ └─ deploy-prod.yml
│ └─ templates/
│ ├─ build-dotnet.yml
│ └─ deploy-webapp.yml
這樣的好處是 repo root 比較乾淨,而且跟 Azure DevOps 相關的設定也比較集中。
小結
所以,Azure DevOps 的 YAML Pipeline 並不是只能使用:
/azure-pipelines.yml
這只是預設慣例,不是規定。
你可以在同一個 repo 裡面放多個 YAML 檔案,也可以在 Azure DevOps 裡建立多條 Pipeline,讓它們分別指向不同的 YAML。
真正要記得的是底下這幾件事:
一、YAML 檔案可以放在 repo 的不同路徑
二、一個 repo 可以有多個 YAML Pipeline
三、每條 Pipeline 可以指向不同的 YAML 檔案
四、不同 YAML 可以有不同 trigger
五、改 YAML 檔名或路徑時,要同步修改 Azure DevOps 裡的 YAML file path
當 Pipeline 中的 trigger、stage、tasks開始變多、環境開始變多、部署規則開始變複雜時,適度把 YAML 拆開,反而會讓整個 CI/CD 流程更清楚,也更容易維護。
不要被 azure-pipelines.yml 這個預設檔名綁住。
它只是起點,不是限制。
留言