65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 PowerShell 自动创建 Team Foundation Server 中的任务

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (2投票s)

2012 年 8 月 14 日

CPOL

6分钟阅读

viewsIcon

41612

使用 PowerShell 自动创建 TFS 中的任务类型工作项

引言

管理 Team Foundation Server 通常需要一遍又一遍地重复相同的任务,只有细节上略有不同。如果您的团队遵循敏捷软件开发方法论,这一点尤其如此。每隔几周一个新的迭代就会开始,这意味着需要在 Team Foundation Server 中输入新的变更请求及其相关的任务*。

重复意味着自动化,自动化意味着 PowerShell。如果您必须在 Windows 中重复执行相同的任务数次以上,请考虑使用PowerShell进行自动化。Microsoft 在让 PowerShell 访问其主要应用程序的大部分功能方面做得非常出色;Team Foundation Server 2010 (TFS) 也不例外。

Microsoft 最新发布的Team Foundation Server Power Tools December 2011包含适用于 Visual Studio Team System Team Foundation Server 的 Windows PowerShell Cmdlet。据 Microsoft 称,Power Tools 是一套增强功能、工具和命令行实用程序,可提高 Team Foundation Server 场景的生产力。Power Tool 的 TFS PowerShell Cmdlet 让您可以控制 TFS 中常见的版本控制命令。

TFS Power Tools 有一个需要注意的地方,默认情况下它不安装 PowerShell 附加组件。如果您已经安装了 Power Tools,则必须重新运行安装程序,选择“修改安装”选项,然后添加 PowerShell 功能。如果您是首次安装 Power Tools,请确保选择“自定义安装”选项并添加 PowerShell 功能。

*任务是 TFS 工作项的一种类型。工作项类型还可以包括 Bug、缺陷、测试用例、风险、QoS 要求,或者您的团队决定定义的任何工作项。Microsoft 的 Patterns & Practices 的第 12 章对工作项进行了全面的解释,可在Codeplex上查阅。

 

自动化任务创建

在我职业生涯中,曾与不同的团队合作,他们实践SCRUM,这是敏捷的一种变体。我们通常每四到六周开始一个新的 Sprint(迭代),平均 Sprint Backlog 有 15-25 个条目。Backlog 中的每个条目都会在 TFS 中转换为单独的 CR。每个 CR 都有几个样板任务与之相关。许多任务对所有变更请求(CR)都是通用的。通用任务通常包括分析、设计、编码、单元测试和管理。对于经理来说,没有什么比每隔几周就不得不将一百多个任务输入 TFS 更令人心烦的了,每个任务都需要输入十个或更多字段的数据。除了时间要求,还有人为错误的可能。

以下 PowerShell 脚本为已在 TFS 中创建的特定 CR 创建了一系列五个不同的任务。创建任务后,我将使用单独的方法将任务链接到 CR。每个团队的开发方法都不同;每个团队对 TFS 的使用也不同。不要纠结于我选择填充哪些字段。您的流程无疑需要不同的字段。

使用 PowerShell,可以通过工作项模板中的许多字段填充数据。理解每个字段的定义——名称、数据类型和使用规则(输入值的范围、必需字段等)——至关重要。要查看字段定义,请在 Visual Studio 2010 中,选择“工具”选项卡 ->“进程编辑器”->“工作项类型”->“从服务器打开 WIT”。从可用模板列表中选择您的工作项模板 (WIT)。您选择的模板将与 PowerShell 脚本中的模板相同,变量为 $workItemType。要更改字段,您需要相应的 TFS 权限。

任务 WIT 数据字段

避免错误 

在为本文开发脚本时,脚本尝试创建某些任务时遇到了一个通用错误(如下所示)——“...工作项尚未准备好保存”,我被卡了数小时。我反复尝试调试和修改脚本以解决错误,但都无济于事。最后发现错误不在脚本中,而是源于我对任务工作项模板 (WIT) 及其字段定义的理解不足。

错误的任务输入错误

通过反复试验,我发现这个错误通常意味着输入到字段中的数据无效(基于字段的定义),或者必需字段未能输入数据。在我脚本开发过程的不同阶段,这两种情况都发生过。首先,我没有包含“完成时间”字段,该字段是我们任务模板中的一个必需字段。其次,我尝试将任务的优先级设置为 1 到 5 之间的数字。我不知道的是,现有的任务模板只允许 1 到 3 之间的值。解决这些类型错误的最佳方法是,在 TFS 中创建一个新任务,并尝试输入与您尝试使用脚本注入相同的数据。错误的根本原因应该很快就会显现出来。

 

脚本

为了简单起见,我提供了一个简单的 PowerShell 脚本。通过将逻辑封装到带有输入参数的函数中,该脚本可以轻松地进行优化,进一步实现自动化。我在脚本中添加了大量注释来解释每个部分的作用,并帮助自定义更容易。脚本明确声明了所有变量,并遵循 PowerShell 的严格模式Set-StrictMode -Version 2.0)。我认为这使得脚本更容易理解,并减少了运行时错误的数量。

#############################################################
#
# Description: Automatically creates (5) standard Task-type
#              Work Items in TFS for a given Change Request.
#
# Author:      Gary A. Stafford
# Created:     04/12/2012
# Modified:    08/14/2012
#
#############################################################

# Clear Output Pane
clear

# Loads Windows PowerShell snap-in if not already loaded
if ( (Get-PSSnapin -Name Microsoft.TeamFoundation.PowerShell -ErrorAction SilentlyContinue) -eq $null )
{
    Add-PSSnapin Microsoft.TeamFoundation.PowerShell
}

# Set Strict Mode - optional
Set-StrictMode -Version 2.0

# Usually changes for each Sprint - both specific to your environment
[string] $areaPath = "Development\PowerShell"
[string] $iterationPath = "PowerShell\TFS2010"

# Usually changes for each CR
[string] $changeRequestName = "Create Task Automation PowerShell Script"
[string] $assignee = "Stafford, Gary"

# Values represent units of work, often 'man-hours'
[decimal[]] $taskEstimateArray = @(2,3,10,3,.5)
# Remaining Time is usually set to Estimated time at start (optional use of this array)
[decimal[]] $taskRemainingArray = @(2,3,10,3,.5)
# Completed Time is usually set to zero at start (optional use of this array)
[decimal[]] $tasktaskCompletedArray = @(0,0,0,0,0,0)

# Usually remains constant
# TFS Server address - specific to your environment
[string] $tfsServerString = "http://[YourServerNameGoesHere]/[PathToCollection]"

# Work Item Type - specific to your environment
[string] $workItemType = "Development\Task"

[string[]] $taskNameArray = @("Analysis", "Design", "Coding", "Unit Testing", "Resolve Tasks")
[string[]] $taskDisciplineArray = @("Analysis", "Development", "Development", "Test", $null)

# Loop and create of eack of the (5) Tasks in prioritized order
[int] $i = 0

Write-Host `n`r**** Script started...`n`r

while ($i -le 4) {
    # Concatenate name of task with CR name for Title and Description fields
    $taskTitle = $taskNameArray[$i] + ": " + $changeRequestName
    
    # Build string of field parameters (key/value pairs)
    [string] $fields = "Title=$($taskTitle);Description=$($taskTitle);Assigned To=$($assignee);"
    $fields += "Area Path=$($areaPath);Iteration Path=$($iterationPath);Discipline=$($taskDisciplineArray[$i]);Priority=$($i+1);"
    $fields += "Estimate=$($taskEstimateArray[$i]);Remaining Work=$($taskRemainingArray[$i]);Completed Work=$($tasktaskCompletedArray[$i])"
    
    #For debugging - optional console output
    Write-Host $fields
    
    # Create the Task (Work Item)
    tfpt workitem /new $workItemType /collection:$tfsServerString /fields:$fields
    
    $i++
 }
 
 Write-Host `n`r**** Script completed... 

 

脚本首先设置一系列变量。有些变量一旦设置就不会改变,例如 TFS 服务器的路径,除非您使用多个 TFS 实例。有些变量只会在每次迭代(Sprint)开始时更改,例如迭代路径。其他变量会针对每个 CR 或每个任务而更改。这些包括 CR 标题以及估计、完成和剩余时间。同样,您的流程将决定不同的字段和不同的变量。

一旦您根据自己的需求设置了脚本的变量并成功运行,您应该会看到类似以下的输出。

成功创建任务

 

TFS 中的新任务,由 PowerShell 创建

 

删除工作项

TFS 管理员都知道 TFS 中没有工作项删除按钮。那么,如何在开发和测试此脚本期间删除您可能创建的任务呢?最快的方法是从命令行或 PowerShell。您也可以在 .NET 中以编程方式删除工作项。要使用命令行,请执行以下操作:

  1. 打开 Visual Studio 2010 命令提示符。
  2. 将目录更改到 witadmin.exe 的位置。我的默认位置是:
    C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE。
  3. 运行以下命令,将“任务 ID”替换为您要删除的任务的 Task ID 或 Task Ids(逗号分隔,无空格)。
witadmin destroywi /collection:[Your TFS Collection Path Here] /id:12930 /noprompt 

从命令行删除任务

在 PowerShell 中运行几乎相同的命令,方法是将 witadmin.exe 的路径包含在脚本中。我在 Goshoom.NET Dev Blog 上找到了这种方法。您可以在那里阅读更多内容。请注意,删除命令无法撤销。/noprompt 是可选的;使用它会加快任务的删除速度。但是,省略 /noprompt 意味着您有机会确认任务是否删除。当您忙于处理其他许多事情时,这倒是个不错的选择。

 

结论 

通过 PowerShell 创建任务,我每个 Sprint 周期可以节省至少两个小时的时间,并大大降低了出错的可能性。除了任务,还有许多更平凡的 TFS 工作可以通过 PowerShell 自动化。这些工作包括从 Excel 或其他项目管理程序批量导入 CR 和任务、创建和分发敏捷报告,以及周转和发布管理自动化,仅举几例。我将在未来的博客中探讨其中一些主题。

 

历史

v1.0:2012-08-14 - 脚本的原始发布。

© . All rights reserved.