5

継続的インテグレーションを使用して TFS ビルドをセットアップしています。すべてが正しく機能します。

ビルドをトリガーするチェックインを特定のフォルダー (およびサブフォルダー) に制限しようとしています。

現在、私の定義で設定されているソース管理フォルダーにチェックインすると、プロジェクトがビルドされますが、コードがサブディレクトリの 1 つ (およびサブディレクトリ) にチェックインされた場合にのみビルドがトリガーされるようにしたいと考えています。ソース管理フォルダー。

誰にもアイデアはありますか?デフォルトのビルド テンプレートに変更を加えようとしましたが、今のところうまくいきません。

4

3 に答える 3

1

この制限を次のようにうまく回避しました。

既定の TFS ビルド プロセス テンプレートは、組み込みの "CreateWorkspace" アクティビティを使用します。これは、ビルド定義のマッピングを取得し、対応する TFS ワークスペースを作成します。このアクティビティを直接カスタマイズする方法はないようです。ただし、追加の作業フォルダー マッピングをソース管理ワークスペースに挿入する "CreateWorkspace" アクティビティの直後に、プロセスに追加のアクティビティを追加することは可能です。これらの追加のマッピングにより、ソースが TFS から取得され、CI ビルド自体をトリガーすることなく、ビルド中に使用できるようになります。

重要なのは、既存のワークスペースにマッピングを追加できる新しいカスタム ビルド ワークフロー アクティビティを作成することです。次のように、 http://tfsbuildextensions.codeplex.com/のベース アクティビティを拡張することにしました。

using System;
using System.Activities;
using System.ComponentModel;
using System.Text;
using System.Text.RegularExpressions;
using global::TfsBuildExtensions.Activities;
using Microsoft.TeamFoundation.Build.Client;
using Microsoft.TeamFoundation.VersionControl.Client;

[Description("Adds a mapping to the workspace.")]
[BuildActivity(HostEnvironmentOption.All)]
public class AddWorkspaceMapping : BaseCodeActivity
{
    public InArgument<Workspace> Workspace { get; set; }
    public InArgument<string> ServerItem { get; set; }
    public InArgument<string> LocalItem { get; set; }
    public InArgument<string> BuildDirectory { get; set; }
    public InArgument<string> SourcesDirectory { get; set; }

    protected override void InternalExecute()
    {
        var ctx = this.ActivityContext;

        Workspace ws = this.Workspace.Get(ctx);

        string serverItem = this.ServerItem.Get(ctx);
        string localItem = this.LocalItem.Get(ctx);

        if (!string.IsNullOrWhiteSpace(serverItem))
        {
            localItem = ExpandEnvironmentVariables(localItem);

            ws.Map(serverItem, localItem);
        }
    }

    // Similar to the internal implementation of Microsoft.TeamFoundation.Build.Common.BuildCommonUtil.ExpandEnvironmentVariables()
    internal string ExpandEnvironmentVariables(string inputStr)
    {
        ...
    }
}
于 2014-01-30T15:09:26.543 に答える
1

私が使用するソリューションは、上記と非常によく似ています。ビルド定義でマッピングを作成するときに、CI ビルドをトリガーしたくないフォルダーをクロークします。次に、ワークフローで、CreateWorkspace アクションの直後にクロークを削除するカスタム アクティビティを追加します。クロークを削除すると、それらのフォルダー内のすべてのソースをビルドに使用できるようになります。

これにより、ビルド定義からすべてを管理できるようになり、CI ビルドをトリガーするフォルダーや、ビルドに使用できる必要があるフォルダーを変更する必要がある場合でも、ワークフローを変更する必要はありません。

ワークスペース マッピングの複雑さによっては、これがうまくいく場合があります。

アクティビティのコードは次のとおりです。

using System.Activities;
using System.Linq;
using Microsoft.TeamFoundation.Build.Client;
using Microsoft.TeamFoundation.VersionControl.Client;

[BuildActivity(HostEnvironmentOption.All)]
public sealed class RemoveCloaksFromWorkspace : CodeActivity
{
    [RequiredArgument]
    public InArgument<Workspace> Workspace { get; set; }

    protected override void Execute(CodeActivityContext context)
    {
        var ws = this.Workspace.Get(context);
        ws.Folders.Where(f => f.IsCloaked).ToList().ForEach(f => ws.DeleteMapping(f));
    }
}
于 2014-06-05T17:27:31.177 に答える