La commande dotnet run se bloque dans Azure Pipeline
J'essaie d'exécuter un test de cyprès dans un pipeline azur. Pour ce faire, je dois exécuter «dotnet run» avant d'exécuter le test. J'ai une tâche de pipeline qui exécute avec succès la commande «dotnet run», mais comme elle ne se termine jamais, le pipeline n'atteint jamais la tâche suivante. Existe-t-il un moyen d'utiliser YAML pour faire passer le travail de pipeline à l'étape suivante tout en maintenant la commande 'dotnet run' en cours d'exécution?
Si cela n'est pas possible, existe-t-il un moyen d'exécuter «dotnet run» en arrière-plan lors de l'exécution d'un test de cyprès dans un pipeline Azure?
Voici une partie de mon code YAML:
- task: DotNetCoreCLI@2
displayName: 'dotnet run'
inputs:
command: run
projects: Api/Api.csproj
arguments: '--configuration Release --verbosity normal'
- script: 'npx cypress verify' // pipeline job never gets to this step
displayName: 'Verify Cypress Can Run'
failOnStderr: true
Réponses
La tâche Azure Devops ne passera pas à la tâche suivante à moins que la tâche actuelle n'ait terminé son travail.
Étant donné que la dotnet runtâche exécute un xx.exe / api / ... qui continue de s'exécuter et ne s'arrête pas, c'est le comportement attendu que votre tâche s'y bloque.
Existe-t-il un moyen d'utiliser YAML pour faire passer le travail de pipeline à l'étape suivante tout en maintenant la commande 'dotnet run' en cours d'exécution?
Pour contourner ce problème, vous pouvez utiliser la tâche cmd pour exécuter la commande. Au lieu d'appeler la commande directement dans la tâche CMD, nous devrions appeler la tâche CMD pour ouvrir une nouvelle session pour exécuter la dotnet runcommande. Pour que le travail passe au travail suivant et que la dotnet runcommande puisse continuer à s'exécuter en arrière-plan.
trigger:
- master
pool:
name: default
steps:
- script: 'start cmd.exe /c dotnet run WpfCore.csproj'
displayName: 'Open new Session to run dotnet run'
- script: 'TaskList'
displayName: 'List running tasks to check if the WpfCore.exe keeps running'
Noter:
Étant donné que le projet que j'ai utilisé pour le test est une application Wpf avec un minuteur, je dois utiliser un agent auto-hébergé avec un mode interactif . Si la solution de contournement ci-dessus ne fonctionne pas pour vous lorsque vous utilisez l'agent hébergé par Microsoft, vous devrez peut-être envisager d'utiliser un agent auto-hébergé avec le mode approprié. (mode interactif ou service)
J'ai trouvé une solution. J'ai mis «dotnet run» dans un script PowerShell qui s'exécute en arrière-plan.
Le script PowerShell:
Start-Process powershell -ArgumentList "-NoProfile", "-NonInteractive", "-NoExit", {
dotnet run
}
Ensuite, j'exécute le script PowerShell dans une étape de construction PowerShell:
- task: PowerShell@2
inputs:
targetType: 'filePath' # Optional. Options: filePath, inline
filePath: $(Build.SourcesDirectory)\Api\dotnetrun.ps1
errorActionPreference: 'stop'
failOnStderr: false # Optional
workingDirectory: ./Api
displayName: 'Run dotnet run as background process'
L'étape de construction s'exécute et passe à l'étape suivante comme souhaité.