如何解决Jenkins中PowerShell执行New-PSSession失败导致的脚本阻塞
Jenkins Pipeline中PowerShell连接阻塞问题的解决方法
问题场景
我在Jenkins中配置了如下Pipeline脚本(包含PowerShell命令):
pipeline { agent any stages { stage('Connecting VPN') { steps { script { bat label: 'Environment', script: 'echo hello world!' } script { pwsh ''' $session1 = New-PSSession -HostName 172.17.1.64 -UserName apcor:mydom -SSHTransport echo Uploading files... echo Copying WebApp.... ''' } } } } }
注:原脚本中PowerShell代码存在语法错误(多余闭合大括号}),已修正。
当New-PSSession因连接超时等原因失败时,脚本会持续阻塞,无法推进后续流程,控制台输出示例:
[Pipeline] { [Pipeline] pwsh ssh: connect to host 172.17.1.64 port 22: Connection timed out
解决方法
1. 给New-PSSession设置连接超时
直接使用-ConnectionTimeout参数(单位:毫秒)限制连接等待时间,超时后命令自动终止,避免无限阻塞:
$session1 = New-PSSession -HostName 172.17.1.64 -UserName apcor:mydom -SSHTransport -ConnectionTimeout 10000
示例设置10秒超时,超时后命令会抛出错误并停止执行。
2. 用try/catch捕获错误并处理
结合-ErrorAction Stop确保错误被捕获,在catch块中处理失败逻辑,避免脚本卡住:
script { pwsh ''' try { $session1 = New-PSSession -HostName 172.17.1.64 -UserName apcor:mydom -SSHTransport -ConnectionTimeout 10000 -ErrorAction Stop echo Uploading files... echo Copying WebApp.... # 后续业务操作 } catch { echo "连接失败: $_" # 可选:添加失败后的处理,比如标记构建状态、发送通知 exit 1 # 返回错误码,让Jenkins识别构建失败 } ''' }
即使连接失败,脚本也会进入catch块处理,之后正常结束或退出,不会阻塞。
3. Jenkins层面添加步骤超时限制
在pwsh步骤外层套timeout指令,强制限制该步骤的执行时间,作为双重保障:
script { timeout(time: 15, unit: 'SECONDS') { pwsh ''' try { $session1 = New-PSSession -HostName 172.17.1.64 -UserName apcor:mydom -SSHTransport -ErrorAction Stop echo Uploading files... echo Copying WebApp.... } catch { echo "连接失败: $_" exit 1 } ''' } }
即使PowerShell的超时参数未生效,Jenkins也会强制终止该步骤。
4. 修正PowerShell语法错误
原脚本中PowerShell代码存在多余的闭合大括号},这类语法错误可能导致执行异常,需先修正避免额外问题。
内容的提问来源于stack exchange,提问作者Diego Villagra
相关产品推荐
相关产品推荐

