使用管線部署 Bicep 檔案

已完成

建立基本管線後,您就可以設定管線,以部署 Bicep 檔案。 在本單元中,您將了解如何從管線部署 Bicep 程式碼,以及如何設定部署步驟。

注意

本單元中的命令僅用於示範概念。 請先不要執行命令。 您很快就會在此練習所學到的內容。

服務連線

當從自己的電腦部署 Bicep 檔案時,您會使用 Azure CLI 或 Azure PowerShell。 您必須先登入 Azure,才可以部署程式碼。 這些工具通常會要求您在瀏覽器中輸入電子郵件地址和密碼。 驗證您的認證之後,即會確認您的資源部署權限,且您可使用這些工具來部署 Bicep 檔案。

依管線部署也需要驗證。 因為管線是在沒有任何人力介入的情況下執行,所以必須使用服務主體向 Azure 驗證管線。 服務主體的認證包含「應用程式識別碼」和祕密,這通常是金鑰或憑證。 您可以在 Azure Pipelines 中使用「服務連線」安全儲存這些認證,讓管線可以使用這些認證。 服務連線還包含一些其他資訊,可協助管線找出您想要部署的 Azure 環境。

提示

在本課程模組中,您將使用 Azure DevOps 在建立服務連線時自動建立服務主體。 課程模組使用服務主體驗證您的 Azure 部署管線中,會進一步詳細說明服務主體,包括服務主體的運作方式,以及建立服務主體的、為服務主體指派角色及管理這些角色的方式。

在建立服務連線時,您要為連線命名。 步驟會使用這個名稱來參考服務連線,所以您的管線 YAML 程式碼不需要包含祕密資訊。

當啟動管線時,執行部署步驟的代理程式就可以存取服務連線,包括其認證。 管線步驟會使用這些認證登入 Azure,如同您親自登入。 然後,步驟中定義的這些動作會使用服務主體的「身分識別」

顯示包含可存取服務連線,然後部署到 Azure 的 Azure 部署步驟管線圖。

您必須確保服務主體有執行部署步驟所需的權限。 例如,您可能需要將資源群組的參與者角色指派給服務主體,以便其可將資源部署到資源群組。

警告

將服務主體的認證儲存在 YAML 檔案中,然後使用 az login 命令登入似乎更為容易。 切勿使用此方法來驗證服務主體。 YAML 檔案會以純文字儲存認證。 任何有權存取您存放庫的人員,都可以看到並使用這些認證。 即使只將存取權限制在 Azure DevOps 組織和專案,但只要有人員複製您的存放庫,該人員電腦上就會有保存認證的 YAML 檔案。 從管線使用 Azure 時,請務必使用服務連線。 服務連線也會提供其他安全性和存取控制功能。

服務連線是建立在 Azure DevOps 專案中。 多個管線可以共用一條服務連線。 不過,最好還是為每個管線和所要部署的每個環境,設定一個服務連線和對應的服務主體。 這種做法有助於提高管線的安全性,並降低在與所預期不同的環境中意外部署或設定資源的可能性。

您也可以設定服務連線,使其只可用於特定的管線。 例如,當建立部署至網站生產環境的服務連線時,最好確保只有您的網站管線可以使用此服務連線。 將服務連線限制在特定的管線,可阻止他人意外對不同專案使用相同的服務連線,以致可能造成生產網站停止運作。

使用 Azure 資源群組部署工作來部署 Bicep 檔案

當您需要從管線部署 Bicep 檔案時,可以使用 Azure 資源群組部署工作。 以下是如何設定使用工作步驟的範例:

- task: AzureResourceManagerTemplateDeployment@3
  inputs:
    connectedServiceName: 'MyServiceConnection'
    location: 'westus3'
    resourceGroupName: Example
    csmFile: deploy/main.bicep
    overrideParameters: >
        -parameterName parameterValue

第一行指定 AzureResourceManagerTemplateDeployment@3。 這會告知 Azure Pipelines,您在這個步驟要使用的工作名為 AzureResourceManagerTemplateDeployment,而您要使用的工作版本為 3

使用 Azure 資源群組部署工作時,您要指定「輸入」,告知工作要執行的內容。 以下是當您使用工作時,可能會指定的一些輸入:

  • connectedServiceName 是要使用的服務連線名稱。
  • 即使可能未使用其值,仍需要指定 location。 Azure 資源群組部署工作也可以為您建立資源群組,如果有的話,其必須知道要在其中建立資源群組的 Azure 區域。 在本課程模組中,您將指定 location 輸入值,但不會使用其值。
  • resourceGroupName 會指定應該部署 Bicep 檔案的目的地資源群組名稱。
  • overrideParameters 包含您想要在部署時傳遞至 Bicep 檔案內的任何參數值。

工作開始時,會使用服務連線登入 Azure。 在工作執行您指定的部署時,即已經通過驗證。 您不需要執行 az login

執行 Azure CLI 和 Azure PowerShell 命令

Azure Pipelines 中最實用的兩個內建工作是 Azure CLI 和 Azure PowerShell 工作。 您可以使用這些工作來執行一或多個 Azure CLI 或 PowerShell 命令。

在未來的 Microsoft Learn 課程模組中,您將了解 Azure CLI 命令能如何協助您從管線將部署程序的更多部分自動化。

變數

您的管線通常會包含您想要與 YAML 檔案分開的值。 例如,當將 Bicep 檔案部署至資源群組時,您需要指定資源群組的名稱。 當部署至不同的環境時,資源群組的名稱可能會不同。 而且,您可能需要提供參數給 Bicep 檔案,包括資料庫伺服器密碼等祕密。 這些值都不應該儲存在管線 YAML 檔案或 Git 存放庫的任何其他位置中。 為提高安全性並讓管線定義可重複使用,請改用「變數」

建立變數

您可以使用 Azure Pipelines Web 介面提供的編輯器,為管線建立變數:

顯示建立新變數的 Azure DevOps 螢幕擷取畫面。

您可將 Azure Pipelines 變數值設定為祕密。 當將變數值設定為祕密時,設定之後就無法檢視該值。 Azure Pipelines 的設計不會在管線記錄中顯示祕密值。

警告

Azure Pipelines 預設會模糊化管線記錄中的祕密變數值,而您也必須遵循良好的做法。 您的管線步驟可以存取所有變數值,包括祕密。 如果您的管線包含不能安全處理安全變數的步驟,此祕密變數即可能顯示在管線記錄中。

當使用者手動執行管線時,您可以讓使用者覆寫變數值。 使用者提供的值只會用於該特定的管線執行。 變數覆寫在測試管線時很實用。

在管線中使用變數

建立變數之後,您將使用特定的語法來參考管線 YAML 檔案中的變數:

- task: AzureResourceManagerTemplateDeployment@3
  inputs:
    connectedServiceName: $(ServiceConnectionName)
    location: $(DeploymentDefaultLocation)
    resourceGroupName: $(ResourceGroupName)
    csmFile: deploy/main.bicep
    overrideParameters: >
      -environmentType $(EnvironmentType)

管線定義檔案格式包含特殊的 $(VariableName) 語法。 不論變數是否為祕密,皆可使用此方法參考任何變數。

提示

在上述範例中,請注意,Bicep 檔案的名稱不會儲存在變數中。 就像 Bicep 參數一樣,您不需要為所有內容建立變數。 為可能隨環境而變更的任何內容以及任何祕密建立變數,是不錯的主意。 由於管線一律會使用相同的範本檔案,所以不需要為路徑建立變數。

系統變數

Azure Pipelines 也提供系統變數。 系統變數包含預先定義的資訊,可供您用於管線中。 以下是可用於管線中的一些系統變數:

  • Build.BuildNumber 是您管線執行的唯一識別碼。 儘管其名稱如此,Build.BuildNumber 值通常是字串,而不是數字。 您可以使用此變數為 Azure 部署命名,以便追蹤部署一路到觸發部署的特定管線執行。
  • Agent.BuildDirectory 是代理程式電腦檔案系統上,儲存您管線執行檔案的路徑。 這項資訊在您想要參考組建代理程式的檔案時相當實用。

在管線的 YAML 檔案中建立變數

除了使用 Azure Pipelines Web 介面建立變數之外,還可以在管線的 YAML 檔中設定變數值。 當您有並非祕密的值、可以儲存在存放庫中的值,以及想要將變數值儲存在檔案中的單一位置時,即可使用此選項,以在整個管線定義中進行參考。 您可以使用這種方法,在您的版本控制系統中追蹤變數的變更。

若要在 YAML 檔案中設定變數,請新增 variables 區段:

trigger: none

pool:
  vmImage: ubuntu-latest

variables:
  ServiceConnectionName: 'MyServiceConnection'
  EnvironmentType: 'Test'
  ResourceGroupName: 'MyResourceGroup'
  DeploymentDefaultLocation: 'westus3'

jobs:
- job:
  steps:
  - task: AzureResourceManagerTemplateDeployment@3
    inputs:
      connectedServiceName: $(ServiceConnectionName)
      location: $(DeploymentDefaultLocation)
      resourceGroupName: $(ResourceGroupName)
      csmFile: deploy/main.bicep
      overrideParameters: >
        -environmentType $(EnvironmentType)

此管線範例定義了四個變數:ServiceConnectionNameEnvironmentTypeResourceGroupNameDeploymentDefaultLocation

稍後在本課程模組中,您將了解能如何在一個管線中將定義於不同位置的變數混合在一起。