Доступ к TFS (предварительно) через powershell в контейнере Docker Windows - PullRequest
0 голосов
/ 23 мая 2018

У меня сервер windows 2016, работающий под управлением windowservercore.Я работаю над перемещением конвейера CI в контейнеры.Во время нашего процесса мы создаем файл version.html.Файл содержит данные сборки (например, дату сборки и сборку nbr) и информацию о проекте TFS 2017 о произошедшем слиянии / ветвлении.

Мы работали с TeamCity, запустив сценарий PowerShell, который подключался и выполнял запрос кTFS 2017. Поэтому я посмотрел на док-концентратор для TFS, но не повезло.Я тоже пытался поискать под Microsoft на док-хабе и ничего не нашел.

Я попытался создать новый файл Docker

    FROM microsoft/windowsservercore:10.0.14393.1480

# Setup shell
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

RUN Mkdir BuildStage
COPY powershell/CopyBuildToStageDir.ps1 \BuildStage
Copy  powershell/BuildVersionFile.ps1 \BuildStage

RUN dir

Но когда я запустил файл Powershell внутри контейнера Windows, он сказал ...

Unable to find type 

[09:25:00][Step 2/2] [Microsoft.TeamFoundation.Client.TeamFoundationServerFactory].

[09:25:00][Step 2/2] At C:\BuildStage\BuildVersionFile.ps1:192 char:12

ВPowerShell, есть эта функция

#============================================================================
# Setup TFS stuff
#============================================================================
function Setup-Tfs {

    # Connect to TFS
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Client") | out-null
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.VersionControl.Client") | out-null

    $tfsServer =  "http://ourServer";
    $tfs = [Microsoft.TeamFoundation.Client.TeamFoundationServerFactory]::GetServer($tfsServer) 
    $Script:versionControlServer = $tfs.GetService([Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer] ) 
    $Script:recursionType = [Microsoft.TeamFoundation.VersionControl.Client.RecursionType]::Full

}

Вот более подробная информация о том, как мы используем powershell для вызова TFS для получения информации о слиянии и ветвлении для создания файла version.html ...

   # Need to get the last 5 changesets of Merge information for both MAIN and Iteration
    Setup-Tfs

    $baseLocation = "$/OurBaseLocation/"
    $locationForMain = $baseLocation + $OurProjectLocation

    # Query history for the TFS path
    $vCSChangeSets = $versionControlServer.QueryHistory($locationForMain, $recursionType, 5)

    # History of Merge changes to MAIN application (only 5 deep)
    "<table border='2'>" | Out-File $VersionFname -append
    "<caption>Merge Info For: $AppName </caption>" | Out-File $VersionFname -append

    # Build out headers
    "<TH>Changeset</TH><TH>Date</TH><TH>Comment</TH>" | Out-File $VersionFname -append

    Foreach ($vCSChangeSet in $vCSChangeSets) {
        # write row
        $changeset =  $vCSChangeSet.ChangesetID 
        $CheckinNotesName =  $vCSChangeSet.Comment
        $CreationDate =  $vCSChangeSet.CreationDate

        if ($CheckinNotesName.ToUpper().Contains("MERGE")){
            "<TR>" | Out-File $VersionFname -append
            "<TD>$changeset</TD><TD>$CreationDate</TD><TD>$CheckinNotesName</TD>" | Out-File $VersionFname -append
            "</TR>" | Out-File $VersionFname -append
        }
        if ($CheckinNotesName.ToUpper().Contains("BRANCH")){
            "<TR>" | Out-File $VersionFname -append
            "<TD>$changeset</TD><TD>$CreationDate</TD><TD>$CheckinNotesName</TD>" | Out-File $VersionFname -append
            "</TR>" | Out-File $VersionFname -append
        }
    }

    # close table add space
    "</table><BR/><BR/>" | Out-File $VersionFname -append

Я предполагаю, что мой файл докера должен добавить что-то для "Microsoft.TeamFoundation.VersionControl.Client"

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 25 сентября 2018

Лучшим для меня оказалось то, что я отказался от пространств имен PowerShell для TFS.Вместо этого используйте API TFS.Вот пример, чтобы получить свойства одного WI.

#============================================
# Get-TFSFieldsByWiId
#============================================
function Get-TFSFieldsByWiId([string]$Id) {

    $url = 'http://YourTFSUrl:YourPort/YourProject/_apis/wit/workitems?ids=' + $Id+'&$expand=all&api-version=YourVersion'

    # Step 1. Create a username:password pair
    $credPair = "$(''):$($password)"

    # Step 2. Encode the pair to Base64 string
    $encodedCredentials = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($credPair))

    # Step 3. Form the header and add the Authorization attribute to it
    $headers = @{ Authorization = "Basic $encodedCredentials" }

    # Step 4. Make the GET request
    $responseData = Invoke-WebRequest -Uri $url -Method Get -Headers $headers -UseBasicParsing -Body ($QueryToRun|ConvertTo-Json) -ContentType "application/json"

    $data = $responseData.Content
    $data = $data | ConvertFrom-Json
    $WIDetails = $data.value
    return $WIDetails
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...