我有一个变量模板
var1.yml
variables:
- name: TEST_DB_HOSTNAME
value: 10.123.56.222
- name: TEST_DB_PORTNUMBER
value: 1521
- name: TEST_USERNAME
value: TEST
- name: TEST_PASSWORD
value: TEST
- name: TEST_SCHEMANAME
value: SCHEMA
- name: TEST_ACTIVEMQNAME
value: 10.123.56.223
- name: TEST_ACTIVEMQPORT
value: 8161
当我运行下面的管道
resources:
repositories:
- repository: templates
type: git
name: pipeline_templates
ref: refs/heads/master
trigger:
- none
variables:
- template: templates/var1.yml@templates
pool:
name: PoolA
steps:
- pwsh: |
Write-Host "${{ convertToJson(variables) }}"
我得到了输出
{
build.sourceBranchName: master,
build.reason: Manual,
system.pullRequest.isFork: False,
system.jobParallelismTag: Public,
system.enableAccessToken: SecretVariable,
TEST_DB_HOSTNAME: 10.123.56.222,
TEST_DB_PORTNUMBER: 1521,
TEST_USERNAME: TEST,
TEST_PASSWORD: TEST,
TEST_SCHEMANAME: SCHEMA,
TEST_ACTIVEMQNAME: 10.123.56.223,
TEST_ACTIVEMQPORT: 8161
}
我如何修改管道以仅从以"Test_"
开头的结果集中提取键值并以相同格式存储到另一个变量中,以便我可以在同一管道中的其他任务中使用?OR遍历具有键的对象"Test_"并获得相同的值?
您所显示的输出是无效的JSON,不能用JSON进行转换。假设它是有效的JSON:
{
"build.sourceBranchName": "master",
"build.reason": "Manual",
"system.pullRequest.isFork": "False",
"system.jobParallelismTag": "Public",
"system.enableAccessToken": "SecretVariable",
"TEST_DB_HOSTNAME": "10.123.56.222",
"TEST_DB_PORTNUMBER": 1521,
"TEST_USERNAME": "TEST",
"TEST_PASSWORD": "TEST",
"TEST_SCHEMANAME": "SCHEMA",
"TEST_ACTIVEMQNAME": "10.123.56.223",
"TEST_ACTIVEMQPORT": 8161
}
,那么您可以使用jq的to_entries
或with_entries
过滤器来获得仅包含以"TEST_"
开头的键的对象:
with_entries(select(.key|startswith("TEST_")))
这将给你一个新对象作为输出:
{
"TEST_DB_HOSTNAME": "10.123.56.222",
"TEST_DB_PORTNUMBER": 1521,
"TEST_USERNAME": "TEST",
"TEST_PASSWORD": "TEST",
"TEST_SCHEMANAME": "SCHEMA",
"TEST_ACTIVEMQNAME": "10.123.56.223",
"TEST_ACTIVEMQPORT": 8161
}
convertToJson()
函数有点乱,因为"json"实际上,它创建的不是一个有效的json。
我能想到有几种可能的方法:
- 使用
convertToJson()
将无效的json传递给脚本步骤,将其转换为有效的json,然后提取相关值。我以前做过这个,如果你能控制变量中的数据,它通常是有效的。缺点是有转换到有效json失败的风险。 - 创建一个yaml循环,迭代变量并提取以
Test_
开头的变量。您可以在这里找到如何编写循环的示例,但基本上,它看起来像这样:
- stage:
variables:
firstVar: 1
secondVar: 2
Test_thirdVar: 3
Test_forthVar: 4
jobs:
- job: loopVars
steps:
- ${{ each var in variables }}:
- script: |
echo ${{ var.key }}
echo ${{ var.value }}
displayName: handling ${{ var.key }}
- 如果适用于您的用例,您可以仅为
Test_
变量创建复杂的参数(而不是变量)。使用它,您可以直接使用相关值,而不需要从变量列表中提取子集。但是请注意,参数是管道的输入,可以在执行之前进行调整。例子:
parameters:
- name: non-test-variables
type: object
default:
firstVar: 1
secondVar: 2
- name: test-variables
type: object
default:
Test_thirdVar: 3
Test_forthVar: 4
您可以通过在管道中引用${{ parameters.Test_thirdVar }}
来使用它们。