如何在Azure Piplines yaml中添加手动干预步骤

时间:2019-05-16 21:21:53

标签: azure-devops

如何在多阶段Azure Devops YAML管道中添加手动干预步骤?

在詹金斯,您可以执行以下操作:

stage ('approve-prod') {
    steps {
        input "Approve deployment to production?"
    }
}

我正在寻找Azure Devops YAML中的等效项。

注意:这是用于新发布的多阶段Azure Devops管道,而不是旧式发布管道。 https://devblogs.microsoft.com/devops/whats-new-with-azure-pipelines/

此处的相关公告

4 个答案:

答案 0 :(得分:5)

Azure DevOps / Pipelines现在具有称为环境的功能,该功能支持批准。 https://docs.microsoft.com/en-us/azure/devops/pipelines/process/environments?view=azure-devops#approvals

我们将它们用作解决方法。基本上,我们在Azure DevOps中指定了两个环境ApprovalNotRequired和ApprovalRequired。在后者上,我们指定了谁可以批准部署。然后在管道中引用这样的环境。

- stage: 'Approval not required'
  jobs:
  - deployment: 'MyDeployment'
    displayName: MyDeployment
    environment: 'ApprovalNotRequired'
    strategy:
      runOnce:
        deploy:
          # whatever

- stage: 'Approval required'
  jobs:
  - deployment: 'MyDeployment2'
    displayName: MyDeployment2
    environment: 'ApprovalRequired'
    strategy:
      runOnce:
        deploy:
          # whatever

第一阶段将在没有干扰的情况下运行,第二阶段将暂停直至获得批准。

答案 1 :(得分:1)

由于Microsoft忽略此名称已有很长时间,并且由于这是一项关键的缺少功能,因此我将在此处添加解决方法(目前,在多机情况下,它仅忽略所有计算机的整个步骤阶段YAML,但我认为这也可以解决,但是我暂时不对此进行研究。

不幸的是,在每个任务之前需要添加一个任务。这也可以通过迭代插入(https://docs.microsoft.com/en-us/azure/devops/pipelines/process/templates?view=azure-devops)来解决。

不久,为了能够忽略特定任务:

  • T1正在检查“ IgnoreStep”标记的构建运行。如果找到,它将IgnoreStep变量设置为true并删除标签
  • T2仅在先前的IgnoreStep设置为false时运行 当出现故障而我想忽略该步骤时,我将添加“ IgnoreStep”标记以进行运行并重试。

要添加标签,我正在使用API​​,因为目前尚无任务。有关请求的详细信息,请在Chrome中使用F21并在添加标签后检查它发送到服务器的内容,然后将请求导出到Power Shell。

下面有YAML:

trigger: none

jobs:
  - deployment: Dev
    environment: 
        name: Dev
        resourceType: virtualMachine
        tags: online
    strategy:                  
          runOnce:
            deploy:
              steps:
              - task: PowerShell@2
                displayName: CheckIfWeShouldIgnoreStep
                name: CheckIfWeShouldIgnoreStep
                inputs:
                  targetType: 'inline'
                  script: |
                    $user = "user"
                    $pass= "pass"
                    $secpasswd = ConvertTo-SecureString $pass -AsPlainText -Force
                    $credential = New-Object System.Management.Automation.PSCredential($user, $secpasswd)

                    $response = Invoke-RestMethod -Uri "https://server/tfs/collection/projectId/_apis/build/builds/$(Build.BuildId)/tags" `
                      -Method "GET" `
                      -Headers @{
                        "accept"="application/json;api-version=6.0;excludeUrls=true;enumsAsNumbers=true;msDateFormat=true;noArrayWrap=true"
                      } `
                      -ContentType "application/json" `
                      -Credential $credential -UseBasicParsing

                      Write-Host "##vso[task.setvariable variable=IgnoreStep]false"

                      Write-Host "Tags: $response"
                      foreach($tag in $response)
                      {
                          if($tag -eq "IgnoreStep")
                          {
                            Write-Host "##vso[task.setvariable variable=IgnoreStep]true"

                            
                            Invoke-RestMethod -Uri "https://server/tfs/collection/projectId/_apis/build/builds/$(Build.BuildId)/tags/IgnoreStep" `
                                -Method "DELETE" `
                                -Headers @{
                                  "accept"="application/json;api-version=6.0;excludeUrls=true;enumsAsNumbers=true;msDateFormat=true;noArrayWrap=true"
                                }`
                            -Credential $credential -UseBasicParsing
                          }
                      }
              - task: PowerShell@2
                displayName: Throw Error
                condition: eq (variables.IgnoreStep, false)
                inputs:
                  targetType: 'inline'
                  script: |   
                    throw "Error"

答案 2 :(得分:1)

Microsoft现在提供了一个全新的官方Manual Validation task,可以将手动干预添加到YAML管道中。

如何使用此任务的快速示例如下:

  jobs:  
  - job: waitForValidation
    displayName: Wait for external validation  
    pool: server    
    timeoutInMinutes: 4320 # job times out in 3 days
    steps:   
    - task: ManualValidation@0
      timeoutInMinutes: 1440 # task times out in 1 day
      inputs:
        notifyUsers: |
          test@test.com
          example@example.com
        instructions: 'Please validate the build configuration and resume'
        onTimeout: 'resume'

需要注意的一些关键约束:

  • 仅YAML管道支持此任务
  • 只能在YAML管道的无代理作业中使用。

答案 3 :(得分:0)

该功能似乎尚不可用,但是有一个GitHub Issue跟踪此问题: https://github.com/MicrosoftDocs/vsts-docs/issues/4241

从问题开始:

  

所以我从产品团队那里听到的是,此“每阶段批准”政策尚不可用,但仍在积压中。

还有一个路线图工作项跟踪它: https://dev.azure.com/mseng/AzureDevOpsRoadmap/_workitems/edit/1510336/