【问题标题】:Using Powershell to checkin zip file to TFS使用 Powershell 将 zip 文件签入到 TFS
【发布时间】:2023-04-02 17:12:01
【问题描述】:

我的构建服务器正在执行构建新网站 zip 所需的所有步骤。我想添加一个将 zipfile 签入到 TFS 的步骤。我创建了一个 ps1 文件来执行签入。我在 ISE 中运行它,因此不依赖于 TeamCity。这是我看到的错误。

  1. 不管我怎么做workspace.GET,都拿不到最新的代码 从服务器。

  2. 即使我更改了硬盘驱动器上的文件 没有看到变化。

  3. 因为没有检测到更改,所以 zip 是 未签入到 TFS。

这里是代码......

#============================================================================
# Method to check in all zip files
#
# Example of WorkingDir passed in
# "D:\TeamCity\buildAgent\work\281509782e84e723\Powershell"
#
# Example of where freshly created zips live
# "D:\TeamCity\buildAgent\work\281509782e84e723\Zips"
#
# this script is based on
# From https://github.com/mmessano/PowerShell/blob/master/TFSCheckIn.ps1
# From http://stackoverflow.com/questions/25917753/check-a-file-into-tfs-using-powershell
# from http://lennartjansson2.wordpress.com/2011/10/13/setting-tfs-vcs-security-with-ps-2/
#
#============================================================================

function StackOverflow {
    Param( [Parameter(Mandatory=$true)][string]$WorkingDir )   

    Write-BuildLog "Inside StackOverflow"

    # Get the direcory where new zips where built
    $NewZipFiles =  $WorkingDir + "\..\Zips\*"

    # This is the url to the TFS server + Project collection 
    $tfsServer =  "YourServerAndCollection";

    # this is the full path on server where zips live
    # You need to start description with $
    $tfsServerPath = "$/MyProject/FullPathToDirwithZips"

    # Where on local hard drive should files from TFS be placed
    $LocalCkoutDir =  "D:\MyLocalHDPath"

    # Debug print var to verify correct
    Write-BuildLog "NewZipFiles => $NewZipFiles"
    Write-BuildLog "tfsServer => $tfsServer"
    Write-BuildLog "tfsServerPath => $tfsServerPath"
    Write-BuildLog "LocalCkoutDir => $LocalCkoutDir"

    # Get the TeamCity build number
    #$VarName = "BUILD_NUMBER"
    #$TeamCityVersionNbr = (get-item env:$VarName).Value
    $TeamCityVersionNbr = "MyProject_03_02_81"
    Write-BuildLog "Version Nbr $TeamCityVersionNbr"
    $CheckInComment =  "Check in zips for $BuildNumber"

    # Load the assemblies needed for TFS:
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Client") | out-null
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.VersionControl.Common") | out-null
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.VersionControl.Client") | out-null

    #Set up connection to TFS Server and get version control
    $tfs = [Microsoft.TeamFoundation.Client.TeamFoundationServerFactory]::GetServer($tfsServer)
    $versionControlType = [Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer]
    $versionControlServer = $tfs.GetService($versionControlType)

    #check to see if workspace already exists.  If it does delete it.
    $WorkSpaceNameForCheckIn = "TeamCityWorkspace"
    $ThisBoxName = [System.Environment]::MachineName
    $test = $versionControlServer.QueryWorkspaces( $WorkSpaceNameForCheckIn, $versionControlServer.AuthenticatedUser, $ThisBoxName )
    if ( $test.length -eq 1 )
    {
        $test[0].Delete()
    }   

    # Generate a workspace
    $workspace = $versionControlServer.CreateWorkspace($WorkSpaceNameForCheckIn);

    # Map Server path to local path
    $workspace.Map($tfsServerPath, $LocalCkoutDir)

    # DEBUG: build filename of a zip.   
    # We will overwrite this file to test the get
    $file = "AZipFileThatExists.zip"
    $filePath = $LocalCkoutDir + "\" + $file
    "hello world" | Out-File $filePath

    # I tried the simple get but it does not get
    # Get the zip files from the server to local directory
    $getstatus = $workspace.Get()   

    # Csharp way of doing it
    #workspace.Map(projectPath, workingDirectory);
    # var myItemSpec = new ItemSpec(projectPath, RecursionType.Full);
    #GetRequest request = new GetRequest(myItemSpec, VersionSpec.Latest);
    #GetStatus status = workspace.Get(request, GetOptions.GetAll | GetOptions.Overwrite); // this line doesn't do anything - no failures or er

    # This does not work either
    # Powershell checkout the file.  Overwrite if file exists.  Get even if TFS thinks it is up to date.    
    $NewItemSpec = New-Object Microsoft.TeamFoundation.VersionControl.Client.ItemSpec ( $tfsServerPath, [Microsoft.TeamFoundation.VersionControl.Client.RecursionType]::Full)
    $NewRequest =  New-Object Microsoft.TeamFoundation.VersionControl.Client.GetRequest( $NewItemSpec,  [Microsoft.TeamFoundation.VersionControl.Client.VersionSpec]::Latest)
    $getstatus = $workspace.Get( $NewRequest,  [Microsoft.TeamFoundation.VersionControl.Client.GetOptions]::GetAll -bOr [Microsoft.TeamFoundation.VersionControl.Client.GetOptions]::Overwrite )

    # I have not tested the rest of this since the "get" does not work.
    # Mark the files before we refresh them with new zips
    $result = $workspace.PendEdit($LocalCkoutDir)

    # Copy zips that where built by TeamCity to checkin direcory
    Copy-Item $NewZipFiles $LocalCkoutDir -force -recurse

    # check if we have some pending changes.  If we do checkin changes
    $pendings = $workspace.GetPendingChanges();
    if($pendings.Count -gt 0){
        $result = $workspace.CheckIn($pendings, $CheckInComment);
        Write-BuildLog "Changes where checked in";
    }
    else
    {
       Write-BuildLog "No changes found";
    }

    # delete the workspace
    $result = $workspace.Delete()
}

#============================================================================
# Write to the build log
#============================================================================
function Write-BuildLog {
    param( [Parameter( Mandatory=$true)]  $Message
           )

    write-host $Message
    #write-host "##teamcity[message text='" + $Message + "']"
}

$myDir = Split-Path -Parent $MyInvocation.MyCommand.Path
StackOverflow $myDir

【问题讨论】:

  • 为什么要将二进制文件放在源代码管理中?这通常被认为是一种不好的做法。
  • 抱歉,我没有 TeamCity 设置,无法尝试您的脚本(所以我会发表评论而不是回答)。诊断:您是否尝试过使用 tf.exe 命令行来做您想做的事?如{ Set-Location $LocalCkoutDir; tf 得到 /r 。您是否从此处找到的“TFS Power Tools”中获取了 TFS Powershell:visualstudiogallery.msdn.microsoft.com/…,因为该工具集可以帮助简化一点。此外,Write-Verbose 甚至 Write-EventLog (blogs.technet.com/b/heyscriptingguy/archive/2013/06/20/…)

标签: powershell tfs teamcity-8.0


【解决方案1】:

使用 tf 命令行

签入示例:
cd C:\TFS\Arquitectura
%ProgramFiles%\Microsoft Visual Studio 9.0\Common7\IDE\TF.exe 签入 $/Arquitectura/Main /recursive

在 Windows x64 上
"%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\IDE\TF.exe" 签入 $/Arquitectura/Main /recursive

有关 tf 命令行的更多信息,请参阅:http://msdn.microsoft.com/en-us/library/z51z7zy0(v=VS.90).aspx

关于使用 tf.exePowershell 的唯一学习曲线。也许需要源代码示例。

来源:Scripting TFS Command Line for Get Latest Version, Check Out and Check in, programmatically

【讨论】:

    猜你喜欢
    • 2018-08-03
    • 2014-11-13
    • 2011-05-27
    • 2012-11-21
    • 1970-01-01
    • 2018-02-27
    • 2017-03-31
    • 2016-01-23
    • 2021-01-10
    相关资源
    最近更新 更多