Azure DevOps REST api - 运行 管道变量
Azure DevOps REST api - Run pipeline with variables
我在 Azure Devops 上有一个管道,我正在尝试 运行 programatically/headless 使用 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:找不到命令”。
我尝试向管道添加“HELLO_WORLD”变量并启用“让用户在运行连接此管道时覆盖此值”设置。这导致 HELLO_WORLD
变量不再是未知的,而是它停留在它的初始值上并且在我用 REST api
触发 运行 时没有设置
如何使用 REST api 将变量传递给管道?仅为特定 run/build
设置变量值很重要
我找到了另一个 API 到 运行 的构建,但似乎您不能像使用管道 api 一样使用个人访问令牌身份验证 - 仅 OAuth2 - https://docs.microsoft.com/en-us/rest/api/azure/devops/build/builds/queue?view=azure-devops-rest-6.0
您可以同时使用 Runs API and Build Queue API, both work with Personal Access Tokens. For which one is the better/preferred, see this question: 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
您的 body 将是 application/json
类型(HTTP header 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
您的 body 将是 application/json
类型(HTTP header Content-Type
设置为 application/json
),类似于下面的内容,只需替换 definition.id
和 sourcebranch
具有适当的值。另请注意参数部分的“字符串化”内容(它应该是 json 映射的字符串表示)
{
"parameters": "{\"HELLO_WORLD\":\"HelloWorldValue\"}",
"definition": {
"id": 1
},
"sourceBranch": "refs/heads/main"
}
这是我解决它的方法....
REST 调用:
POST https://dev.azure.com/<myOrg>/<myProject>/_apis/pipelines/17/runs?api-version=6.0-preview.1
请求的body:
{
"resources": {
"repositories": {
"self": {
"refName": "refs/heads/main"
}
}
},
"templateParameters": {
"A_Parameter": "And now for something completely different."
}
}
注意:我添加了一个授权 header,其中包含用户名(任何名称都可以)和密码(您的 PAT 令牌值)的基本身份验证。还加了个Content-Typeapplication/jsonheader.
这是我使用的整个 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:
我在 Azure Devops 上有一个管道,我正在尝试 运行 programatically/headless 使用 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:找不到命令”。
我尝试向管道添加“HELLO_WORLD”变量并启用“让用户在运行连接此管道时覆盖此值”设置。这导致 HELLO_WORLD
变量不再是未知的,而是它停留在它的初始值上并且在我用 REST api
如何使用 REST api 将变量传递给管道?仅为特定 run/build
设置变量值很重要我找到了另一个 API 到 运行 的构建,但似乎您不能像使用管道 api 一样使用个人访问令牌身份验证 - 仅 OAuth2 - https://docs.microsoft.com/en-us/rest/api/azure/devops/build/builds/queue?view=azure-devops-rest-6.0
您可以同时使用 Runs API and Build Queue API, both work with Personal Access Tokens. For which one is the better/preferred, see this question: 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
您的 body 将是 application/json
类型(HTTP header 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
您的 body 将是 application/json
类型(HTTP header Content-Type
设置为 application/json
),类似于下面的内容,只需替换 definition.id
和 sourcebranch
具有适当的值。另请注意参数部分的“字符串化”内容(它应该是 json 映射的字符串表示)
{
"parameters": "{\"HELLO_WORLD\":\"HelloWorldValue\"}",
"definition": {
"id": 1
},
"sourceBranch": "refs/heads/main"
}
这是我解决它的方法....
REST 调用:
POST https://dev.azure.com/<myOrg>/<myProject>/_apis/pipelines/17/runs?api-version=6.0-preview.1
请求的body:
{
"resources": {
"repositories": {
"self": {
"refName": "refs/heads/main"
}
}
},
"templateParameters": {
"A_Parameter": "And now for something completely different."
}
}
注意:我添加了一个授权 header,其中包含用户名(任何名称都可以)和密码(您的 PAT 令牌值)的基本身份验证。还加了个Content-Typeapplication/jsonheader.
这是我使用的整个 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: