2009-07-24 7 views
14

하나의 TFS 빌드를 다른 빌드에서 호출하고 첫 번째 빌드를 빌드하고 두 번째 빌드를 스테이징하는 시나리오가 있습니다. 이렇게하면 동일한 솔루션에 대해 여러 개의 사용자 지정 준비 작업을 수행 할 수 있습니다.TFS 빌드를 체인화하는 방법은 무엇입니까?

두 번째 빌드에서 exec 태스크를 사용하여이 작업을 수행하고 tfsbuild.exe를 호출하여 첫 ​​번째 빌드 정의에서 빌드를 대기열에 넣을 수 있습니다. 그러나 누군가가 더 나은 방법을 알고 있는지 궁금해하고 있었습니까?

+1

우리는 CC.NET로 전환을 대기열에 확장을 빌드합니다. – Sneal

+0

CC.NET으로 여러 번 해왔습니다. TFS와 똑같이 할 수있는 좋은 방법이 있어야합니다. – user22242

답변

5

내가 수행하는 방법이다이 (http://sajojacob.com/2009/08/how-to-chain-tfs-builds/)

어떻게 TFS 체인에 빌드? 에 게시 됨 2009 년 8 월 5 일 Sajo - No Comments ↓

최근 동료 중 한 명인 @gdurzi가 최근 나에게이 질문을 던졌습니다. TFS로 박스에서 즉시 지원받을 수있을만큼 간단합니다. 이것에 너무 많은 단점이 있습니다. 그리고 % TFSSVR % % TEAMPROJECT % % BUILDTYPE/큐 시작이

TFSBuild.exe 같은과 첫 TFSBuild.proj에서 새로운 빌드를 큐에 TFSBuild.exe에 대한 호출을 만들기 위해 지금까지 충실한은 MSBuild 작업을 사용 권장 %

TFSBuild.exe 사용시 발생하는 문제는 빌드 에이전트를 명령 줄 인수로 전달할 수 없다는 것입니다.

특정 시나리오에 따라 취할 수있는 몇 가지 접근 방법이 있으므로 여기서 시나리오를 정의 해 보겠습니다. 핵심 프로젝트를 빌드하는 Main_Build TFS 빌드 정의가 있고 동일한 Main_Build를 실행하는 여러 준비 빌드가 있어야합니다. 컴파일/빌드 작업을 수행하지만 Main_Build를 호출하는 사용자를 기반으로 배포를 위해 사용자 지정 준비를 수행해야합니다. 클라이언트 당 사용자 정의 사전 빌드 및 빌드 후 조치가 필요한 여러 클라이언트로 제품을 출시 할 때 매우 유용합니다. 따라서 TFS 2008을 사용하여 Build Chaining을 수행하는 한 가지 방법이 있습니다.

1 단계 : 빌드 정의 파일과 연결된 기본 빌드 에이전트를 사용하여 빌드를 대기시키는 Team Foundation 개체 모델을 사용하여 사용자 지정 MSBuild 작업을 만들어 보겠습니다. 큐의

샘플 코드 : QueueTFS.cs

using Microsoft.TeamFoundation.Client; 
using Microsoft.TeamFoundation.Build.Client; 

// Get the team foundation server. 
TeamFoundationServer _tfsServer = TeamFoundationServerFactory.GetServer(_tfs); 

// Get the IBuildServer 
IBuildServer buildServer = (IBuildServer)_tfsServer.GetService(typeof(IBuildServer)); 

// Get the build definition for which a build is to be queued. 
IBuildDefinition definition = buildServer.GetBuildDefinition(teamProject, buildDefinition); 

// Create a build request for the build definition. 
IBuildRequest request = definition.CreateBuildRequest(); 
request.CommandLineArguments = "Pass any custom command line args here"; // Ex: Custom Targets file 

// Queue the build. 
buildServer.QueueBuild(request, QueueOptions.None); 

2 단계 : 이제 준비 빌드 정의 파일을 생성 할 TFS에서 새 폴더로 QueueTFS.dll를 복사합니다.

이제 새로운 MSBuild 작업을 사용하고 EndToEndIteration 대상을 재정의하는 최소한의 TFSBuild.proj 파일을 만듭니다. Main_Build 빌드를 트리거하는 스테이징 빌드 정의입니다. 이 TFSBuild.proj를 손으로 작성하고 빌드 정의 UI에서 새 폴더로 프로젝트 파일 위치를 지정하기 만하면됩니다. 최소한의 TFSBuild.proj에 대한

샘플 코드 :

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> 
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TeamBuild\Microsoft.TeamFoundation.Build.targets" /> 
    <UsingTask TaskName="MyNewCustomTFSTask" AssemblyFile="QueueTFS.dll"/> 
    <Target Name="EndToEndIteration"> 
    <Message Text="About to trigger main build" Importance="high"/> 
    < MyNewCustomTFSTask TFS="http://TFSServer.com:8080/" TeamProject="TeamProject" BuildDefinition="Main_Build" TargetsFile="Custom.Target" XYZ="XYZ" /> 
    <!-- When everything is done, change the status of the task to "Succeeded" --> 
    <SetBuildProperties TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)" TestStatus="Succeeded" CompilationStatus="Succeeded"/> 
    </Target> 
</Project> 

3 단계 : 미리 빌드 및 빌드 후 대상 통화와 Main_Build TFSBuild.proj 파일을 편집합니다.

<Target Name=“BeforeCompile“> 

    <CallTarget Targets=“Custom_PreBuild“/>  

    </Target> 

    <Target Name=“AfterDropBuild“ Condition=“‘$(BuildBreak)’!=’true’“>  

    <CallTarget Targets=“Custom_PostBuild“/> 

    </Target> 

우리는 우리가 목표는 빈 Custom_PreBuild 및 Custom_PostBuild 목표로 파일 기본을 가져 우리의 Main_Build TFSBuild.proj 조건부 수입을 추가이를 지원하기 위해뿐만 아니라 그 자체로 Main_Build 실행할 ​​수있는 기능을 원했다. 이제 목표는 Custom_PreBuild 및 Custom_PostBuild 목표 당신과 함께 Custom.Target 및 EmptyCustom.Target 파일 생성 : $ (CustomTarget)는 request.CommandLineArguments

<Import Project="$(CustomTarget)" Condition="'$(CustomTarget)'!=''"/> 
<!--Import CustomContoso.Target if no partner is passed in—> 
<Import Project="EmptyCustom.Target" Condition="'$(CustomTarget)'==''"/> 

단계 4 1 단계에서 명령 행 인수로 전달할 것 인 것이다 완료되었습니다.

나는 단계와이 블로그 게시물의 범위,하지만 희망을 받아야 밖에서 시작 몇 가지 다른 사소한 일들을 구축 업데이트에 대한 지원을 추가했습니다.

7

당신이하려는 일에 달려 있습니다.

1) 빌드 + 스테이징을 하나의 작업으로 실행 하시겠습니까? 하나의 통합 된 빌드 보고서, 하나의 로그 파일, 서버의 빌드 대기열에있는 하나의 작업, 이전 단계를 실행 한 동일한 빌드 에이전트에 의해 순차적으로 실행되는 모든 단계로 끝나야합니까?

그렇다면 기본적으로 올바른 경로에 있습니다. 나는 tfsbuild.exe에 <Exec> 아웃을하지 않을 것입니다 - 전체 빌드를 실행하는 데 오버 헤드가 많이 발생하고 잠재적 인 부작용이 무엇인지 확신 할 수 없습니다. 대신, <Call> 작업을 사용하여 준비 스크립트에 정의 된 msbuild 작업을 실행합니다.

2) "빌드 빌드"가 실제로 별도의 "준비 빌드"를 대기열에 넣으시겠습니까? 별도의 보고서, 로그 파일, & 대기열에 있습니까? 여러 빌드 에이전트가있는 경우 병렬로 실행할 수 있습니까?

다음, 그렇다면 :

  • 원래 빌드 정의에 약간의 코드를 추가 준비를위한 새로운 빌드 정의 (들)을 생성하는 큐 [한/여러]를 사용하여 새 빌드 정의 팀 빌드 API. Sample code. 핵심 관련이없는
  • 제거 아무것도
  • 이 새로운 "준비"정의는 어떤 자동 트리거 (시간 간격, 체크인 이벤트 등)
+0

바람직하게 1 단계이지만, 작업은 사용자가 제안한대로 사용할 수 없습니다. 스테이징 빌드는이 경우 빌드의 원동력이되어야합니다. 핵심 빌드를 호출 한 다음 사용자 지정 스테이징을 수행합니다. 최소 tfsbuild proj 파일 사용시 문제는 UI를 통해 생성 된 TFSBuild 정의 파일이 빌드 할 솔루션을 기반으로 모든 경로 속성을 설정한다는 것입니다. (스테이징 빌드 정의가 솔루션을 다시 작성해서는 안됨) TFSBuild.proj 파일을 하드 코딩하지 않고 올바른 코어 TFSBuild.proj 파일을 호출하도록 구성된 경로를 얻는 데 어려움이 있습니다. – user22242

+0

문제를 이해할 수 없습니다. 스테이징 스크립트를 빌드 스크립트와 동일한 디렉토리에 저장하지 않으시겠습니까? 실제로, 심지어 그것이 필요하지 않습니다 - 그냥 상대 경로가 동일하게 유지하십시오. ///// 도움이되지 않는다면, 당신이하려는 일에 대해 더 자세히 설명해주십시오. "첫 번째 빌드"및 "두 번째 빌드"에서 발생할 것으로 예상되는 정확한 내용은 무엇입니까? 공통된 작업과 사용자 정의해야 할 작업은 무엇입니까? –

+0

BTW, 수행하려는 작업에 따라 팀 빌드가 올바른 접근 방식이 아닐 수도 있습니다. 예를 들어, 테스트 환경은 "밀어 ​​넣기"대신 "끌어 오기"모델로 설정됩니다. 각 시스템은 TFS 알림 시스템에 가입합니다. BuildCompletion 이벤트가 발생하면 시스템의 서비스가 해당 상자에 대해 구성된 다양한 기준을 확인하고 적절하게 테스트 환경을 다시 배포합니다. –

0

인가가없는 있는지 확인 원래 빌드 정의에서 구축 준비 환경에 솔루션을 배포하려고하십니까? 그래서 좋은 방법은 ... 선택한 빌드 품질을 기반으로 개의 다른의 PowerShell 스크립트를 실행 코드 플렉스에서 TFSDeployer를 사용하는 경우

다음
+1

TFSDeployer에 대한 학습 곡선을 다루는 대신이 작업을 CC처럼 처리 할 수 ​​있습니다. TFS에서 다른 도구에 의존해야하는 이유는 무엇입니까? 나는 많은 사람들이 심지어 체인화 된 TFS 빌드에 대해서 말하고 있지 않다는 점에 놀랐다 – user22242

+2

체인으로 연결된 빌드는 내 버전 번호 매기기를 때려 눕힐 것이다. 하나의 빌드를 사용하여 모든 "아티팩트"를 빌드 한 다음 DEV에 시스템 테스트를 적용한 다음 QA를 베타하고 마지막으로 라이브에 배포해야합니다. 이것은 오염 된 빌드 (개발자 체크 인)의 포지셔닝이 절대적으로 없도록하기 위해 수행됩니다. 문제가 발생하면 DEV로 돌아갑니다. 이는 메인에 병합되기 전에 QA/UAT를 통과하고 릴리즈를 위해 Branched가 통과 될 때까지 모든 기능 브랜치에서 수행됩니다. :) –

1

다음은 유용한 링크입니다. 그것은 다른 사람들을 도울지도 모른다.

다른 빌드 정의를 작성하고 트리거 될 다른 빌드 정의를 호출합니다. 아이 빌드에

http://blog.stangroome.com/2011/09/06/queue-another-team-build-when-one-team-build-succeeds/

인수 전달

http://blogs.objectsharp.com/post/2012/02/04/Create-a-Master-Build-that-calls-other-Builds.aspx

.쉽게 이런 종류의 시나리오를 지원합니다 - http://blog.stangroome.com/2014/02/19/queue-a-team-build-from-another-and-pass-parameters/

TFS 다른 빌드 정의

http://tfsbuildextensions.codeplex.com/

관련 문제