Загрузка файлов из TFS Source Control с помощью Powershell работает везде, но определение сборки - PullRequest
2 голосов
/ 06 июня 2019

У меня есть сценарий PS, который я написал, который загружает файлы из системы контроля версий из командного проекта. Сценарий выглядит следующим образом:

    function Clear-Folder
    {
        Param ([string]$directory)


        try
        {
            if ((Test-Path -Path $directory -PathType Container))
            {
                Write-Output "INFO: Clearing directory: $directory"
                Remove-Item -Path "$directory\*" -Recurse -Force -Verbose -ErrorVariable exClear -ErrorAction Stop
            }
            else
            {
                Write-Output "INFO: Directory: $directory does not exist, so it is being created."
                New-Item -Path $directory -ItemType Directory -Force -Verbose -ErrorVariable exClear -ErrorAction Stop
                Write-Output "INFO: Directory: $directory successfully created."
            }
        }
        catch
        {
            Write-Output "ERROR: $exClear"
        }
    }

    Add-PSSnapin Microsoft.TeamFoundation.PowerShell

    function Get-TFS
    {
        Param ([string]$TeamProjectName)

        $tfsCollectionPath = 'http://ourtfsserver/tfs/DefaultCollection'
        [Microsoft.TeamFoundation.Client.TfsTeamProjectCollection] $tfs = Get-TfsServer $tfsCollectionPath

        $tfsCollection = New-Object -TypeName Microsoft.TeamFoundation.Client.TfsTeamProjectCollection -ArgumentList $tfsCollectionPath
        $tfsVersionControl = $tfsCollection.GetService([Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer])

        $locationToSearch = "$/$TeamProjectName/"

        $sourceFolder = "C:\$TeamProjectName"
        Clear-Folder -directory $sourceFolder

        $items = Get-TfsItemHistory -HistoryItem $locationToSearch -Recurse -Server $tfs -Version '1084892~1084927' -IncludeItems |
                Select-Object -Expand "Changes" | 
                    Where-Object { $_.ChangeType -notlike '*Delete*'} | 
                    Where-Object { $_.ChangeType -notlike '*Rename*'} | 
                Select-Object -Expand "Item" | 
                    Where-Object { $_.ContentLength -gt 0} 


        Write-Output $items.Count

        foreach ($item in $items)
        {
            Write-Output $item

            $itemFullName = $item.ServerItem
            Write-Output $itemFullName
            try
            {
                $path = $itemFullName.Replace($locationToSearch, "$sourceFolder\")
                $path = $path.Replace('/', '\')
                Write-Output $locationToSearch
                Write-Output $sourceFolder
                Write-Output $path
                Write-Output "INFO: Downloading file: $itemFullName to: $path"
                $tfsVersionControl.DownloadFile($itemFullName, $path)
            }
            catch [System.Exception]
            {
                $exceptionMessage = $_.Exception.message
                Write-Output "ERROR: Downloading file: $itemFullName to: $path failed; exception message: $exceptionMessage"
            }
        }
    }


    Get-TFS -TeamProjectName 'A'
    Get-TFS -TeamProjectName 'B'
    Get-TFS -TeamProjectName 'C'

Я запускаю этот скрипт в трех местах:
1. локально на моей машине во время первоначальной разработки скриптов и тестирования
2. Сервер с ОС: Windows Server 2012 R2
3. В определении сборки TFS 2015 на сервере в расположении # 2

Скрипт работает просто отлично и не имеет проблем во всех трех местах для одного командного проекта. Затем я снова запускаю сценарий, но с передачей другого командного проекта в функцию «Get-TFS». Это работает для местоположений # 1 и # 2, но не для местоположения # 3. Я пробовал это с несколькими различными командными проектами (у нас их десятки), и до сих пор он работал только во всех трех местах для первого. Все остальные работают только для локаций № 1 и № 2, но не для локации № 3. И под "не работает" я специально имею в виду, что он производит следующий журнал PS в определении сборки:

"Не найдено записей истории для указанной комбинации элемента и версии."

(Также выводится символ «0» без символов двойных кавычек для кода в моем скрипте: «Write-Output $ items.Count»)

Таким образом, он не может найти какие-либо элементы в истории при запуске в местоположении # 3, хотя он действительно находил и успешно загружал их при запуске в местоположениях # 1 и # 2.

Есть идеи, почему это происходит? Я подозреваю, что это какая-то проблема с разрешениями, но я не смог ничего найти, и я нахожу странным, что он будет работать нормально в 2/3 местоположений вместо сбоя во всех 3, если это имело место. .

Другие важные детали для заметки:
1. Теперь я несколько раз тщательно проверял, правильно ли написаны имена командных проектов.
2. Диапазон изменений является правильным и содержит файлы для загрузки в этом диапазоне в всех командных проектов, для которых я пытаюсь это сделать. Помните, что я получаю результаты и успешно загружаю файлы, когда запускаю скрипт в местах № 1 и № 2.
3. Я понимаю, что это может быть какой-то странной ошибкой в ​​TFS 2015, и что обновление до Azure вполне может решить эту проблему. Я хотел бы обновить, но, к сожалению, я нахожусь на рабочем месте, и есть люди, которые сидят за большими столами, чем я, которые решают, когда произойдет обновление. Они планируют это сделать, но в то же время мне все еще нужно сделать это или найти какой-то обходной путь, чтобы меня обойти.

UPDATE:
Я запустил следующую строку:

$ PSVersionTable.PSVersion

во всех трех местах со следующими результатами:

Местоположение 1:
Major: 5
Несовершеннолетний: 1
Телосложение: 14409
Редакция: 1018
MajorRevision: 0
MinorRevision: 1018

Местоположение 2:
Major: 5
Несовершеннолетний: 1
Телосложение: 14409
Редакция: 1018

Местоположение 3:
Major: 5
Несовершеннолетний: 1
Телосложение: 14409
Редакция: 1018
MajorRevision: 0
MinorRevision: 1018

Так что версии powershell все одинаковые. Это не проблема.

...