简体   繁体   中英

Create TFS work item with PowerShell

I'm working on a TFS build with a pre-build PowerShell script that (in addition to building my app) automatically checks out a file where we maintain version, increments the build number, then checks the file in.

I have been able to do this, except that I get an error from the script which results in a partially successful build (orange). I need to have a fully successful (green) build.

Here's the check-in line (using TFS Power Tools for VS 2013 ):

New-TfsChangeset -Item $versionFile -Override "Automated" -Notes "Code Reviewer=tfs" -Comment "Automated"

The error I receive is that the changeset is not associated with a work item, but the -Override should handle that. The funny thing is that it checks in anyway.

Running locally on my machine instead of the build server, I get the same thing, except that I also see a line that says The policies have been overridden. This tells me that the override is working, but it still outputs the error.

I've tried adding -ErrorAction SilentlyContinue , but it has no effect.

I need one of three options:

  1. A way to suppress output of the checkin error,
  2. A way to create a work item and associate it to the checkin, or
  3. Some other third option that will result in a green build.

Any ideas?

Credit goes to Eddie - MSFT for leading me the right direction, but I wanted to consolidate everything here.

WARNING This will check in all pending changes in the workspace.

Creating a new work item ( source )

I did modify it quite a bit to support automation. It connects to TFS and generates a new work item.

function New-WorkItem()
{
    # These *should* be registered in the GAC.
    # The version numbers will likely have to change as new versions of Visual Studio are installed on the server.
    Add-Type -Assembly "Microsoft.TeamFoundation.Client, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
    Add-Type -Assembly "Microsoft.TeamFoundation.WorkItemTracking.Client, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

    $server = "http://YOURTFSSERVER:8080/tfs"
    $tfs = [Microsoft.TeamFoundation.Client.TeamFoundationServerFactory]::GetServer($server)
    $type = [Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore]
    $store = [Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore] $tfs.GetService($type)
    $workItem = New-Object Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem($store.Projects[0].WorkItemTypes[0])
    $workItem.Title = "Automated work item"

    $workItem
}

Associating the work item and checking in

Slight modifications to the code from the link given by Eddie, we get the following:

function CheckIn()
{
    param([Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem] $workItem)

    $col = Get-TfsCollection("http://YOURTFSSERVER:8080/tfs/YOURCOLLECTION")
    $vcs = Get-TfsVersionControlServer($col)
    $ws = $vcs.GetWorkspace([System.IO.Path]::GetDirectoryName($anyPathInWorkspace))
    $pc = $ws.GetPendingChanges()
    $wici = Get-TfsWorkItemCheckinInfo($workItem)
    $changeset = $ws.CheckIn($pc, "Automated check in", $null, $wici, $null)
}

That post doesn't tell you that Get-TfsCollection , Get-TfsVersionControlServer , and Get-TfsWorkItemCheckinInfo aren't defined. I had to find them.

I found the first two on http://nkdagility.com/powershell-tfs-2013-api-1-get-tfscollection-and-tfs-services/ . I didn't have to change anything.

function Get-TfsCollection
{
    param([string] $CollectionUrl)
    if ($CollectionUrl -ne "")
    {
        #if collection is passed then use it and select all projects
        $tfs = [Microsoft.TeamFoundation.Client.TfsTeamProjectCollectionFactory]::GetTeamProjectCollection($CollectionUrl)
    }
    else
    {
        #if no collection specified, open project picker to select it via gui
        $picker = New-Object Microsoft.TeamFoundation.Client.TeamProjectPicker([Microsoft.TeamFoundation.Client.TeamProjectPickerMode]::NoProject, $false)
        $dialogResult = $picker.ShowDialog()
        if ($dialogResult -ne "OK")
        {
            #exit
        }
        $tfs = $picker.SelectedTeamProjectCollection
    }

    $tfs
}

function Get-TfsVersionControlServer
{
    param([Microsoft.TeamFoundation.Client.TfsTeamProjectCollection] $TfsCollection)

    $TfsCollection.GetService("Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer")
}

But I couldn't find Get-TfsWorkItemCheckinInfo . The only Google hit was the kinook link from Eddie (and soon probably this answer). Here's what I came up with:

function Get-TfsWorkItemCheckinInfo
{
    param([Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem] $workItem)

    $wi = New-Object Microsoft.TeamFoundation.VersionControl.Client.WorkItemCheckinInfo($workItem, [Microsoft.TeamFoundation.VersionControl.Client.WorkItemCheckinAction]::Resolve)

    $wi
}

Now we can use it

CheckIn (New-WorkItem)

That's it!

You can create a work item from PowerShell by following this article: http://halanstevens.com/blog/powershell-script-to-create-a-workitem/

Quote the code here for reference:

$key = Get-ItemProperty HKLM:\SOFTWARE\Microsoft\VisualStudio\8.0

$dir = [string] (Get-ItemProperty $key.InstallDir)

$dir += "PrivateAssemblies\"

$lib = $dir + "Microsoft.TeamFoundation.WorkItemTracking.Client.dll"

[Reflection.Assembly]::LoadFrom($lib)

$lib = $dir + "Microsoft.TeamFoundation.Client.dll"

[Reflection.Assembly]::LoadFrom($lib)

"Please enter your Team Foundation Server Name:"
$server = [Console]::ReadLine()
$server = $server.Trim()

"Connecting to " + $server + "..."
$tfs = [Microsoft.TeamFoundation.Client.TeamFoundationServerFactory]::GetServer($server)

$type = [Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore]

$store = [Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore] $tfs.GetService($type)

$workItem = new-object Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem($store.Projects[0].WorkItemTypes[0])

"Created a new work item of type " + $workItem.Type.Name

$workItem.Title = "Created by Windows PowerShell!"

$workItem.Save()

And then refer to this article to associate the work item to changeset: http://www.kinook.com/Forum/showthread.php?t=4502

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM