前言 之前友人有提過 Redmine 有 API 功能可以直傳入給 Azure DevOps ,因此我稍微試試看如何使用 Redmine 給 Azure DevOps。
Redmine API 一、取得API Key 點選我的帳戶 > API 存取金鑰 > 顯示,打開後複製這組金鑰。
二、簡單實作 - 取得當前專案的Issue 2-1 安裝 NuGet 套件 1 dotnet add package redmine-api --version 4.6.5
引用套件
1 2 using Redmine.Net.Api;using Redmine.Net.Api.Types;
2-2 程式碼 因為這邊專案資料比較多,所以就只抓其中幾筆資料。
1 2 3 4 5 6 7 8 9 string host = "host" ;string apiKey = "apiKey" ;var redmineManager = new RedmineManager(host, apiKey);foreach (var issue in issues){ Console.WriteLine($"Id: {issue.Id} , Subject: {issue.Subject} " ); }
Azure DevOps API 一、取得API Key Azure 直接使用 PAT (Personal Access Token) 來當作 API Key,取得方式如下: 這邊因為我單純展示如何使用,所以PAT權限我就給最高權限。
二、簡單實作 - 建立工作項目 2-1 安裝 NuGet 套件 1 dotnet add package Microsoft.TeamFoundationServer.Client --version 16.153.0
引用套件
1 2 3 4 using Microsoft.VisualStudio.Services.Common;using Microsoft.VisualStudio.Services.WebApi;using Microsoft.TeamFoundation.WorkItemTracking.WebApi;using Microsoft.VisualStudio.Services.WebApi.Patch.Json;
2-2 程式碼 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 string host = "host" ;string apiKey = "apiKey" ;var redmineManager = new RedmineManager(host, apiKey);string azureDevOpsUrl = "azure DevOps Url" ;string azureDevOpsPat = "azure DevOps Token" ;VssConnection connection = new VssConnection(new Uri(azureDevOpsUrl), new VssBasicCredential(string .Empty, azureDevOpsPat)); WorkItemTrackingHttpClient workItemTrackingClient = connection.GetClient<WorkItemTrackingHttpClient>(); IList<Issue> issues = redmineManager.GetObjects<Issue>(new NameValueCollection(){ { "status_id" , "*" }, { "project_id" , "project_id" }, { "limit" , "10" } }); foreach (var issue in issues){ var workItem = new JsonPatchDocument(){ new JsonPatchOperation() { Operation = Microsoft.VisualStudio.Services.WebApi.Patch.Operation.Add, Path = "/fields/System.Title" , Value = $"#{issue.Id} _{issue.Subject} " }, new JsonPatchOperation() { Operation = Microsoft.VisualStudio.Services.WebApi.Patch.Operation.Add, Path = "/fields/System.Description" , Value = issue.Description }, new JsonPatchOperation() { Operation = Microsoft.VisualStudio.Services.WebApi.Patch.Operation.Add, Path = "/fields/System.CreatedDate" , Value = issue.CreatedOn }, new JsonPatchOperation() { Operation = Microsoft.VisualStudio.Services.WebApi.Patch.Operation.Add, Path = "/fields/System.AssignedTo" , Value = "conte.ma" } }; workItemTrackingClient.CreateWorkItemAsync(workItem, "ProjectName" , "Issue" ).Wait(); }