読者です 読者をやめる 読者になる 読者になる

Natural Software

KinectなどのDepthセンサーを中心に活動しています

TFS Advent Calendarの2日目・TFSの作業項目(チケット)をAPIで登録する #tfsug

この記事はTFS Advent Calendarの2日目です。
サイトはこちら:http://atnd.org/events/22819


APIを利用して、TFSへ作業項目を登録することができます。
f:id:kaorun55:20111205152057p:image

プロジェクト一式はこちらです

Main

TfsClientを使う側です。サーバーURI、認証情報、登録するコレクション、プロジェクト名を指定します。

using System;
using System.Net;
using TfsAdventCalendar;

namespace AddWorkItem
{
    class Program
    {
        static void Main( string[] args )
        {
            try {
                Uri uri = new Uri( "http://win7-vm:8080/tfs/" );
                NetworkCredential credential = new NetworkCredential( "hoge", "foo" );
                string collenctionName = "win7-vm\\DefaultCollection";
                string projectName = "TFS_API_SAMPLE";

                TfsClient tfs = new TfsClient( uri, credential,
                                    collenctionName, projectName );
                tfs.AddWorkItem();

                Console.WriteLine( "Success" );
            }
            catch ( Exception ex ) {
                Console.WriteLine( "Error : " + ex.Message );
            }
        }
    }
}

TfsClient

TFSにアクセスするクラスです。サンプルのため、項目などは直に書いています。

using System;
using System.Collections.ObjectModel;
using System.Net;

using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.Framework.Client;
using Microsoft.TeamFoundation.Framework.Common;
using Microsoft.TeamFoundation.WorkItemTracking.Client;


namespace TfsAdventCalendar
{
    public class TfsClient
    {
        TfsConfigurationServer configurationServer;
        WorkItemStore workItemStore;
        Project teamProject;

        public TfsClient( Uri tfsUri, NetworkCredential credential,
                                string collenctionName, string projectName )
        {
            configurationServer =
                new TfsConfigurationServer( tfsUri, credential );
            GetTfsProject( collenctionName, projectName );
        }

        // TFSの情報を取得する
        void GetTfsProject( string collenctionName, string projectName )
        {
            // TFS内の、コレクションのリストを取得する
            ReadOnlyCollection<CatalogNode> collectionNodes =
                configurationServer.CatalogNode.QueryChildren(
                    new[] { CatalogResourceTypes.ProjectCollection },
                    false, CatalogQueryOptions.None );

            // コレクションのリストから、必要なコレクションを取得する
            foreach ( CatalogNode collectionNode in collectionNodes ) {
                Guid collectionId =
                    new Guid( collectionNode.Resource.Properties["InstanceId"] );
                TfsTeamProjectCollection teamProjectCollection =
                    configurationServer.GetTeamProjectCollection( collectionId );
                Console.WriteLine( "Collection: " + teamProjectCollection.Name );

                // 登録するチームコレクションでフィルタする
                if ( teamProjectCollection.Name != collenctionName ) {
                    continue;
                }

                // コレクション内の、チームプロジェクトのリストを取得する
                ReadOnlyCollection<CatalogNode> projectNodes =
                    collectionNode.QueryChildren(
                        new[] { CatalogResourceTypes.TeamProject },
                        false, CatalogQueryOptions.None );

                // チームプロジェクトのリストから、必要なプロジェクトを取得する
                foreach ( CatalogNode projectNode in projectNodes ) {
                    Console.WriteLine( " Team Project: " +
                        projectNode.Resource.DisplayName );

                    // 登録するプロジェクトでフィルタする
                    if ( projectNode.Resource.DisplayName != projectName ) {
                        continue;
                    }

                    // チームプロジェクトを取得する
                    WorkItemStore workItemStore =
                        teamProjectCollection.GetService<WorkItemStore>();
                    teamProject =
                        workItemStore.Projects[projectNode.Resource.DisplayName];

                    return;
                }
            }

            throw new Exception( "プロジェクトがありません" );
        }

        public void AddWorkItem()
        {
            WorkItem newItem = new WorkItem( teamProject.WorkItemTypes["タスク"] );
            newItem.Title = "作業項目の概要です";
            newItem.Description = "作業項目の詳細です";
            newItem.Save();
        }

    }
}