關於 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 這個預設檔名綁住。

它只是起點,不是限制。

留言

這個網誌中的熱門文章

實際嘗試使用DeepSeek API

開啟 teams 中的『會議轉錄(謄寫)』與Copilot會議記錄、摘要功能

使用 Dify API 快速建立一個包含前後文記憶的對談機器人

使用LM Studio輕鬆在本地端以API呼叫大語言模型(LLM)

使用 Dify 串接 LINE Bot