从 TFS 签入构建当前代码到另一个分支

Check-in from TFS build the current code to another branch

我们有 TFS 2017,我们正在使用 TFVC。

我们有 vNext 构建定义,其中包含来自许多分支的许多源代码映射(构建需要所有代码)。

在构建结束时(如果他成功通过)我想从代理文件夹(具有本地文件夹结构)中取出所有本地代码并将所有代码签入到单独的分支("release branch" 例如)并保持文件夹结构。

(我们想要一个分支包含所有 "working" 代码,在开发中,我们不能只使用一个分支,因为构建需要许多不同的源)。

我想到了这样的事情:

需要考虑的一件事:我们有很多构建定义,我们想为所有构建定义,所以对于每个构建,我们想在 "release branch" 上创建一个文件夹,并将代码签入到那里。所以我需要检查该文件夹是否存在,如果存在 - 签入,不存在 - 创建一个文件夹并签入。

我该怎么做? (tf.exe?)

更新:

我使用 tf.exe 工具成功实现了这一点,除非有一个问题:

tf.exe 无法检测到自动删除的文件,我需要指定从工作区中删除哪些项目。我怎样才能做到这一点? (我有一个包含数百个文件夹和子文件夹的文件夹)

我通过在每个成功的构建中创建一个分支来解决这个问题(不是最好的方法但不是 CI 而且我们没有很多构建)。

因为tf barnch没有创建分支(除非源来自分支)我将所有源代码从代理复制到临时工作区,然后我签入TFS,它创建了一个新文件夹使用我的代码,然后将文件夹转换为分支。

Param(
[string]$path
)
$newCodeFolderPath = "$($env:Agent_BuildDirectory)\newCode"
$tempWorkspacePath =  "$($env:Agent_BuildDirectory)\tempWorkspace"

New-Item -Path $newCodeFolderPath -ItemType directory

Copy-Item -Path "$($env:Build_SourcesDirectory)/*" -Recurse -Destination $newCodeFolderPath 

New-Item -Path $tempWorkspacePath -ItemType directory

cd $tempWorkspacePath 

$tfExe = "C:\Program Files (x86)\Microsoft Visual Studio17\Professional\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\tf.exe"

& $tfExe workspace /collection:{TfsCollection} /new "TempWorkspace" /noprompt

& $tfExe workfold "$($path)/Release/$($env:Build_BuildNumber)" $tempWorkspacePath 

Copy-Item -Path "$($newCodeFolderPath)/*" -Recurse -Destination $tempWorkspacePath 

& $tfExe add * /recursive /noignore

& $tfExe checkin /recursive /comment:"from vNext build"

& $tfExe workspace /delete /collection:{TfsCollection} "Tempworkspace"

cd c:/
Remove-Item -Path $newCodeFolderPath -Force -Recurse
Remove-Item -Path $tempWorkspacePath -Force -Recurse

$releaseBranchPath = "$($path)/Release/$($env:Build_BuildNumber)
Write-Host ("##vso[task.setvariable variable=releaseBranchPath;]$releaseBranchPath")

在构建 PowerShell 任务中,我传递了 $path 变量,例如 $/MyProject/V1/Name,脚本将创建文件夹 Release(第一次)并在 Release 文件夹中创建一个文件夹包含所有代码。

之后,我需要将文件夹转换为分支,所以我用 C# 编写了一个小工具(你需要 TFS API 库):

try
{
  string collectionUrl = {myCollection};
  string releaseBranchPath = Environment.GetEnvironmentVariable("releaseBranchPath");
  var tp = TfsTeamProjectCollection(new Uri (collectionUrl));
  var versionControl = tp.GetService<VersionControlServer>();
  versionControl.CreateaBranchPbject(new BranchProperties(new ItemIdentifier(releaseBranchPath)));
}
catch (Execption e)
{
  Console.WriteLine(e.Message);
}

我编译了它,然后 运行 .exe 在 PowerShell 任务之后使用命令行任务。