共用方式為


設定管線和推送更新

在本文中,您將瞭解如何使用 Azure 開發人員 CLI (azd) 透過 CI/CD 管線推送範本變更,例如 GitHub Actions 或 Azure DevOps。 在此範例中,您會在 Azure 範本上使用 React Web 應用程式搭配 Node.js API 和 MongoDB,但您可以將本文中學到的原則套用至任何 Azure 開發人員 CLI 範本

注意

命令 azd pipeline config 仍在 Beta 中。 在功能版本設定和發行策略頁面上深入瞭解 Alpha 和 Beta 功能支援

必要條件

azd 範本 不一定包含稱為的預設 GitHub Actions 和/或 Azure DevOps 管線組態檔 azure-dev.yml,這是設定 CI/CD 的必要專案。 此組態檔會布建您的 Azure 資源,並將程式代碼部署至 main 分支。 您可以找到 azure-dev.yml

  • 針對 GitHub Actions:.github/workflows 目錄中。
  • 針對 Azure DevOps:.azdo/pipelines 目錄中。

您可以依目前使用組態檔,或修改它以符合您的需求。

注意

在呼叫 azd pipeline config之前,請確定您的範本具有管線定義 (azure-dev.yaml)。 azd 不會自動建立此檔案。 請參閱 下方的 azd 建立管線定義。

azd pipeline config使用 命令來設定 CI/CD 管線,以處理下列工作:

  • 在 Azure 訂用帳戶上建立及設定應用程式的服務主體。 您的用戶必須在 Azure 訂用帳戶內具有 Owner 角色或 Contributor + User Access Administrator 角色,才能允許 azd 建立角色,並將角色指派給服務主體。
  • 逐步引導您完成工作流程,以建立和設定 GitHub 或 Azure DevOps 存放庫,並將專案程式代碼認可至該工作流程。 您也可以選擇使用現有的存放庫。
  • 建立 Azure 與存放庫之間的安全連線。
  • 當您簽入工作流程檔案時,請執行 GitHub 動作。

若要更細微地控制此程式,或如果用戶沒有必要的角色,您可以 手動設定管線

選取您慣用的管線提供者以繼續:

授權 GitHub 部署至 Azure

若要設定工作流程,您必須授權服務主體從 GitHub 動作代表您部署至 Azure。 azd 會為其建立服務主體和 同盟認證

  1. 執行下列命令以建立 Azure 服務主體並設定管線:

    azd pipeline config
    

    此命令會選擇性地建立 GitHub 存放庫,並將程式代碼推送至新的存放庫。

    注意

    根據預設,azd pipeline config會使用稱為同盟認證的 OpenID Connect (OIDC)。 如果您不想使用 OIDC,請執行 azd pipeline config --auth-type client-credentials

    Terraform 不支援 OIDC/同盟認證

    深入瞭解 中的 azdOIDC 支援。

  2. 提供要求的 GitHub 資訊。

  3. 當系統提示您認可和推送本機變更以啟動新的 GitHub Actions 執行時,請指定 y

  4. 在終端機視窗中,檢視命令的結果 azd pipeline config 。 此命令 azd pipeline config 會輸出專案的 GitHub 存放庫名稱。

  5. 使用瀏覽器,開啟專案的 GitHub 存放庫。

  6. 選取 [ 動作 ] 以查看工作流程正在執行。

    執行 GitHub 工作流程的螢幕快照。

進行和推送程式代碼變更

  1. 在項目的 /src/web/src/layout 目錄中,開啟 header.tsx

  2. 找出行 <Text variant="xLarge">ToDo</Text>

  3. 將常值 ToDo 變更為 myTodo

  4. 儲存檔案。

  5. 認可您的變更。 認可變更會啟動 GitHub Action 管線來部署更新。

    對測試檔案進行和認可變更所需的步驟螢幕快照。

  6. 使用瀏覽器,開啟專案的 GitHub 存放庫,以查看這兩者:

    • 您的認可
    • 正在設定的 GitHub Actions 認可。

    GitHub 中已認可變更的螢幕快照。

  7. 選取 [ 動作 ] 以查看工作流程中反映的測試更新。

    測試更新後執行的 GitHub 工作流程螢幕快照。

  8. 請流覽 Web 前端 URL 以檢查更新。

azd 作為 GitHub 動作

新增 azd 為 GitHub 動作。 此動作將會安裝 azd。 若要使用它,您可以將下列內容新增至 .github\workflows\azure-dev.yml

on: [push]

jobs:
   build:
      runs-on: ubuntu-latest
      steps:
         - name: Install azd
         uses: Azure/setup-azd@v0.1.0

清除資源

當您不再需要本文中建立的 Azure 資源時,請執行下列命令:

azd down

進階功能

您可以擴充 azd pipeline config 特定範本案例或需求的命令,如下列各節所述。

其他秘密或變數

根據預設, azd 設定管線的變數和秘密。 例如, azd pipeline config 命令會在 subscription id執行 時建立和 environment name region 作為管線變數。 然後管線定義會參考這些變數:

env:
   AZURE_CLIENT_ID: ${{ vars.AZURE_CLIENT_ID }}
   AZURE_TENANT_ID: ${{ vars.AZURE_TENANT_ID }}
   AZURE_SUBSCRIPTION_ID: ${{ vars.AZURE_SUBSCRIPTION_ID }}
   AZURE_ENV_NAME: ${{ vars.AZURE_ENV_NAME }}
   AZURE_LOCATION: ${{ vars.AZURE_LOCATION }}

當管線執行時, azd 從環境取得值,其會對應至變數和秘密。 視範本而定,可能會有您可以使用環境變數來控制的設定。 例如,可以設定名為 KEY_VAULT_NAME 的環境變數,以定義範本基礎結構內 金鑰保存庫 資源的名稱。 在這種情況下,範本可以使用 來定義 azure.yaml變數和秘密的清單。 例如,請考慮下列 azure.yaml 組態:

pipeline:
  variables:
    - KEY_VAULT_NAME
    - STORAGE_NAME
  secrets:
    - CONNECTION_STRING

使用此組態時, azd 檢查環境中是否有任何變數或秘密具有非空白值。 azd 然後,使用組態中的索引鍵名稱做為變數或秘密,以及來自環境的非字串值,建立管線的變數或秘密。

azure-dev.yaml然後管線定義可以參考變數或秘密:

- name: Provision Infrastructure
   run: azd provision --no-prompt
   env:
      KEY_VAULT_NAME: ${{ variables.KEY_VAULT_NAME }}
      STORAGE_NAME: ${{ variables.STORAGE_NAME }}
      CONNECTION_STRING: ${{ secrets.CONNECTION_STRING }}

注意

您必須在 中更新秘密azure.yaml或變數清單之後執行azd pipeline config,azd 才能重設管線值。

基礎結構參數

請考慮下列 bicep 範例:

@secure()
param BlobStorageConnection string

參數 BlobStorageConnection 未設定預設值,因此 azd 會提示使用者輸入值。 不過,CI/CD 期間沒有互動式提示。 azd 當您執行 azd pipeline config時,必須要求 參數的值、將值儲存在管線中,然後在管線執行時再次擷取值。

azd 會使用稱為 AZD_INITIAL_ENVIRONMENT_CONFIG 的管線秘密,自動儲存並設定管線中所有必要參數的值。 您只需要在管線中參考此秘密:

- name: Provision Infrastructure
   run: azd provision --no-prompt
   env:
      AZD_INITIAL_ENVIRONMENT_CONFIG: ${{ secrets.AZD_INITIAL_ENVIRONMENT_CONFIG }}

當管線執行時, azd 會從秘密取得參數的值,以移除互動式提示的需求。

注意

如果您新增參數,則必須重新執行 azd pipeline config

建立管線定義

azd如果您的範本還沒有 CI/CD 管線定義檔案,您可以自行建立一個檔案。 CI/CD 管線定義通常有 4 個主要區段:

  • 觸發程序 (trigger)
  • 權限
  • 操作系統或集區
  • 要執行的步驟

下列範例示範如何建立 GitHub Actions 和 Azure Pipelines 的定義檔和相關組態。

在 GitHub Actions 中執行 azd 需要下列設定:

您可以使用下列樣本作為您自己的管線定義的起點:

on:
  workflow_dispatch:
  push:
    # Run when commits are pushed to mainline branch (main or master)
    # Set this to the mainline branch you are using
    branches:
      - main
      - master

# Set this permission if you are using a Federated Credential.
permissions:
  id-token: write
  contents: read

jobs:
  build:
    runs-on: ubuntu-latest
    # azd build-in variables.
    # This variables are always set by `azd pipeline config`
    # You can set them as global env (apply to all steps) or you can add them to individual steps' environment
    env:
      AZURE_CLIENT_ID: ${{ vars.AZURE_CLIENT_ID }}
      AZURE_TENANT_ID: ${{ vars.AZURE_TENANT_ID }}
      AZURE_SUBSCRIPTION_ID: ${{ vars.AZURE_SUBSCRIPTION_ID }}
      AZURE_ENV_NAME: ${{ vars.AZURE_ENV_NAME }}
      AZURE_LOCATION: ${{ vars.AZURE_LOCATION }}
      ## Define the additional variables or secrets that are required globally (provision and deploy)
      # ADDITIONAL_VARIABLE_PLACEHOLDER: ${{ variables.ADDITIONAL_VARIABLE_PLACEHOLDER }}
      # ADDITIONAL_SECRET_PLACEHOLDER: ${{ secrets.ADDITIONAL_SECRET_PLACEHOLDER }}      
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      # using the install-azd action
      - name: Install azd
        uses: Azure/setup-azd@v1.0.0

      # # If you want to use azd-daily build, or install it from a PR, you can remove previous step and
      # # use the next one:
      # - name: Install azd - daily or from PR
      #  # Update this scrip based on the OS - pool of your pipeline. This example is for a linux pipeline installing daily build
      #  run: curl -fsSL https://aka.ms/install-azd.sh | bash -s -- --version daily
      #  shell: pwsh

      # azd set up Federated Credential by default. You can remove this step if you are using Client Credentials
      - name: Log in with Azure (Federated Credentials)
        if: ${{ env.AZURE_CLIENT_ID != '' }}
        run: |
          azd auth login `
            --client-id "$Env:AZURE_CLIENT_ID" `
            --federated-credential-provider "github" `
            --tenant-id "$Env:AZURE_TENANT_ID"
        shell: pwsh

      ## If you set up your pipeline with Client Credentials, remove previous step and uncomment this one
      # - name: Log in with Azure (Client Credentials)
      #   if: ${{ env.AZURE_CREDENTIALS != '' }}
      #   run: |
      #     $info = $Env:AZURE_CREDENTIALS | ConvertFrom-Json -AsHashtable;
      #     Write-Host "::add-mask::$($info.clientSecret)"

      #     azd auth login `
      #       --client-id "$($info.clientId)" `
      #       --client-secret "$($info.clientSecret)" `
      #       --tenant-id "$($info.tenantId)"
      #   shell: pwsh
      #   env:
      #     AZURE_CREDENTIALS: ${{ secrets.AZURE_CREDENTIALS }}

      - name: Provision Infrastructure
        run: azd provision --no-prompt
        env:
         #  # uncomment this if you are using infrastructure parameters
         #  AZD_INITIAL_ENVIRONMENT_CONFIG: ${{ secrets.AZD_INITIAL_ENVIRONMENT_CONFIG }}
         ## Define the additional variables or secrets that are required only for provision 
         #  ADDITIONAL_VARIABLE_PLACEHOLDER: ${{ variables.ADDITIONAL_VARIABLE_PLACEHOLDER }}
         #  ADDITIONAL_SECRET_PLACEHOLDER: ${{ secrets.ADDITIONAL_SECRET_PLACEHOLDER }}

      - name: Deploy Application
        run: azd deploy --no-prompt
        env:
         ## Define the additional variables or secrets that are required only for deploy
         #  ADDITIONAL_VARIABLE_PLACEHOLDER: ${{ variables.ADDITIONAL_VARIABLE_PLACEHOLDER }}
         #  ADDITIONAL_SECRET_PLACEHOLDER: ${{ secrets.ADDITIONAL_SECRET_PLACEHOLDER }}