2014-04-24 2 views
0

CC.Net을 사용하여 VS2010으로 빌드 할 때 "An error occurred while validating. HRESULT = '8000000A'"이 많이 보입니다. 나는 거기에 설명 된 핫픽스를 설치했지만 여전히 오류가 표시됩니다.CC.Net의 오류 HRESULT = '8000000A'에서 복구

오류는 거의 항상 다른 빌드를 수동으로 강제로 해결할 수 있습니다. 그것은 진짜 고통입니다. 자연스럽게 그것을 자동화하고 싶습니다. : ^) 그러나 나는 과정의 일부를 알아내는 데 어려움을 겪고있다. 조건부 작업 블록을 사용해야 할 것입니다.

if statusCondition == Failure 
    if failure is caused by HRESULT = '8000000A' <-- this is the part I can't figure out 
    Use devenv to rebuild vdproj file 
    endif 
endif 

가 어떻게 실패의 원인이 정말 8000000A이 있음을 결정하기 위해 CC.Net 사용할 수 있습니다처럼 내가 원하는 무엇에 대한 의사 보인다? CC.Net의 통합 속성 또는 작업 조건 블록에서 필요한 항목이 보이지 않습니다.

감사합니다.

답변

0

좋아, 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를 사용하여이 작업을 수행 할 수 있지만 방법을 파악할 수는 없습니다.