2014-09-18 3 views
4

Как часть моей непрерывной интеграции, я создаю SQL-скрипт. Этот SQL-скрипт должен быть снова включен в TFS после его создания. Я использую TFS Powertools в Powershell.Проверьте файл в TFS с помощью Powershell

код, который я использовал на моей машине было:

Add-TfsPendingChange -Add -Item $filename | New-TfsChangeSet 

Это работало отлично на моем Dev поле, так как папка я был сопоставлен с рабочей TFS. Когда я переношу его на свой сервер сборки, он больше не работает, потому что TeamCity не отображает его в рабочей области, а просто вытаскивает файлы.

Как проверить файлы в определенной папке в TFS, не находясь в сопоставленной рабочей области? Возможно ли это?

+1

Обычно вам необходимо создать сопоставление рабочей области и рабочей папки, чтобы вытащить файлы TFS в локальный каталог. Вы уверены, что TeamCity не создает сопоставление? Вы можете увидеть сбой регистрации, потому что учетная запись, использующая сборку TeamCity, не имеет прав на регистрацию. –

+0

Некоторые команды TFS принимают аргумент сервера или рабочей области, но команда New-TfsChangeSet (что я понимаю, это команда, чтобы проверить ситуацию). –

ответ

1

Я работал над чем-то, чтобы сделать это для нашего проекта непрерывной доставки, используя GO. Я работал, используя комбинацию PowerShell и поставщика сборщиков .NET с Team Explorer. Я не мог заставить его работать исключительно в PowerShell (хотя может быть и так!)

Следующий сценарий будет проверять все, что содержится в пути материала, который предоставляется в качестве параметра в указанный путь к серверу (также параметр). Вы также можете указать учетные данные для использования и URL-адрес сервера TFS.

Этот код требует установки Visual Studio или клиента Team Explorer. Вам необходимо указать расположение каталогов в сценариях в параметре AssemblyPath. Если эти сборки не будут найдены, сценарий будет ошибочен и покажет, какие из них отсутствуют.

ПРИМЕЧАНИЕ: Код не был проверен какое-то время, поэтому могут быть опечатки и т. Д. Если у вас есть какие-либо проблемы, сообщите мне, и я постараюсь помочь.

[CmdletBinding(PositionalBinding=$false)] 
Param(
    [Parameter(Mandatory)] [string] $ServerUrl, 
    [Parameter(Mandatory)] [string] $ServerPath, 
    [Parameter(Mandatory=$False)] [string] $Domain = "", 
    [Parameter(Mandatory=$False)] [string] $Username = "", 
    [Parameter(Mandatory=$False)] [System.Security.SecureString] $Password, 
    [Parameter(Mandatory)] [string] [ValidateScript({($_ -eq $null) -or (Test-Path -Path $_ -PathType Container)})] $MaterialPath, 
    [Parameter(Mandatory)] [string] [ValidateScript({ Test-Path -Path $_ -PathType Container})] $AssemblyPath 
) 

<# 
    .SYNOPSIS 
    Responsible for checking in files into Source Control 
    .DESCRIPTION 
#> 

$clientDllName = "Microsoft.TeamFoundation.Client.dll" 
$commonDllName = "Microsoft.TeamFoundation.Common.dll" 
$versionControlClientDllName = "Microsoft.TeamFoundation.VersionControl.Client.dll" 
$versionControlClientCommonDllName = "Microsoft.TeamFoundation.VersionControl.Common.dll" 


#Create global variables to hold the value of Debug and Verbose action preferences which can then be used for all module function calls and passed into the remote session. 
$verboseParameter = $PSCmdlet.MyInvocation.BoundParameters["Verbose"] 
if ($verboseParameter -ne $null) 
{ 
    $Global:Verbose = [bool]$verboseParameter.IsPresent 
} 
else 
{ 
    $Global:Verbose = $false 
} 
$debugParameter = $PSCmdlet.MyInvocation.BoundParameters["Debug"] 
if ($debugParameter -ne $null) 
{ 
    $Global:Debug = [bool]$debugParameter.IsPresent 
} 
else 
{ 
    $Global:Debug = $false 
} 

$scriptName = $(Split-Path -Leaf $PSCommandPath) 

#Ensure any errors cause failure 
$ErrorActionPreference = "Stop" 

Write-Host "Running script ""$scriptName"" as user ""$env:USERDOMAIN\$env:USERNAME""" 

#Check assembly path is a valid directory 
If (Test-Path -Path $AssemblyPath -PathType Container) 
{ 
    Write-Host "Loading required assemblies from assembly path ""$AssemblyPath""" 

    $clientDllPath = Join-Path -Path $AssemblyPath -ChildPath $clientDllName 
    $commonDllPath = Join-Path -Path $AssemblyPath -ChildPath $commonDllName 
    $versionControlClientDllPath = Join-Path -Path $AssemblyPath -ChildPath $versionControlClientDllName 
    $versionControlClientCommonDllPath = Join-Path -Path $AssemblyPath -ChildPath $versionControlClientCommonDllName 

    If (!Test-Path -Path $clientDllPath -PathType Leaf) 
    { 
     Throw "Required assembly ""$clientDllName"" not found at path ""$clientDllPath""" 
    } 
    If (!Test-Path -Path $commonDllPath -PathType Leaf) 
    { 
     Throw "Required assembly ""$commonDllName"" not found at path ""$commonDllPath""" 
    } 
    If (!Test-Path -Path $versionControlClientDllPath -PathType Leaf) 
    { 
     Throw "Required assembly ""$versionControlClientDllName"" not found at path ""$versionControlClientDllPath""" 
    } 
    If (!Test-Path -Path $versionControlClientCommonDllPath -PathType Leaf) 
    { 
     Throw "Required assembly ""$versionControlClientCommonDllName"" not found at path ""$versionControlClientCommonDllPath""" 
    } 

    #Load the Assemblies 
    [Reflection.Assembly]::LoadFrom($clientDllPath) | Out-Null 
    [Reflection.Assembly]::LoadFrom($commonDllPath)| Out-Null 
    [Reflection.Assembly]::LoadFrom($versionControlClientDllPath) | Out-Null 
    [Reflection.Assembly]::LoadFrom($versionControlClientCommonDllPath) | Out-Null 

    #If the credentials have been specified then create a credential object otherwise we will use the default ones 
    If ($Username -and $Password) 
    { 

     $creds = New-Object System.Net.NetworkCredential($Username,$Password,$Domain) 
     Write-Host "Created credential object for user ""$($creds.UserName)"" in domain ""$($creds.Domain)""" 

     $tfsProjectCollection = New-Object Microsoft.TeamFoundation.Client.TFSTeamProjectCollection($ServerUrl, $creds) 
    } 
    else 
    { 
     Write-Host "Using default credentials for user ""$Env:Username""" 
     $tfsProjectCollection = New-Object Microsoft.TeamFoundation.Client.TFSTeamProjectCollection($ServerUrl) 
    } 

    $versionControlType = [Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer] 
    $versionControlServer = $tfsProjectCollection.GetService($versionControlType) 

    Write-Host "Version control server authenticated user: $($versionControlServer.AuthenticatedUser)" 

    #Create a local path in the temp directory to hold the workspace 
    $LocalPath = Join-Path -Path $env:TEMP -ChildPath $([System.Guid]::NewGuid().ToString()) 
    $null = New-Item -Path $LocalPath -ItemType Directory 

    #Create a "workspace" and map a local folder to a TFS location 
    $workspaceName = "PowerShell Workspace_{0}" -f [System.Guid]::NewGuid().ToString() 
    $workspace = $versionControlServer.CreateWorkspace($workspaceName, $versionControlServer.AuthenticatedUser) 
    $workingfolder = New-Object Microsoft.TeamFoundation.VersionControl.Client.WorkingFolder($ServerPath,$LocalPath) 
    $result = $workspace.CreateMapping($workingFolder) 
    $result = $workspace.Get() #Get the latest version into the workspace 

    Write-Host "Copying files from materials path ""$MaterialPath"" to temporary workspace path ""$LocalPath""" 
    robocopy $MaterialPath $LocalPath /s | Out-Null 

    $checkInComments = "Files automatically checked in by PowerShell script ""$scriptName""" 

    #Submit file as a Pending Change and submit the change 
    $result = $workspace.PendAdd($LocalPath,$true) 
    $pendingChanges = $workspace.GetPendingChanges() 

    Write-Host "Getting pending changes" 

    #Only try to check in if there are changes 
    If ($pendingChanges -ne $null) 
    { 
     If ($pendingChanges.Count -gt 0) 
     { 
      $changeSetId = $workspace.CheckIn($pendingChanges,$checkInComments) 

      Write-Host "Successfully checked in ""$($pendingChanges.Count)"" changes using changeset id ""$changeSetId""" 
     } 
     else 
     { 
      Write-Host "No changes to check-in" 
     } 
    } 
    else 
    { 
     Write-Host "No changes to check-in" 
    } 

    Write-Host "Deleting workspace and temporary folders" 
    $result = $workspace.Delete() 
    $null = Remove-Item -Path $LocalPath -Recurse -Force 
} 
else 
{ 
    Write-Error "The path to required assemblies ""$AssemblyPath"" cannot be found" 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^