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
, , routeTraffic
dan 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
, , deploy
routeTraffic
, 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 deploy
kait siklus hidup , , routeTraffic
dan 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 deploy
kait 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.