web-dev-qa-db-fra.com

Comment ajouter une étape d'intervention manuelle dans Azure Pipelines Yaml

Comment ajoutez-vous une étape d'intervention manuelle dans un pipeline Yaml de Devops de Devops à plusieurs étages?

À Jenkins, vous pouvez faire quelque chose comme:

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

Je cherche l'équivalent à Azure Devops Yaml.

Remarque: Ceci est pour les pipelines Devops de Devops de Devops de Devops de Devops, et non sur les pipelines de style ancien. Annonce connexe ici https://devblogs.microsoft.com/devops/whats-new-with-azure-pipelines/

11
cfbd

Microsoft a maintenant mis à disposition une toute nouvelle tâche officielle tâche manuelle de validation qui permet d'ajouter une intervention manuelle dans un pipeline YAML.

Exemple rapide de la manière d'utiliser cette tâche est la suivante:

  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'

Quelques contraintes clés à prendre conscience de:

  • Cette tâche n'est prise en charge que dans les pipelines YAML
  • Peut être utilisé uniquement dans un travail sans agent de pipeline YAML.
2
user14786410

Parce qu'il y a longtemps que Microsoft l'ignore, et parce que c'est une fonctionnalité manquante critique, je vais ajouter une solution de contournement ici (pour le moment, cela ne fonctionne que pour ignorer l'étape entière de toutes les machines en cas d'yaml à plusieurs étapes mais Je pense que cela peut être résolu aussi, mais je ne le regarde pas pour le moment).

Malheureusement, une tâche doit être ajoutée avant chaque tâche. Cela peut également être résolu également par insertion itérative ( https://docs.microsoft.com/en-us/azure/devops/pipelines/process/templates?view=AZURE-DEVOPS ).

Bientôt, afin de pouvoir ignorer une tâche spécifique:

  • T1 vérifie la course de construction pour "ignorestetep". Si trouvé, il définira la variable Ignorestete à true et supprimera la balise
  • T2 est en cours d'exécution que si précédent Ignorestetep est sur False lorsque quelque chose échoue et je veux ignorer l'étape, j'ajouterai une balise "ignorestete" pour la course et réessayer.

Pour ajouter des balises, j'utilise l'API car il n'y a pas encore de tâche pour le faire. Pour les détails de la demande, F21 IN Chrome et vérifiez ce qu'il a envoyé au serveur après avoir ajouté une balise et exporter la demande à la coque d'alimentation.

Ci-dessous vous avez la 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