Jenkins中应用签名用Bash脚本运行异常 签名后参数被识别为独立命令
问题根因
你的报错核心是类Unix shell环境的路径自动转换逻辑导致参数解析异常:
Jenkins Windows节点的sh步骤默认运行在Git Bash/MinGW/MSYS这类兼容层环境中,这类环境会自动把/f、/p这类斜杠开头的参数识别为Unix根路径,自动转换为F:/、P:/这类Windows盘符路径,传递给signtool.exe之后参数顺序完全错乱。所以会出现目标exe签名成功,但同时证书路径、密码都被当成待签名文件,报找不到F:/、P:/的错误。
解决方案
方案1:临时关闭当前命令的路径转换(推荐)
在signtool命令前加MSYS_NO_PATHCONV=1环境变量,禁止shell对该命令的参数做路径转换,同时删掉原脚本中多余的bash行(sh步骤本身就运行在shell环境中,额外写bash会启动无意义的交互式子shell),修正后的代码如下:
sh ''' cd Wrap.UI MSYS_NO_PATHCONV=1 "C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.19041.0\\x86\\signtool.exe" sign /f "./Service.pfx" /p password ./bin/x64/''' + CONFIGURATION + '''/Wrap.UI.exe cd .. '''
方案2:修改参数格式规避转换
如果你不想调整环境变量,也可以给所有signtool的斜杠参数前再加一个斜杠,标记不需要转义:
把原来的/f改成//f、/p改成//p即可,示例:
"C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.19041.0\\x86\\signtool.exe" sign //f "./Service.pfx" //p password ./bin/x64/xxx/Wrap.UI.exe
内容的提问来源于stack exchange,提问作者inifus
相关产品推荐
相关产品推荐

