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/
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:
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:
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"