2010-09-27 14 views
10

Esta es una característica a la que estoy acostumbrado desde TeamCity: podría especificar que una cierta configuración de compilación se desencadenará por el éxito de otra configuración de compilación.Generación de desencadenamiento cuando otro finalizó correctamente en TFS 2008

Incluso pude pasar los resultados de una compilación a otra, pero quizás esto es pedir demasiado.

Estoy buscando una funcionalidad similar en TFS2008, ¿hay alguna manera de establecer un desencadenante en una configuración de compilación que se iniciará después de que otra finalice correctamente?

Respuesta

6

utilizo el siguiente objetivo en mi TFSBuild.proj:

inyectar los nuevos objetivos en el proceso de construcción. Nos único desencadenante construye dependiente si una "caída" se ha creado correctamente:

<PropertyGroup> 
    <DropBuildDependsOn> 
     $(DropBuildDependsOn); 
     CreateDependentBuildItemGroup; 
     TriggerDependentBuilds; 
    </DropBuildDependsOn> 
</PropertyGroup> 

Crear una ItemGroup que contiene una lista de los dependientes construye queremos desencadenar (el atributo Incluir listará el nombre de la acumulación dependiente como aparece en el explorador de compilación, en mi caso a continuación, la compilación dependiente se llama "Integración"). En nuestro proceso de compilación, a veces queremos activar más de una compilación, y queremos apuntar a la siguiente compilación en los archivos binarios que fueron producidos por la compilación actual (en este ejemplo, quiero ejecutar pruebas de integración contra los archivos binarios producidos). Observe el truco para moverse por los espacios en los nombres de configuración, por ejemplo, "Cualquier CPU" causará un problema en los argumentos de MsBuild. Usando este formato, podemos tener args MSBuild personalizados por compilación dependiente.

<Target Name="CreateDependentBuildItemGroup"> 
    <ItemGroup> 
     <DependentBuild Include="Integration"> 
      <!--Using 8dot3 format for "Mixed Platforms" as it's tricky (impossible?) to pass a space char within /msbuildarguments of tfsbuild--> 
      <MsBuildArgs>/p:CallingBuildDropFolder=$(DropLocation)\$(BuildNumber)\Mixedp~1\Ship;CiSmallBuildNumber=$(CiSmallBuildNumber);BuildNumberPostFix=$(BuildNumberPostFix)</MsBuildArgs> 
      <PriorityArg>/priority:AboveNormal</PriorityArg> 
     </DependentBuild> 
    </ItemGroup>  
</Target> 

Ahora, active las compilaciones. Tenga en cuenta que usamos una GetOption personalizada: queremos asegurarnos de que las compilaciones dependientes utilicen el mismo conjunto de cambios que usó la compilación actual; no podemos usar Latest, porque alguien puede haberse registrado mientras tanto, por lo que queremos que todas las compilaciones dependientes nuestra "cadena" para todos se basa en el mismo conjunto de cambios. El comando real está dentro del Exec, y las cosas de BuildStep son para asegurarnos de informar el éxito (o falla) del Exec.

<Target Name="TriggerDependentBuilds" 
     Condition=" '$(CompilationStatus)' == 'Succeeded' "> 
    <BuildStep TeamFoundationServerUrl="$(TeamFoundationServerUrl)" 
       BuildUri="$(BuildUri)" 
       Name="TriggerStep" 
       Message="Triggering Dependent Builds"> 
     <Output TaskParameter="Id" 
       PropertyName="TriggerStepId" /> 
    </BuildStep> 

    <PropertyGroup> 
     <TriggerBuildCommandBase>TfsBuild start $(TeamFoundationServerUrl) $(TeamProject)</TriggerBuildCommandBase> 
    </PropertyGroup> 

    <Exec 
     ContinueOnError="true" 
     WorkingDirectory="C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE" 
     Command="$(TriggerBuildCommandBase) %(DependentBuild.Identity) /queue /getOption:Custom /customGetVersion:$(GetVersion) %(DependentBuild.PriorityArg) /msbuildarguments:&quot;%(DependentBuild.MsBuildArgs)&quot;"> 
     <Output TaskParameter="ExitCode" 
       ItemName="TfsBuildResult"/> 
    </Exec> 

    <BuildStep Condition="'@(TfsBuildResult)'=='0'" 
       TeamFoundationServerUrl="$(TeamFoundationServerUrl)" 
       BuildUri="$(BuildUri)" 
       Id="$(TriggerStepId)" 
       Status="Succeeded" /> 
    <BuildStep Condition="'@(TfsBuildResult)'!='0'" 
       TeamFoundationServerUrl="$(TeamFoundationServerUrl)" 
       BuildUri="$(BuildUri)" 
       Id="$(TriggerStepId)" 
       Status="Failed" /> 
</Target> 

Espero que ayude ...

+0

¿podría enviar el archivo completo? (y plantilla)? Gracias –

+0

Lo siento: se mudó de ese trabajo y ya no tiene acceso. Realmente, debería haber suficiente en el tho anterior .... –

+0

No hay problema. Lo descubrí usando la plantilla de definición de construcción. –

Cuestiones relacionadas