Bagikan melalui


Pekerjaan penyebaran

Layanan Azure DevOps | Azure DevOps Server 2022 | Azure DevOps Server 2020

Penting

  • Nama pekerjaan dan tahap tidak boleh berisi kata kunci (misalnya: deployment).
  • Setiap pekerjaan dalam satu tahap harus memiliki nama yang unik.

Dalam alur YAML, kami sarankan Anda menempatkan langkah-langkah penyebaran Anda dalam jenis pekerjaan khusus yang disebut pekerjaan penyebaran. Pekerjaan penyebaran adalah kumpulan langkah-langkah yang dijalankan secara berurutan terhadap lingkungan. Pekerjaan penyebaran dan pekerjaan tradisional dapat ada dalam tahap yang sama. Azure DevOps mendukung strategi runOnce, rolling, dan kenari .

Pekerjaan penyebaran memberikan manfaat berikut:

  • Riwayat penyebaran: Anda mendapatkan riwayat penyebaran di seluruh alur, hingga ke sumber daya dan status penyebaran tertentu untuk audit.
  • Menerapkan strategi penyebaran: Anda menentukan bagaimana aplikasi Anda diluncurkan.

Pekerjaan penyebaran tidak secara otomatis mengkloning repositori sumber. Anda dapat memeriksa repositori sumber dalam pekerjaan Anda dengan checkout: self.

Catatan

Artikel ini berfokus pada penyebaran dengan pekerjaan penyebaran. Untuk mempelajari cara menyebarkan ke Azure dengan alur, lihat Menyebarkan ke gambaran umum Azure.

Skema

Berikut adalah sintaks lengkap untuk menentukan pekerjaan penyebaran:

jobs:
- deployment: string   # name of the deployment job, A-Z, a-z, 0-9, and underscore. The word "deploy" is a keyword and is unsupported as the deployment name.
  displayName: string  # friendly name to display in the UI
  pool:                # not required for virtual machine resources
    name: string       # Use only global level variables for defining a pool name. Stage/job level variables are not supported to define pool name.
    demands: string | [ string ]
  workspace:
    clean: outputs | resources | all # what to clean up before the job runs
  dependsOn: string
  condition: string
  continueOnError: boolean                # 'true' if future jobs should run even if this job fails; defaults to 'false'
  container: containerReference # container to run this job inside
  services: { string: string | container } # container resources to run as a service container
  timeoutInMinutes: nonEmptyString        # how long to run the job before automatically cancelling
  cancelTimeoutInMinutes: nonEmptyString  # how much time to give 'run always even if cancelled tasks' before killing them
  variables: # several syntaxes, see specific section
  environment: string  # target environment name and optionally a resource name to record the deployment history; format: <environment-name>.<resource-name>
  strategy:
    runOnce:    #rolling, canary are the other strategies that are supported
      deploy:
        steps: [ script | bash | pwsh | powershell | checkout | task | templateReference ]

Ada sintaks alternatif yang lebih terperinci yang juga dapat Anda gunakan untuk environment properti .

environment:
    name: string # Name of environment.
    resourceName: string # Name of resource.
    resourceId: string # Id of resource.
    resourceType: string # Type of environment resource.
    tags: string # List of tag filters.

Untuk komputer virtual, Anda tidak perlu menentukan kumpulan. Setiap langkah yang Anda tentukan dalam pekerjaan penyebaran dengan sumber daya komputer virtual akan berjalan terhadap komputer virtual tersebut dan bukan terhadap agen di kumpulan. Untuk jenis sumber daya lain seperti Kubernetes, Anda perlu menentukan kumpulan sehingga tugas dapat berjalan pada komputer tersebut.

Strategi penyebaran

Saat Anda menyebarkan pembaruan aplikasi, penting bahwa teknik yang Anda gunakan untuk memberikan pembaruan akan:

  • Aktifkan inisialisasi.
  • Sebarkan pembaruan.
  • Arahkan lalu lintas ke versi yang diperbarui.
  • Uji versi yang diperbarui setelah merutekan lalu lintas.
  • Jika terjadi kegagalan, jalankan langkah-langkah untuk memulihkan ke versi baik terakhir yang diketahui.

Kami mencapai ini dengan menggunakan kait siklus hidup yang dapat menjalankan langkah-langkah selama penyebaran. Setiap kait siklus hidup diselesaikan menjadi pekerjaan agen atau pekerjaan server (atau pekerjaan kontainer atau validasi di masa mendatang), tergantung pada pool atribut . Secara default, kait siklus hidup akan mewarisi yang pool ditentukan oleh deployment pekerjaan.

Pekerjaan penyebaran menggunakan variabel sistem $(Pipeline.Workspace).

Deskripsi kait siklus hidup

preDeploy: Digunakan untuk menjalankan langkah-langkah yang menginisialisasi sumber daya sebelum penyebaran aplikasi dimulai.

deploy: Digunakan untuk menjalankan langkah-langkah yang menyebarkan aplikasi Anda. Tugas unduh artefak akan disuntikkan secara otomatis hanya di deploy hook untuk pekerjaan penyebaran. Untuk berhenti mengunduh artefak, gunakan - download: none atau pilih artefak tertentu untuk diunduh dengan menentukan tugas Unduh Artefak Alur.

routeTraffic: Digunakan untuk menjalankan langkah-langkah yang melayani lalu lintas ke versi yang diperbarui.

postRouteTraffic: Digunakan untuk menjalankan langkah-langkah setelah lalu lintas dirutekan. Biasanya, tugas-tugas ini memantau kesehatan versi yang diperbarui untuk interval yang ditentukan.

on: failure atau on: success: Digunakan untuk menjalankan langkah-langkah untuk tindakan putar kembali atau pembersihan.

Strategi penyebaran RunOnce

runOnce adalah strategi penyebaran paling sederhana di mana semua kait siklus hidup, yaitu preDeploy deploy, , routeTrafficdan postRouteTraffic, dijalankan sekali. Lalu, baik on: success maupun on: failure atau dijalankan.

strategy: 
    runOnce:
      preDeploy:        
        pool: [ server | pool ] # See pool schema.        
        steps:
        - script: [ script | bash | pwsh | powershell | checkout | task | templateReference ]
      deploy:          
        pool: [ server | pool ] # See pool schema.        
        steps:
        ...
      routeTraffic:         
        pool: [ server | pool ]         
        steps:
        ...        
      postRouteTraffic:          
        pool: [ server | pool ]        
        steps:
        ...
      on:
        failure:         
          pool: [ server | pool ]           
          steps:
          ...
        success:          
          pool: [ server | pool ]           
          steps:
          ...

Jika Anda menggunakan agen yang dihost sendiri, Anda dapat menggunakan opsi bersih ruang kerja untuk membersihkan ruang kerja penyebaran Anda.

  jobs:
  - deployment: MyDeploy
    pool:
      vmImage: 'ubuntu-latest'
    workspace:
      clean: all
    environment: staging

Strategi penyebaran bergulir

Penyebaran bergulir menggantikan instans versi aplikasi sebelumnya dengan instans versi baru aplikasi pada sekumpulan komputer virtual tetap (set bergulir) di setiap iterasi.

Saat ini kami hanya mendukung strategi bergulir ke sumber daya VM.

Misalnya, penyebaran bergulir biasanya menunggu penyebaran pada setiap set komputer virtual selesai sebelum melanjutkan ke serangkaian penyebaran berikutnya. Anda dapat melakukan pemeriksaan kesehatan setelah setiap perulangan dan jika masalah signifikan terjadi, penyebaran bergulir dapat dihentikan.

Penyebaran bergulir dapat dikonfigurasi dengan menentukan kata kunci rolling: di bawah simpul strategy: . Variabel strategy.name tersedia dalam blok strategi ini, yang mengambil nama strategi. Dalam hal ini, bergulir.

strategy:
  rolling:
    maxParallel: [ number or percentage as x% ]
    preDeploy:        
      steps:
      - script: [ script | bash | pwsh | powershell | checkout | task | templateReference ]
    deploy:          
      steps:
      ...
    routeTraffic:         
      steps:
      ...        
    postRouteTraffic:          
      steps:
      ...
    on:
      failure:         
        steps:
        ...
      success:          
        steps:
        ...

Semua kait siklus hidup didukung dan pekerjaan kait siklus hidup dibuat untuk dijalankan pada setiap VM.

preDeploy, , deployrouteTraffic, dan postRouteTraffic dijalankan sekali per ukuran batch yang ditentukan oleh maxParallel. Lalu, baik on: success maupun on: failure atau dijalankan.

Dengan maxParallel: <# or % of VMs>, Anda dapat mengontrol jumlah/persentase target komputer virtual untuk disebarkan secara paralel. Ini memastikan bahwa aplikasi berjalan pada komputer ini dan mampu menangani permintaan saat penyebaran berlangsung di komputer lainnya, yang mengurangi waktu henti keseluruhan.

Catatan

Terdapat beberapa celah yang diketahui dalam fitur ini. Misalnya, ketika Anda mencoba kembali suatu tahap, penyebaran akan dieksekusi kembali pada semua mesin virtual bukan hanya target yang gagal.

Strategi penyebaran kenari

Strategi penyebaran Kenari adalah strategi penyebaran tingkat lanjut yang membantu mengurangi risiko yang terlibat dalam meluncurkan versi aplikasi baru. Dengan menggunakan strategi ini, Anda dapat meluncurkan perubahan ke sebagian kecil server terlebih dahulu. Saat Anda semakin percaya diri dengan versi baru, Anda dapat merilisnya ke lebih banyak server di infrastruktur Anda dan mengarahkan lebih banyak lalu lintas ke sana.

strategy: 
    canary:
      increments: [ number ]
      preDeploy:        
        pool: [ server | pool ] # See pool schema.        
        steps:
        - script: [ script | bash | pwsh | powershell | checkout | task | templateReference ]
      deploy:          
        pool: [ server | pool ] # See pool schema.        
        steps:
        ...
      routeTraffic:         
        pool: [ server | pool ]         
        steps:
        ...        
      postRouteTraffic:          
        pool: [ server | pool ]        
        steps:
        ...
      on:
        failure:         
          pool: [ server | pool ]           
          steps:
          ...
        success:          
          pool: [ server | pool ]           
          steps:
          ...

Strategi penyebaran kenari mendukung preDeploy kait siklus hidup (dijalankan sekali) dan melakukan iterasi dengan deploykait siklus hidup , , routeTrafficdan postRouteTraffic . Kemudian keluar dengan kait success atau failure .

Variabel berikut tersedia dalam strategi ini:

strategy.name: Nama strategi. Misalnya, kenari.
strategy.action: Tindakan yang akan dilakukan pada kluster Kubernetes. Misalnya, menyebarkan, mempromosikan, atau menolak.
strategy.increment: Nilai kenaikan yang digunakan dalam interaksi saat ini. Variabel ini hanya tersedia di deploykait siklus hidup , routeTraffic, dan postRouteTraffic .

Contoh

Strategi penyebaran RunOnce

Contoh cuplikan YAML berikut menampilkan penggunaan sederhana pekerjaan penyebaran dengan menggunakan runOnce strategi penyebaran. Contohnya mencakup langkah checkout.


jobs:
  # Track deployments on the environment.
- deployment: DeployWeb
  displayName: deploy Web App
  pool:
    vmImage: 'ubuntu-latest'
  # Creates an environment if it doesn't exist.
  environment: 'smarthotel-dev'
  strategy:
    # Default deployment strategy, more coming...
    runOnce:
      deploy:
        steps:
        - checkout: self 
        - script: echo my first deployment

Dengan setiap eksekusi pekerjaan ini, riwayat penyebaran dicatat terhadap smarthotel-dev lingkungan.

Catatan

  • Anda juga dapat membuat lingkungan dengan sumber daya kosong dan menggunakannya sebagai shell abstrak untuk merekam riwayat penyebaran, seperti yang ditunjukkan pada contoh sebelumnya.

Contoh berikutnya menunjukkan bagaimana alur dapat merujuk lingkungan dan sumber daya yang akan digunakan sebagai target untuk pekerjaan penyebaran.

jobs:
- deployment: DeployWeb
  displayName: deploy Web App
  pool:
    vmImage: 'ubuntu-latest'
  # Records deployment against bookings resource - Kubernetes namespace.
  environment: 'smarthotel-dev.bookings'
  strategy: 
    runOnce:
      deploy:
        steps:
          # No need to explicitly pass the connection details.
        - task: KubernetesManifest@0
          displayName: Deploy to Kubernetes cluster
          inputs:
            action: deploy
            namespace: $(k8sNamespace)
            manifests: |
              $(System.ArtifactsDirectory)/manifests/*
            imagePullSecrets: |
              $(imagePullSecret)
            containers: |
              $(containerRegistry)/$(imageRepository):$(tag)

Pendekatan ini memiliki manfaat berikut:

  • Merekam riwayat penyebaran pada sumber daya tertentu dalam lingkungan, dibandingkan dengan merekam riwayat pada semua sumber daya dalam lingkungan.
  • Langkah-langkah dalam pekerjaan penyebaran secara otomatis mewarisi detail koneksi sumber daya (dalam hal ini, namespace Layanan Kubernetes, smarthotel-dev.bookings), karena pekerjaan penyebaran ditautkan ke lingkungan. Ini berguna dalam kasus di mana detail koneksi yang sama diatur untuk beberapa langkah pekerjaan.

Catatan

Jika Anda menggunakan kluster AKS privat, pastikan Anda terhubung ke jaringan virtual kluster karena titik akhir server API tidak diekspos melalui alamat IP publik.

Azure Pipelines merekomendasikan untuk menyiapkan agen yang dihost sendiri dalam VNET yang memiliki akses ke jaringan virtual kluster. Lihat Opsi untuk menyambungkan ke kluster privat untuk detailnya.

Strategi penyebaran bergulir

Strategi bergulir untuk VM memperbarui hingga lima target di setiap iterasi. maxParallel akan menentukan jumlah target yang dapat disebarkan, secara paralel. Pilihan memperhitungkan jumlah mutlak atau persentase target yang harus tetap tersedia setiap saat tidak termasuk target yang disebarkan. Pilihan ini juga digunakan untuk menentukan kondisi keberhasilan dan kegagalan selama penyebaran.

jobs: 
- deployment: VMDeploy
  displayName: web
  environment:
    name: smarthotel-dev
    resourceType: VirtualMachine
  strategy:
    rolling:
      maxParallel: 5  #for percentages, mention as x%
      preDeploy:
        steps:
        - download: current
          artifact: drop
        - script: echo initialize, cleanup, backup, install certs
      deploy:
        steps:
        - task: IISWebAppDeploymentOnMachineGroup@0
          displayName: 'Deploy application to Website'
          inputs:
            WebSiteName: 'Default Web Site'
            Package: '$(Pipeline.Workspace)/drop/**/*.zip'
      routeTraffic:
        steps:
        - script: echo routing traffic
      postRouteTraffic:
        steps:
        - script: echo health check post-route traffic
      on:
        failure:
          steps:
          - script: echo Restore from backup! This is on failure
        success:
          steps:
          - script: echo Notify! This is on success

Strategi penyebaran kenari

Dalam contoh berikutnya, strategi kenari untuk AKS akan terlebih dahulu menyebarkan perubahan dengan 10 persen pod, diikuti oleh 20 persen, sambil memantau kesehatan selama postRouteTraffic. Jika semua berjalan dengan baik, itu akan mempromosikan hingga 100 persen.

jobs: 
- deployment: 
  environment: smarthotel-dev.bookings
  pool: 
    name: smarthotel-devPool
  strategy:                  
    canary:      
      increments: [10,20]  
      preDeploy:                                     
        steps:           
        - script: initialize, cleanup....   
      deploy:             
        steps: 
        - script: echo deploy updates... 
        - task: KubernetesManifest@0 
          inputs: 
            action: $(strategy.action)       
            namespace: 'default' 
            strategy: $(strategy.name) 
            percentage: $(strategy.increment) 
            manifests: 'manifest.yml' 
      postRouteTraffic: 
        pool: server 
        steps:           
        - script: echo monitor application health...   
      on: 
        failure: 
          steps: 
          - script: echo clean-up, rollback...   
        success: 
          steps: 
          - script: echo checks passed, notify... 

Menggunakan dekorator alur untuk menyuntikkan langkah-langkah secara otomatis

Dekorator alur dapat digunakan dalam pekerjaan penyebaran untuk secara otomatis menyuntikkan langkah kustom apa pun (misalnya, pemindai kerentanan) ke setiap eksekusi kait siklus hidup setiap pekerjaan penyebaran. Karena dekorator alur dapat diterapkan ke semua alur dalam organisasi, ini dapat diterapkan sebagai bagian dari memberlakukan praktik penyebaran yang aman.

Selain itu, pekerjaan penyebaran dapat dijalankan sebagai pekerjaan kontainer bersama dengan layanan side-car jika ditentukan.

Dukungan untuk variabel output

Tentukan variabel output dalam kait siklus hidup pekerjaan penyebaran dan gunakan dalam langkah dan pekerjaan hilir lainnya dalam tahap yang sama.

Untuk berbagi variabel antar tahap, keluarkan artefak dalam satu tahap lalu gunakan dalam tahap berikutnya, atau gunakan stageDependencies sintaks yang dijelaskan dalam variabel.

Saat menjalankan strategi penyebaran, Anda dapat mengakses variabel output di seluruh pekerjaan dengan menggunakan sintaks berikut.

  • Untuk strategi runOnce : $[dependencies.<job-name>.outputs['<job-name>.<step-name>.<variable-name>']] (misalnya, $[dependencies.JobA.outputs['JobA.StepA.VariableA']])
  • Untuk strategi runOnce ditambah resourceType: $[dependencies.<job-name>.outputs['Deploy_<resource-name>.<step-name>.<variable-name>']]. (Contohnya, $[dependencies.JobA.outputs['Deploy_VM1.StepA.VariableA']])
  • Untuk strategi canary : $[dependencies.<job-name>.outputs['<lifecycle-hookname>_<increment-value>.<step-name>.<variable-name>']]
  • Untuk strategi bergulir : $[dependencies.<job-name>.outputs['<lifecycle-hookname>_<resource-name>.<step-name>.<variable-name>']]
# Set an output variable in a lifecycle hook of a deployment job executing canary strategy.
- deployment: A
  pool:
    vmImage: 'ubuntu-latest'
  environment: staging
  strategy:                  
    canary:      
      increments: [10,20]  # Creates multiple jobs, one for each increment. Output variable can be referenced with this.
      deploy:
        steps:
        - bash: echo "##vso[task.setvariable variable=myOutputVar;isOutput=true]this is the deployment variable value"
          name: setvarStep
        - bash: echo $(setvarStep.myOutputVar)
          name: echovar

# Map the variable from the job.
- job: B
  dependsOn: A
  pool:
    vmImage: 'ubuntu-latest'
  variables:
    myVarFromDeploymentJob: $[ dependencies.A.outputs['deploy_10.setvarStep.myOutputVar'] ]
  steps:
  - script: "echo $(myVarFromDeploymentJob)"
    name: echovar

runOnce Untuk pekerjaan, tentukan nama pekerjaan alih-alih kait siklus hidup:

# Set an output variable in a lifecycle hook of a deployment job executing runOnce strategy.
- deployment: A
  pool:
    vmImage: 'ubuntu-latest'
  environment: staging
  strategy:                  
    runOnce:
      deploy:
        steps:
        - bash: echo "##vso[task.setvariable variable=myOutputVar;isOutput=true]this is the deployment variable value"
          name: setvarStep
        - bash: echo $(setvarStep.myOutputVar)
          name: echovar

# Map the variable from the job.
- job: B
  dependsOn: A
  pool:
    vmImage: 'ubuntu-latest'
  variables:
    myVarFromDeploymentJob: $[ dependencies.A.outputs['A.setvarStep.myOutputVar'] ]
  steps:
  - script: "echo $(myVarFromDeploymentJob)"
    name: echovar

Saat Anda menentukan lingkungan dalam pekerjaan penyebaran, sintaks variabel output bervariasi tergantung pada bagaimana lingkungan ditentukan. Dalam contoh ini, env1 menggunakan notasi singkat dan env2 menyertakan sintaks penuh dengan jenis sumber daya yang ditentukan.

stages:
- stage: StageA
  jobs:
  - deployment: A1
    pool:
      vmImage: 'ubuntu-latest'
    environment: env1
    strategy:                  
      runOnce:
        deploy:
          steps:
          - bash: echo "##vso[task.setvariable variable=myOutputVar;isOutput=true]this is the deployment variable value"
            name: setvarStep
          - bash: echo $(System.JobName)
  - deployment: A2
    pool:
      vmImage: 'ubuntu-latest'
    environment: 
      name: env2
      resourceName: vmsfortesting
      resourceType: virtualmachine
    strategy:                  
      runOnce:
        deploy:
          steps:
          - script: echo "##vso[task.setvariable variable=myOutputVarTwo;isOutput=true]this is the second deployment variable value"
            name: setvarStepTwo
  
  - job: B1
    dependsOn: A1
    pool:
      vmImage: 'ubuntu-latest'
    variables:
      myVarFromDeploymentJob: $[ dependencies.A1.outputs['A1.setvarStep.myOutputVar'] ]
      
    steps:
    - script: "echo $(myVarFromDeploymentJob)"
      name: echovar
 
  - job: B2
    dependsOn: A2
    pool:
      vmImage: 'ubuntu-latest'
    variables:
      myVarFromDeploymentJob: $[ dependencies.A2.outputs['A2.setvarStepTwo.myOutputVarTwo'] ]
      myOutputVarTwo: $[ dependencies.A2.outputs['Deploy_vmsfortesting.setvarStepTwo.myOutputVarTwo'] ]
    
    steps:
    - script: "echo $(myOutputVarTwo)"
      name: echovartwo

Saat Anda mengeluarkan variabel dari pekerjaan di tahap pertama, merujuknya dari pekerjaan penyebaran pada tahap berikutnya menggunakan sintaks yang berbeda tergantung pada apakah Anda ingin mengatur variabel atau menggunakannya sebagai kondisi untuk tahap tersebut.

stages:
- stage: StageA
  jobs:
  - job: A1
    steps:
      - pwsh: echo "##vso[task.setvariable variable=RunStageB;isOutput=true]true"
        name: setvarStep
      - bash: echo $(System.JobName)

- stage: StageB
  dependsOn: 
    - StageA
 
  # when referring to another stage, stage name is included in variable path
  condition: eq(dependencies.StageA.outputs['A1.setvarStep.RunStageB'], 'true')
  
  # Variables reference syntax differs slightly from inter-stage condition syntax
  variables:
    myOutputVar: $[stageDependencies.StageA.A1.outputs['setvarStep.RunStageB']]
  jobs:
  - deployment: B1
    pool:
      vmImage: 'ubuntu-latest'
    environment: envB
    strategy:                  
      runOnce:
        deploy:
          steps:
          - bash: echo $(myOutputVar)

Saat Anda mengeluarkan variabel dari pekerjaan penyebaran, gunakan sintaksis stageDependencies untuk mereferensikannya dari tahap berikutnya (misalnya, $[stageDependencies.<stage-name>.<job-name>.outputs[Deploy_<resource-name>.<step-name>.<variable-name>]]).

stages:
- stage: StageA
  jobs:
    - deployment: A1
      environment: 
        name:  env1
        resourceName: DevEnvironmentV
        resourceType: virtualMachine
      strategy:
        runOnce:
          deploy:
            steps:
              - script: echo "##vso[task.setvariable variable=myVar;isOutput=true]true"
                name: setvarStep
              - script: |
                  echo "Value of myVar in the same Job : $(setVarStep.myVar)"
                displayName: 'Verify variable in StageA'
- stage: StageB
  dependsOn: StageA

  # Full Variables syntax for inter-stage jobs
  variables:
    myOutputVar: $[stageDependencies.StageA.A1.outputs['Deploy_DevEnvironmentV.setvarStep.myVar']]
  jobs:
  - deployment: B1
    pool:
      vmImage: 'ubuntu-latest'
    environment: envB
    strategy:                  
      runOnce:
        deploy:
          steps:
          - bash: echo $(myOutputVar)

Pelajari selengkapnya tentang cara mengatur variabel output multi-pekerjaan

FAQ

Alur saya terjebak dengan pesan "Pekerjaan tertunda...". Bagaimana aku bisa memperbaiki ini?

Ini dapat terjadi ketika ada konflik nama antara dua pekerjaan. Verifikasi bahwa pekerjaan penyebaran apa pun dalam tahap yang sama memiliki nama yang unik dan nama pekerjaan dan tahapan tersebut tidak berisi kata kunci. Jika penggantian nama tidak memperbaiki masalah, tinjau pemecahan masalah eksekusi alur.

Apakah dekorator didukung dalam grup penyebaran?

Tidak. Anda tidak dapat menggunakan dekorator dalam grup penyebaran.