我有一个TeamCity(8.1)构建项目,大部分时间运行良好。我的MSBuild脚本的一部分是,构建的可执行文件应该是代码签名的,并且有时构建失败。
<Target Name="AfterBuild">
<Exec Command="sign.exe /D "$(OutputName)" "$(TargetPath)" "certificate.pfx" password" />
</Target>
sign.exe
是一个帮助命令行工具,它在内部调用Microsoft Windows SDK中的signtool.exe
(它检测安装了哪个版本),在迭代中使用硬编码时间戳服务器,因为有时,无法访问时间戳服务器。
foreach (var tsServer in TimestampServer)
{
var p = new Process
{
StartInfo =
{
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
FileName = signtool,
Arguments = String.Format("sign /f \"{0}\" /p {1} {4} /d \"{3}\" \"{2}\"", cert, pass, file, description ?? Path.GetFileName(file), tsServer)
}
};
p.Start();
p.WaitForExit();
if (p.ExitCode == 0)
{
// signing succeeded
Environment.Exit(0);
}
}
// if all failed issue a nonzero exit code
Environment.Exit(-1);
如果与所有时间戳服务器签名失败(编辑:尚未发生),我的自定义sign.exe
仅返回非零退出代码。但是TeamCity将构建标记为失败,因为它检测到我的sign.exe
的子进程退出时使用非零退出代码(编辑:),即使稍后调用signtool.exe成功并签名也是如此。 exe返回零退出代码。
我知道选项,忽略非零退出代码,但我只想忽略我的签名工具的子进程的退出代码(编辑)而不是我的sign.exe的退出代码,因为我的工具是为了处理这个问题而写的。
TeamCity中是否有办法处理此问题,或者我是否可以选择修改自定义C#命令行工具以不传播子进程的退出代码?
答案 0 :(得分:0)
我知道选项,忽略非零退出代码,但我只想忽略我的签名工具子进程的退出代码。
你确定这是安全的吗?如果签名失败,那么在您的环境中就可以了,但是构建是否已创建?
TeamCity中是否有办法处理此问题,或者我是否可以选择修改自定义C#命令行工具以不传播子进程的退出代码?
我不确定TeamCity中的选项,但由于sign.exe在您的控制之下,无论子进程是否成功,您都可以返回0。
如果所有时间服务器偶尔失败,您是否已调查潜在原因?你的结局可能是暂时的互联网中断?在所有时间服务器发生故障后,您可以尝试在sign.exe之外尝试对网络外部的高可靠性进行ping操作,以查看是否存在一般的互联网中断。
在延迟之后,可能值得重试整个foreach
循环一次或多次,以允许任何导致偶然无法自我纠正的情况。