c# - 如何通过 VSTS REST API 创建构建定义
问题描述
情况:
我目前正在通过 bitbucket -> vsts -> azure 自动化 CI/CD 配置。
我的理想结果是能够将我的配置值复制粘贴(或手动输入)到它们各自的控制台程序中,并让应用程序配置整个 CI/CD 考验,而无需单击所有 Web 界面。现在可以在 Bitbucket 和 Azure 中使用,但通过 REST API 创建 VSTS CI/CD 配置被证明是困难的。
Azure 资源和 Bitbucket 配置当前是通过与 REST API 对话的简单 .NET 控制台应用程序创建的。基本上将所有值(天蓝色输入值/ bitbucket 输入值)复制粘贴(或手动输入)到控制台应用程序中,它将在 5 分钟内配置所有内容。
问题:
现在我面临着尝试在 VSTS 中自动化构建配置和发布配置的困难部分。Microsoft Docs对 VSTS 客户端库的文档不是很好。
老实说,我不知道如何通过 API 或客户端库创建构建定义。
BuildHttpClient有三种我可以使用的方法:
public virtual Task<BuildDefinition> CreateDefinitionAsync(BuildDefinition definition, Guid project, int? definitionToCloneId = null, int? definitionToCloneRevision = null, object userState = null, CancellationToken cancellationToken = default(CancellationToken)); public virtual Task<BuildDefinition> CreateDefinitionAsync(BuildDefinition definition, int? definitionToCloneId = null, int? definitionToCloneRevision = null, object userState = null, CancellationToken cancellationToken = default(CancellationToken)); public virtual Task<BuildDefinition> CreateDefinitionAsync(BuildDefinition definition, string project, int? definitionToCloneId = null, int? definitionToCloneRevision = null, object userState = null, CancellationToken cancellationToken = default(CancellationToken));
BuildDefinition具有以下属性。
namespace Microsoft.TeamFoundation.Build.WebApi { [DataContract] public class BuildDefinition : BuildDefinitionReference { public BuildDefinition(); public List<string> Tags { get; } public PropertiesCollection Properties { get; } public List<RetentionPolicy> RetentionRules { get; } public List<Demand> Demands { get; } public IDictionary<string, BuildDefinitionVariable> Variables { get; } public List<BuildTrigger> Triggers { get; } public ProcessParameters ProcessParameters { get; set; } public BuildRepository Repository { get; set; } public List<BuildOption> Options { get; } public List<BuildDefinitionStep> Steps { get; } public bool BadgeEnabled { get; set; } public int JobTimeoutInMinutes { get; set; } public BuildAuthorizationScope JobAuthorizationScope { get; set; } public string DropLocation { get; set; } public string Description { get; set; } public string Comment { get; set; } public string BuildNumberFormat { get; set; } public Build LatestBuild { get; } public Build LatestCompletedBuild { get; } } }
如您所见,构建定义的最重要属性是只读的。
如何通过 REST API 创建构建定义?是否有更好的 VSTS 替代方案可以让我这样做?
解决方案
REST API创建构建定义的格式如下:
POST https://{account}.visualstudio.com/{project}/_apis/build/definitions?api-version=5.0-preview.6
应用程序/json 示例:
{
"process": {
"phases": [
{
"steps": [
],
"name": "Phase 1",
"refName": "Phase_1",
"condition": "succeeded()",
"target": {
"executionOptions": {
"type": 0
},
"allowScriptsAuthAccessOption": false,
"type": 1
},
"jobAuthorizationScope": "projectCollection",
"jobCancelTimeoutInMinutes": 1
}
],
"type": 1
},
"repository": {
"properties": {
"cleanOptions": "0",
"labelSources": "0",
"labelSourcesFormat": "$(build.buildNumber)",
"reportBuildStatus": "true",
"gitLfsSupport": "false",
"skipSyncSource": "false",
"checkoutNestedSubmodules": "false",
"fetchDepth": "0"
},
"id": "4ba24767-e5a6-4987-80cc-ebaeca01fdbc",
"type": "TfsGit",
"name": "product1",
"url": "https://marinaliu.visualstudio.com/Git2/_git/product1",
"defaultBranch": "refs/heads/master",
"clean": "false",
"checkoutSubmodules": false
},
"processParameters": {},
"drafts": [],
"queue": {
"id": 324,
"name": "ownPC",
"pool": {
"id": 23,
"name": "ownPC"
}
},
"name": "definitionCreatedByRESTAPI",
"type": "build",
"queueStatus": "enabled"
}
要在 C# 中使用 REST API,您可以进行如下转换:
var personalaccesstoken = "PAT";
var base64Token = Convert.ToBase64String(Encoding.ASCII.GetBytes($":{personalaccesstoken}"));
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", base64Token);
var requestMessage = new HttpRequestMessage(HttpMethod.Post, "https://account.visualstudio.com/project/_apis/build/definitions?api-version=5.0-preview.6");
requestMessage.Content = new StringContent("{\"process\": { \"phases\": [{\"steps\": [], \"name\": \"Phase 1\",\"refName\": \"Phase_1\",\"condition\": \"succeeded()\",\"target\": { \"executionOptions\": { \"type\": 0 },\"allowScriptsAuthAccessOption\": false, \"type\": 1 }, \"jobAuthorizationScope\": \"projectCollection\", \"jobCancelTimeoutInMinutes\": 1 }],\"type\": 1 }, \"repository\": { \"properties\": { \"cleanOptions\": \"0\",\"labelSources\": \"0\",\"labelSourcesFormat\": \"$(build.buildNumber)\", \"reportBuildStatus\": \"true\",\"gitLfsSupport\": \"false\", \"skipSyncSource\": \"false\",\"checkoutNestedSubmodules\": \"false\", \"fetchDepth\": \"0\"},\"id\": \"4ba24767-e5a6-4987-80cc-ebaeca01fdbc\",\"type\": \"TfsGit\",\"name\": \"product1\", \"url\": \"https://marinaliu.visualstudio.com/Git2/_git/product1\", \"defaultBranch\": \"refs/heads/master\", \"clean\": \"false\",\"checkoutSubmodules\": false },\"processParameters\": {}, \"drafts\": [],\"queue\": { \"id\": 324, \"name\": \"ownPC\",\"pool\": {\"id\": 23, \"name\": \"ownPC\"}}, \"name\": \"definitionCreatedByRESTAPI\", \"type\": \"build\",\"queueStatus\": \"enabled\"}", Encoding.UTF8, "application/json");
HttpResponseMessage response = client.SendAsync(requestMessage).Result;
response.EnsureSuccessStatusCode();
通过参考博客以编程方式访问 TFS/VSTS 2017以获取 C# 程序。
推荐阅读
- java - 如何让 Java Swing 正确绘制?
- c - Fork() 有多个孩子并等待所有孩子完成
- ionic-framework - Ion-Button color="x" 呈现为白色
- json - Swift 4 解码复杂的嵌套 JSON
- amazon-web-services - 如何在一个 terraform 文件中创建 2 个 ASG,并附加一个 ELB?
- java - 如果 Spring 可以成功拦截 @Configuration 类中的类内函数调用,为什么它在常规 bean 中不支持呢?
- javascript - 使用 jquery.timeline.min.js 未显示事件
- google-sheets - 将公式转换为 ArrayFormula
- ssis - 将 csv 文件写入 Azure Blob 存储时,是否可以将 SSIS 配置为将 NULL 表示为 BLANK 而不是 \N?
- angular - 如何在 OnInit 之后更新视图上的属性绑定?(角度)