2014-09-18 8 views
4

연속 통합 빌드의 일부로 SQL 스크립트를 작성하고 있습니다. 이 SQL 스크립트는 생성 된 후 다시 TFS로 체크인해야합니다. Powershell에서 TFS Powertools를 사용하고 있습니다. Powershell을 사용하여 TFS로 파일을 확인하십시오.

내 컴퓨터에서 사용되는 코드

했다 : 나는에 있던 폴더가 TFS 작업 영역에 매핑되기 때문에

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

이 내 dev에 상자에 괜찮 았는데. TeamCity가 체크 아웃을 작업 영역에 매핑하지 않기 때문에 빌드 서버로 이동하면 더 이상 작동하지 않습니다.

매핑 된 작업 공간에 있지 않은 상태에서 TFS의 특정 폴더로 파일을 확인하려면 어떻게합니까? 그게 가능한가?

+1

일반적으로 TFS 파일을 로컬 디렉터리로 끌어 오려면 작업 영역 및 작업 폴더 매핑을 만들어야합니다. TeamCity에서 매핑을 만들지 않았습니까? TeamCity 빌드를 실행하는 계정에 체크인 권한이 없기 때문에 체크인 실패를 볼 수 있습니다. –

+0

TFS 명령 중 일부는 서버 또는 작업 영역 인수를 사용하지만 New-TfsChangeSet 명령 (작업 내용을 확인하는 명령임을 이해함). –

답변

1

GO를 사용하여 계속되는 배달 프로젝트를 위해이 작업을 수행했습니다. Team Explorer와 함께 PowerShell과 .NET 어셈블리 공급자를 함께 사용하여 작업하고 있습니다. PowerShell에서 순전히 작동하지 못했습니다 (방법이있을 수 있습니다!)

다음 스크립트는 지정된 서버 경로에 매개 변수로 제공되는 재료 경로에 포함 된 모든 항목을 체크인합니다 매개 변수). 사용할 자격 증명과 TFS 서버의 URL을 지정할 수도 있습니다.

이 코드를 사용하려면 Visual Studio 또는 TFS 팀 탐색기 클라이언트가 설치되어 있어야합니다. 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" 
}