ProjectX で作成された TFS 2010 ビルド定義がいくつかあります。これで、ソース コードは ProjectY の下位フォルダーに移動しました。ビルド定義を ProjectY に移動して、ProjectY のチーム エクスプローラーの [ビルド] ノードの下に表示するにはどうすればよいですか?
6 に答える
あるプロジェクトから別のプロジェクトにビルド定義をコピーするためのすぐに使えるものはないと思います。ただし、TFS API を使用して実行できるはずです。Pete が参照しているビルド プロセス テンプレートを、新しいプロジェクトの Build Process Template フォルダーに移動する必要があります。その後、次のようにします。
var server = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("<server uri>"));
IBuildServer buildServer = server.GetService<IBuildServer>();
var buildDetails = buildServer.QueryBuildDefinitions("Project X");
foreach(var build in buildDetails)
{
var buildDefinition = buildServer.CreateBuildDefinition("Project Y");
buildDefinition.Name = "Copy of " + build.Name;
buildDefinition.BuildController = build.BuildController;
// This finds the template to use
buildDefinition.Process = buildServer.QueryProcessTemplates("Project Y")[0];
buildDefinition.ProcessParameters = build.ProcessParameters;
buildDefinition.Save();
}
注意すべきことがいくつかあります。あるプロジェクトから別のプロジェクトへのワークスペース マッピングの変換に対処する必要があります。特定のテンプレートを見つけるには、buildDefinition.Process 行も変更する必要があります。
上記のショーンの答えのパワーシェルバージョン
# Copy some TFS build defintions from one project collection to another
[void][Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Client")
[void][Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.VersionControl.Client")
[void][Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Build.Client")
$tfsUrl = "http://lontfs_at:8080/tfs/XXX"
$tfs = [Microsoft.TeamFoundation.Client.TeamFoundationServerFactory]::GetServer($tfsUrl)
$vcs = $tfs.GetService([Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer])
$buildServer = $tfs.GetService([Microsoft.TeamFoundation.Build.Client.IBuildServer])
$buildDetails = $buildServer.QueryBuildDefinitions("Project X");
foreach( $build in $buildDetails)
{
$buildDefinition = $buildServer.CreateBuildDefinition("Project Y");
$buildDefinition.Name = "Copy of " + $build.Name;
$buildDefinition.BuildController = $build.BuildController;
# This finds the template to use
$buildDefinition.Process = $buildServer.QueryProcessTemplates("Project Y")[0];
$buildDefinition.ProcessParameters = $build.ProcessParameters;
$buildDefinition.Save();
}
1 つまたは 2 つのビルド定義のみを移動する(複製しない)醜いが非常に効率的な方法:
- SQL Server Management Studio を開きます。
- コレクション DB を開く
- テーブル tbl_BuildDefinition を編集します
- 現在の GroupId をターゲット チーム プロジェクトの GroupId に置き換えます
それでおしまい ;)
ターゲット チーム プロジェクトの GroupId を特定するには、tbl_BuildDefinition でそのチーム プロジェクトの BuildDefinition を検索し、その GroupId を取得します。
確かに、BuildDefinition のワークスペース、ビルドするアイテム、...を更新して、新しいチーム プロジェクトのサーバー パスを使用する必要があります。
BuildDefinition を更新するときに「GroupItem をチーム プロジェクト全体に移動できません」のようなエラーが発生した場合は、DB を更新する前に既に開いていた可能性があります。閉じて、再度開きます。
この操作をあまり頻繁に繰り返すつもりがない場合は、IMO が最速のソリューションです。
V.
ビルド定義は、TFS の別のソース管理ファイルにすぎません。ProjectX でビルド定義を開いて、projectY のビルド定義フォルダーに新しいファイルとして保存できるはずです。
編集
上記の投稿では、ProjectX と ProjectY が TFS プロジェクトであると想定しています。この場合、ワークフローのビルド定義は、それぞれのソース管理ルートの builddfinitions フォルダーにあるだけです。