My build server is doing all the steps necessary to build a zip of the new website. I would like to add a step to checkin zipfile to TFS. I have created a ps1 file to perform the checkin. I am running it in ISE so there is no dependency on having TeamCity. Here are the errors that I am seeing.
No matter how I do workspace.GET, it does not get the latest code from the server.
Even when I change a file on the hard drive it does not see changes.
Because no changes are detected the zip is not checked in to TFS.
Here is the code....
#============================================================================ # 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