从 PowerShell 调用 Jenkins 的长 NAnt 进程(使用 Pipelines)



我一直在努力总结 Jenkins 作业后面的一些旧 NAnt 脚本的使用。Jenkins 作业本身正在使用管道功能,一个时髦的 DSL 脚本,其中一个步骤是 PowerShell 块,在计算出大量要解析的参数后,它会调用一些调用 NAnt 的函数。

我确实在某个时候工作得很好,但在某个阶段有些东西坏了。调用 PowerShell 函数,并触发 NAnt,在完成所需的近一个小时内,您会得到输出,因为它碰巧显示在 Jenkins 中。

这是使用类似Invoke-Expression "& $NAntExe $NAntFile $Target $ParameterString" | Write-Host的东西完成的,其中$ParameterString是所有-D:Key=Value参数。

我相信我已经添加了| Write-Host,因为没有它,你只能在最后得到输出,但我们希望能够在它发生时看到进度。

正如我所说,某处发生了一些变化,我们不再从 NAnt 获得任何输出。我最终发现删除| Write-Host可以恢复日志,但正如我所料,我们现在必须等待 NAnt 完成才能看到任何日志。

在这里调用 NAnt 以获得我想要的输出的"正确"方法是什么?我想在发生时看到输出。


我尝试了各种调用 NAnt 的方法,但没有运气。似乎我不得不满足于"我最后一次性获得所有输出"或"没有输出"。我怀疑这不是PowerShell的问题,但这是基于直觉。


似乎我基本上可以重现我在詹金斯身上看到的症状。如果我通过一个新的PowerShell会话调用NAnt,我会遇到同样的问题,我正在运行类似于以下内容的东西,据我所知,这与Jenkins插件调用PowerShell的方式相同:

powershell.exe -NoProfile -NonInteractive -ExecutionPolicy ByPass -Command 'Invoke-FunctionThatCallsNAnt'

在我的Invoke-FunctionThatCallsNAnt中,正如我上面所说,我最初只是直接打电话给 NAnt,没有日志。然后,我更新我的函数以通过管道将输出传输到Write-Host或者我可以删除-NonInteractive标志,我将实时从 NAnt 获取输出。但是,当我去 Jenkins 时,这并不能解决问题,我最终根本没有获得任何输出。

我不确定为什么它不会流式传输。 您应该能够通过以下方式编写命令:

& $NAntExe $NAntFile $Target $ParameterString

或者用南特命令是什么。

$env:path += ';c:program filesnant'  # add to path if needed
nant.exe $NAntFile $Target $ParameterString

如果它不在路径中,并且文件夹没有空格,您也可以放置它的整个路径。

c:nantnant.exe $NAntFile $Target $ParameterString

编辑:

以下是在带有空格的路径中运行某些内容的方法:

C:Program` FilesInternet` Exploreriexplore.exe

编辑2:

看起来您必须在下载后解锁 nant zip:如何解决 Nant 0.91 的配置错误?

或者在事后取消阻止所有文件:

get-childitem -recurse c:nant-92 |
get-item -stream zone.identifier -erroraction silentlycontinue |
select -expand filename | get-item | unblock-file

相关内容

最新更新