【问题标题】:Azure DevOps REST api - Run pipeline with variablesAzure DevOps REST api - 使用变量运行管道
【发布时间】:2021-02-13 13:04:11
【问题描述】:

我在 Azure Devops 上有一个管道,我正在尝试使用 REST api 以编程方式/无头运行:https://docs.microsoft.com/en-us/rest/api/azure/devops/pipelines/runs/run%20pipeline?view=azure-devops-rest-6.0

到目前为止一切顺利,我可以进行身份​​验证并开始运行。我想将数据传递给这个管道,文档建议可以在请求正文中使用variables。我的请求正文:

{
    "variables": {
        "HELLO_WORLD": {
            "isSecret": false,
            "value": "HelloWorldValue"
        }
    }
}

我的管道 YAML 如下所示:

trigger: none

pr: none

pool:
  vmImage: 'ubuntu-latest'

steps:
- task: Bash@3
  inputs:
    targetType: 'inline'
    script: |
      KEY=$(HELLO_WORLD)
      echo "Hello world key: " $KEY

然而,这给了我一个“HELLO_WORLD: command not found”的错误。

我尝试将“HELLO_WORLD”变量添加到管道并启用“让用户在运行此管道时覆盖此值”设置。这导致HELLO_WORLD 变量不再未知,而是停留在其初始值上,并且在我使用 REST api 触发运行时未设置

如何使用 REST api 将变量传递给管道?仅针对特定运行/构建设置变量值很重要

我找到了另一个 API 来运行构建,但您似乎无法使用个人访问令牌身份验证,就像您可以使用管道 api 一样 - 只有 OAuth2 - https://docs.microsoft.com/en-us/rest/api/azure/devops/build/builds/queue?view=azure-devops-rest-6.0

【问题讨论】:

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


    【解决方案1】:

    您可以同时使用Runs APIBuild Queue API,它们都可以使用个人访问令牌。对于哪个更好/首选,请参阅这个问题:Difference between Azure Devops Builds - Queue vs run pipeline REST APIs,但简而言之,Runs API 将是更面向未来的选项

    选项 1:运行 API

    POST https://dev.azure.com/{{organization}}/{{project}}/_apis/pipelines/{{PipelineId}}/runs?api-version=6.0-preview.1
    

    您的正文将是application/json 类型(HTTP 标头Content-Type 设置为application/json),与下面类似,只需将resources.repositories.self.refName 替换为适当的值

    {
        "resources": {
            "repositories": {
                "self": {
                    "refName": "refs/heads/main"
                }
            }
        },
        "variables": {
            "HELLO_WORLD": {
                "isSecret": false,
                "value": "HelloWorldValue"
            }
        }
    }
    

    选项 2:构建 API

    POST https://dev.azure.com/{{organization}}/{{project}}/_apis/build/builds?api-version=6.0
    

    您的正文将是application/json 类型(HTTP 标头Content-Type 设置为application/json),类似于下面的内容,只需将definition.idsourcebranch 替换为适当的值。另请注意参数部分的“字符串化”内容(它应该是json映射的字符串表示)

    {
        "parameters": "{\"HELLO_WORLD\":\"HelloWorldValue\"}",
        "definition": {
            "id": 1
        },
        "sourceBranch": "refs/heads/main"
    }
    

    【讨论】:

    • 选项 1 对我有用!谢谢你。我需要在我的请求中添加resources...
    • 它也可以在没有 resources 块的情况下工作,它将回退到默认分支。
    • 多个变量的语法是什么?
    • @LarsPellarin 只需将附加变量添加到序列化的 json 数组 "parameters": "{\"HELLO_WORLD\": \"HelloWorldValue\", \"ANOTHER_KEY\": \"ANOTHER_VALUE\"}"
    【解决方案2】:

    这是我解决它的方法....

    REST 调用:

    POST https://dev.azure.com/<myOrg>/<myProject>/_apis/pipelines/17/runs?api-version=6.0-preview.1
    

    请求正文:

    {
        "resources": {
            "repositories": {
                "self": {
                    "refName": "refs/heads/main"
                }
            }
        },
        "templateParameters": {
            "A_Parameter": "And now for something completely different."
        }
    }
    

    注意:我添加了一个带有基本身份验证的授权标头,其中包含用户名(任何名称都可以)和密码(您的 PAT 令牌值)。还添加了 Content-Type application/json 标头。


    这是我使用的整个 yaml 管道:

    parameters:
    - name: A_Parameter
      displayName: A parameter
      default: noValue
      type: string
     
    trigger:
    - none
     
    pool:
      vmImage: ubuntu-latest
     
    steps:
     
    - script: |
        echo '1 - using dollar sign parens, p dot A_Parameter is now: ' $(parameters.A_Parameter)
        echo '2 - using dollar sign double curly braces, p dot A_Parameter is now::' ${{ parameters.A_Parameter }} '::'
        echo '3 - using dollar sign and only the var name: ' $(A_Parameter)
      displayName: 'Run a multi-line script'
    

    这是管道日志的输出。请注意,只有第二种方式正确显示了该值。

    1 - using dollar sign parens, p dot A_Parameter is now: 
    2 - using dollar sign double curly braces, p dot A_Parameter is now:: And now for something completely different. :: 
    3 - using dollar sign and only the var name:
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-02
      • 2021-12-12
      • 2021-10-30
      • 1970-01-01
      • 2023-02-09
      • 2023-04-10
      • 2020-12-28
      相关资源
      最近更新 更多