web-dev-qa-db-ja.com

Azure Pipelines yamlで手動介入ステップを追加する方法

マルチステージAzure Devops Yaml Pipelineに手動の介入ステップを追加しますか?

ジェンキンスでは、次のようなことができることがあります。

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

私はAzure DevOps Yamlの等価物を探しています。

注:これは、古いスタイルのリリースパイプラインではなく、新しくリリースされたマルチステージAzure DevOpSパイプライン用です。関連のお知らせここ https://devblogs.microsoft.com/devops/whats-new-with-azure-pipelines/

11
cfbd

マイクロソフトは現在ブランドの新しい公式 手動検証タスク が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: |
          [email protected]
          [email protected]
        instructions: 'Please validate the build configuration and resume'
        onTimeout: 'resume'
 _

注意するためのいくつかの重要な制約

  • このタスクは、YAMLパイプラインでのみサポートされています
  • YAMLパイプラインのエージェントレスジョブでのみ使用できます。
2
user14786410

マイクロソフトがこれを無視してから長い時間があるからであり、これは重大な不足機能であるため、ここで回避策を追加します(現時点では、マルチステージYAMLの場合はすべてのマシンの全体のステップを無視するのにのみ機能していますが私はこれも解決できると思いますが、私は現時点では見ていません)。

残念ながら、各タスクの前に追加する必要があるタスクがあります。これは繰り返し挿入によっても解決できます( https://docs.microsoft.com/jaus/azure/devops/pipelines/process/templatess?view=azure-devops )。

特定のタスクを無視できるようにするには

  • T1は「ignoreStep」タグのビルドランをチェックしています。見つかった場合、それはignoreStep変数をtrueに設定し、タグを削除します
  • T2は、何かが失敗しているときに前のIgnoreStepがfalseの場合にのみ実行されていて、ステップを無視したい場合は、実行と再試行のための "ignoreStep"タグを追加します。

タグを追加するには、まだ実行するタスクがないため、APIを使用しています。リクエストの詳細については、F21 IN Chrome]およびタグを追加した後にサーバーに送信された内容を確認し、そのリクエストを電源シェルにエクスポートします。

下には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"
 _
1
Silviu Luca