2014-09-02 9 views
3

빌드 프로세스 템플릿에 사용 된 참조에서 사용자 정의 어셈블리를 가져 오기 위해 빌드 컨트롤러/에이전트를 가져 오는 데 문제가 있습니다.TFS가 사용자 정의 어셈블리를로드하지 않음

이 문제를 해결하기 위해 나는 여러 블로그에 걸쳐 광범위하게이 문제에 대해 읽고 불행하게도 내가 없었습니다 :

TFS Build Error Log] 나는 다음과 같은 확인할 수 있습니다

:

  1. TFS 2012 업데이트 없음 Visual Studio 2013, 업데이트 1 ( 활동 만들기 및 빌드 프로세스 템플릿 업그레이드)

  2. 과 올바른 경로가 서비스를 빌드 컨트롤러에서 설정

Custom Assembly Checked In]

소스 제어에서 확인하여 여러개의 에이전트

  • 하여 TFS 총회와

    한 빌드 컨트롤러를 다시 시작 : [Build Controller Settings

    가이드 리에 따라 사용자 지정 작업이 템플릿 내에서 올바르게 해석됩니다. 이 블로그에서 사용 NES :

    http://www.ewaldhofman.nl/post/2010/04/29/Customize-Team-Build-2010-e28093-Part-4-Create-your-own-activity.aspx

    http://blogs.msdn.com/b/jimlamb/archive/2010/02/12/how-to-create-a-custom-workflow-activity-for-tfs-build-2010.aspx

    Build Process Template - Custom Activity Resolving Correctly (assembly updater)

    나는 빌드 프로세스 템플릿의 XAML 내에서 참조를 볼 수 있으며 어떤 유효성 검사 오류 내 코드가 잘 보이는 활동이 올바르게 구현 된 것 같습니다. 아래

    코드 :

    using System; 
    using System.Collections; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.IO; 
    using System.Linq; 
    using System.Reflection; 
    using System.Text; 
    using System.Activities; 
    using System.Text.RegularExpressions; 
    using Microsoft.TeamFoundation.Build.Client; 
    using Microsoft.TeamFoundation.VersionControl.Client; 
    
    namespace FireWatch.TFS 
    { 
        [BuildActivity(HostEnvironmentOption.Agent)] 
        public sealed class AssemblyUpdater : CodeActivity 
        { 
         #region Static Methods 
         #endregion 
    
         #region Property Variables 
         #endregion 
    
         #region Constants and Read-Onlys 
         private const string ASSEMBLY_VERSION_REG_EX = @"\(""\d+\.\d+\.\d+\.\d+""\)"; 
         private const string ATTRIBUTE_REG_EX = "AssemblyVersion"; 
         #endregion 
    
         #region Accessors 
    
         [RequiredArgument] 
         public InArgument<int> Major { get; set; } 
         [RequiredArgument] 
         public InArgument<int> Minor { get; set; } 
         [RequiredArgument] 
         public InArgument<int> Build { get; set; } 
         [RequiredArgument] 
         public InArgument<Workspace> Workspace { get; set; } 
    
         #endregion 
    
         #region Encapsulation 
    
         private void UpdateAssemblyInfo(IEnumerable<string> assemblyInfos, int major, int minor, int build) 
         { 
          foreach (string myAssemblyInfo in assemblyInfos) 
          { 
           string myFileText = File.Exists(myAssemblyInfo) ? File.ReadAllText(myAssemblyInfo) : string.Empty; 
    
           if (myFileText != string.Empty) 
           { 
            Regex myRegex = new Regex(ATTRIBUTE_REG_EX + ASSEMBLY_VERSION_REG_EX); 
            Match myMatch = myRegex.Match(myFileText); 
    
            if (myMatch.Success) 
            { 
             string myVersionNumber = myMatch.Value.Substring(ATTRIBUTE_REG_EX.Length + 2, 
                   myMatch.Value.Length - ATTRIBUTE_REG_EX.Length - 4); 
    
             Version myCurrentVersion = new Version(myVersionNumber); 
             Version myNewVersion = new Version(major, minor, build, (myCurrentVersion.Revision + 1)); 
    
             string myUpdatedAssemblyText = myRegex.Replace(myFileText, ATTRIBUTE_REG_EX + "(\"" + myNewVersion + "\")"); 
    
             File.WriteAllText(myAssemblyInfo, myUpdatedAssemblyText); 
            } 
           } 
          } 
         } 
    
         private void CheckOut(Workspace workspace, IList<string> assemblyInfos) 
         { 
          if (workspace != null && assemblyInfos != null && assemblyInfos.Any()) 
          { 
           workspace.PendEdit(assemblyInfos.ToArray()); 
          } 
         } 
    
         private IEnumerable<string> GetRelevantAssemblyInfos(Workspace workspace) 
         { 
          IList<string> myReturn = new List<string>(); 
    
          PendingChange[] myPendingChanges = workspace.GetPendingChanges(); 
    
          foreach (PendingChange myPendingChange in myPendingChanges) 
          { 
           string myPath = AssemblyInfoPresent(myPendingChange); 
    
           if (!string.IsNullOrEmpty(myPath)) 
           { 
            myReturn.Add(myPath); 
           } 
          } 
    
          return myReturn; 
         } 
    
         private string AssemblyInfoPresent(PendingChange pendingChange) 
         { 
          string myReturn = string.Empty; 
    
          if (pendingChange != null) 
          { 
           string myParentDirectory = pendingChange.LocalItem; 
           string myParentLevelAssemblyInfo = myParentDirectory + @"\AssemblyInfo.cs"; 
    
           string myPropertiesDirectory = pendingChange.LocalItem + @"\Properties"; 
           string myPropertiesLevelAssemblyInfo = myParentDirectory + @"\Properties\AssemblyInfo.cs"; 
    
           if (Directory.Exists(myPropertiesDirectory) && File.Exists(myPropertiesLevelAssemblyInfo)) 
           { 
            myReturn = myPropertiesLevelAssemblyInfo; 
           } 
           else if (Directory.Exists(myParentDirectory) && File.Exists(myParentLevelAssemblyInfo)) 
           { 
            myReturn = myParentLevelAssemblyInfo; 
           } 
          } 
    
          return myReturn; 
         } 
    
         #endregion 
    
         #region CodeActivity Members 
    
         protected override void Execute(CodeActivityContext context) 
         { 
          int myMajor = context.GetValue(this.Major); 
          int myMinor = context.GetValue(this.Minor); 
          int myBuild = context.GetValue(this.Build); 
          Workspace myWorkspace = context.GetValue(this.Workspace); 
    
          IList<string> myAssemblyInfos = GetRelevantAssemblyInfos(myWorkspace).Distinct().ToList(); 
    
          if (myAssemblyInfos.Any()) 
          { 
           CheckOut(myWorkspace, myAssemblyInfos); 
           UpdateAssemblyInfo(myAssemblyInfos, myMajor, myMinor, myBuild); 
          } 
         } 
    
         #endregion 
        } 
    } 
    
  • 답변

    2

    당신이 컴퓨터를 다시 시작 했습니까?

    C에서 빌드 시스템에서 캐시를 지워보세요 : 사용자 \ BUILDACCOUNT의 AppData \ 로컬 \ 온도 \ \ \ BuildController 2.0 \ 어셈블리 \

    C : \ 사용자의 AppData \ 로컬 \ \ BUILDACCOUNT\ 온도 \ BuildAgent 어셈블리 \ BUILDAGENTNO\

    TFS (20) 사용하여 최신 어셈블리 결국

    +0

    빌드 컨트롤러가 야간에 다시 시작되지만 빌드 에이전트가 다시 시작되지 않았습니다. 오늘 밤 빌드 담당자를 다시 시작하고 문제를 해결할 수 있기를 기대합니다. 도움을 주셔서 감사합니다. – Slavvy

    +0

    불행히도이 문제가 해결되지 않았습니다.도움을 주시면 감사하겠습니다. 시도 할 수있는 코드 활동을 확장하는 방법을 보여주는 견고한 자습서를 보내주십시오. 간단히 말해서 내가 단계를 놓친 가능성이 있기 때문입니다. 나는 내가 가지고 있지 않다는 것을 상당히 확신한다. – Slavvy

    +1

    dll이 해당 캐시 폴더에 표시됩니까? –

    0

    이 문제가 해결되었습니다를 다운로드 빌드 컨트롤러를 강제적으로 어느 쪽이든 13 최신 서비스 팩. 이제 사용자 지정 어셈블리가 문제없이로드됩니다.