Pekerjaan penyebaran
| Layanan Azure DevOps Azure DevOps Server 2020
Penting
- Nama pekerjaan dan panggung tidak dapat berisi kata kunci (contoh:
deployment). - Setiap pekerjaan dalam suatu 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.
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.
Catatan
Saat ini kami hanya mendukung runOnce, rolling, dan strategi kenari .
Pekerjaan penyebaran tidak secara otomatis mengkloning repo sumber. Anda dapat checkout repo sumber dalam pekerjaan Anda dengan checkout: self. Pekerjaan penyebaran hanya mendukung satu langkah checkout.
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 rinci 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 mesin virtual, Anda tidak perlu menentukan kumpulan. Setiap langkah yang Anda tentukan dalam pekerjaan penyebaran dengan sumber daya mesin virtual akan bertentangan dengan mesin virtual itu dan bukan terhadap agen di kumpulan. Untuk jenis sumber daya lain seperti Kubernetes, Anda perlu menentukan kumpulan sehingga tugas dapat berjalan di mesin itu.
Strategi penyebaran
Saat Anda menerapkan pembaruan aplikasi, penting bahwa teknik yang Anda gunakan untuk memberikan pembaruan akan:
- Aktifkan inisialisasi.
- Sebarkan pembaruan.
- Merutekan lalu lintas ke versi yang diperbarui.
- Uji versi yang diperbarui setelah lalu lintas perutean.
- Jika terjadi kegagalan, jalankan langkah-langkah untuk memulihkan ke versi bagus terakhir yang diketahui.
Kami mencapai ini dengan menggunakan kait siklus hidup yang dapat menjalankan langkah-langkah selama penyebaran. Masing-masing kait siklus hidup diselesaikan menjadi pekerjaan agen atau pekerjaan server (atau pekerjaan kontainer atau validasi di masa depan), tergantung pada atributnya pool . Secara default, kait siklus hidup akan mewarisi yang pool ditentukan oleh deployment pekerjaan.
Pekerjaan penyebaran menggunakan $(Pipeline.Workspace) variabel sistem.
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 dialihkan. 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 rollback atau pembersihan.
Strategi penyebaran RunOnce
runOnce adalah strategi penyebaran paling sederhana di mana semua kait siklus hidup, yaitu preDeploydeploy, , routeTrafficdan postRouteTraffic, dijalankan sekali. Kemudian, baik on:success atau on:failure dieksekusi.
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 dihosting sendiri, Anda dapat menggunakan opsi pembersihan 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 instance dari versi aplikasi sebelumnya dengan contoh versi baru aplikasi pada satu set mesin virtual tetap (rolling set) di setiap iterasi.
Saat ini kami hanya mendukung strategi bergulir ke sumber daya VM.
Misalnya, penyebaran bergulir biasanya menunggu penyebaran pada setiap set mesin virtual selesai sebelum melanjutkan ke set penyebaran berikutnya. Anda dapat melakukan pemeriksaan kesehatan setelah setiap iterasi dan jika terjadi masalah signifikan, penyebaran bergulir dapat dihentikan.
Penyebaran bergulir dapat dikonfigurasi dengan menentukan kata kunci rolling: di strategy: bawah simpul.
Variabel strategy.name tersedia di 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 berjalan di setiap VM.
preDeploy, deploy, , routeTrafficdan postRouteTraffic dijalankan sekali per ukuran batch yang ditentukan oleh maxParallel.
Kemudian, baik on: success atau on: failure dieksekusi.
Dengan maxParallel: <# or % of VMs>, Anda dapat mengontrol jumlah / persentase target mesin virtual untuk disebarkan secara paralel. Ini memastikan bahwa aplikasi berjalan pada mesin-mesin ini dan mampu menangani permintaan saat penyebaran berlangsung di seluruh mesin, yang mengurangi waktu henti secara keseluruhan.
Catatan
Ada beberapa celah yang diketahui dalam fitur ini. Misalnya, saat Anda mencoba kembali sebuah tahap, itu akan menjalankan kembali penyebaran di semua VM bukan hanya target yang gagal.
Strategi penyebaran kenari
Strategi penyebaran Canary adalah strategi penyebaran lanjutan yang membantu mengurangi risiko yang terlibat dalam meluncurkan versi aplikasi baru. Dengan menggunakan strategi ini, Anda dapat meluncurkan perubahan ke subset kecil server terlebih dahulu. Ketika Anda mendapatkan lebih banyak kepercayaan pada versi baru, Anda dapat merilisnya ke lebih banyak server di infrastruktur Anda dan merutekan 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 canary mendukung preDeploy kait siklus hidup (dieksekusi sekali) dan iterasi dengan deploykait , , routeTrafficdan postRouteTraffic siklus hidup. Kemudian keluar dengan baik success atau failure hook.
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 dalam deploy, , routeTraffic, dan postRouteTraffic kait siklus hidup.
Contoh
Strategi penyebaran RunOnce
Contoh cuplikan YAML berikut menampilkan penggunaan sederhana dari pekerjaan deploy dengan runOnce menggunakan strategi penyebaran. Contohnya termasuk 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 menjalankan pekerjaan ini, riwayat penyebaran dicatat terhadap smarthotel-dev lingkungan.
Catatan
- Dimungkinkan juga untuk 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 sebagai berikut:
- Mencatat riwayat penyebaran pada sumber daya tertentu dalam lingkungan, sebagai lawan merekam riwayat pada semua sumber daya dalam lingkungan.
- Langkah-langkah dalam pekerjaan penyebaran secara otomatis mewarisi detail koneksi sumber daya (dalam hal ini, namespace Kubernetes,
smarthotel-dev.bookings), karena pekerjaan penyebaran terkait dengan lingkungan. Ini berguna dalam kasus di mana detail koneksi yang sama diatur untuk beberapa langkah pekerjaan.
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 pertama-tama akan menyebarkan perubahan dengan pod 10 persen, diikuti oleh 20 persen, sambil memantau kesehatan selama postRouteTraffic. Jika semuanya berjalan dengan baik, itu akan dipromosikan 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...
Gunakan dekorator alur untuk menyuntikkan langkah secara otomatis
Dekorator alur dapat digunakan dalam pekerjaan penyebaran untuk menyuntikkan secara otomatis langkah kustom apa pun (misalnya, pemindai kerentanan) ke setiap eksekusi kait siklus hidup dari setiap pekerjaan penyebaran. Karena dekorator alur dapat diterapkan ke semua alur dalam organisasi, ini dapat dimanfaatkan sebagai bagian dari penegakan praktik penyebaran yang aman.
Selain itu, pekerjaan penyebaran dapat dijalankan sebagai pekerjaan kontainer bersama dengan layanan side-car jika didefinisikan.
Dukungan untuk variabel output
Tentukan variabel output dalam kait siklus hidup pekerjaan penyebaran dan konsumsi dalam langkah dan pekerjaan hilir lainnya dalam tahap yang sama.
Untuk berbagi variabel antar tahap, output artefak dalam satu tahap dan kemudian mengkonsumsinya dalam tahap berikutnya, atau menggunakan stageDependencies sintaks yang dijelaskan dalam variabel.
Saat menjalankan strategi penyebaran, Anda dapat mengakses variabel output di seluruh pekerjaan menggunakan sintaks berikut.
- Untuk strategi runOnce :
$[dependencies.<job-name>.outputs['<lifecycle-hookname>.<step-name>.<variable-name>']](misalnya,$[dependencies.JobA.outputs['Deploy.StepA.VariableA']]) - Untuk strategi runOnce ditambah resourceType:
$[dependencies.<job-name>.outputs['<lifecycle-hookname>_<resource-name>.<step-name>.<variable-name>']]. (contohnya,$[dependencies.JobA.outputs['Deploy_VM1.StepA.VariableA']]) - Untuk strategi kenari :
$[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
Untuk pekerjaan runOnce , tentukan nama pekerjaan, bukan 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 didefinisikan. Dalam contoh ini, env1 menggunakan notasi singkatan dan env2 menyertakan sintaks lengkap 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
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.myOutputVar'] ]
myOutputVarTwo: $[ dependencies.A2.outputs['Deploy_vmsfortesting.setvarStepTwo.myOutputVarTwo'] ]
steps:
- script: "echo $(myOutputVarTwo)"
name: echovartwo
Saat Anda mengeluarkan variabel dari pekerjaan penyebaran, mereferensikannya dari pekerjaan berikutnya menggunakan sintaks yang berbeda tergantung pada apakah Anda ingin mengatur variabel atau menggunakannya sebagai syarat 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)
Mer informasjon tentang cara mengatur variabel output multi-pekerjaan
FAQ
Alur saya macet dengan pesan "Pekerjaan tertunda ...". Bagaimana aku bisa memperbaiki ini?
Hal ini dapat terjadi ketika ada konflik nama antara dua pekerjaan. Verifikasi bahwa setiap pekerjaan penyebaran pada tahap yang sama memiliki nama yang unik dan bahwa nama pekerjaan dan panggung tidak mengandung kata kunci. Jika penggantian nama tidak memperbaiki masalah, tinjau alur pemecahan masalah berjalan.
Apakah dekorator didukung dalam grup penyebaran?
Nomor. Anda tidak dapat menggunakan dekorator dalam grup penyebaran.