分享方式:


搭配 GitHub Actions 使用 Azure Spring Apps CI/CD

注意

基本標準和企業方案將從 2025 年 3 月中旬開始淘汰,並停用 3 年。 建議您轉換至 Azure Container Apps。 如需詳細資訊,請參閱 Azure Spring Apps 淘汰公告

標準 耗用量和專用 方案將從 2024 年 9 月 30 日起淘汰,並在六個月後完成關閉。 建議您轉換至 Azure Container Apps。 如需詳細資訊,請參閱 將 Azure Spring Apps 標準取用和專用方案遷移至 Azure Container Apps

本文適用於: ✔️ 基本/標準 ✔️ 企業

本文說明如何使用 GitHub Actions 建置 Azure Spring Apps 的 CI/CD 工作流程。

GitHub Actions 支援自動化軟體開發生命週期工作流程。 使用適用於 Azure Spring Apps 的 GitHub Actions,您可以在存放庫中建立工作流程,以建置、測試、封裝、發行和部署至 Azure。

必要條件

此範例需要 Azure CLI

設定 GitHub 存放庫並驗證

您需要 Azure 服務主體認證,才能授權 Azure 登入動作。 若要取得 Azure 認證,請在本機電腦上執行下列命令:

az login
az ad sp create-for-rbac \
    --role contributor \
    --scopes /subscriptions/<SUBSCRIPTION_ID> \
    --json-auth

若要存取特定資源群組,您可以減少範圍:

az ad sp create-for-rbac \
    --role contributor \
    --scopes /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP> \
    --json-auth

這個指令應該會輸出 JSON 物件:

{
    "clientId": "<GUID>",
    "clientSecret": "<GUID>",
    "subscriptionId": "<GUID>",
    "tenantId": "<GUID>",
    ...
}

此範例使用 GitHub 上的 steeltoe 範例。 分支存放庫,開啟分支的 GitHub 存放庫頁面,然後選取 [設定] 索引卷標。開啟 [秘密] 功能表,然後選取 [新增秘密]:

GitHub Actions 秘密和變數頁面的螢幕快照,其中已醒目提示 [新增存放庫秘密] 按鈕。

將秘密名稱設定為 AZURE_CREDENTIALS ,並將其值設定為您在設定 GitHub 存放庫並驗證標題底下找到的 JSON 字串。

GitHub Actions 秘密 /新增秘密頁面的螢幕快照。

您也可以從 GitHub Actions 中的 金鑰保存庫 取得 Azure 登入認證,如使用 GitHub Actions 中的 金鑰保存庫 驗證 Azure Spring 中所述

布建服務實例

若要布建 Azure Spring Apps 服務實例,請使用 Azure CLI 執行下列命令。

az extension add --name spring
az group create \
    --name <resource-group-name> \
    --location eastus
az spring create \
    --resource-group <resource-group-name> \
    --name <service-instance-name>
az spring config-server git set \
    --name <service-instance-name> \
    --uri https://github.com/Azure-Samples/azure-spring-apps-samples \
    --label main \
    --search-paths steeltoe-sample/config

建置工作流程

工作流程是使用下列選項來定義。

準備使用 Azure CLI 進行部署

命令 az spring app create 目前不是等冪的。 執行一次之後,如果您再次執行相同的命令,就會收到錯誤。 我們建議在現有的 Azure Spring Apps 應用程式和實例上使用此工作流程。

使用下列 Azure CLI 命令來準備:

az config set defaults.group=<service-group-name>
az config set defaults.spring=<service-instance-name>
az spring app create --name planet-weather-provider
az spring app create --name solar-system-weather

直接使用 Azure CLI 進行部署

使用下列內容,在存放庫中建立 .github/workflows/main.yml 檔案。 以正確的值取代資源組名>和服務<名稱>。<

name: Steeltoe-CD

# Controls when the action runs. Triggers the workflow on push or pull request
# events but only for the main branch
on:
  push:
    branches: [ main]

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job runs on
    runs-on: ubuntu-latest
    env:
      working-directory: ./steeltoe-sample
      resource-group-name: <your resource group name>
      service-name: <your service name>

    # Supported .NET Core version matrix.
    strategy:
      matrix:
        dotnet: [ '3.1.x' ]

    # Steps represent a sequence of tasks that is executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v2

      # Set up .NET Core 3.1 SDK
      - uses: actions/setup-dotnet@v1
        with:
          dotnet-version: ${{ matrix.dotnet }}

      # Set credential for az login
      - uses: azure/login@v1.1
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}

      - name: install Azure CLI extension
        run: |
          az extension add --name spring --yes

      - name: Build and package planet-weather-provider app
        working-directory: ${{env.working-directory}}/src/planet-weather-provider
        run: |
          dotnet publish
          az spring app deploy -n planet-weather-provider --runtime-version NetCore_31 --main-entry Microsoft.Azure.SpringCloud.Sample.PlanetWeatherProvider.dll --artifact-path ./publish-deploy-planet.zip -s ${{ env.service-name }} -g ${{ env.resource-group-name }}
      - name: Build solar-system-weather app
        working-directory: ${{env.working-directory}}/src/solar-system-weather
        run: |
          dotnet publish
          az spring app deploy -n solar-system-weather --runtime-version NetCore_31 --main-entry Microsoft.Azure.SpringCloud.Sample.SolarSystemWeather.dll --artifact-path ./publish-deploy-solar.zip -s ${{ env.service-name }} -g ${{ env.resource-group-name }}

設定 GitHub 存放庫並驗證

您需要 Azure 服務主體認證,才能授權 Azure 登入動作。 若要取得 Azure 認證,請在本機電腦上執行下列命令:

az login
az ad sp create-for-rbac \
    --role contributor \
    --scopes /subscriptions/<SUBSCRIPTION_ID> \
    --json-auth

若要存取特定資源群組,您可以減少範圍:

az ad sp create-for-rbac \
    --role contributor \
    --scopes /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP> \
    --json-auth

這個指令應該會輸出 JSON 物件:

{
    "clientId": "<GUID>",
    "clientSecret": "<GUID>",
    "subscriptionId": "<GUID>",
    "tenantId": "<GUID>",
    ...
}

此範例使用 GitHub 上的 PiggyMetrics 範例。 分叉範例,取消核取 [僅複製 Azure 分支],開啟 [GitHub 存放庫] 頁面,然後選取 [設定] 索引卷標。開啟 [秘密] 功能表,然後選取 [新增秘密]:

GitHub Actions 秘密和變數頁面的螢幕快照,其中已醒目提示 [新增存放庫秘密] 按鈕。

將秘密名稱設定為 AZURE_CREDENTIALS ,並將其值設定為您在設定 GitHub 存放庫並驗證標題底下找到的 JSON 字串。

GitHub Actions 秘密 /新增秘密頁面的螢幕快照。

您也可以從 GitHub Actions 中的 金鑰保存庫 取得 Azure 登入認證,如使用 GitHub Actions 中的 金鑰保存庫 驗證 Azure Spring 中所述

布建服務實例

若要布建 Azure Spring Apps 服務實例,請使用 Azure CLI 執行下列命令。

az extension add --name spring
az group create --location eastus --name <resource group name>
az spring create -n <service instance name> -g <resource group name>
az spring config-server git set -n <service instance name> --uri https://github.com/xxx/piggymetrics --label config

端對端範例工作流程

下列範例示範常見的使用案例。

部署

下列各節說明部署應用程式的各種選項。

生產環境

Azure Spring Apps 支援部署至具有建置成品的部署(例如 JAR 或 .NET Core ZIP)或原始程式碼封存。

下列範例會使用 Maven 所建置的 JAR 檔案,部署至 Azure Spring Apps 中的預設生產部署。 此範例是使用基本 SKU 時唯一可能的部署案例:

注意

套件搜尋模式應該只傳回一個套件。 如果建置工作產生多個 JAR 套件,例如 sources.jarjavadoc.jar,您需要精簡搜尋模式,使其只符合應用程式二進位成品。

name: AzureSpringApps
on: push
env:
  ASC_PACKAGE_PATH: ${{ github.workspace }}
  AZURE_SUBSCRIPTION: <azure subscription name>

jobs:
  deploy_to_production:
    runs-on: ubuntu-latest
    name: deploy to production with artifact
    steps:
      - name: Checkout GitHub Action
        uses: actions/checkout@v2

      - name: Set up Java 11
        uses: actions/setup-java@v3
        with:
          distribution: 'temurin'
          java-version: '11'

      - name: maven build, clean
        run: |
          mvn clean package

      - name: Login via Azure CLI
        uses: azure/login@v1
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}

      - name: deploy to production with artifact
        uses: azure/spring-apps-deploy@v1
        with:
          azure-subscription: ${{ env.AZURE_SUBSCRIPTION }}
          action: Deploy
          service-name: <service instance name>
          app-name: <app name>
          use-staging-deployment: false
          package: ${{ env.ASC_PACKAGE_PATH }}/**/*.jar

下列範例會使用原始程式碼部署至 Azure Spring Apps 中的預設生產環境部署。

name: AzureSpringApps
on: push
env:
  ASC_PACKAGE_PATH: ${{ github.workspace }}
  AZURE_SUBSCRIPTION: <azure subscription name>

jobs:
  deploy_to_production:
    runs-on: ubuntu-latest
    name: deploy to production with source code
    steps:
      - name: Checkout GitHub Action
        uses: actions/checkout@v2

      - name: Login via Azure CLI
        uses: azure/login@v1
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}

      - name: deploy to production step with source code
        uses: azure/spring-apps-deploy@v1
        with:
          azure-subscription: ${{ env.AZURE_SUBSCRIPTION }}
          action: deploy
          service-name: <service instance name>
          app-name: <app name>
          use-staging-deployment: false
          package: ${{ env.ASC_PACKAGE_PATH }}

下列範例會使用企業方案中的原始程式碼,部署至 Azure Spring Apps 中的預設生產環境部署。 您可以使用 選項指定要用於部署動作的 builder 產生器。

name: AzureSpringApps
on: push
env:
  ASC_PACKAGE_PATH: ${{ github.workspace }}
  AZURE_SUBSCRIPTION: <azure subscription name>

jobs:
  deploy_to_production:
    runs-on: ubuntu-latest
    name: deploy to production with source code
    steps:
      - name: Checkout GitHub Action
        uses: actions/checkout@v2

      - name: Login via Azure CLI
        uses: azure/login@v1
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}

      - name: deploy to production step with source code in the Enterprise plan
        uses: azure/spring-apps-deploy@v1
        with:
          azure-subscription: ${{ env.AZURE_SUBSCRIPTION }}
          action: deploy
          service-name: <service instance name>
          app-name: <app name>
          use-staging-deployment: false
          package: ${{ env.ASC_PACKAGE_PATH }}
          builder: <builder>

下列範例會使用現有的容器映射,部署到 Azure Spring Apps 中的默認生產環境部署。

name: AzureSpringApps
on: push
env:
  ASC_PACKAGE_PATH: ${{ github.workspace }}
  AZURE_SUBSCRIPTION: <azure subscription name>

jobs:
  deploy_to_production:
    runs-on: ubuntu-latest
    name: deploy to production with source code
    steps:
      - name: Checkout GitHub Action
        uses: actions/checkout@v2

      - name: Login via Azure CLI
        uses: azure/login@v1
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}

      - name: Deploy Custom Image
        uses: Azure/spring-apps-deploy@v1
        with:
          azure-subscription: ${{ env.AZURE_SUBSCRIPTION }}
          action: deploy
          service-name: <service instance name>
          app-name: <app name>
          deployment-name: <deployment name>
          container-registry: <your container image registry>
          registry-username: ${{ env.REGISTRY_USERNAME }}
          registry-password: ${{ secrets.REGISTRY_PASSWORD }}
          container-image: <your image tag>

在部署期間,您可以使用更多自變數來達成更多功能。 如需詳細資訊,請參閱 GitHub Action 的自變數一節,以部署至 Azure Spring Apps。

藍綠

下列範例會部署到現有的預備部署。 此部署在設定為生產環境部署之前,不會收到生產流量。 您可以設定 use-staging-deployment true,以自動尋找預備部署,或只配置特定的部署名稱。 我們只關注行動, spring-apps-deploy 排除文章其餘部分的準備工作。

# environment preparation configurations omitted
    steps:
      - name: blue green deploy step use-staging-deployment
        uses: azure/spring-apps-deploy@v1
        with:
          azure-subscription: ${{ env.AZURE_SUBSCRIPTION }}
          action: deploy
          service-name: <service instance name>
          app-name: <app name>
          use-staging-deployment: true
          package: ${{ env.ASC_PACKAGE_PATH }}/**/*.jar
# environment preparation configurations omitted
    steps:
      - name: blue green deploy step with deployment-name
        uses: azure/spring-apps-deploy@v1
        with:
          azure-subscription: ${{ env.AZURE_SUBSCRIPTION }}
          action: deploy
          service-name: <service instance name>
          app-name: <app name>
          deployment-name: staging
          package: ${{ env.ASC_PACKAGE_PATH }}/**/*.jar

如需藍綠部署的詳細資訊,包括替代方法,請參閱 藍綠部署策略

設定生產環境部署

下列範例會將目前的預備部署設定為生產環境,有效地交換哪些部署會接收生產流量。

# environment preparation configurations omitted
    steps:
      - name: set production deployment step
        uses: azure/spring-apps-deploy@v1
        with:
          azure-subscription: ${{ env.AZURE_SUBSCRIPTION }}
          action: set-production
          service-name: <service instance name>
          app-name: <app name>
          use-staging-deployment: true

刪除預備部署

動作 Delete Staging Deployment 可讓您刪除未接收生產流量的部署。 此刪除可釋出該部署所使用的資源,並騰出空間進行新的預備部署:

# environment preparation configurations omitted
    steps:
      - name: Delete staging deployment step
        uses: azure/spring-apps-deploy@v1
        with:
          azure-subscription: ${{ env.AZURE_SUBSCRIPTION }}
          action: delete-staging-deployment
          service-name: <service instance name>
          app-name: <app name>

建立或更新組建 (僅限企業方案)

下列範例會在 Enterprise 方案中建立或更新組建資源:

# environment preparation configurations omitted
    steps:
      - name: Create or update build
        uses: azure/spring-apps-deploy@v1
        with:
          azure-subscription: ${{ env.AZURE_SUBSCRIPTION }}
          action: build
          service-name: <service instance name>
          build-name: <build name>
          package: ${{ env.ASC_PACKAGE_PATH }}
          builder: <builder>

移除組建 (只限企業方案)

下列範例會刪除 Enterprise 方案中的組建資源:

# environment preparation configurations omitted
    steps:
      - name: Delete build
        uses: azure/spring-apps-deploy@v1
        with:
          azure-subscription: ${{ env.AZURE_SUBSCRIPTION }}
          action: delete-build
          service-name: <service instance name>
          build-name: <build name>

使用 Maven 外掛程式進行部署

另一個選項是使用 Maven 外掛程式 來部署 Jar 和更新應用程式設定。 此命令 mvn azure-spring-apps:deploy 是等冪的,並視需要自動建立應用程式。 您不需要事先建立對應的應用程式。

name: AzureSpringApps
on: push

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:

    - uses: actions/checkout@main

    - name: Set up Java 11
      uses: actions/setup-java@v3
      with:
        distribution: 'temurin'
        java-version: '11'

    - name: maven build, clean
      run: |
        mvn clean package -DskipTests

    # Maven plugin can cosume this authentication method automatically
    - name: Azure Login
      uses: azure/login@v1
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}

    # Maven deploy, make sure you have correct configurations in your pom.xml
    - name: deploy to Azure Spring Apps using Maven
      run: |
        mvn azure-spring-apps:deploy

執行工作流程

當您將 .github/workflow/main.yml推送至 GitHub 之後,應該會自動啟用 GitHub Actions。 當您推送新的認可時,就會觸發動作。 如果您在瀏覽器中建立此檔案,您的動作應該已經執行。

若要確認動作已啟用,請選取 GitHub 存放庫頁面上的 [動作] 索引標籤:

[GitHub Actions] 索引標籤的螢幕快照,其中顯示 [所有工作流程] 區段。

例如,如果您的動作發生錯誤,例如,如果您尚未設定 Azure 認證,您可以在修正錯誤之後重新執行檢查。 在 [GitHub 存放庫] 頁面上,選取 [動作],選取特定的工作流程工作,然後選取 [重新執行檢查 ] 按鈕以重新執行檢查:

[GitHub Actions] 索引標籤的螢幕快照,其中已醒目提示 [重新執行檢查] 按鈕。

下一步