在Azure Pipeline中添加条件步骤以回滚Kubernetes部署

pwuypxnk  于 2022-11-17  发布在  Kubernetes
关注(0)|答案(1)|浏览(112)

我有一个Azure管道,它将2个Kubernetes部署(清单文件)部署到AKS。我没有使用HELM,而且在AKS的中间级别。
任务如下所示(由于某些原因,我在单独的任务中一次部署1个文件)

- task: Kubernetes@1
          inputs:
            connectionType: 'Azure Resource Manager'
            azureSubscriptionEndpoint: '$(serviceConnection)'
            azureResourceGroup: 'my-aks-rg'
            kubernetesCluster: 'my-aks'
            command: 'apply'
            arguments: '-f $(Pipeline.Workspace)/drop/manifest_1.yaml --record=true'             
            secretType: 'dockerRegistry'
            containerRegistryType: 'Azure Container Registry'

         - task: Kubernetes@1
          inputs:
            connectionType: 'Azure Resource Manager'
            azureSubscriptionEndpoint: '$(serviceConnection)'
            azureResourceGroup: 'my-aks-rg'
            kubernetesCluster: 'my-aks'
            command: 'apply'
            arguments: '-f $(Pipeline.Workspace)/drop/manifest_2.yaml --record=true'             
            secretType: 'dockerRegistry'
            containerRegistryType: 'Azure Container Registry'

现在的问题是,假设第一个文件部署通过,第二个文件部署失败,那么我就有一个部署了一半的应用程序,如果出现任何失败,我希望将所有部署正常回滚到以前的版本。
我知道K8的回滚命令。

kubectl rollout undo deployment/app1

kubectl rollout undo deployment/app2

如果我将此命令添加为CLI任务,则我不确定如何检测此CLI任务是否仅在管道中的某些操作失败时执行,否则,如果所有步骤均通过,则应忽略并跳过cli任务。
先谢谢你了。

pftdvrlh

pftdvrlh1#

如果在单独的任务中一次部署一个文件。这可以通过自定义条件来实现。指定每个阶段、作业下的条件。在此方案中,我们可以在每个阶段下保留自定义条件。在阶段2,它将验证步骤1的状态,如果任何状态失败,它将自动回滚部署。

stages:
- stage: Stage1
  displayName: Stage 1
  dependsOn: []
  condition: and(contains(variables['build.sourceBranch'], 'refs/heads/main'), succeeded())
  jobs:
  - job: ShowVariables
    displayName: KubernetDeployment1
    steps:
     - task: Kubernetes@1
          inputs:
            connectionType: 'Azure Resource Manager'
            azureSubscriptionEndpoint: '$(serviceConnection)'
            azureResourceGroup: 'my-aks-rg'
            kubernetesCluster: 'my-aks'
            command: 'apply'
            arguments: '-f $(Pipeline.Workspace)/drop/manifest_1.yaml --record=true'             
            secretType: 'dockerRegistry'
            containerRegistryType: 'Azure Container Registry'

- stage: Stage2
  displayName: stage 2
  
  jobs:
  - job: ShowVariables
   dependsOn: Stage1
    condition: eq(dependencies.Stage1.outputs['DetermineResult.doThing'], 'Yes') 
    displayName: KubernetDeployment2
    steps:
    - task: Kubernetes@1
          inputs:
            connectionType: 'Azure Resource Manager'
            azureSubscriptionEndpoint: '$(serviceConnection)'
            azureResourceGroup: 'my-aks-rg'
            kubernetesCluster: 'my-aks'
            command: 'apply'
            arguments: '-f $(Pipeline.Workspace)/drop/manifest_2.yaml --record=true'             
            secretType: 'dockerRegistry'
            containerRegistryType: 'Azure Container Registry'

此部分将验证stage1状态

dependsOn: Stage1
        condition: eq(dependencies.Stage1.outputs['DetermineResult.doThing'], 'Yes')

相关问题