Azure devops 如何在Azure管道yaml中添加手动干预步骤

Azure devops 如何在Azure管道yaml中添加手动干预步骤,azure-devops,azure-pipelines,Azure Devops,Azure Pipelines,如何将手动干预步骤添加到多阶段Azure Devops YAML管道中 在詹金斯,你可以做一些事情,比如: stage ('approve-prod') { steps { input "Approve deployment to production?" } } 我正在寻找Azure Devops YAML中的等效版本 注意:这适用于新发布的多级Azure Devops管道,而不是旧式发布管道。此处的相关公告这似乎还不可用,但有一个GitHub问题跟踪此问题:

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

在詹金斯,你可以做一些事情,比如:

stage ('approve-prod') {
    steps {
        input "Approve deployment to production?"
    }
}
我正在寻找Azure Devops YAML中的等效版本


注意:这适用于新发布的多级Azure Devops管道,而不是旧式发布管道。此处的相关公告

这似乎还不可用,但有一个GitHub问题跟踪此问题:

本期:

因此,我从产品团队那里听到的是,这个“每个阶段的批准”策略目前还不可用,但已在他们的待办事项中

还有一个跟踪它的路线图工作项:
Azure DevOps/Pipelines现在有一个名为Environments的功能,支持审批。

我们正在使用它们作为解决办法。基本上,我们在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

第一个阶段将在不受干扰的情况下运行,第二个阶段将暂停,直到获得批准。

因为Microsoft已经很久没有忽略这一点了,而且这是一个关键的缺失功能,我将在这里添加一个解决方法(目前,在多阶段YAML的情况下,忽略所有机器的整个步骤是可行的,但我认为这也可以解决,但我暂时不考虑)

不幸的是,在每个任务之前都需要添加一个任务。这也可以通过迭代插入()来解决

简而言之,为了能够忽略特定任务:

  • T1正在检查“IgnoreStep”标记的生成运行。如果找到,它会将IgnoreStep变量设置为true并删除该标记
  • T2仅在上一个Ignorstep为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"

微软现在提供了一个全新的官方版本,允许在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管道的无代理作业中使用

链接文章提到批准将在稍后进行。据我所知,这张罚单已关闭。我不清楚这是否实际得到了解决。有人有可行的解决方案吗?“如果您在YAML管道中使用环境,所有组织现在都可以获得批准。有关更多信息,请参阅。”请参阅此处的讨论部分:不幸的是,支持它的唯一方法是将手动步骤建模为具有批准的资源上的部署任务,这是非常不灵活的。您的另一个选项究竟是什么?请解释代码,这样其他人可以从您的答案中受益更多,而不是只编写代码而不做解释。此代码非常简单ht来自提供的链接;但是,真正需要的是任务部分。这将创建任务,直到有人进入作业并点击“批准”。If几乎与经典管道中现有的手动干预任务相同。超时时间以分钟为单位设置,是可选的;但是,当超时时间到期时,它将继续或停止设置为“拒绝”,这将终止作业