C#でazure devops rest apiを使い、WorkItemを作成する。
環境
- Visual Studio 2022 Community
- .NET Framework 4.8 Console App
nugetパッケージ
Microsoft.TeamFoundationServer.Client [19.255.1]
事前準備
azure devops側でPersonal Access Tokenを取得しておく
コード
using Microsoft.TeamFoundation.SourceControl.WebApi; using Microsoft.TeamFoundation.WorkItemTracking.WebApi; using Microsoft.VisualStudio.Services.Common; using Microsoft.VisualStudio.Services.WebApi; using System; using System.Collections.Generic; namespace AzureAccess { internal class Program { static void Main(string[] args) { var uri = new Uri(Define.URL);//https://dev.azure.com/{organization}/ var credentials = new VssBasicCredential("", Define.PAT); // 接続 var connection = new VssConnection(uri, credentials); using (var witc = connection.GetClient<WorkItemTrackingHttpClient>()) { var patchDocument = new Microsoft.VisualStudio.Services.WebApi.Patch.Json.JsonPatchDocument(); patchDocument.Add(new Microsoft.VisualStudio.Services.WebApi.Patch.Json.JsonPatchOperation() { Operation = Microsoft.VisualStudio.Services.WebApi.Patch.Operation.Add, Path = "/fields/System.IterationPath", Value = $"{Define.ProjectName}\\Iteration1" }); patchDocument.Add(new Microsoft.VisualStudio.Services.WebApi.Patch.Json.JsonPatchOperation() { Operation = Microsoft.VisualStudio.Services.WebApi.Patch.Operation.Add, Path = "/fields/System.AreaPath", Value = $"{Define.ProjectName}\\TestArea1" }); patchDocument.Add(new Microsoft.VisualStudio.Services.WebApi.Patch.Json.JsonPatchOperation() { Operation = Microsoft.VisualStudio.Services.WebApi.Patch.Operation.Add, Path = "/fields/System.Title", Value = "create task from code" }); //こちらの書き方でも可。ただし、Pathの最初の「/」を勝手に付加するので不要。つけてると例外になる var patchDocument2 = VssJsonPatchDocumentFactory.ConstructJsonPatchDocument( Microsoft.VisualStudio.Services.WebApi.Patch.Operation.Add, new Dictionary<string, object> { {"fields/System.IterationPath", $"{Define.ProjectName}\\Iteration1" }, {"fields/System.AreaPath", $"{Define.ProjectName}\\TestArea1" }, {"fields/System.Title", "create task from code" }, }); //validateOnlyをtrueにしておくと、実際には追加しないが追加後のWorkItemを確認することができる。 //この場合、Idは割り振られない var ret = witc.CreateWorkItemAsync(patchDocument, Define.ProjectName, "Task", validateOnly: true).Result; } Console.Read(); } } }
(追記)おまけ
こんな風にラップしておいたほうが親切かな。
internal class JsonPatchDocumentBuilder { private Dictionary<string, object> _properties; public JsonPatchDocumentBuilder() { _properties = new Dictionary<string, object>(); } public JsonPatchDocumentBuilder IterationPath(string path) { _properties.Add("fields/System.IterationPath", path); return this; } public JsonPatchDocumentBuilder AreaPath(string path) { _properties.Add("fields/System.AreaPath", path); return this; } public JsonPatchDocumentBuilder Title(string title) { _properties.Add("fields/System.Title", title); return this; } public JsonPatchDocumentBuilder Description(string desc) { _properties.Add("fields/System.Description", desc); return this; } public JsonPatchDocumentBuilder AssignedTo(string user) { _properties.Add("fields/System.AssignedTo", user); return this; } public JsonPatchDocument Build() => VssJsonPatchDocumentFactory.ConstructJsonPatchDocument( Microsoft.VisualStudio.Services.WebApi.Patch.Operation.Add, _properties); }
参考
基本的に使用するクライアントは以下のリファレンスと対照性があるので、やりたいことをリファレンスで調べてからコードに落としていくと楽。