При регистрации из TFS соберите текущий код в другую ветку - PullRequest
0 голосов
/ 02 октября 2018

У нас есть TFS 2017, и мы используем TFVC.

У нас есть определение сборки vNext со многими сопоставлениями исходного кода из многих ветвей (весь код требуется для сборки).

Вконец сборки (если он прошел успешно) Я хочу взять весь локальный код из папки агента (со структурой локальной папки) и зарегистрировать весь код в отдельной ветке (например, «ветвь релиза») и сохранитьструктура папок.

(Нам нужна одна ветка со всем «рабочим» кодом, в разработке мы не можем работать с одной веткой, потому что для сборки требовалось много разных источников).

Я думал о чем-то вроде этого:

  • Создать новую папку
  • Создать новое рабочее пространство в этой папке
  • Отображение папки в «ветку релиза»
  • Скопируйте весь код в эту папку
  • Проверьте файлы в ветке

Одна вещь, которую нужно учитывать: у нас много определений сборок, и мы хотим сделать это для всехтак для каждого буild, мы хотим создать папку в «ветке релиза» и проверить там код.поэтому мне нужно проверить, существует ли папка, если да - проверить, нет - создать папку и проверить.

Как я могу это сделать?(tf.exe?)

ОБНОВЛЕНИЕ:

Мне удалось с помощью инструмента tf.exe добиться этого, если только одна проблема:

tf.exe можетне обнаруживать автоматически удаленные файлы, мне нужно указать, какие элементы удаляются из рабочей области.Как мне это сделать?(У меня есть папка с сотнями папок и подпапок)

1 Ответ

0 голосов
/ 15 октября 2018

Я понимаю это, создавая ветку в каждой успешной сборке (не лучший способ, но это не 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")

В задаче сборки 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.

...