Použití CI/CD azure Spring Apps s GitHub Actions

Poznámka:

Azure Spring Apps je nový název služby Azure Spring Cloud. Přestože má služba nový název, na některých místech uvidíte starý název, protože pracujeme na aktualizaci prostředků, jako jsou snímky obrazovky, videa a diagramy.

Tento článek se vztahuje na: ✔️ Basic/Standard ✔️ Enterprise

V tomto článku se dozvíte, jak vytvořit pracovní postup CI/CD pro Azure Spring Apps pomocí GitHub Actions.

GitHub Actions podporuje pracovní postup automatizovaného životního cyklu vývoje softwaru. Pomocí GitHub Actions pro Azure Spring Apps můžete v úložišti vytvářet pracovní postupy pro sestavování, testování, balení, vydávání a nasazování do Azure.

Požadavky

Tento příklad vyžaduje Azure CLI.

Nastavení úložiště GitHub a ověření

K autorizaci akce přihlášení k Azure potřebujete přihlašovací údaje instančního objektu Azure. Pokud chcete získat přihlašovací údaje Azure, spusťte na místním počítači následující příkazy:

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

Pokud chcete získat přístup ke konkrétní skupině prostředků, můžete omezit rozsah:

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

Příkaz by měl vypíše objekt JSON:

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

Tento příklad používá ukázku steeltoe na GitHubu. Vytvořte fork úložiště, otevřete stránku úložiště GitHubu pro fork a vyberte kartu Nastavení. Otevřete nabídku Tajné kódy a vyberte Nový tajný kód:

Screenshot of the GitHub Actions secrets and variables page with the New repository secret button highlighted.

Nastavte název tajného kódu na AZURE_CREDENTIALS řetězec JSON a jeho hodnotu na řetězec JSON, který jste našli pod nadpisem Nastavení úložiště GitHub a ověření.

Screenshot of the GitHub Actions secrets / New secret page.

Přihlašovací údaje Azure můžete získat také ze služby Key Vault v GitHub Actions, jak je vysvětleno v části Ověřování Azure Spring ve službě Key Vault v GitHub Actions.

Zřízení instance služby

Pokud chcete zřídit instanci služby Azure Spring Apps, spusťte pomocí Azure CLI následující příkazy.

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

Sestavení pracovního postupu

Pracovní postup je definován pomocí následujících možností.

Příprava na nasazení pomocí Azure CLI

az spring app create Příkaz aktuálně není idempotentní. Jakmile ho spustíte jednou, zobrazí se chyba, pokud znovu spustíte stejný příkaz. Tento pracovní postup doporučujeme pro existující aplikace a instance Azure Spring Apps.

K přípravě použijte následující příkazy 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

Přímé nasazení pomocí Azure CLI

V úložišti vytvořte soubor .github/workflows/main.yml s následujícím obsahem. Nahraďte <název> skupiny prostředků a <název> služby správnými hodnotami.

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 }}

Nastavení úložiště GitHub a ověření

K autorizaci akce přihlášení k Azure potřebujete přihlašovací údaje instančního objektu Azure. Pokud chcete získat přihlašovací údaje Azure, spusťte na místním počítači následující příkazy:

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

Pokud chcete získat přístup ke konkrétní skupině prostředků, můžete omezit rozsah:

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

Příkaz by měl vypíše objekt JSON:

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

Tento příklad používá ukázku PiggyMetrics na GitHubu. Vytvořte fork ukázky, zrušte zaškrtnutí políčka Kopírovat jenom větev Azure, otevřete stránku úložiště GitHub a vyberte kartu Nastavení. Otevřete nabídku Tajné kódy a vyberte Přidat nový tajný kód:

Screenshot of the GitHub Actions secrets and variables page with the New repository secret button highlighted.

Nastavte název tajného kódu na AZURE_CREDENTIALS řetězec JSON a jeho hodnotu na řetězec JSON, který jste našli pod nadpisem Nastavení úložiště GitHub a ověření.

Screenshot of the GitHub Actions secrets / New secret page.

Přihlašovací údaje Azure můžete získat také ze služby Key Vault v GitHub Actions, jak je vysvětleno v části Ověřování Azure Spring ve službě Key Vault v GitHub Actions.

Zřízení instance služby

Pokud chcete zřídit instanci služby Azure Spring Apps, spusťte pomocí Azure CLI následující příkazy.

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

Kompletní ukázkové pracovní postupy

Následující příklady ukazují běžné scénáře použití.

Nasazování

Následující části ukazují různé možnosti nasazení aplikace.

Do produkčního prostředí

Azure Spring Apps podporuje nasazení do nasazení s sestavenými artefakty (například JAR nebo .NET Core ZIP) nebo archivem zdrojového kódu.

Následující příklad se nasadí do výchozího produkčního nasazení v Azure Spring Apps pomocí souboru JAR vytvořeného mavenem. Tento příklad je jediným možným scénářem nasazení při použití skladové položky Basic:

Poznámka:

Vzor vyhledávání balíčků by měl vracet pouze jeden balíček. Pokud úloha sestavení vytváří více balíčků JAR, jako jsou sources.jar a javadoc.jar, je potřeba upřesnit vzor hledání tak, aby odpovídal pouze binárnímu artefaktu aplikace.

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

Následující příklad se nasadí do výchozího produkčního nasazení v Azure Spring Apps pomocí zdrojového kódu.

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 }}

Následující příklad se nasadí do výchozího produkčního nasazení v Azure Spring Apps pomocí zdrojového kódu v plánu Enterprise. Pomocí této možnosti můžete určit, který tvůrce se má použít pro akce builder nasazení.

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>

Následující příklad se nasadí do výchozího produkčního nasazení v Azure Spring Apps s existující imagí kontejneru.

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>

Během nasazování můžete dosáhnout více funkcí pomocí více argumentů. Další informace najdete v části Argumenty akce GitHubu pro nasazení do Azure Spring Apps.

Modrá-zelená

Následující příklady se nasadí do existujícího přípravného nasazení. Toto nasazení nepřijímá produkční provoz, dokud se nenastaví jako produkční nasazení. Můžete nastavit hodnotu true přípravného nasazení, abyste našli přípravné nasazení automaticky nebo pouze přidělte konkrétní název nasazení. Zaměříme se jenom na spring-apps-deploy akci a ve zbytku článku vynecháme přípravné úlohy.

# 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

Další informace o nasazeních s modrou zelenou barvou, včetně alternativního přístupu, najdete v tématu Strategie nasazení s modrou zelenou barvou.

Nastavení produkčního nasazení

Následující příklad nastaví aktuální přípravné nasazení jako produkční a efektivně prohodí, které nasazení přijímá produkční provoz.

# 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

Odstranění přípravného nasazení

Akce Delete Staging Deployment umožňuje odstranit nasazení, které nepřijímají produkční provoz. Toto odstranění uvolní prostředky používané tímto nasazením a vytvoří místo pro nové přípravné nasazení:

# 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>

Vytvoření nebo aktualizace sestavení (jenom plán Enterprise)

Následující příklad vytvoří nebo aktualizuje prostředek sestavení v plánu 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>

Odstranění sestavení (jenom plán Enterprise)

Následující příklad odstraní prostředek sestavení v plánu 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>

Nasazení s využitím modulu plug-in Maven

Další možností je použít modul plug-in Maven pro nasazení souboru Jar a aktualizaci nastavení aplikace. mvn azure-spring-apps:deploy Příkaz je idempotentní a v případě potřeby automaticky vytvoří aplikace. Nemusíte předem vytvářet odpovídající aplikace.

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

Spuštění pracovního postupu

Akce GitHub Actions by se měly povolit automaticky po nasdílení .githubu, pracovního postupu nebo main.yml do GitHubu. Akce se aktivuje, když nasdílíte nové potvrzení. Pokud tento soubor vytvoříte v prohlížeči, vaše akce by už měla být spuštěná.

Pokud chcete ověřit, že je akce povolená, vyberte kartu Akce na stránce úložiště GitHub:

Screenshot of the GitHub Actions tab showing the All workflows section.

Pokud se vaše akce spustí omylem, například pokud jste nenastavili přihlašovací údaje Azure, můžete po opravě chyby znovu spustit kontroly. Na stránce úložiště GitHub vyberte Akce, vyberte konkrétní úlohu pracovního postupu a pak vyberte tlačítko Znovu spustit kontroly a spusťte kontroly znovu:

Screenshot of the GitHub Actions tab with the Re-run checks button highlighted.

Další kroky