使用管線範本處理環境之間的相似處

已完成

當您將變更部署到多個環境時,部署到每個環境所涉及的步驟都很類似或相同。 在本單元中,您將了解如何使用管線範本來避免重複,並允許重複使用管線程式碼。

部署到多個環境

與網站小組的同事談過之後,您決定將下列管線用在您的玩具公司網站上:

此圖顯示一連串管線階段,其中包括測試和實際執行環境部署。

  1. 管線執行 Bicep Linter,檢查 Bicep 程式碼是否有效且遵循最佳做法。

    對 Bicep 程式碼執行 Lint 分析不需要連線至 Azure,因此部署至多少個環境無所謂。 它只會執行一次。

  2. 管線部署至測試環境。 此階段需要:

    1. 執行 Azure Resource Manager 預檢驗證。
    2. 部署 Bicep 程式碼。
    3. 對測試環境執行一些測試。
  3. 如果管線的任何部分失敗,整個管線會停止,方便您調查並解決問題。 但如果一切成功,管線就繼續部署至實際執行環境:

    1. 管線會執行預覽階段,針對實際執行環境執行假設狀況作業,以列出您實際執行環境的 Azure 資源將有何變化。 預覽階段也驗證部署,您不需要對實際執行環境另外執行驗證階段。
    2. 管線暫停以方便手動驗證。
    3. 如果獲准,管線會對實際執行環境執行部署和煙霧測試。

其中一些階段在測試與實際執行環境之間重複,而有些階段僅針對特定環境執行:

階段 環境
Lint 兩者皆否 - 不會對環境執行 Lint 分析
Validate 僅測試
預覽 僅生產
部署 這兩個環境
煙霧測試 這兩個環境

需要在管線中重複步驟時,您可能會嘗試複製並貼上步驟定義。 不過,最好避免該做法。 複製管線的程式碼時,一不小心就會發生難以察覺的錯誤,或造成不同步。 日後需要變更步驟時,您必須想起在很多地方套用變更。

管線範本

「管線範本」可讓您建立可重複使用的管線定義區段。 範本可以定義步驟、作業,甚至整個階段。 在單一管線內,甚至在多個管線中,您可以利用範本來多次重複使用管線的各部分。 如果要在多個管線中重複使用的一組變數,您也可以為此建立範本。

範本只是 YAML 檔案,包含可重複使用的內容。 步驟定義的簡單範本看起來可能像這樣,並儲存在名為 script.yml 的檔案中:

steps:
- script: |
    echo Hello world!

在管線中,您可以在通常定義個別步驟的地方,利用 template 關鍵字來使用範本:

jobs:
- job: Job1
  pool:
    vmImage: 'windows-latest'
  steps:
  - template: script.yml

- job: Job2
  pool:
    vmImage: 'ubuntu-latest'
  steps:
  - template: script.yml

巢狀範本

範本之間也可以形成巢狀。 假設先前的檔案名為 jobs.yml,而且您建立名為 azure-pipelines.yml 的檔案,以在多個管線階段重複使用作業範本:

trigger:
  branches:
    include:
    - main

pool:
  vmImage: ubuntu-latest

stages:

- stage: Stage1
  jobs:
  - template: jobs.yml

- stage: Stage2
  jobs:
  - template: jobs.yml

在單一管線中巢狀範本或多次重複使用範本時,必須小心,切勿不慎對多個管線資源使用相同的名稱。 例如,階段內的每項作業都需要自己的識別碼。 因此,如果您在範本中定義作業識別碼,則不可在同一階段重複使用多次。

使用幾組複雜的部署管線時,最好為共用管線範本建立專用 Git 存放庫。 然後,在多個管線中,甚至是不同專案,您就可以重複使用相同的存放庫。 我們在摘要中提供詳細資訊的連結。

管線範本參數

「管線範本參數」可讓範本檔案變得更容易重複使用,因為每當使用範本時,可以容許些微差異。

建立管線範本時,您可以在檔案頂端指出其參數:

parameters: 
- name: environmentType
  type: string
  default: 'Test'
- name: serviceConnectionName
  type: string

需要多少參數就定義多少參數。 但就像 Bicep 參數一樣,請盡量不要濫用管線範本參數。 應該讓其他人不必指定太多設定,就能輕鬆重複使用您的範本。

每個管線範本參數都有三個屬性:

  • 參數的「名稱」,在範本檔案中用來參考參數。
  • 參數的「類型」。 參數支援幾種不同類型的資料,包括「字串」、「數字」和「布林值」。 您也可以定義更複雜的範本,以接受結構化物件。
  • 參數的「預設值」,這是選擇性的。 如果您未指定預設值,則使用管線範本時必須提供值。

在範例中,管線會定義名為 environmentType 的字串參數 (預設值為 Test) 及名為 serviceConnectionName 的必要參數。

在管線範本中,您使用特殊語法來參考參數的值。 使用 ${{parameters.YOUR_PARAMETER_NAME}} 巨集,如下列範例所示:

steps:
- script: |
    echo Hello ${{parameters.environmentType}}!

您使用 parameters 關鍵字將參數的值傳遞至管線範本,如下列範例所示:

steps:
- template: script.yml
  parameters:
    environmentType: Test

- template: script.yml
  parameters: 
    environmentType: Production

在管線範本中指派識別碼給作業和階段時,您也可以使用參數。 在管線中需要多次重複使用相同範本時,這項技巧很有用,如下所示:

parameters:
- name: environmentType
  type: string
  default: 'Test'

jobs:
- job: Job1-${{parameters.environmentType}}
  pool:
    vmImage: 'windows-latest'
  steps:
  - template: script.yml

- job: Job2-${{parameters.environmentType}}
  pool:
    vmImage: 'ubuntu-latest'
  steps:
  - template: script.yml

條件

您可以使用管線「條件」,指定步驟、作業或甚至是階段是否應該根據您指定的規則來執行。 針對許多不同的情況,您可以結合範本參數和管線條件,以自訂部署流程。

例如,假設您定義管線範本來執行指令碼步驟。 您打算對每個環境重複使用範本。 當您部署實際執行環境時,您希望執行另一個步驟。 以下示範如何使用 if 巨集和 eq (「等於」) 運算子來達成此目的:

parameters: 
- name: environmentType
  type: string
  default: 'Test'

steps:
- script: |
    echo Hello ${{parameters.environmentType}}!

- ${{ if eq(parameters.environmentType, 'Production') }}:
  - script: |
      echo This step only runs for production deployments.

此處條件可轉譯為:「如果 environmentType 參數的值等於 Production,則執行下列步驟」

提示

當您在範例中使用條件時,請注意 YAML 檔案的縮排。 套用條件的步驟必須再多縮排一層。

您也可以在階段、作業或步驟上指定 condition 屬性。 以下示範如何使用 ne (「不等於」) 運算子來指定條件,例如,「如果 environmentType 參數的值不等於 Production,則執行下列步驟」

- script: |
    echo This step only runs for non-production deployments.
  condition: ne('${{ parameters.environmentType }}', 'Production')

雖然條件可讓管線更有彈性,但請不要使用太多。 因為這會使得管線變很複雜,不易理解流程。 如果管線範本中有許多條件,該範本對您打算執行的工作流程而言,可能就不是最佳解決方案,您可能需要重新設計管線。

此外,請考慮使用 YAML 註解來說明您使用的條件,以及管線中可能需要進一步說明的其他任何層面。 註解使得管線變得簡單易懂,日後更易於使用。 在這整個課程模組的練習中,提供了 YAML 註解範例。