我正在将Jenkins与很多东西集成在一起,并且我使用powershell来做到这一点。我在远程计算机上有一个脚本,该脚本在jenkins上成功构建后执行。该脚本会执行很多操作,然后将重新启动计算机。
我需要做的是:
到目前为止,我还没有设法将'EXIT 0'发送给jenkins,然后重新启动计算机。反正有这样做吗?
谢谢。
代码示例:
Write-Host "Code example"
Exit 0 #for jenkins success
Restart-Computer -Force
答案 0 :(得分:2)
这将托管一个单独的命令提示符,该命令提示符从powershell脚本异步运行,并在3秒钟内重新启动计算机,足够的时间让powershell将退出代码返回给jenkins。
Start-Process -FilePath "cmd.exe" -ArgumentList '/c "timeout /t 3 /nobreak && shutdown -r -f -t 0"' -WindowStyle Hidden
Exit 0
答案 1 :(得分:0)
如@Avshalom的评论中所述,您的问题是Exit
语句将无条件退出脚本,而无需执行放置在之后的Restart-Computer
命令。 / p>
Restart-Computer
,在本地执行时,总是异步,因此您的脚本将继续执行,至少持续一段时间。
因此,您可以尝试先致电Restart-Computer
,然后再致电exit 0
:
Write-Host "Code example"
Restart-Computer -Force
exit 0 # for Jenkins success
但是,没有保证可以将控制权及时归还Jenkins,并且Jenkins本身将有时间在成功关闭退出之前对其进行处理。
您可以通过单独的异步启动的PowerShell实例 [1] 通过 delay 来提高这种可能性,类似于Evilcat's answer中的方法:
Write-Host "Code example"
# Asynchronously start a separate, hidden PowerShell instance
# that sleeps for 5 seconds before initiating the shutdown.
Start-Process -WindowStyle Hidden powershell.exe -Args '-command',
'Start-Sleep 5; Restart-Computer -Force'
exit 0 # for Jenkins success
但是,这仍然不是一个完全可靠的解决方案。一个完全可靠的解决方案需要更改您的方法:
让您的脚本仅指示成功,而不启动重新启动。
让Jenkins测试是否成功,如果成功,请调用另一个无条件启动关闭脚本。
[1]正如Evilcat指出的那样,将后台作业与Start-Job
一起使用不会有效 ,因为在退出调用PowerShell会话时exit
后台作业也被终止。