Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过VSTS REST API创建构建定义 情况:_C#_Continuous Integration_Azure Pipelines_Build Definition_Azure Devops Rest Api - Fatal编程技术网

C# 如何通过VSTS REST API创建构建定义 情况:

C# 如何通过VSTS REST API创建构建定义 情况:,c#,continuous-integration,azure-pipelines,build-definition,azure-devops-rest-api,C#,Continuous Integration,Azure Pipelines,Build Definition,Azure Devops Rest Api,我目前正在通过bitbucket->vsts->azure自动化CI/CD配置 我的理想结果是能够将粘贴(或手动输入)我的配置值复制到各自的控制台程序中,并让应用程序配置整个CI/CD,而无需点击所有web界面。现在可以在Bitbucket和Azure中使用,但是通过RESTAPI创建VSTS CI/CD配置被证明是困难的 比特桶配置目前是通过一个简单的.NET控制台应用程序创建的,该应用程序与REST API对话。基本上,将粘贴(或手动输入)所有值(/)复制到控制台应用程序中,它将在5分钟内配

我目前正在通过bitbucket->vsts->azure自动化CI/CD配置

我的理想结果是能够将粘贴(或手动输入)我的配置值复制到各自的控制台程序中,并让应用程序配置整个CI/CD,而无需点击所有web界面。现在可以在Bitbucket和Azure中使用,但是通过RESTAPI创建VSTS CI/CD配置被证明是困难的

比特桶配置目前是通过一个简单的.NET控制台应用程序创建的,该应用程序与REST API对话。基本上,将粘贴(或手动输入)所有值(/)复制到控制台应用程序中,它将在5分钟内配置所有内容


问题: 现在,我面临着在VST中尝试自动化构建配置和发布配置的困难部分。微软文档在网络上不是很好

老实说,我不知道如何通过API或客户端库进行访问

  • 我可以使用以下三种方法:

    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));
    
    公共虚拟任务CreateDefinitionAsync(BuildDefinition,Guid项目,int?definitionToCloneId=null,int?definitionToCloneRevision=null,object userState=null,CancellationToken CancellationToken=default(CancellationToken));
    公共虚拟任务CreateDefinitionAsync(BuildDefinition定义,int?definitionToCloneId=null,int?definitionToCloneRevision=null,object userState=null,CancellationToken CancellationToken=default(CancellationToken));
    公共虚拟任务CreateDefinitionAsync(BuildDefinition定义,字符串项目,int?definitionToCloneId=null,int?definitionToCloneRevision=null,object userState=null,CancellationToken CancellationToken=default(CancellationToken));
    
  • 具有以下属性

    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; }
        }
     }
    
    名称空间Microsoft.TeamFoundation.Build.WebApi
    { 
    [数据合同]
    公共类BuildDefinition:BuildDefinitionReference
    {
    公共建筑定义();
    公共列表标记{get;}
    公共属性集合属性{get;}
    公共列表保留规则{get;}
    公共列表要求{get;}
    公共IDictionary变量{get;}
    公共列表触发器{get;}
    公共ProcessParameters ProcessParameters{get;set;}
    公共BuildRepository存储库{get;set;}
    公共列表选项{get;}
    公共列表步骤{get;}
    公共bool{get;set;}
    public int jobtimeoutminutes{get;set;}
    public BuildAuthorizationScope JobAuthorizationScope{get;set;}
    公共字符串位置{get;set;}
    公共字符串说明{get;set;}
    公共字符串注释{get;set;}
    公共字符串BuildNumberFormat{get;set;}
    公共生成最新生成{get;}
    公共生成LatestCompletedBuild{get;}
    }
    }
    
如您所见,生成定义的最重要属性是只读的

如何通过RESTAPI创建构建定义?有没有比VST更好的替代方案可以让我做到这一点


REST API的格式如下所示:

POST https://{account}.visualstudio.com/{project}/_apis/build/definitions?api-version=5.0-preview.6
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();
应用程序/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,可以进行如下转换:

POST https://{account}.visualstudio.com/{project}/_apis/build/definitions?api-version=5.0-preview.6
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();

通过参考博客了解C#程序。

您考虑过使用YAML构建吗?那么您的构建定义只是源代码控制的YAML文件。YAML的缺点是,目前不支持任务组/模板。并且它只支持TFS Git和GitHub,而不支持bitbucket.:)对成功了!我的愚蠢超出了我自己的预期。我一直未经授权,因为我只输入了用于读取响应的凭据,而没有使用request@Mariana,如果我们要设置默认的Azure托管构建代理和队列,Azure DevOps主体的这一部分应该是什么?“队列”:{“id”:324,“name”:“ownPC”,“pool”:{“id”:23,“name”:“ownPC”},@Marina Liu步骤信息如何?没有步骤的构建管道是非常无用的。您知道是否有添加它们的方法吗?您可以使用AzurePipelinePS powershell模块获取发布定义,将APReleaseDefinition获取为JSON,修改JSON并使用Update APReleaseDefinition将其发回。我已经在圈中运行了4个小时,结果发现我使用的是Git类型而不是tfsGit类型