使用管線範本處理環境之間的相似處
當您將變更部署到多個環境時,部署到每個環境所涉及的步驟都很類似或相同。 在本單元中,您將了解如何使用管線範本來避免重複,並允許重複使用管線程式碼。
部署到多個環境
與網站小組的同事談過之後,您決定將下列管線用在您的玩具公司網站上:
管線執行 Bicep Linter,檢查 Bicep 程式碼是否有效且遵循最佳做法。
對 Bicep 程式碼執行 Lint 分析不需要連線至 Azure,因此部署至多少個環境無所謂。 它只會執行一次。
管線部署至測試環境。 此階段需要:
- 執行 Azure Resource Manager 預檢驗證。
- 部署 Bicep 程式碼。
- 對測試環境執行一些測試。
如果管線的任何部分失敗,整個管線會停止,方便您調查並解決問題。 但如果一切成功,管線就繼續部署至實際執行環境:
- 管線會執行預覽階段,針對實際執行環境執行假設狀況作業,以列出您實際執行環境的 Azure 資源將有何變化。 預覽階段也驗證部署,您不需要對實際執行環境另外執行驗證階段。
- 管線暫停以方便手動驗證。
- 如果獲准,管線會對實際執行環境執行部署和煙霧測試。
其中一些階段在測試與實際執行環境之間重複,而有些階段僅針對特定環境執行:
階段 | 環境 |
---|---|
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 註解範例。