Tutorial: Membuat alur multi-panggung dengan Azure DevOps

Layanan Azure DevOps | Azure DevOps Server 2022 - Azure DevOps Server 2019

Anda dapat menggunakan alur multitahap Azure DevOps untuk membagi proses CI/CD Anda menjadi tahapan yang mewakili berbagai bagian siklus pengembangan Anda. Menggunakan alur multitahap memberi Anda lebih banyak visibilitas ke dalam proses penyebaran Anda dan membuatnya lebih mudah untuk mengintegrasikan persetujuan dan pemeriksaan.

Dalam artikel ini, Anda akan membuat dua instans App Service dan membangun alur YAML dengan tiga tahap:

Dalam skenario dunia nyata, Anda mungkin memiliki tahap lain untuk menyebarkan ke produksi tergantung pada proses DevOps Anda.

Contoh kode dalam latihan ini adalah untuk aplikasi web .NET untuk permainan ruang berpura-pura yang menyertakan papan peringkat untuk menunjukkan skor tinggi. Anda akan menyebarkan ke instans pengembangan dan penahapan Azure Web App untuk Linux.

Prasyarat

Fork proyek

Fork repositori sampel berikut di GitHub.

https://github.com/MicrosoftDocs/mslearn-tailspin-spacegame-web-deploy

Membuat instans App Service

Sebelum dapat menyebarkan alur, Anda harus terlebih dahulu membuat instans App Service untuk disebarkan. Anda akan menggunakan Azure CLI untuk membuat instans.

  1. Masuk ke portal Azure.

  2. Dari menu, pilih Cloud Shell dan pengalaman Bash .

  3. Buat angka acak yang membuat nama domain aplikasi web Anda unik. Keuntungan memiliki nilai unik adalah instans App Service Anda tidak akan memiliki nama yang bertentangan dengan pelajar lain yang menyelesaikan tutorial ini.

    webappsuffix=$RANDOM    
    
  4. Buka perintah dan gunakan az group create perintah untuk membuat grup sumber daya bernama tailspin-space-game-rg yang berisi semua instans App Service Anda. location Perbarui nilai untuk menggunakan wilayah terdekat Anda.

    az group create --location eastus --name tailspin-space-game-rg
    
  5. Gunakan perintah untuk membuat paket App Service.

    az appservice plan create \
      --name tailspin-space-game-asp \
      --resource-group tailspin-space-game-rg \
      --sku B1 \
      --is-linux
    
  6. Di prompt perintah, buat dua instans App Service, satu untuk setiap instans (Dev dan Staging) dengan az webapp create perintah .

    az webapp create \
      --name tailspin-space-game-web-dev-$webappsuffix \
      --resource-group tailspin-space-game-rg \
      --plan tailspin-space-game-asp \
      --runtime "DOTNET|6.0"
    
    az webapp create \
      --name tailspin-space-game-web-staging-$webappsuffix \
      --resource-group tailspin-space-game-rg \
      --plan tailspin-space-game-asp \
      --runtime "DOTNET|6.0"
    
  7. Dengan prompt perintah, cantumkan kedua instans App Service untuk memverifikasi bahwa instans tersebut berjalan dengan az webapp list perintah .

    az webapp list \
      --resource-group tailspin-space-game-rg \
      --query "[].{hostName: defaultHostName, state: state}" \
      --output table
    
  8. Salin nama instans App Service untuk digunakan sebagai variabel di bagian berikutnya.

Membuat proyek dan variabel Azure DevOps Anda

Siapkan proyek Azure DevOps dan alur build Anda. Anda juga akan menambahkan variabel untuk instans pengembangan dan penahapan Anda.

Alur build Anda:

  • Menyertakan pemicu yang berjalan saat ada perubahan kode ke cabang
  • Mendefinisikan dua variabel, buildConfiguration dan releaseBranchName
  • Menyertakan tahap bernama Build yang membangun aplikasi web
  • Menerbitkan artefak yang akan Anda gunakan di tahap selanjutnya

Menambahkan tahap Build

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

  2. Buka Alur, lalu pilih Alur baru atau Buat alur jika membuat alur pertama Anda.

  3. Lakukan langkah-langkah wizard dengan terlebih dahulu memilih GitHub sebagai lokasi kode sumber Anda.

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

  5. Saat Anda melihat daftar repositori, pilih repositori Anda.

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

  1. Saat tab Konfigurasi muncul, pilih Alur pemula.

  2. Ganti isi azure-pipelines.yml dengan kode ini.

    trigger:
    - '*'
    
    variables:
      buildConfiguration: 'Release'
      releaseBranchName: 'release'
    
    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.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
    
  3. Saat Anda siap, pilih Simpan dan jalankan.

Menambahkan variabel instans

  1. Di Azure DevOps, buka Pustaka Alur>.

  2. Pilih + Grup variabel.

  3. Di bawah Properti, tambahkan Rilis untuk nama grup variabel.

  4. Buat dua variabel untuk merujuk ke nama host pengembangan dan penahapan Anda. Ganti nilai 1234 dengan nilai yang benar untuk instans Anda.

    Nama variabel Contoh nilai
    WebAppNameDev tailspin-space-game-web-dev-1234
    WebAppNameStaging tailspin-space-game-web-staging-1234
  5. Pilih Simpan untuk menyimpan variabel Anda.

Menambahkan tahap Dev

Selanjutnya, Anda akan memperbarui alur untuk mempromosikan build Anda ke tahap Dev .

  1. Di Alur Azure, buka Alur Alur>.

  2. Pilih Edit di menu kontekstual untuk mengedit alur Anda.

    Cuplikan layar pilih Edit item menu.

  3. Perbarui azure-pipelines.yml untuk menyertakan tahap Dev. Pada tahap Dev, alur Anda akan:

    • Jalankan saat tahap Build berhasil karena kondisi

    • Mengunduh artefak dari drop

    • Menyebarkan ke Azure App Service dengan koneksi layanan Azure Resource Manager

      trigger:
      - '*'
      
      variables:
        buildConfiguration: 'Release'
        releaseBranchName: 'release'
      
      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.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
      
      - stage: 'Dev'
        displayName: 'Deploy to the dev environment'
        dependsOn: Build
        condition:  succeeded()
        jobs:
        - deployment: Deploy
          pool:
            vmImage: 'ubuntu-20.04'
          environment: dev
          variables:
          - group: Release
          strategy:
            runOnce:
              deploy:
                steps:
                - download: current
                  artifact: drop
                - task: AzureWebApp@1
                  displayName: 'Azure App Service Deploy: website'
                  inputs:
                    azureSubscription: 'your-subscription'
                    appType: 'webAppLinux'
                    appName: '$(WebAppNameDev)'
                    package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip'
      
  4. AzureWebApp@1 Ubah tugas untuk menggunakan langganan Anda.

    1. Pilih Pengaturan untuk tugas tersebut.

      Cuplikan layar opsi pengaturan di tugas editor YAML.

    2. your-subscription Perbarui nilai untuk Langganan Azure untuk menggunakan langganan Anda sendiri. Anda mungkin perlu mengotorisasi akses sebagai bagian dari proses ini. Jika Anda mengalami masalah saat mengotorisasi sumber daya Anda dalam editor YAML, pendekatan alternatif adalah membuat koneksi layanan.

      Cuplikan layar item menu langganan Azure.

    3. Atur Jenis aplikasi ke Aplikasi Web di Linux.

    4. Pilih Tambahkan untuk memperbarui tugas.

  5. Simpan dan jalankan alur Anda.

Menambahkan tahap Pentahapan

Terakhir, Anda akan mempromosikan tahap Dev ke Penahapan. Tidak seperti lingkungan Dev, Anda ingin memiliki lebih banyak kontrol di lingkungan penahapan, Anda akan menambahkan persetujuan manual.

Membuat lingkungan penahapan

  1. Dari Azure Pipelines, pilih Lingkungan.

  2. Pilih Lingkungan baru.

  3. Buat lingkungan baru dengan penahapan nama dan Sumber Daya diatur ke Tidak Ada.

  4. Pada halaman lingkungan penahapan, pilih Persetujuan dan pemeriksaan.

    Cuplikan layar opsi menu persetujuan dan pemeriksaan.

  5. Pilih Persetujuan.

  6. Di Pemberi Persetujuan, pilih Tambahkan pengguna dan grup, lalu pilih akun Anda.

  7. Di Instruksi untuk pemberi persetujuan, tulis Setujui perubahan ini saat siap untuk penahapan.

  8. Pilih Simpan.

Menambahkan tahap baru ke alur

Anda akan menambahkan tahap baru, Staging ke alur yang menyertakan persetujuan manual.

  1. Edit file alur Anda dan tambahkan bagian Staging .

    trigger:
    - '*'
    
    variables:
      buildConfiguration: 'Release'
      releaseBranchName: 'release'
    
    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.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
    
    - stage: 'Dev'
      displayName: 'Deploy to the dev environment'
      dependsOn: Build
      condition:  succeeded()
      jobs:
      - deployment: Deploy
        pool:
          vmImage: 'ubuntu-20.04'
        environment: dev
        variables:
        - group: Release
        strategy:
          runOnce:
            deploy:
              steps:
              - download: current
                artifact: drop
              - task: AzureWebApp@1
                displayName: 'Azure App Service Deploy: website'
                inputs:
                  azureSubscription: 'your-subscription'
                  appType: 'webAppLinux'
                  appName: '$(WebAppNameDev)'
                  package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip'
    
    - stage: 'Staging'
      displayName: 'Deploy to the staging environment'
      dependsOn: Dev
      jobs:
      - deployment: Deploy
        pool:
          vmImage: 'ubuntu-20.04'
        environment: staging
        variables:
        - group: 'Release'
        strategy:
          runOnce:
            deploy:
              steps:
              - download: current
                artifact: drop
              - task: AzureWebApp@1
                displayName: 'Azure App Service Deploy: website'
                inputs:
                  azureSubscription: 'your-subscription'
                  appType: 'webAppLinux'
                  appName: '$(WebAppNameDev)'
                  package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip'
    
  2. AzureWebApp@1 Ubah tugas di tahap Penahapan untuk menggunakan langganan Anda.

    1. Pilih Pengaturan untuk tugas tersebut.

      Cuplikan layar opsi pengaturan di tugas editor YAML.

    2. your-subscription Perbarui nilai untuk Langganan Azure untuk menggunakan langganan Anda sendiri. Anda mungkin perlu mengotorisasi akses sebagai bagian dari proses ini.

      Cuplikan layar item menu langganan Azure.

    3. Atur Jenis aplikasi ke Aplikasi Web di Linux.

    4. Pilih Tambahkan untuk memperbarui tugas.

  3. Buka eksekusi alur. Tonton build saat berjalan. Ketika mencapai Staging, alur menunggu persetujuan rilis manual. Anda juga akan menerima email bahwa Anda memiliki persetujuan yang menunggu alur.

    Cuplikan layar tunggu persetujuan alur.

  4. Tinjau persetujuan dan izinkan alur berjalan.

    Cuplikan layar pemeriksaan validasi manual.

Membersihkan sumber daya

Jika Anda tidak akan terus menggunakan aplikasi ini, hapus grup sumber daya di portal Azure dan proyek di Azure DevOps dengan langkah-langkah berikut:

Untuk membersihkan grup sumber daya Anda:

  1. Buka portal Microsoft Azure dan masuk.

  2. Dari bilah menu, pilih Cloud Shell. Jika diminta, pilih pengalaman Bash.

    Cuplikan layar portal Azure memperlihatkan pemilihan item menu Cloud Shell.

  3. Jalankan perintah az group delete berikut untuk menghapus grup sumber daya yang Anda gunakan, tailspin-space-game-rg.

    az group delete --name tailspin-space-game-rg
    

Untuk menghapus proyek Azure DevOps Anda, termasuk alur build:

  1. Di Azure DevOps, buka proyek Anda.

  2. Pilih Pengaturan proyek.

  3. Di detail Proyek, pilih Hapus.