我们有TFS 2017,我们使用TFVC。
我们有vNext构建定义,其中包含来自许多分支的许多源代码映射(构建需要所有代码)。
在构建结束时(如果他成功通过),我想从agent文件夹(具有本地文件夹结构)中获取所有本地代码,然后将所有代码检入到单独的分支中(对于例如)并保留文件夹结构。
(我们想要一个包含所有“工作”代码的分支,在开发中,我们不能使用一个分支,因为构建需要许多不同的资源)。
我想到了这样的事情:
要考虑的一件事:我们有很多构建定义,并且我们想为每个构建都做,因此,对于每个构建,我们都想在“发布分支”上创建一个文件夹,并在其中检入代码。所以我需要检查文件夹是否存在-如果存在-签入,不存在-创建文件夹并签入。
我该怎么做? (tf.exe?)
更新:
我成功使用tf.exe
工具来实现这一目标,除非出现以下问题:
tf.exe
无法检测到自动删除的文件,我需要指定从工作空间中删除哪些项目。我怎样才能做到这一点? (我有一个包含数百个文件夹和子文件夹的文件夹)
答案 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
。