【问题标题】:Run Azure DevOps pipeline via REST API with queue time variables通过 REST API 使用队列时间变量运行 Azure DevOps 管道
【发布时间】:2020-02-10 12:17:37
【问题描述】:

我有 Azure DevOps 管道,其中包含应该在排队期间修改的一组输入变量。根据documentationthis post 如果管道变量的值会在管道队列期间更改,它们不能在管道 YAML 定义中定义,而是使用 UI Variables 面板和 Variables 触发器页面中的strong>标签。

如果我要使用Azure DevOps REST API 触发我的管道,定义它们的正确方法是什么,或者我需要这样做吗?我是否还应该使用 变量 选项卡提前定义它们并稍后在 REST 请求负载中覆盖这些值?

【问题讨论】:

  • @ShaykiAbramczyk 感谢您的指点,这是关于如何使用 REST API 调用管道的有用帖子,但我没有看到任何关于如何在管道队列之前提前定义变量的说明。跨度>
  • 您应该使用“在排队时设置”来定义它们,并且在上面的答案中,您可以看到在使用其余 api 对构建进行排队时如何放置一个值。

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


【解决方案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
                   }
}

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

希望这会有所帮助。

【讨论】:

  • 非常感谢。这正是我的问题的答案。
  • @easkerov,我很高兴 :)。
  • 感谢您的回答。然而,对我来说,这并不能完全解决它,因为从 gui 手动触发构建时它似乎不起作用。我在这里评论; stackoverflow.com/questions/60852825/… 在一个解决方案上,该解决方案既可以与其余 api 一起使用,也可以在手动触发构建时从 gui 参数化。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    截至撰写本文时,我相信 Microsoft Docs 中的 this article 是有关该主题的最新消息。我确实不得不稍微挠头才能让它工作,但最终还是得到了这段代码。我的管道没有像 OP 的问题那样使用变量,但它们的工作原理与参数相同。

    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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-28
      • 2021-09-14
      • 1970-01-01
      • 2020-04-02
      • 1970-01-01
      • 2020-11-13
      • 2020-12-06
      • 2021-12-12
      相关资源
      最近更新 更多