좋아, CruiseControl.NET의 API를 사용하여 마침내이 문제를 해결할 수있었습니다. 우와!
먼저 C# 콘솔 응용 프로그램을 만들어 실패한 프로젝트 목록을 가져 왔습니다. 실패한 각 프로젝트의 로그 파일을 검사하고 오류 8000000A로 인해 프로젝트가 실패하면 해당 프로젝트에서 빌드가 강제 실행됩니다.
//Due to a race condition in Visual Studio 2010, CCNet builds often fail with error 8000000A.
//See http://stackoverflow.com/questions/8648428/an-error-occurred-while-validating-hresult-8000000a
//
//The build failure can almost always be fixed by manually forcing another build on the failed project.
//
//This program, along with a companion CCNet project, will automate the process of forcing the builds on the failed projects.
// 1. For each CCNet project whose IntegrationStatus == Failure
// 2. Search the most recent log file for the string "8000000A"
// 3. If string found in log file, force a build on the project
using System;
using ThoughtWorks.CruiseControl.Remote;
namespace ForceBuildForError8000000A
{
class Program
{
static void Main(string[] args)
{
CruiseServerRemotingClient ccnetClient = new CruiseServerRemotingClient("tcp://localhost:21234/CruiseManager.rem");
ProjectStatus[] prjStatusList = ccnetClient.GetProjectStatus();
foreach (ProjectStatus prjStatus in prjStatusList)
{
if (prjStatus.BuildStatus == IntegrationStatus.Failure)
{
string latestBuildName = ccnetClient.GetLatestBuildName(prjStatus.Name);
string log = ccnetClient.GetLog(prjStatus.Name, latestBuildName);
if (log.Contains("ERROR: An error occurred while validating. HRESULT = '8000000A'"))
{
Console.WriteLine("Forcing build for " + prjStatus.Name);
ccnetClient.ForceBuild(prjStatus.Name);
}
}
}
}
}
}
다음으로 내 ccnet.config 파일에 다른 프로젝트를 만들었습니다. 이 프로젝트는 다중 트리거를 사용하여 8000000A 오류로 실패 할 수있는 다른 모든 프로젝트를 모니터링합니다. 트리거 프로젝트 중 하나라도 실패하면 C# 프로그램이 실행되어 8000000A로 인해 실패한 프로젝트를 강제로 빌드합니다.
<cb:scope ProjectName="$(ForceBuildForError8000000A.Run_ProjectName)">
<project name="$(ProjectName)" >
<cb:ProjectHeaderMacro projectName="$(ProjectName)" />
<cb:AssemblyVersionLabellerMacro Major="1" Minor="0" Build="0" />
<triggers>
<multiTrigger>
<triggers>
<projectTrigger project="$(ProjectName1)" triggerStatus="Failure" />
<projectTrigger project="$(ProjectName2)" triggerStatus="Failure" />
<projectTrigger project="$(ProjectName3)" triggerStatus="Failure" />
<projectTrigger project="$(ProjectName4)" triggerStatus="Failure" />
<projectTrigger project="$(ProjectName5)" triggerStatus="Failure" />
<projectTrigger project="$(ProjectName6)" triggerStatus="Failure" />
</triggers>
</multiTrigger>
</triggers>
<tasks>
<exec>
<executable>$(ForceBuildForError8000000A.exe)</executable>
<baseDirectory>$(MyWorkingTrunk)</baseDirectory>
<buildTimeoutSeconds>120</buildTimeoutSeconds>
</exec>
</tasks>
</project>
</cb:scope>
내가 원래 필요하다 생각으로 조건부 작업 블록을 사용하여 끝나지 않았다 주, 오히려 조건부 트리거.
아마도 C# 대신 NANT를 사용하여이 작업을 수행 할 수 있지만 방법을 파악할 수는 없습니다.
출처
2014-08-10 20:49:41
TJH