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

时间:2021-02-13 13:04:11

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

我在 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

2 个答案:

答案 0 :(得分:6)

您可以使用 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 :(得分:0)

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

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: