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 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.