Latihan - Menyebarkan aplikasi Azure Functions ke Azure

Selesai

Proyek Anda dilengkapi dengan alur yang membangun proyek dalam solusi dan menyebarkan aplikasi web ke Azure App Service. Sekarang saatnya untuk memperluas alur tersebut untuk juga menyebarkan proyek Azure Functions yang baru.

Di bagian ini, Anda akan:

  • Meninjau tahap Bangun.
  • Menambahkan tugas untuk menyebarkan aplikasi fungsi Anda.
  • Menambahkan tugas konfigurasikan App Service yang diterbitkan untuk menggunakan fungsi yang diterbitkan.
  • Simpan alur untuk memicu alur kerja CI/CD.

Meninjau tahap Bangun

Di sini, Anda akan meninjau alur CI/CD yang sudah ada yang ditentukan dalam azure-pipelines.yml.

  1. Dari Azure DevOps, navigasikan ke Alur.

  2. Pilih alur.

  3. Pilih Edit. Pastikan cabang diatur ke utama dengan memilihnya dari menu dropdown. Ini memunculkan file azure-pipelines.yml yang menentukan alur CI/CD yang ada.

    Karena penggunaan wildcard ke jalur proyek, tugas yang disorot di bawah ini akan secara otomatis memulihkan, membangun, dan menerbitkan proyek Azure Functions baru.

    stages:
    - stage: 'Build'
      displayName: 'Build the web application'
      jobs: 
      - job: 'Build'
        displayName: 'Build job'
        pool:
          vmImage: 'ubuntu-20.04'
          demands:
          - npm
    
        variables:
          wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot'
          dotnetSdkVersion: '6.0.x'
    
        steps:
        - task: UseDotNet@2
          displayName: 'Use .NET SDK $(dotnetSdkVersion)'
          inputs:
            version: '$(dotnetSdkVersion)'
    
        - task: Npm@1
          displayName: 'Run npm install'
          inputs:
            verbose: false
    
        - script: './node_modules/.bin/node-sass $(wwwrootDir) --output $(wwwrootDir)'
          displayName: 'Compile Sass assets'
    
        - task: gulp@1
          displayName: 'Run gulp tasks'
    
        - script: 'echo "$(Build.DefinitionName), $(Build.BuildId), $(Build.BuildNumber)" > buildinfo.txt'
          displayName: 'Write build info'
          workingDirectory: $(wwwrootDir)
    
        - task: DotNetCoreCLI@2
          displayName: 'Restore project dependencies'
          inputs:
            command: 'restore'
            projects: '**/*.csproj'
    
        - task: DotNetCoreCLI@2
          displayName: 'Build the project - $(buildConfiguration)'
          inputs:
            command: 'build'
            arguments: '--no-restore --configuration $(buildConfiguration)'
            projects: '**/*.csproj'
    
        - task: DotNetCoreCLI@2
          displayName: 'Publish the project - $(buildConfiguration)'
          inputs:
            command: 'publish'
            projects: '**/*.csproj'
            publishWebProjects: false
            arguments: '--no-build --configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)/$(buildConfiguration)'
            zipAfterPublish: true
    
        - publish: '$(Build.ArtifactStagingDirectory)'
          artifact: drop
    

Andy: Ini adalah tahap build kami sebelumnya. Saya tidak mengubahnya dari proyek asli karena tugas sudah dikonfigurasi untuk dijalankan terhadap semua proyek berdasarkan pola pencocokan wildcard.

Mara: Ya, ini seharusnya berfungsi tanpa perlu perubahan apa pun. Saya rasa kita tidak perlu membuat perubahan apa pun di sini. Setelah tugas pembangunan ini berjalan, artefak file zip untuk proyek web dan papan peringkat akan diterbitkan untuk digunakan tahap Sebarkan.

Menambahkan tugas untuk menyebarkan Azure Functions

Andy: Saya rasa kita juga bisa menggunakan kembali tugas penyebaran App Service apa adanya. Semoga saja ada hal serupa yang bisa kita gunakan untuk menyebarkan aplikasi fungsi.

Mara: Saya punya kabar baik. Setelah melakukan sedikit riset, sepertinya ada tugas yang secara konseptual mirip dengan tugas penyebaran App Service, tetapi untuk penyebaran Azure Functions. Mari kita tinjau sekarang.

Tugas Azure Function App

Tugas AzureFunctionApp@1 dirancang untuk menyebarkan aplikasi fungsi. Ini secara konseptual mirip AzureWebApp@1 dengan tugas dan mencakup semua yang diperlukan untuk skenario aplikasi fungsi ini:

  • azureSubscription mengacu pada nama variabel alur koneksi layanan Azure Anda.
  • appType menunjukkan apakah aplikasi sedang disebarkan untuk Linux (functionAppLinux) atau Windows (functionApp).
  • appName menentukan nama instans aplikasi Azure Functions di akun Azure Anda.
  • package menentukan jalur ke paket yang akan disebarkan.
  • runtimeStack menunjukkan citra tempat fungsi harus dijalankan, yang diperlukan untuk penyebaran Linux.
  • startUpCommand menentukan perintah startup untuk dijalankan setelah fungsi disebarkan, yang diperlukan untuk penyebaran Linux.

Anda dapat mempelajari lebih lanjut tentang fleksibilitas tugas ini dalam dokumentasi untuk tugas Azure Function App.

Tambahkan kode yang disorot berikut ke akhir alur Anda.

- stage: 'Deploy'
  displayName: 'Deploy the web application'
  dependsOn: Build
  jobs:
  - deployment: Deploy
    pool:
      vmImage: 'ubuntu-20.04'
    environment: spike
    variables:
    - group: Release
    strategy:
      runOnce:
        deploy:
          steps:
          - download: current
            artifact: drop
          - task: AzureWebApp@1
            displayName: 'Azure App Service Deploy: website'
            inputs:
              azureSubscription: 'Resource Manager - Tailspin - Space Game'
              appName: '$(WebAppName)'
              appType: webAppLinux
              package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/Tailspin.SpaceGame.Web.zip'

          - task: AzureFunctionApp@1
            displayName: 'Azure Function Deploy: leaderboard'
            inputs:
              azureSubscription: 'Resource Manager - Tailspin - Space Game'
              appType: functionAppLinux
              appName: '$(LeaderboardAppName)'
              package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/Tailspin.SpaceGame.LeaderboardFunction.zip'
              runtimeStack: DOCKER|microsoft/azure-functions-dotnet:4
              startUpCommand: 'func azure functionapp publish $(functionAppName) --no-bundler'

Tip

Dalam file YAML, whitespace sangat penting. Pastikan bahwa tugas yang Anda tambahkan di sini menggunakan indentasi yang sama seperti tugas sebelumnya.

Menambahkan tugas untuk memperbarui pengaturan aplikasi App Service

Andy: Sekarang yang perlu kita lakukan hanyalah mengonfigurasi aplikasi web agar menggunakan API papan peringkat yang diterbitkan. Kita biasanya mengonfigurasi variabel di portal, tetapi akan lebih baik jika kita bisa melakukannya di sini. Ini mengharapkan parameter AppSettings bernama LeaderboardFunctionUrl.

Mara: Saya setuju. Menambahkan tugas untuk itu ke alur kita akan membantu kita menghindari kelalaian yang tidak disengaja nantinya jika kita mengubah salah satu layanan. Kita bisa meletakkannya tepat di bagian akhir.

Tambahkan kode yang disorot berikut ke akhir alur Anda. Pastikan untuk mencocokkan indentasi tugas di atasnya. Jika Anda ingin mempelajari selengkapnya tentang tugas ini, Anda dapat meninjau dokumen untuk tugas Pengaturan Azure App Service.

- task: AzureFunctionApp@1
  displayName: 'Azure Function Deploy: leaderboard'
  inputs:
    azureSubscription: 'Resource Manager - Tailspin - Space Game'
    appType: functionAppLinux
    appName: '$(LeaderboardAppName)'
    package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/Tailspin.SpaceGame.LeaderboardFunction.zip'
    runtimeStack: DOCKER|microsoft/azure-functions-dotnet:4
    startUpCommand: 'func azure functionapp publish $(functionAppName) --no-bundler'

- task: AzureAppServiceSettings@1
  displayName: 'Update web app settings'
  inputs:
    azureSubscription: 'Resource Manager - Tailspin - Space Game'
    appName: $(WebAppName)
    resourceGroupName: $(ResourceGroupName)
    appSettings: |
      [
        {
          "name": "AppSettings__LeaderboardFunctionUrl",
          "value": "http://$(LeaderboardAppName).azurewebsites.net/api/LeaderboardFunction",
          "slotSetting": false
        }
      ]

Menyimpan alur untuk memicu build dan rilis

  1. Pilih Simpan dari pojok kanan atas halaman. Konfirmasikan Simpan untuk memicu eksekusi.

  2. Di Azure Pipelines, buka build. Lacak build saat berjalan.

  3. Setelah build berhasil, pilih tugas penyebaran situs web dan pilih URL untuk melihat situs yang disebarkan.

    A screenshot of Azure Pipelines, showing the location of the web site URL.

  4. Anda akan mendapatkan halaman dengan situs yang berjalan di App Service. Gulir ke bawah untuk mengonfirmasi bahwa papan peringkat memiliki data yang sebenarnya di dalamnya. Ini didukung oleh aplikasi fungsi.

    A screenshot of the Space Game web site.

    Catatan

    Jika ada kesalahan saat memuat papan peringkat, periksa kembali langkah-langkah yang Anda ikuti dalam modul ini. Jika Anda melihat pesan pengecualian "Ada upaya yang dilakukan untuk mengakses soket dengan cara yang dilarang oleh izin aksesnya", pastikan bahwa pengaturan AppSettings__LeaderboardFunctionUrl layanan aplikasi diatur dengan benar.

  5. Anda juga dapat menguji aplikasi fungsi secara langsung. Cukup navigasikan ke URL Anda menggunakan format berikut. Responsnya adalah JSON, yang seharusnya hanya dirender sebagai teks di browser Anda.

    http://<leaderboard function name>.azurewebsites.net/api/LeaderboardFunction?pageSize=10
    

    seperti

    http://tailspin-space-game-leaderboard-4692.azurewebsites.net/api/LeaderboardFunction?pageSize=10
    

    A screenshot of a web browser showing the JSON response from the leaderboard API Azure Functions app.

Andy: Ternyata hasilnya bagus! Semua orang seharusnya cukup terkesan dengan potensi yang kita tunjukkan di sini.