由于子进程退出非零退出代码,TeamCity构建失败

时间:2015-05-19 15:51:42

标签: c# msbuild teamcity teamcity-8.0

我有一个TeamCity(8.1)构建项目,大部分时间运行良好。我的MSBuild脚本的一部分是,构建的可执行文件应该是代码签名的,并且有时构建失败。

<Target Name="AfterBuild">
   <Exec Command="sign.exe /D &quot;$(OutputName)&quot; &quot;$(TargetPath)&quot; &quot;certificate.pfx&quot; 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#命令行工具以不传播子进程的退出代码?

1 个答案:

答案 0 :(得分:0)

  

我知道选项,忽略非零退出代码,但我只想忽略我的签名工具子进程的退出代码。

你确定这是安全的吗?如果签名失败,那么在您的环境中就可以了,但是构建是否已创建?

  

TeamCity中是否有办法处理此问题,或者我是否可以选择修改自定义C#命令行工具以不传播子进程的退出代码?

我不确定TeamCity中的选项,但由于sign.exe在您的控制之下,无论子进程是否成功,您都可以返回0。

如果所有时间服务器偶尔失败,您是否已调查潜在原因?你的结局可能是暂时的互联网中断?在所有时间服务器发生故障后,您可以尝试在sign.exe之外尝试对网络外部的高可靠性进行ping操作,以查看是否存在一般的互联网中断。

在延迟之后,可能值得重试整个foreach循环一次或多次,以允许任何导致偶然无法自我纠正的情况。