Как создать определения сборки через VSTS REST API

Ситуация:

В настоящее время я работаю над автоматизацией конфигураций CI / CD через bitbucket -> vsts -> azure.

Мой идеальный результат - иметь возможность скопировать и вставить (или вручную ввести) мои значения конфигурации в соответствующие консольные программы и позволить приложениям настраивать все испытания CI / CD без необходимости щелкать по всем веб-интерфейсам. Теперь это возможно в Bitbucket и Azure, но создание конфигураций VSTS CI / CD с помощью REST API оказывается затруднительным.

Ресурсы Azure и конфигурации Bitbucket в настоящее время создаются с помощью простого консольного приложения .NET, которое взаимодействует с REST. API. Обычно скопируйте и вставьте (или введите вручную) все значения (входные значения azure / входные значения битбакета) в консольное приложение, и оно настроит все в течение 5 минут.


Проблема:

Теперь я столкнулся с более сложной частью попытки автоматизировать конфигурации сборки и конфигурации выпуска в VSTS. Документы Microsoft не очень хороши для документация клиентских библиотек 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, которые позволят мне это сделать?



comment
Вы рассматривали возможность использования сборки YAML? Тогда ваши определения сборки - это просто файлы YAML с исходным кодом.   -  person Daniel Mann    schedule 11.05.2018
comment
У YAML есть недостаток, заключающийся в том, что на данный момент группы задач / шаблоны не поддерживаются. И что он поддерживает только TFS Git и GitHub, но не битбакет. :)   -  person Anh-Duc    schedule 15.05.2018


Ответы (1)


Формат 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"
}

Чтобы использовать REST API в C #, вы можете выполнить преобразование, как показано ниже:

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 #.

person Marina Liu    schedule 14.05.2018
comment
Да! Это сработало! Также случается так, что я глуп сверх моих ожиданий. Я продолжал получать 203 неавторизованных, потому что я ввел учетные данные только для ЧТЕНИЯ ответа, а не учетные данные с запросом - person Anh-Duc; 15.05.2018
comment
@Mariana, какой должна быть эта часть тела для Azure DevOps, если мы хотим установить агенты сборки Azure по умолчанию и очередь? очередь: {id: 324, имя: ownPC, пул: {id: 23, name: ownPC}}, - person hmz; 18.01.2020
comment
@ Марина Лю, что насчет информации о шагах? Конвейер сборки без шагов практически бесполезен. Вы знаете, есть ли способ их добавить? - person FredE; 07.08.2020
comment
Вы можете использовать модуль PowerShell AzurePipelinePS, чтобы получить определение выпуска Get-APReleaseDefinition как JSON, изменить JSON и отправить его обратно с помощью Update-APReleaseDefintion. powershellgallery.com/packages/AzurePipelinesPS - person Dejulia489; 15.08.2020
comment
Я бегаю по кругу уже 4 часа, только чтобы узнать, что использую тип Git вместо tfsGit - person Talal Yousif; 14.09.2020