O comando dotnet run trava no pipeline azul

Sep 18 2020

Estou tentando executar um teste de cipreste em um pipeline azul. Para fazer isso, preciso executar 'dotnet run' antes de executar o teste. Eu tenho uma tarefa de pipeline que executa com êxito o comando 'dotnet run', mas como ele nunca sai, o pipeline nunca chega à próxima tarefa. Existe uma maneira de usar YAML para fazer o trabalho do pipeline ir para a próxima etapa enquanto mantém o comando 'dotnet run' em execução?

Se isso não for possível, há uma maneira de executar 'dotnet run' em segundo plano enquanto executa um teste de cipreste em um pipeline do Azure?

Esta é parte do meu código 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

Respostas

1 LanceLi-MSFT Sep 21 2020 at 15:05

A tarefa do Azure Devops não navegará para a próxima tarefa, a menos que a tarefa atual tenha concluído seu trabalho.

Como a dotnet runtarefa está executando um xx.exe / api / ... que continua em execução e não para, é esperado que sua tarefa pare ali.

Existe uma maneira de usar YAML para fazer o trabalho do pipeline ir para a próxima etapa enquanto mantém o comando 'dotnet run' em execução?

Como alternativa, você pode usar a tarefa cmd para executar o comando. Em vez de chamar o comando diretamente na tarefa CMD, devemos chamar a tarefa CMD para abrir uma nova sessão para executar o dotnet runcomando. Para que o trabalho vá para o próximo trabalho e o dotnet runcomando possa continuar em execução em segundo plano.

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'

Observação:

Como o projeto que usei para teste é um aplicativo Wpf com um temporizador, tenho que usar um agente auto-hospedado com modo interativo . Se a solução alternativa acima não funcionar para você quando estiver usando o agente hospedado pela Microsoft, pode ser necessário considerar o uso do agente auto-hospedado com o modo apropriado. (modo interativo ou de serviço)

mdailey77 Sep 21 2020 at 19:24

Eu encontrei uma solução. Eu coloquei 'dotnet run' em um script PowerShell que é executado como um processo em segundo plano.

O script do PowerShell:

Start-Process powershell -ArgumentList "-NoProfile", "-NonInteractive", "-NoExit", {
    dotnet run
}

Em seguida, executo o script do PowerShell em uma etapa de construção do 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'

A etapa de construção é executada e vai para a próxima etapa conforme desejado.