Azure DevOps REST API - 使用变量运行管道

8

我在Azure Devops上有一个管道,我正在尝试使用REST API以编程/无头模式运行它:https://learn.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:命令未找到”。

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

如何使用REST api向管道传递变量?重要的是,变量值仅针对特定运行/构建设置。

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

2个回答

19
你可以使用Runs APIBuild Queue API两种方式来完成,都需要使用个人访问令牌。关于哪个更好/更受欢迎,请参见此问题:Azure DevOps Builds - Queue vs run pipeline REST APIs的区别,但简而言之,Runs API将是更具未来性的选择。

选项1:Runs 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对我有用!谢谢。我需要在请求中添加“资源”...如果它能为此提供错误提示就更好了,但是现在看起来可以工作了,再次感谢。 - user1202032
1
它也可以在没有“resources”块的情况下工作,它将回退到默认分支。 - danielorn
超过一个变量的语法是什么? - Lars Pellarin
1
@LarsPellarin 只需将其他变量添加到序列化的 JSON 数组中 "parameters": "{\"HELLO_WORLD\": \"HelloWorldValue\", \"ANOTHER_KEY\": \"ANOTHER_VALUE\"}" - danielorn

3
这是我解决它的方法...
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应用程序/ 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:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接