通过具有队列时间变量的REST API运行Azure DevOps管道

时间:2020-02-10 12:17:37

标签: azure-devops azure-pipelines azure-devops-rest-api

我有Azure DevOps管道,该管道具有一组输入变量,应该在队列时间内对其进行修改。根据{{​​3}}和documentation,如果在管道队列期间将更改管道变量的值,则无法在管道YAML定义中定义它们,而是使用UI 变量面板和触发器页面上的>变量标签。

如果我要使用this post触发管道,那么定义它们的正确方法是什么?或者我需要这样做吗?我是否还应该使用变量标签预先定义它们,并稍后在REST请求有效负载中覆盖这些值?

3 个答案:

答案 0 :(得分:1)

定义它们的正确方法是什么?我需要这样做吗?我是否还应该使用“变量”选项卡预先定义它们,并稍后在REST请求有效负载中覆盖这些值?

您可以直接通过parameters调用带有队列时间变量的REST API。

that post中的状态:

如果在管道队列期间将更改管道变量的值, 不能在管道YAML定义中定义它们,而是使用UI “变量”面板和“触发器”页面中的“变量”选项卡。

这意味着当您在YMAL文件中定义变量时,就无法在排队管道时对其进行修改,但是如果您在UI中定义了该变量,则可以使用队列时间变量对其进行修改

但是,我们仍然可以通过具有队列时间变量的REST API运行YAML类型的Azure DevOps管道。

作为测试,我创建了一个YAML类型的管道,如下所示,在YAML或UI中没有任何预定义变量:

pool:
  vmImage: 'ubuntu-latest'

trigger: 
 branches:
  include:
    - mster

steps:
- script: echo $(Test)
  displayName: 'Do something'

然后我将REST API与以下请求正文一起使用:

{
    "parameters": "{\"Test\":\"123\"}",

    "definition":  {
                       "id":  66
                   }
}

休息时,管道被触发,输出为:

enter image description here

希望这会有所帮助。

答案 1 :(得分:0)

您绝对不需要定义触发器,对于变量,是的-您需要定义它们才能设置它们。

答案 2 :(得分:0)

我也一直在致力于实现DevOps管道的自动化,并且在撰写本文时,我相信Microsoft Docs中的this article是最新的。我确实需要花些时间才能使它正常工作,但是用这段代码结束了

public static async Task InitiatePipeline(CancellationToken cancellationToken = default)
{
    using(HttpClient client = new HttpClient())
    {
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        var token = Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:{1}", "", AppSettings.DevOpsPAT)));
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", token);

var repoGuid = "Put GUID Here"; // You can get GUID for repo from the URL when you select the rpo of interest under  Repos is Project Settings
var bodyJson = @"{
    ""parameters"": {
        ""parameterName"": ""parameterValue""
    },
    ""variables"": {},
    ""resources"": {
        ""repositories"": {
            ""self"": {
                ""repository"": {
                    ""id"": """ + repoGuid + @""",
                    ""type"": ""azureReposGit""
                },
                ""refName"": ""refs/heads/master""
            }
        }
    }
}";

        var bodyContent = new StringContent(bodyJson, Encoding.UTF8, "application/json");
        var pipeLineId = 61; // Can get this from URL when you open the pipeline of interest in Azure DevOps
        var response = await client.PostAsync($"https://dev.azure.com/ORG_NAME/PROJECT_NAME/_apis/pipelines/{pipeLineId}/runs?api-version=6.0-preview.1", bodyContent, cancellationToken);
        response.EnsureSuccessStatusCode();
    }
}