If you, like the Visual Studio ALM Rangers, create a lot of hands-on-lab (HOL) content you will be familiar with the brain-numbing setup work to create team projects, create workspaces, check-in code, branch and create work items. One of the initiatives we have been working on is trying to get to a point where we can run one script and setup all Rangers HOLs on a virtual machine … and we are getting close.

Branching Guidance HOL Extract

We create a team project and setup a number of user rights, whereby the Team Foundation Server Power Tools April 2010 come into play on line 105:

   1: # Copyright © Microsoft Corporation.  All Rights Reserved.
   2: # This code released under the terms of the 
   3: # Microsoft Public License (MS-PL, http://opensource.org/licenses/ms-pl.html.)
   4: #
   5: #<#  
   6: #.SYNOPSIS  
   7: #   This script configures the enviroment for the hands on labs scenarios.
   8: #    It is only intended to be run after the TFS enviroment is fully configured.
   9: #
  10: #.DESCRIPTION  
  11: #    This script performs the following steps:
  12: #     1) Creates the sample users
  13: #     2) Adds the sample users to the correct TFS groups
  14: #
  15: #.NOTES  
  16: #    File Name  : 3-hol.ps1  
  17: #    Author     : VSTS Rangers 
  18: #    Requires   : PowerShell V1
  19: #
  20: #.LINK  
  21: #   This script posted to:  
  22: #        http://???.codeplex.com 
  23: #    License:
  24: #        http://opensource.org/licenses/ms-pl.html
  25: #> 
  26:  
  27:  
  28: function createUser([string]$accountName, [string]$password, [string]$name) 
  29: {  
  30:         # create user
  31:     $computer = [adsi] 'WinNT://localhost'
  32:     $user = $computer.Create('User', $accountName)      
  33:     $user.SetPassword($password)
  34:     $user.SetInfo()         
  35:     $user.FullName = $name
  36:     $user.put('UserFlags',65536 -bor 64)
  37:     $user.SetInfo()         
  38:  
  39:     # add user to Remote desktop group to allow RD access
  40:     net localgroup 'Remote Desktop Users' $accountName /add
  41:     
  42:     # add user to Power Users group to allow them to logon locally on TR images
  43:     net localgroup 'Power Users' $accountName /add
  44: }
  45:  
  46: function createSampleAccounts
  47: {
  48:     createUser 'michaf' '#############' 'Michael Affronti (PM)'
  49:     createUser 'aprist' '#############' 'April Stewart (Dev Lead)'
  50:     createUser 'dorikr' '#############' 'Doris Krieger (Dev)'
  51:     createUser 'abuobe' '#############' 'Abu Obeida Bakhach (Dev)'
  52:     createUser 'chriko' '#############' 'Christine Koch (Tester)'
  53:     createUser 'chriba' '#############' 'Chris Barry (Business Stakeholder)'
  54:     createUser 'robiwo' '#############' 'Robin Wood (End User)'
  55: }
  56:  
  57: function addToTFSGlobal([string]$accountName, [string]$groupname ) 
  58: {  
  59:     $currentLocation = Get-Location
  60:     Set-Location 'c:\Program Files\Microsoft Team Foundation Server 2010\Tools'
  61:     .\tfssecurity /g+ $groupname n:$accountName /server:localhost
  62:     Set-Location $currentLocation
  63: }
  64:  
  65: function addToTFSProject([string]$accountName, [string]$groupname, [string]$collection = '', [string]$targetProjectName = '') 
  66: {  
  67:     $target = ''
  68:     if ($targetProjectName -ne '')
  69:     {
  70:         $target = '[' +$targetProjectName + ']\' +$groupname
  71:     }
  72:     else
  73:     {
  74:         $target = $groupname
  75:     }
  76:     
  77:     if (!$accountName.Contains('\'))
  78:     {
  79:         $accountName = $hostname + '\' + $accountName
  80:     }
  81:     
  82:     $currentLocation = Get-Location
  83:     Set-Location 'c:\Program Files\Microsoft Team Foundation Server 2010\Tools'
  84:     $argument = 'http://localhost:8080/tfs/' + $collection
  85:     .\tfssecurity /g+ $target n:$accountName /collection:$argument /server:$hostname
  86:     Set-Location $currentLocation
  87: }
  88:  
  89: function addSampleAccountsToGroups
  90: {    
  91:     addToTFSGlobal  'michaf' 'Team Foundation Administrators'
  92:     addToTFSGlobal  'aprist' 'Team Foundation Administrators'
  93:     addToTFSProject 'michaf' 'Project Administrators'   '/defaultcollection' 'BranchingGuide'
  94:     addToTFSProject 'aprist' 'Project Administrators'   '/defaultcollection' 'BranchingGuide'
  95:     addToTFSProject 'dorikr' 'Contributors'             '/defaultcollection' 'BranchingGuide'
  96:     addToTFSProject 'abuobe' 'Contributors'             '/defaultcollection' 'BranchingGuide'
  97:     addToTFSProject 'chriko' 'Contributors'             '/defaultcollection' 'BranchingGuide'
  98:     addToTFSProject 'chriba' 'Contributors'             '/defaultcollection' 'BranchingGuide'
  99:     addToTFSProject 'robiwo' 'Readers'                  '/defaultcollection' 'BranchingGuide'
 100: }
 101:  
 102: function SetupHOL
 103: {
 104:  #Create team project with tfpt
 105:  &'\Program Files\Microsoft Team Foundation Server 2010 Power Tools\TFPT.EXE' createteamproject /settingsfile:'C:\HOL\Branching Guidance\HOLSetup\Project_Branch.XML'
 106:  
 107:  createSampleAccounts
 108:  addSampleAccountsToGroups
 109: }
 110:  
 111: Write-Host -Object:""
 112: Write-Host -ForegroundColor Red -Object "Setting up the Branching Guidance HOL Environment"
 113: Write-Host                      -Object:"-------------------------------------------------"    
 114: SetupHOL

TFS Integration Platform HOL Setup Script Extract

Apart from creating a number of team projects (excluded in the extract), we also check-in code … the PowerTools assist us on lines 9-11 and 32.

   1: # Copyright © Microsoft Corporation.  All Rights Reserved.
   2: # This code released under the terms of the 
   3: # Microsoft Public License (MS-PL, http://opensource.org/licenses/ms-pl.html.)
   4: #
   5:  
   6: function SetupHOL
   7: {
   8:  #Create team project with tfpt
   9:  &'\Program Files\Microsoft Team Foundation Server 2010 Power Tools\TFPT.EXE' createteamproject /settingsfile:'C:\HOL\TFS Integration Platform\HOLSetup\Project_TP-A.XML'
  10:  &'\Program Files\Microsoft Team Foundation Server 2010 Power Tools\TFPT.EXE' createteamproject /settingsfile:'C:\HOL\TFS Integration Platform\HOLSetup\Project_TP-B.XML'
  11:  &'\Program Files\Microsoft Team Foundation Server 2010 Power Tools\TFPT.EXE' createteamproject /settingsfile:'C:\HOL\TFS Integration Platform\HOLSetup\Project_TP-C.XML'
  12:  
  13:  #Create Workspace
  14:  &'\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\tf.exe' workspace /new TP-A /noprompt /collection:http://localhost:8080/tfs/DefaultCollection
  15:  &'\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\tf.exe' workfold  /unmap $/
  16:  &'\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\tf.exe' workspace /new TP-B /noprompt /collection:http://localhost:8080/tfs/DefaultCollection
  17:  &'\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\tf.exe' workfold  /unmap $/
  18:  &'\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\tf.exe' workspace /new TP-C /noprompt /collection:http://localhost:8080/tfs/DefaultCollection
  19:  &'\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\tf.exe' workfold  /unmap $/
  20:  
  21:  #Create the VC space as per HOL
  22:  &'\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\tf.exe' workfold  /map $/TP-A 'C:\HOL\TFS Integration Platform\Source Code\Demo\Sandbox-A'  /workspace:TP-A
  23:  &'\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\tf.exe' add       'C:\HOL\TFS Integration Platform\Source Code\Demo\Sandbox-A\Main'         /recursive
  24:  &'\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\tf.exe' checkin   'C:\HOL\TFS Integration Platform\Source Code\Demo\Sandbox-A\Main'         /comment:'HOL Automated Checkin' /recursive /noprompt
  25:  &'\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\tf.exe' branch    'C:\HOL\TFS Integration Platform\Source Code\Demo\Sandbox-A\Main’         ‘$/TP-A/Dev’
  26:  &'\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\tf.exe' checkin   'C:\HOL\TFS Integration Platform\Source Code\Demo\Sandbox-A\Dev'          /comment:'HOL Automated Branch' /noprompt
  27:  copy 'C:\HOL\TFS Integration Platform\HOLSetup\Raw\HelloWorldDemo' 'C:\HOL\TFS Integration Platform\Source Code\Demo\Sandbox-A\Dev' -recurse
  28:  &'\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\tf.exe' add       'C:\HOL\TFS Integration Platform\Source Code\Demo\Sandbox-A\Dev\HelloWorldDemo'     /recursive
  29:  &'\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\tf.exe' checkin   'C:\HOL\TFS Integration Platform\Source Code\Demo\Sandbox-A\Dev'          /comment:'HOL Automated Checkin' /recursive /noprompt
  30:  
  31:  #create workitem
  32:  &'\Program Files\Microsoft Team Foundation Server 2010 Power Tools\TFPT.EXE' workitem /new TP-A\Bug /Fields:"Title=Change the string goodbye world to hello world;Assigned To= Administrator" /collection:'http://localhost:8080/tfs/defaultcollection'
  33: }
  34:  
  35: Write-Host -Object:""
  36: Write-Host -ForegroundColor Red -Object "Setting up the TFS Integration Platform HOL Environment"
  37: Write-Host                      -Object:"-------------------------------------------------------"    
  38: SetupHOL

What does a typical XML file look like as referred to in the branching script when creating a team project?

   1: <?xml version="1.0" encoding="utf-8"?>
   2: <Project xmlns="ProjectCreationSettingsFileSchema.xsd">
   3:     <TFSName>http://LocalHost:8080/tfs/defaultcollection</TFSName>
   4:     <LogFolder>c:\HOL\Logs</LogFolder>
   5:     <ProjectName>BranchingGuide</ProjectName>
   6:     <ProjectSiteTitle>Visual Studio 2010 Branching Guidance</ProjectSiteTitle>
   7:     <ProjectSiteDescription>Visual Studio 2010 Branching Guidance</ProjectSiteDescription>
   8:     <SccCreateType>new</SccCreateType>
   9:     <SccBranchFromPath></SccBranchFromPath>
  10:     <ProcessTemplateName>MSF for Agile Software Development v5.0</ProcessTemplateName>
  11: </Project>

While we still have to sanitize and cleanup the scripts … an initiative that the South-African Rangers are focused on … we can now run a script, go away for coffee and return to a fully configured Rangers Base HOL image.

imageThat’s productive (more coffee/hour) and practical!