Gunakan Azure Spring Apps CI/CD dengan Tindakan GitHub

Catatan

Azure Spring Apps adalah nama baru untuk layanan Azure Spring Cloud. Meskipun layanan memiliki nama baru, Anda akan melihat nama lama di beberapa tempat untuk sementara saat kami berupaya memperbarui aset seperti cuplikan layar, video, dan diagram.

Artikel ini berlaku untuk: ✔️ Basic/Standard ✔️ Enterprise

Artikel ini menunjukkan kepada Anda cara membangun alur kerja CI/CD untuk Azure Spring Apps dengan GitHub Actions.

GitHub Actions mendukung alur kerja siklus hidup pengembangan perangkat lunak otomatis. Dengan GitHub Actions for Azure Spring Apps Anda dapat membuat alur kerja di repositori Anda untuk membangun, menguji, mengemas, merilis, dan menyebarkan ke Azure.

Prasyarat

Contoh ini memerlukan Azure CLI.

Menyiapkan repositori GitHub dan mengautentikasi

Anda memerlukan info masuk utama layanan Azure untuk mengotorisasi tindakan login Azure. Untuk mendapatkan info masuk Azure, jalankan perintah berikut ini di komputer lokal Anda:

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

Untuk mengakses grup sumber daya tertentu, Anda bisa mengurangi cakupan:

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

Perintah harus mengeluarkan objek JSON:

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

Contoh ini menggunakan sampel steeltoe pada GitHub. Fork repositori, buka halaman repositori GitHub untuk fork, dan pilih tab Pengaturan. Buka menu Rahasia, dan pilih Rahasia baru:

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

Atur nama rahasia ke AZURE_CREDENTIALS dan nilainya ke string JSON yang Anda temukan di bawah judul Siapkan repositori GitHub Anda dan autentikasi.

Screenshot of the GitHub Actions secrets / New secret page.

Anda juga bisa mendapatkan info masuk login Azure dari Key Vault dalam Tindakan GitHub seperti yang dijelaskan dalam Mengautentikasi Azure Spring dengan Key Vault di Tindakan GitHub.

Memprovisikan instans layanan

Untuk menyediakan instans layanan Azure Spring Apps Anda, jalankan perintah berikut menggunakan CLI Azure.

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

Menyusun alur kerja

Alur kerja ditentukan menggunakan opsi berikut.

Bersiap untuk penyebaran dengan Azure CLI

Perintah az spring app create saat ini tidak idempotent. Setelah menjalankannya sekali, Anda mendapatkan kesalahan jika Menjalankan perintah yang sama lagi. Kami merekomendasikan alur kerja ini pada aplikasi dan instans Azure Spring Apps yang ada.

Gunakan perintah Cli Azure berikut ini untuk persiapan:

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

Sebarkan dengan Azure CLI secara langsung

Buat file .github/workflows/main.yml di repositori dengan konten berikut. Ganti <nama grup sumber daya Anda> dan <nama layanan Anda> dengan nilai yang benar.

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

Menyiapkan repositori GitHub dan mengautentikasi

Anda memerlukan info masuk utama layanan Azure untuk mengotorisasi tindakan login Azure. Untuk mendapatkan info masuk Azure, jalankan perintah berikut ini di komputer lokal Anda:

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

Untuk mengakses grup sumber daya tertentu, Anda bisa mengurangi cakupan:

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

Perintah harus mengeluarkan objek JSON:

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

Contoh ini menggunakan sampel PiggyMetrics di GitHub. Fork sampel, hapus centang Salin cabang Azure saja, buka halaman repositori GitHub, dan pilih tab Pengaturan. Buka menu Rahasia, dan pilih Tambahkan rahasia baru:

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

Atur nama rahasia ke AZURE_CREDENTIALS dan nilainya ke string JSON yang Anda temukan di bawah judul Siapkan repositori GitHub Anda dan autentikasi.

Screenshot of the GitHub Actions secrets / New secret page.

Anda juga bisa mendapatkan info masuk login Azure dari Key Vault dalam Tindakan GitHub seperti yang dijelaskan dalam Mengautentikasi Azure Spring dengan Key Vault di Tindakan GitHub.

Memprovisikan instans layanan

Untuk menyediakan instans layanan Azure Spring Apps Anda, jalankan perintah berikut menggunakan CLI Azure.

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

Alur kerja sampel end-to-end

Contoh berikut menunjukkan skenario penggunaan yang umum.

Menyebarkan

Bagian berikut menunjukkan kepada Anda berbagai opsi untuk menyebarkan aplikasi Anda.

Ke produksi

Azure Spring Apps mendukung penyebaran ke penyebaran dengan artefak bawaan (misalnya, JAR atau .NET Core ZIP) atau arsip kode sumber.

Contoh berikut menyebar ke penyebaran produksi default di Azure Spring Apps menggunakan file JAR yang dibuat oleh Maven. Contoh ini adalah satu-satunya skenario penyebaran yang mungkin saat menggunakan SKU Dasar:

Catatan

Pola pencarian paket hanya boleh mengembalikan tepat satu paket. Jika tugas build menghasilkan beberapa paket JAR seperti sources.jar dan javadoc.jar, Anda perlu memperbaiki pola pencarian sehingga hanya cocok dengan artefak biner aplikasi.

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

Contoh berikut menyebarkan ke penyebaran produksi default di Azure Spring Apps menggunakan kode sumber.

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

Contoh berikut menyebarkan ke penyebaran produksi default di Azure Spring Apps menggunakan kode sumber dalam paket Enterprise. Anda dapat menentukan penyusun mana yang akan digunakan untuk menyebarkan tindakan menggunakan builder opsi .

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>

Contoh berikut menyebarkan ke penyebaran produksi default di Azure Spring Apps dengan gambar kontainer yang ada.

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>

Selama penyebaran, Anda dapat mencapai lebih banyak fungsionalitas dengan menggunakan lebih banyak argumen. Untuk informasi selengkapnya, lihat bagian Argumen dari GitHub Action untuk menyebarkan ke Azure Spring Apps.

Biru-hijau

Contoh berikut disebarkan ke penyebaran penahapan yang ada. Penyebaran ini tidak menerima lalu lintas produksi hingga ditetapkan sebagai penyebaran produksi. Anda dapat mengatur use-staging-deployment true untuk menemukan penyebaran penahapan secara otomatis atau hanya mengalokasikan nama penyebaran tertentu. Kami hanya fokus pada spring-apps-deploy tindakan dan meninggalkan pekerjaan persiapan di sisa artikel.

# 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

Untuk informasi selengkapnya tentang penyebaran biru-hijau, termasuk pendekatan alternatif, lihat Strategi penyebaran biru-hijau.

Mengatur penyebaran produksi

Contoh berikut menetapkan penyebaran penahapan saat ini sebagai produksi, secara efektif menukar penyebaran mana yang menerima lalu lintas produksi.

# 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

Menghapus penyebaran penahapan

Tindakan ini Delete Staging Deployment memungkinkan Anda menghapus penyebaran yang tidak menerima lalu lintas produksi. Penghapusan ini membebaskan sumber daya yang digunakan oleh penyebaran tersebut dan memberikan ruang untuk penyebaran penahapan baru:

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

Membuat atau memperbarui build (hanya paket Perusahaan)

Contoh berikut membuat atau memperbarui sumber daya build dalam paket 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>

Hapus build (hanya paket Enterprise)

Contoh berikut menghapus sumber daya build dalam paket 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>

Sebarkan dengan Maven Plugin

Opsi lain adalah menggunakan Plugin Maven untuk menyebarkan Jar dan memperbarui pengaturan Aplikasi. Perintahnya mvn azure-spring-apps:deploy idempogen dan secara otomatis membuat Aplikasi jika diperlukan. Anda tidak perlu membuat aplikasi yang sesuai terlebih dahulu.

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

Jalankan alur kerja

Tindakan GitHub harus diaktifkan secara otomatis setelah Anda mendorong .github/workflow/main.yml ke GitHub. Tindakan dipicu saat Anda mendorong penerapan baru. Jika Anda membuat file ini di browser, tindakan Anda seharusnya sudah berjalan.

Untuk memverifikasi bahwa tindakan telah diaktifkan, pilih tab Tindakan di halaman repositori GitHub:

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

Jika tindakan Anda berjalan dalam kesalahan, misalnya, jika Anda belum mengatur info masuk Azure, Anda dapat menjalankan ulang pemeriksaan setelah memperbaiki kesalahan. Pada halaman repositori GitHub, pilih Tindakan, pilih tugas alur kerja tertentu, lalu pilih tombol Jalankan ulang pemeriksaan untuk menjalankan ulang pemeriksaan:

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

Langkah berikutnya