Dağıtım işleri
Azure Pipelines | Azure DevOps Server 2020
Önemli
- İş ve aşama adları anahtar sözcükler içeremez (örnek:
deployment). - Bir aşamadaki her iş benzersiz bir ada sahip olmalıdır.
YAML işlem hatları içinde, dağıtım adımlarınızı dağıtım işi olarak adlandırılan özel bir iş türüne koymanız önerilir. Dağıtım işi, ortama göre sırayla çalıştırılan adımlardan oluşan bir koleksiyondur. Aynı aşamada bir dağıtım işi ve geleneksel bir iş bulunabilir.
Dağıtım işleri aşağıdaki avantajları sağlar:
Dağıtım geçmişi: dağıtım geçmişini belirli bir kaynağa ve denetim için dağıtımların durumuna göre işlem hatları genelinde alırsınız.
Dağıtım stratejisini Uygula: uygulamanızın nasıl kullanıma alınacağını tanımlarsınız.
Not
Şu anda yalnızca runOnce, yuvarlamave kanarya stratejilerini destekliyoruz.
Dağıtım işi, kaynak depoyu otomatik olarak klonmaz. İş içindeki kaynak depoyu ile kullanıma alabilirsiniz checkout: self . Dağıtım işleri yalnızca bir kullanıma alma adımını destekler.
Şema
Dağıtım işini belirten tam sözdizimi aşağıda verilmiştir:
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 ]
Özelliği için de kullanabileceğiniz daha ayrıntılı, alternatif bir sözdizimi vardır environment .
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.
Sanal makineler için bir havuz tanımlamanız gerekmez. Bir sanal makine kaynağıyla bir dağıtım işinde tanımladığınız tüm adımlar, havuzdaki aracıya karşı değil, bu sanal makineye karşı çalışır. Kubernetes gibi diğer kaynak türleri için, görevlerin bu makinede çalışabilmesi için bir havuz tanımlamanız gerekir.
Dağıtım stratejileri
Uygulama güncelleştirmelerini dağıttığınızda, güncelleştirmeyi teslim etmek için kullandığınız tekniğin şunları gerçekleştirmeleri önemlidir:
- Başlatmayı etkinleştirin.
- Güncelleştirmeyi dağıtın.
- Trafiği güncelleştirilmiş sürüme yönlendirin.
- Trafiği yönlendirdikten sonra güncelleştirilmiş sürümü test edin.
- Hata durumunda, bilinen son iyi sürüme geri yüklemek için adımları çalıştırın.
Bu, dağıtım sırasında adımları çalıştırabildiğiniz yaşam döngüsü kancalarını kullanarak elde ediyoruz. Yaşam döngüsünün her biri, özniteliğe bağlı olarak bir aracı işine veya bir sunucu işine (ya da gelecekte bir kapsayıcı veya doğrulama işine) çözümlenir . Varsayılan olarak, yaşam döngüsü kancaları pool iş tarafından belirtilen öğesini alır deployment .
Dağıtım işleri $(Pipeline.Workspace) sistem değişkenini kullanır.
Yaşam döngüsü kancalarının açıklamaları
preDeploy: Uygulama dağıtımı başlamadan önce kaynakları başlatacak adımları çalıştırmak için kullanılır.
deploy: Uygulamanızı dağıtan adımları çalıştırmak için kullanılır. Yapıtı indirme görevi yalnızca deploy dağıtım işleri için kanca içine otomatik olarak eklenir. Yapıtları indirmeyi durdurmak için, indirme işlem - download: none- download: nonebelirterek, indirmek üzere belirli yapıtları kullanın veya seçin.
routeTraffic: Trafiği güncelleştirilmiş sürüme sunan adımları çalıştırmak için kullanılır.
postRouteTraffic: Trafik yönlendirildikten sonra adımları çalıştırmak için kullanılır. Genellikle, bu görevler tanımlı Aralık için güncelleştirilmiş sürümün sistem durumunu izler.
on: failure ya da on: success : geri alma eylemleri veya temizleme adımlarını çalıştırmak için kullanılır.
RunOnce dağıtım stratejisi
runOnce, ve gibi tüm yaşam döngüsü preDeploydeployrouteTrafficpostRouteTraffic kancalarının bir kez yürütüldüğü en basit dağıtım stratejisidir. Ardından, ya da on:successon:failure yürütülür.
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:
...
Şirket içinde barındırılan aracılar kullanıyorsanız, dağıtım çalışma alanınızı temizlemek için çalışma alanı temizleme seçeneklerini kullanabilirsiniz.
jobs:
- deployment: deploy
pool:
vmImage: 'ubuntu-latest'
workspace:
clean: all
environment: staging
Sıralı dağıtım stratejisi
Sıralı dağıtım, bir uygulamanın önceki sürümünün örneklerini, her yinelemede sabit bir sanal makine kümesindeki (sıralı küme) uygulamanın yeni sürümünün örneklerine koyar.
Şu anda yalnızca VM kaynaklarına yönelik çalışırken strateji destekliyoruz.
Örneğin, sıralı bir dağıtım tipik olarak her bir sanal makine kümesindeki dağıtımların bir sonraki dağıtım kümesine geçmeden önce tamamlanmasını bekler. Her yinelemeden sonra bir sistem durumu denetimi yapabilirsiniz ve önemli bir sorun oluşursa, sıralı dağıtım durdurulabilir.
Sıralı dağıtımlar, düğüm altındaki anahtar sözcüğü belirtilerek yapılandırılabilir rolling:strategy: .
strategy.nameDeğişken, stratejinin adını alan bu strateji bloğunda mevcuttur. Bu durumda, yuvarlama.
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:
...
Tüm yaşam döngüsü kancaları desteklenir ve yaşam döngüsü kancası işleri her bir VM 'de çalışacak şekilde oluşturulur.
preDeploy, deploy , routeTraffic ve, postRouteTraffic tarafından tanımlanan toplu iş boyutu başına bir kez yürütülür maxParallel .
Ardından, ya on: success da on: failure yürütülür.
İle maxParallel: <# or % of VMs> , ' ye dağıtılacak sanal makine hedeflerinin sayısını/yüzdesini paralel olarak kontrol edebilirsiniz. Bu, uygulamanın bu makinelerde çalıştırılmasını sağlar ve dağıtım, makinelerin geri kalanı üzerinde gerçekleşirken istekleri işleyebilir ve bu da genel kapalı kalma süresini azaltır.
Not
Bu özellikte bazı bilinen boşluklar vardır. Örneğin, bir aşamayı yeniden denediğinizde, yalnızca başarısız olan hedefleri olmayan tüm VM 'lerde dağıtımı yeniden çalıştırır.
Kanarya dağıtımı stratejisi
Canary dağıtım stratejisi, uygulamaların yeni sürümlerini kullanıma alma riskini azaltmaya yardımcı olan gelişmiş bir dağıtım stratejisidir. Bu stratejiyi kullanarak, öncelikle sunucuların küçük bir alt kümesine yapılan değişiklikleri dağıtabilirsiniz. Yeni sürüme daha fazla güven kazandığınızda, altyapınızdaki daha fazla sunucuya serbest bırakabilir ve buna daha fazla trafik yönlendirebilirsiniz.
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:
...
Canary dağıtım stratejisi preDeploy yaşam döngüsü kancasını (bir kez yürütülür) destekler ve deploy , routeTraffic ve postRouteTraffic yaşam döngüsü kancalarını kullanarak yinelenir. Sonra ya da Hook ile çıkar successfailure .
Bu stratejide aşağıdaki değişkenler mevcuttur:
strategy.name: Stratejinin adı. Örneğin, Canary.
strategy.action: Kubernetes kümesinde gerçekleştirilecek eylem. Örneğin, dağıtın, yükseltin veya reddedin.
strategy.increment: Geçerli etkileşime göre kullanılan artış değeri. Bu değişken yalnızca deploy , routeTraffic ve postRouteTraffic yaşam döngüsü kancalarında kullanılabilir.
Örnekler
RunOnce dağıtım stratejisi
Aşağıdaki örnek YAML kod parçacığı, dağıtım stratejisini kullanarak bir dağıtım işinin basit bir kullanımını gösterir runOnce . Örnek, bir kullanıma alma adımı içerir.
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
Bu işin her çalıştırılmasındaki dağıtım geçmişi ortama göre kaydedilir smarthotel-dev .
Not
- Ayrıca, boş kaynaklarla bir ortam oluşturmak ve bunu önceki örnekte gösterildiği gibi dağıtım geçmişini kaydetmek için soyut bir kabuk olarak kullanmak da mümkündür.
Sonraki örnekte, bir işlem hattının bir dağıtım işi için hedef olarak kullanılacak bir ortamı ve kaynağı nasıl başvurabileceği gösterilmektedir.
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)
Bu yaklaşım aşağıdaki avantajlara sahiptir:
- Ortamın içindeki tüm kaynakların geçmişini kaydetme aksine, ortam içindeki belirli bir kaynaktaki dağıtım geçmişini kaydeder.
- Dağıtım işi ortama bağlı olduğundan, Dağıtım işindeki adımlar kaynağın bağlantı ayrıntılarını (Bu durumda bir Kubernetes ad alanı) otomatik olarak alır . Bu, işin birden çok adımı için aynı bağlantı ayrıntılarının ayarlandığı durumlarda faydalıdır.
Sıralı dağıtım stratejisi
VM 'Lerin sıralı stratejisi, her yinelemede beş hedefe kadar güncelleştirilir. maxParallel , paralel olarak, öğesine dağıtılabilecek hedef sayısını tespit eder. Dağıtım yapılan hedefleri dışlayarak herhangi bir zamanda kullanılabilir kalması gereken mutlak sayı veya hedef yüzdesi için seçim hesapları. Dağıtım sırasında başarı ve başarısızlık koşullarını tespit etmek için de kullanılır.
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
Kanarya dağıtımı stratejisi
Bir sonraki örnekte, aks için kanarya stratejisi, ilk olarak değişiklikleri yüzde 20 oranında dağıtarak, sonrasında sistem durumunu izlerken yüzde 20 oranında bir dağıtım yapar postRouteTraffic . Hepsi iyi gitse, yüzde 100 ' a yükseltilecektir.
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...
Adımları otomatik olarak eklemek için işlem hattı dekoratlarını kullanın
Ardışık düzen Dekoratörleri , dağıtım işlerinde, her dağıtım işinin her yaşam döngüsü kancasını yürütmeye yönelik herhangi bir özel adımı (örneğin, güvenlik açığı tarayıcısı) otomatik olarak eklemek için kullanılabilir. Ardışık düzen Dekoratörleri bir kuruluştaki tüm işlem hatlarına uygulanamadığından, bu, güvenli dağıtım uygulamalarının zorlanmasının bir parçası olarak yararlanılabilir olabilir.
Ayrıca dağıtım işleri, tanımlandığı sürece hizmetler yan araba ile birlikte bir kapsayıcı işi olarak çalıştırabilirsiniz.
Çıkış değişkenleri desteği
Dağıtım işinin yaşam döngüsü kancalarında çıkış değişkenlerini tanımlayın ve bunları aynı aşamadaki diğer aşağı akış adımlarında ve işlerde kullanın.
Aşamaların arasında değişkenleri paylaşmak için bir aşamada bir yapıt çıktısı kullanın ve sonraki bir aşamada kullanın veya değişkenlerinde açıklanan söz dizimlerini kullanın.
Dağıtım stratejilerini yürütürken, aşağıdaki sözdizimini kullanarak işler arasında çıkış değişkenlerine erişebilirsiniz.
- RunOnce stratejisi için: (örneğin,
$[dependencies.JobA.outputs['Deploy.StepA.VariableA']]) - RunOnce stratejisi ve resourceType için: . (örneğin,
$[dependencies.JobA.outputs['Deploy_VM1.StepA.VariableA']]) - Canary stratejisi için:
- Kayan strateji için:
# 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
Bir runOnce iş için, yaşam döngüsü kancası yerine işin adını belirtin:
# 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
Bir dağıtım işi içinde ortam tanımladığınız zaman, çıkış değişkeninin söz dizimi ortamın nasıl tanımlandığına bağlı olarak değişir. Bu örnekte, env1 kısa nota kullanır ve env2 tanımlı bir kaynak türü ile tam söz dizimi içerir.
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
Bir dağıtım işinden bir değişken çıkışını 0,000.000.000.000,000.000,000,000,000,00000000000000000000000000000000000000000000000000000000000000000000
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)
Çok işli çıkış değişkeni ayarlama hakkında daha fazla bilgi
SSS
İşlem hattım "İş bekliyor..." iletisiyle takıldı. Bunu nasıl düzeltebilirim?
İki iş arasında bir ad çakışması olduğunda bu durum olabilir. Aynı aşamadaki dağıtım işlerinin benzersiz bir adına sahip olduğunu ve iş ve aşama adlarının anahtar sözcük içere olmadığını doğrulayın. Yeniden ifade etmek sorunu çözemezse işlem hattı çalıştırma sorunlarını gidermeyi gözden geçirebilirsiniz.
Dekoratörler dağıtım gruplarında desteklensin mi?
Hayır. Dağıtım gruplarında dekoratörleri kullanamalısınız.