从 TFS 签入构建当前代码到另一个分支
Check-in from TFS build the current code to another branch
我们有 TFS 2017,我们正在使用 TFVC。
我们有 vNext 构建定义,其中包含来自许多分支的许多源代码映射(构建需要所有代码)。
在构建结束时(如果他成功通过)我想从代理文件夹(具有本地文件夹结构)中取出所有本地代码并将所有代码签入到单独的分支("release branch" 例如)并保持文件夹结构。
(我们想要一个分支包含所有 "working" 代码,在开发中,我们不能只使用一个分支,因为构建需要许多不同的源)。
我想到了这样的事情:
- 新建文件夹
- 在此文件夹中创建一个新工作区
- 正在将文件夹映射到 "release branch"
- 将所有代码复制到此文件夹
- 将文件签入分支
需要考虑的一件事:我们有很多构建定义,我们想为所有构建定义,所以对于每个构建,我们想在 "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 任务之后使用命令行任务。
我们有 TFS 2017,我们正在使用 TFVC。
我们有 vNext 构建定义,其中包含来自许多分支的许多源代码映射(构建需要所有代码)。
在构建结束时(如果他成功通过)我想从代理文件夹(具有本地文件夹结构)中取出所有本地代码并将所有代码签入到单独的分支("release branch" 例如)并保持文件夹结构。
(我们想要一个分支包含所有 "working" 代码,在开发中,我们不能只使用一个分支,因为构建需要许多不同的源)。
我想到了这样的事情:
- 新建文件夹
- 在此文件夹中创建一个新工作区
- 正在将文件夹映射到 "release branch"
- 将所有代码复制到此文件夹
- 将文件签入分支
需要考虑的一件事:我们有很多构建定义,我们想为所有构建定义,所以对于每个构建,我们想在 "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 任务之后使用命令行任务。