VSTS 构建定义 - 防止导致进程终止的 PowerShell 退出行为

VSTS build definition - prevent PowerShell exit behavior causing processes termination

我的定义中有一个 PowerShell 任务,它自己调用另一个脚本文件,该文件负责 运行我的构建代理上的几件事(启动几个不同的进程)- 模拟器,node.js应用等

一切都很好,直到完成此步骤并且 运行 继续。上面提到的所有东西都会随着大部分底层进程的终止而关闭,因此,任何进一步的执行(例如测试运行)注定会失败。

我的假设是这些进程在某种程度上依赖于 VSTS 生成的最外层(临时)脚本来处理该步骤。

我尝试使用脚本的参数列表中指定的 -NoExit 开关,但无济于事。我还在某处读到一条建议,默认情况下使用 powershell.exe 的注册表项进行设置 - 仍然没有。

在 Jenkins 中完全相同的工作流程是可以的。我该如何解决这个问题?

这些是我的任务:

最后一个 PowerShell 任务调用一个指定的 PowerShell 文件,该文件自己调用其他几个。他们确保开始执行测试所需的一些本地依赖项和过程,例如运行ning Node.js 应用程序(例如在单独的控制台中启动并且 运行ning 很好)。

当任务完成并成功时,最后一个测试将失败,因为 Node.js 应用程序以及在上一步中启动的任何其他应用程序都已关闭。它只是停止一切。这就是为什么我目前 运行 在同一任务本身中进行测试,直到我找到如何克服这种行为。

出错时继续选项(控制选项部分)。如果为真(选中),构建过程将继续,但构建结果将是部分成功

您还可以使用 PowerShell 或 VSTS 任务命令输出错误或警告(取消选中 高级 中的 标准错误失败 选项部分)并使用 exit 关键字终止当前的 PowerShell 进程,例如:

Write-Warning “warning”
Write-Error “error”
Write-Host " ##vso[task.logissue type=warning;]this is the warning"
Write-Host " ##vso[task.logissue type=error;sourcepath=consoleapp/main.cs;linenumber=1;columnnumber=1;code=100;]this is an error "

更多关于VSTS任务命令的内容,可以参考:Logging Commands

我不确定您如何在 PowerShell 脚本中调用依赖项和应用程序。但是我尝试在 PowerShell 脚本任务中使用以下命令 运行 一个 Node.js 应用程序:

invoke-expression 'cmd /c start powershell -Command {node main.js}'

应用程序在 PowerShell 脚本任务通过并完成后保持 运行ning,这应该符合您的要求。具体可以参考这个问题:PowerShell launch script in new instance

但是需要记得在测试结束后关闭进程