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

时间:2018-10-02 09:41:37

标签: tfs tfsbuild tfvc

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

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

在构建结束时(如果他成功通过),我想从agent文件夹(具有本地文件夹结构)中获取所有本地代码,然后将所有代码检入到单独的分支中(对于例如)并保留文件夹结构。

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

我想到了这样的事情:

  • 创建一个新文件夹
  • 在此文件夹中创建一个新的工作区
  • 将文件夹映射到“发布分支”
  • 将所有代码复制到此文件夹
  • 将文件检入分支

要考虑的一件事:我们有很多构建定义,并且我们想为每个构建都做,因此,对于每个构建,我们都想在“发布分支”上创建一个文件夹,并在其中检入代码。所以我需要检查文件夹是否存在-如果存在-签入,不存在-创建文件夹并签入。

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

更新:

我成功使用tf.exe工具来实现这一目标,除非出现以下问题:

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

1 个答案:

答案 0 :(得分:0)

我通过在每个成功的构建中创建一个分支来弄清楚(这不是最好的方法,但不是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 Studio\2017\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")

在build 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);
}

我编译了它,并在PowerShell任务之后运行了带有命令行任务的.exe