Använda Azure Spring Apps CI/CD med GitHub Actions

Kommentar

Azure Spring Apps är det nya namnet på Azure Spring Cloud-tjänsten. Även om tjänsten har ett nytt namn ser du det gamla namnet på vissa platser ett tag medan vi arbetar med att uppdatera tillgångar som skärmbilder, videor och diagram.

Den här artikeln gäller för: ✔️ Basic/Standard ✔️ Enterprise

Den här artikeln visar hur du skapar ett CI/CD-arbetsflöde för Azure Spring Apps med GitHub Actions.

GitHub Actions stöder ett arbetsflöde för automatiserad programvaruutvecklingslivscykel. Med GitHub Actions för Azure Spring Apps kan du skapa arbetsflöden på lagringsplatsen för att skapa, testa, paketera, släppa och distribuera till Azure.

Förutsättningar

Det här exemplet kräver Azure CLI.

Konfigurera GitHub-lagringsplats och autentisera

Du behöver en autentiseringsuppgift för Azure-tjänstens huvudnamn för att auktorisera Azure-inloggningsåtgärden. Kör följande kommandon på den lokala datorn för att hämta en Azure-autentiseringsuppgift:

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

Om du vill få åtkomst till en specifik resursgrupp kan du minska omfånget:

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

Kommandot ska mata ut ett JSON-objekt:

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

I det här exemplet används steeltoe-exemplet på GitHub. Förgrena lagringsplatsen, öppna GitHub-lagringsplatsens sida för förgreningen och välj fliken Inställningar. Öppna menyn Hemligheter och välj Ny hemlighet:

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

Ange det hemliga namnet till AZURE_CREDENTIALS och dess värde till den JSON-sträng som du hittade under rubriken Konfigurera din GitHub-lagringsplats och autentisera.

Screenshot of the GitHub Actions secrets / New secret page.

Du kan också hämta autentiseringsuppgifterna för Azure-inloggning från Key Vault i GitHub Actions enligt beskrivningen i Autentisera Azure Spring med Key Vault i GitHub Actions.

Etablera tjänstinstans

Om du vill etablera din Azure Spring Apps-tjänstinstans kör du följande kommandon med hjälp av 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

Skapa arbetsflödet

Arbetsflödet definieras med hjälp av följande alternativ.

Förbereda för distribution med Azure CLI

Kommandot az spring app create är för närvarande inte idempotent. När du har kört den en gång får du ett felmeddelande om du kör samma kommando igen. Vi rekommenderar det här arbetsflödet för befintliga Azure Spring Apps-appar och -instanser.

Använd följande Azure CLI-kommandon för förberedelse:

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

Distribuera med Azure CLI direkt

Skapa .github/workflows/main.yml-filen på lagringsplatsen med följande innehåll. Ersätt <resursgruppens namn> och <tjänstnamn> med rätt värden.

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

Konfigurera GitHub-lagringsplats och autentisera

Du behöver en autentiseringsuppgift för Azure-tjänstens huvudnamn för att auktorisera Azure-inloggningsåtgärden. Kör följande kommandon på den lokala datorn för att hämta en Azure-autentiseringsuppgift:

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

Om du vill få åtkomst till en specifik resursgrupp kan du minska omfånget:

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

Kommandot ska mata ut ett JSON-objekt:

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

I det här exemplet används PiggyMetrics-exemplet på GitHub. Förgrena exemplet, avmarkera Kopiera endast Azure-grenen, öppna GitHub-lagringsplatsen och välj fliken Inställningar. Öppna menyn Hemligheter och välj Lägg till en ny hemlighet:

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

Ange det hemliga namnet till AZURE_CREDENTIALS och dess värde till den JSON-sträng som du hittade under rubriken Konfigurera din GitHub-lagringsplats och autentisera.

Screenshot of the GitHub Actions secrets / New secret page.

Du kan också hämta autentiseringsuppgifterna för Azure-inloggning från Key Vault i GitHub Actions enligt beskrivningen i Autentisera Azure Spring med Key Vault i GitHub Actions.

Etablera tjänstinstans

Om du vill etablera din Azure Spring Apps-tjänstinstans kör du följande kommandon med hjälp av 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

Exempelarbetsflöden från slutpunkt till slutpunkt

I följande exempel visas vanliga användningsscenarier.

Distribuera

I följande avsnitt visas olika alternativ för att distribuera din app.

Till produktion

Azure Spring Apps stöder distribution till distributioner med byggda artefakter (till exempel JAR eller .NET Core ZIP) eller källkodsarkiv.

I följande exempel distribueras till standardproduktionsdistributionen i Azure Spring Apps med hjälp av JAR-filen som skapats av Maven. Det här exemplet är det enda möjliga distributionsscenariot när du använder Basic SKU:

Kommentar

Mönstret för paketsökning bör bara returnera exakt ett paket. Om byggaktiviteten genererar flera JAR-paket, till exempel sources.jar och javadoc.jar, måste du förfina sökmönstret så att det endast matchar programmets binära artefakt.

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

I följande exempel distribueras till standardproduktionsdistributionen i Azure Spring Apps med källkod.

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

I följande exempel distribueras till standardproduktionsdistributionen i Azure Spring Apps med källkod i Enterprise-planen. Du kan ange vilken byggare som ska användas för att distribuera åtgärder med hjälp av builder alternativet .

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>

I följande exempel distribueras till standardproduktionsdistributionen i Azure Spring Apps med en befintlig containeravbildning.

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>

Under distributionen kan du få fler funktioner med hjälp av fler argument. Mer information finns i avsnittet Argument i GitHub Action för distribution till Azure Spring Apps.

Blågrön

Följande exempel distribueras till en befintlig mellanlagringsdistribution. Den här distributionen tar inte emot produktionstrafik förrän den har angetts som en produktionsdistribution. Du kan ange use-staging-deployment true för att hitta mellanlagringsdistributionen automatiskt eller bara allokera ett specifikt distributionsnamn. Vi fokuserar bara på spring-apps-deploy åtgärden och utelämnar de förberedande jobben i resten av artikeln.

# 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

Mer information om blågröna distributioner, inklusive en alternativ metod, finns i Blågröna distributionsstrategier.

Ställa in produktionsdistribution

I följande exempel anges den aktuella mellanlagringsdistributionen som produktion, vilket effektivt växlar vilken distribution som tar emot produktionstrafik.

# 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

Ta bort en mellanlagringsdistribution

Med Delete Staging Deployment åtgärden kan du ta bort distributionen som inte tar emot produktionstrafik. Den här borttagningen frigör resurser som används av distributionen och ger utrymme för en ny mellanlagringsdistribution:

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

Skapa eller uppdatera bygge (endast Enterprise-plan)

I följande exempel skapas eller uppdateras en byggresurs i Enterprise-planen:

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

Ta bort version (endast Enterprise-plan)

I följande exempel tas en byggresurs bort i Enterprise-planen:

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

Distribuera med Maven-plugin-programmet

Ett annat alternativ är att använda Maven-plugin-programmet för att distribuera jar-programmet och uppdatera appinställningarna. Kommandot mvn azure-spring-apps:deploy är idempotent och skapar automatiskt Appar om det behövs. Du behöver inte skapa motsvarande appar i förväg.

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

Kör arbetsflödet

GitHub Actions ska aktiveras automatiskt när du har push-överfört .github/workflow/main.yml till GitHub. Åtgärden utlöses när du skickar en ny incheckning. Om du skapar den här filen i webbläsaren bör åtgärden redan ha körts.

Kontrollera att åtgärden har aktiverats genom att välja fliken Åtgärder på GitHub-lagringsplatsens sida:

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

Om åtgärden till exempel körs i fel, om du inte har angett Azure-autentiseringsuppgifterna, kan du köra kontroller igen när du har åtgärdat felet. På sidan GitHub-lagringsplats väljer du Åtgärder, väljer den specifika arbetsflödesuppgiften och väljer sedan knappen Kör kontroller igen för att köra kontroller igen:

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

Nästa steg