Menyebarkan ke App Service dengan menggunakan Azure Pipelines

Azure DevOps | Azure DevOps Server 2020 | Azure DevOps Server 2019

Gunakan Azure Pipelines untuk menyebarkan aplikasi web Anda secara otomatis ke Azure App Service pada setiap build yang berhasil. Azure Pipelines memungkinkan Anda membangun, menguji, dan menyebarkan dengan integrasi berkelanjutan (CI) dan pengiriman berkelanjutan (CD) menggunakan Azure DevOps.

Alur YAML ditentukan menggunakan file YAML di repositori Anda. Langkah adalah blok penyusun terkecil dari alur dan dapat menjadi skrip atau tugas (skrip yang dikemas sebelumnya). Pelajari tentang konsep utama dan komponen yang membentuk sebuah alur.

Anda akan menggunakan tugas Azure Web App (AzureWebApp) untuk menyebarkan ke Azure App Service di alur Anda. Untuk skenario yang lebih rumit seperti perlu menggunakan parameter XML dalam penyebaran, Anda dapat menggunakan tugas penyebaran Azure App Service (AzureRmWebAppDeployment).

Prasyarat

1. Buat alur untuk tumpukan Anda

Contoh kode di bagian ini mengasumsikan Anda menyebarkan aplikasi web ASP.NET. Anda dapat menyesuaikan instruksi untuk kerangka kerja lain.

Pelajari lebih lanjut terkait dukungan ekosistem Azure Pipelines.

  1. Masuk ke organisasi Azure DevOps Anda dan arahkan ke proyek Anda.

  2. Buka Alur, lalu pilih Alur baru.

  3. Saat diminta, pilih lokasi kode sumber Anda: Azure Repos Git atau GitHub.

    Anda dapat diarahkan ke GitHub untuk masuk. Jika demikian, masukkan informasi masuk GitHub Anda.

  4. Saat daftar repositori muncul, pilih repositori Anda.

  5. Anda mungkin diarahkan ke GitHub untuk menginstal aplikasi Azure Pipelines. Jika demikian, pilih Setujui & instal.

  6. Saat tab Konfigurasi muncul, pilih ASP.NET Core.

  7. Ketika alur baru Anda muncul, tinjau YAML untuk melihat tindakan yang dilakukannya. Saat Anda siap, pilih Simpan dan jalankan.

2. Tambahkan tugas penyebaran

  1. Klik akhir file YAML, lalu pilih Perlihatkan asisten.'

  2. Gunakan asisten Tugas untuk menambahkan tugas Azure Web App.

    Screenshot of Azure web app task.

    Atau, Anda dapat menambahkan tugas penyebaran Azure App Service (AzureRmWebAppDeployment).

  3. Pilih langganan Azure Anda. Pastikan untuk Mengotorisasi sambungan Anda. Otorisasi membuat koneksi layanan yang diperlukan.

  4. Pilih Jenis aplikasi, Nama aplikasi, dan Tumpukan Runtime berdasarkan aplikasi App Service Anda. YAML lengkap Anda akan terlihat mirip dengan kode berikut.

    variables:
      buildConfiguration: 'Release'
    
    steps:
    - script: dotnet build --configuration $(buildConfiguration)
      displayName: 'dotnet build $(buildConfiguration)'
    - task: DotNetCoreCLI@2
      inputs:
        command: 'publish'
        publishWebProjects: true
    - task: AzureWebApp@1
      inputs:
        azureSubscription: '<service-connection-name>'
        appType: 'webAppLinux'
        appName: '<app-name>'
        package: '$(System.DefaultWorkingDirectory)/**/*.zip'
    
    • azureSubscription: Nama koneksi layanan resmi ke langganan Azure Anda.
    • appName: Nama aplikasi anda yang sudah ada.
    • paket: Jalur file ke paket atau folder yang berisi konten layanan aplikasi Anda. Penggunaan wildcard didukung.

Contoh: Menyebarkan aplikasi .NET

Untuk menyebarkan paket web .zip (misalnya, dari aplikasi web ASP.NET) ke Azure Web App, gunakan cuplikan berikut untuk menyebarkan build ke aplikasi.

variables:
  buildConfiguration: 'Release'

steps:
- script: dotnet build --configuration $(buildConfiguration)
  displayName: 'dotnet build $(buildConfiguration)'
- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    publishWebProjects: true
- task: AzureWebApp@1
  inputs:
    azureSubscription: '<service-connection-name>'
    appType: 'webAppLinux'
    appName: '<app-name>'
    package: '$(System.DefaultWorkingDirectory)/**/*.zip'
  • azureSubscription: langganan Azure Anda.
  • appType: jenis Web App Anda.
  • appName: nama layanan aplikasi Anda yang sudah ada.
  • paket: jalur file ke paket atau folder yang berisi konten layanan aplikasi Anda. Penggunaan wildcard didukung.

Contoh: menyebarkan ke aplikasi virtual

Secara default, penyebaran Anda terjadi pada aplikasi root di Azure Web App. Anda dapat menyebarkan ke aplikasi virtual tertentu dengan menggunakan VirtualApplication properti tugas penyebaran Azure App Service (AzureRmWebAppDeployment):

- task: AzureRmWebAppDeployment@4
  inputs:
    VirtualApplication: '<name of virtual application>'

Contoh: Menyebarkan ke slot

Contoh berikut menunjukkan cara menyebarkan ke slot penahapan, lalu bertukar ke slot produksi:

- task: AzureWebApp@1
  inputs:
    azureSubscription: '<service-connection-name>'
    appType: webAppLinux
    appName: '<app-name>'
    deployToSlotOrASE: true
    resourceGroupName: '<name of resource group>'
    slotName: staging
    package: '$(Build.ArtifactStagingDirectory)/**/*.zip'

- task: AzureAppServiceManage@0
  inputs:
    azureSubscription: '<service-connection-name>'
    appType: webAppLinux
    WebAppName: '<app-name>'
    ResourceGroupName: '<name of resource group>'
    SourceSlot: staging
    SwapWithProduction: true
  • azureSubscription: langganan Azure Anda.
  • appType: (opsional) Gunakan webAppLinux untuk menyebarkan ke Aplikasi Web di Linux.
  • appName: nama layanan aplikasi Anda yang sudah ada.
  • deployToSlotOrASE: Boolean. Menyebarkan ke slot penyebaran yang sudah ada atau Lingkungan Azure App Service.
  • resourceGroupName: Nama grup sumber daya. Diperlukan jika deployToSlotOrASE true.
  • slotName: Nama slot, yang default ke production. Diperlukan jika deployToSlotOrASE true.
  • paket: jalur file ke paket atau folder yang berisi konten layanan aplikasi Anda. Penggunaan wildcard didukung.
  • SourceSlot: Slot dikirim ke produksi ketika SwapWithProduction true.
  • SwapWithProduction: Boolean. Menukar lalu lintas slot sumber dengan produksi.

Contoh: Menyebarkan ke beberapa aplikasi web

Anda dapat menggunakan pekerjaan dalam file YAML Untuk menyiapkan alur penyebaran. Dengan menggunakan pekerjaan, Anda dapat mengontrol urutan penyebaran ke beberapa aplikasi web.

jobs:
- job: buildandtest
  pool:
    vmImage: ubuntu-latest
 
  steps:
  # publish an artifact called drop
  - task: PublishPipelineArtifact@1
    inputs:
      targetPath: '$(Build.ArtifactStagingDirectory)' 
      artifactName: drop
  
  # deploy to Azure Web App staging
  - task: AzureWebApp@1
    inputs:
      azureSubscription: '<service-connection-name>'
      appType: <app type>
      appName: '<staging-app-name>'
      deployToSlotOrASE: true
      resourceGroupName: <group-name>
      slotName: 'staging'
      package: '$(Build.ArtifactStagingDirectory)/**/*.zip'

- job: deploy
  dependsOn: buildandtest
  condition: succeeded()

  pool: 
    vmImage: ubuntu-latest  
  
  steps:
    # download the artifact drop from the previous job
  - task: DownloadPipelineArtifact@2
    inputs:
      source: 'current'
      artifact: 'drop'
      path: '$(Pipeline.Workspace)'

  - task: AzureWebApp@1
    inputs:
      azureSubscription: '<service-connection-name>'
      appType: <app type>
      appName: '<production-app-name>'
      resourceGroupName: <group-name>
      package: '$(Pipeline.Workspace)/**/*.zip'

Contoh: Membuat substitusi variabel

Untuk sebagian besar bahasa pemrogram, pengaturan aplikasi dan string sambungan dapat diatur sebagai variabel lingkungan saat runtime bahasa umum.

Tetapi ada alasan lain Anda ingin membuat substitusi variabel ke Web.config Anda. Dalam contoh ini, file Web.config Anda berisi string koneksi bernama connectionString. Anda dapat mengubah nilainya sebelum menyebarkan ke setiap aplikasi web. Anda dapat melakukan tindakan ini baik dengan menerapkan transformasi Web.config atau dengan mengganti variabel dalam file Web.config Anda.

Cuplikan berikut menunjukkan contoh substitusi variabel dengan menggunakan tugas Azure App Service Deploy (AzureRmWebAppDeployment):

jobs:
- job: test
  variables:
    connectionString: <test-stage connection string>
  steps:
  - task: AzureRmWebAppDeployment@4
    inputs:
      azureSubscription: '<Test stage Azure service connection>'
      WebAppName: '<name of test stage web app>'
      enableXmlVariableSubstitution: true

- job: prod
  dependsOn: test
  variables:
    connectionString: <prod-stage connection string>
  steps:
  - task: AzureRmWebAppDeployment@4
    inputs:
      azureSubscription: '<Prod stage Azure service connection>'
      WebAppName: '<name of prod stage web app>'
      enableXmlVariableSubstitution: true

Contoh: Menyebarkan secara kondisional

Untuk melakukan ini di YAML, Anda dapat menggunakan salah satu teknik berikut:

  • Isolasi langkah-langkah penyebaran ke dalam pekerjaan terpisah, dan tambahkan kondisi ke pekerjaan tersebut.
  • Tambahkan kondisi ke langkah tersebut.

Contoh berikut menunjukkan cara menggunakan kondisi langkah untuk menyebarkan hanya build yang berasal dari cabang utama saja:

- task: AzureWebApp@1
  condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
  inputs:
    azureSubscription: '<service-connection-name>'
    appName: '<app-name>'

Untuk mempelajari kondisi lebih lanjut, lihat Menentukan kondisi.

Contoh: menyebarkan menggunakan Web Deploy

Tugas penyebaran Azure App Service (AzureRmWebAppDeployment) dapat disebarkan ke App Service menggunakan Web Deploy.

trigger:
- main

pool:
  vmImage: windows-latest

variables:
  buildConfiguration: 'Release'

steps:
- script: dotnet build --configuration $(buildConfiguration)
  displayName: 'dotnet build $(buildConfiguration)'
- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    publishWebProjects: true
    arguments: '--configuration $(buildConfiguration)'
    zipAfterPublish: true
- task: AzureRmWebAppDeployment@4
  inputs:
    ConnectionType: 'AzureRM'
    azureSubscription: '<service-connection-name>'
    appType: 'webApp'
    WebAppName: '<app-name>'
    packageForLinux: '$(System.DefaultWorkingDirectory)/**/*.zip'
    enableCustomDeployment: true
    DeploymentType: 'webDeploy'

Pertanyaan yang Sering Ditanyakan

Apa perbedaan antara AzureWebApp tugas dan AzureRmWebAppDeployment ?

Tugas Azure Web App (AzureWebApp) adalah cara paling sederhana untuk menyebarkan ke Azure Web App. Secara default, penyebaran Anda terjadi pada aplikasi root di Azure Web App.

Tugas Penyebaran Azure App Service (AzureRmWebAppDeployment) dapat menangani lebih banyak skenario kustom, seperti:

Catatan

Transformasi file dan substitusi variabel juga didukung oleh Tugas Transformasi File terpisah untuk digunakan di Azure Pipelines. Anda dapat menggunakan tugas Transformasi File untuk menerapkan transformasi file dan substitusi variabel pada file konfigurasi dan parameter apa pun.

Saya mendapatkan pesan "Paket App Service tidak valid atau jalur folder yang disediakan."

Di alur YAML, tergantung pada alur Anda, mungkin ada ketidakcocokan antara tempat paket web bawaan Anda disimpan dan di mana tugas penyebaran mencarinya. Misalnya, AzureWebApp tugas mengambil paket web untuk penyebaran. Misalnya, tugas AzureWebApp terlihat di $(System.DefaultWorkingDirectory)/**/*.zip. Jika paket web didepositkan di tempat lain, ubah nilai package.

Saya mendapatkan pesan "Terbitkan menggunakan opsi webdeploy hanya didukung saat menggunakan agen Windows."

Kesalahan ini terjadi dalam tugas AzureRmWebAppDeployment saat Anda mengonfigurasi tugas untuk menyebarkan menggunakan Web Deploy, tetapi agen Anda tidak menjalankan Windows. Verifikasi bahwa YAML Anda memiliki sesuatu yang mirip dengan kode berikut:

pool:
  vmImage: windows-latest

Penyebaran Web tidak berfungsi saat saya menonaktifkan autentikasi dasar

Untuk informasi pemecahan masalah tentang mendapatkan autentikasi ID Microsoft Entra untuk bekerja dengan AzureRmWebAppDeployment tugas, lihat Saya tidak dapat Menyebarkan Web ke Azure App Service saya menggunakan autentikasi ID Microsoft Entra dari agen Windows saya

Langkah berikutnya