Share via


GitHub Actions ile Azure Spring Apps CI/CD kullanma

Not

Azure Spring Apps, Azure Spring Cloud hizmetinin yeni adıdır. Hizmetin yeni bir adı olsa da, ekran görüntüleri, videolar ve diyagramlar gibi varlıkları güncelleştirmek için çalışırken bazı yerlerde eski adı bir süre görürsünüz.

Bu makale şunlar için geçerlidir: ✔️ Temel/Standart ✔️ Kurumsal

Bu makalede, GitHub Actions ile Azure Spring Apps için CI/CD iş akışı oluşturma adımları gösterilmektedir.

GitHub Actions, otomatik yazılım geliştirme yaşam döngüsü iş akışını destekler. Azure Spring Apps için GitHub Actions ile deponuzda derlemek, test etmek, paketlemek, yayımlamak ve Azure'a dağıtmak için iş akışları oluşturabilirsiniz.

Önkoşullar

Bu örnekte Azure CLI gereklidir.

GitHub deposunu ayarlama ve kimlik doğrulaması

Azure oturum açma eylemini yetkilendirmek için bir Azure hizmet sorumlusu kimlik bilgilerine ihtiyacınız vardır. Azure kimlik bilgilerini almak için yerel makinenizde aşağıdaki komutları yürütebilirsiniz:

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

Belirli bir kaynak grubuna erişmek için kapsamı azaltabilirsiniz:

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

Komutun bir JSON nesnesi vermesi gerekir:

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

Bu örnekte GitHub'da steeltoe örneği kullanılmaktadır. Deponun çatalını oluşturun, çatalın GitHub deposu sayfasını açın ve Ayarlar sekmesini seçin. Gizli Diziler menüsünü açın ve Yeni gizli dizi'yi seçin:

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

Gizli dizi adını AZURE_CREDENTIALS olarak ve değerini GitHub deponuzu ayarlama ve kimlik doğrulaması başlığı altında bulduğunuz JSON dizesi olarak ayarlayın.

Screenshot of the GitHub Actions secrets / New secret page.

GitHub Actions'ta Azure Spring'i Key Vault ile kimlik doğrulaması konusunda açıklandığı gibi GitHub Actions'ta Key Vault'tan Azure oturum açma kimlik bilgilerini de alabilirsiniz.

Hizmet örneği sağlama

Azure Spring Apps hizmet örneğinizi sağlamak için Azure CLI kullanarak aşağıdaki komutları çalıştırın.

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

İş akışını oluşturma

İş akışı aşağıdaki seçenekler kullanılarak tanımlanır.

Azure CLI ile dağıtıma hazırlanma

Komut az spring app create şu anda bir kez etkili değildir. Bir kez çalıştırdıktan sonra, aynı komutu yeniden çalıştırırsanız bir hata alırsınız. Bu iş akışının mevcut Azure Spring Apps uygulamaları ve örneklerinde kullanılması önerilir.

Hazırlık için aşağıdaki Azure CLI komutlarını kullanın:

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 ile doğrudan dağıtma

Depoda .github/workflows/main.yml dosyasını aşağıdaki içerikle oluşturun. Kaynak grubu adınızı> ve <hizmet adınızı> doğru değerlerle değiştirin.<

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 deposunu ayarlama ve kimlik doğrulaması

Azure oturum açma eylemini yetkilendirmek için bir Azure hizmet sorumlusu kimlik bilgilerine ihtiyacınız vardır. Azure kimlik bilgilerini almak için yerel makinenizde aşağıdaki komutları yürütebilirsiniz:

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

Belirli bir kaynak grubuna erişmek için kapsamı azaltabilirsiniz:

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

Komutun bir JSON nesnesi vermesi gerekir:

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

Bu örnekte GitHub'da PiggyMetrics örneği kullanılmaktadır. Örneğin çatalını oluşturun, Yalnızca Azure dalını kopyala'nın işaretini kaldırın, GitHub deposu sayfasını açın ve Ayarlar sekmesini seçin. Gizli Diziler menüsünü açın ve Yeni gizli dizi ekle'yi seçin:

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

Gizli dizi adını AZURE_CREDENTIALS olarak ve değerini GitHub deponuzu ayarlama ve kimlik doğrulaması başlığı altında bulduğunuz JSON dizesi olarak ayarlayın.

Screenshot of the GitHub Actions secrets / New secret page.

GitHub Actions'ta Azure Spring'i Key Vault ile kimlik doğrulaması konusunda açıklandığı gibi GitHub Actions'ta Key Vault'tan Azure oturum açma kimlik bilgilerini de alabilirsiniz.

Hizmet örneği sağlama

Azure Spring Apps hizmet örneğinizi sağlamak için Azure CLI kullanarak aşağıdaki komutları çalıştırın.

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

Uçtan uca örnek iş akışları

Aşağıdaki örneklerde yaygın kullanım senaryoları gösterilmektedir.

Dağıtılıyor

Aşağıdaki bölümlerde uygulamanızı dağıtmak için çeşitli seçenekler gösterilmektedir.

Üretime

Azure Spring Apps, yerleşik yapıtlar (jar veya .NET Core ZIP gibi) veya kaynak kodu arşivi ile dağıtımlara dağıtmayı destekler.

Aşağıdaki örnek, Maven tarafından oluşturulan JAR dosyasını kullanarak Azure Spring Apps'te varsayılan üretim dağıtımına dağıtılır. Bu örnek, Temel SKU kullanılırken olası tek dağıtım senaryosudur:

Not

Paket arama düzeni yalnızca bir paket döndürmelidir. Derleme görevi sources.jar ve javadoc.jar gibi birden çok JAR paketi oluşturuyorsa, arama desenini yalnızca uygulama ikili yapıtıyla eşleşecek şekilde geliştirmeniz gerekir.

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

Aşağıdaki örnek, kaynak kodu kullanarak Azure Spring Apps'te varsayılan üretim dağıtımına dağıtılır.

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

Aşağıdaki örnek, Kurumsal plandaki kaynak kodu kullanarak Azure Spring Apps'te varsayılan üretim dağıtımına dağıtılır. seçeneğini kullanarak dağıtım eylemleri için hangi oluşturucunun builder kullanılacağını belirtebilirsiniz.

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>

Aşağıdaki örnek, mevcut bir kapsayıcı görüntüsüyle Azure Spring Apps'te varsayılan üretim dağıtımına dağıtılır.

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>

Dağıtım sırasında daha fazla bağımsız değişken kullanarak daha fazla işlevsellik elde edebilirsiniz. Daha fazla bilgi için Azure Spring Apps'e dağıtım için GitHub Eylemi'nin Bağımsız Değişkenler bölümüne bakın.

Mavi-yeşil

Aşağıdaki örnekler var olan bir hazırlama dağıtımına dağıtılır. Bu dağıtım, üretim dağıtımı olarak ayarlanana kadar üretim trafiği almaz. Hazırlama dağıtımını otomatik olarak bulmak için use-staging-deployment true ayarlayabilir veya yalnızca belirli bir dağıtım-adı ayırabilirsiniz. Yalnızca eyleme spring-apps-deploy odaklanıyoruz ve makalenin geri kalanında hazırlık işlerini dışarıda bırakıyoruz.

# 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

Alternatif bir yaklaşım da dahil olmak üzere mavi-yeşil dağıtımlar hakkında daha fazla bilgi için bkz . Mavi-yeşil dağıtım stratejileri.

Üretim dağıtımlarını ayarlama

Aşağıdaki örnek, geçerli hazırlama dağıtımını üretim olarak ayarlar ve hangi dağıtımın üretim trafiğini aldığını etkili bir şekilde değiştirir.

# 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

Hazırlama dağıtımlarını silme

Eylem, Delete Staging Deployment üretim trafiğini almayan dağıtımı silmenize olanak tanır. Bu silme işlemi, söz konusu dağıtım tarafından kullanılan kaynakları boşaltır ve yeni bir hazırlama dağıtımına yer sağlar:

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

Derleme oluşturma veya güncelleştirme (yalnızca Kurumsal plan)

Aşağıdaki örnek, Kurumsal planda bir derleme kaynağı oluşturur veya güncelleştirir:

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

Derlemeyi silme (yalnızca Kurumsal plan)

Aşağıdaki örnek, Kurumsal plandaki bir derleme kaynağını siler:

# 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 Eklentisi ile dağıtma

Bir diğer seçenek de Jar'ı dağıtmak ve Uygulama ayarlarını güncelleştirmek için Maven Eklentisi'ni kullanmaktır. Komutu mvn azure-spring-apps:deploy bir kez etkili olur ve gerekirse uygulamaları otomatik olarak oluşturur. İlgili uygulamaları önceden oluşturmanız gerekmez.

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

İş akışını çalıştırma

.github/workflow/main.yml GitHub'a gönderildikten sonra GitHub Actions otomatik olarak etkinleştirilmelidir. Eylem, yeni bir işleme gönderdiğinizde tetikleniyor. Bu dosyayı tarayıcıda oluşturursanız eyleminiz zaten çalıştırılmalıdır.

Eylemin etkinleştirildiğini doğrulamak için GitHub deposu sayfasındaki Eylemler sekmesini seçin:

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

Eyleminiz hatayla çalışıyorsa, örneğin Azure kimlik bilgilerini ayarlamadıysanız, hatayı düzelttikkten sonra denetimleri yeniden çalıştırabilirsiniz. GitHub deposu sayfasında Eylemler'i seçin, belirli iş akışı görevini seçin ve ardından denetimleri yeniden çalıştırmak için Denetimleri yeniden çalıştır düğmesini seçin:

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

Sonraki adımlar