如何将从json中提取的变量键和值存储到azure管道中具有相同格式的另一个变量?



我有一个变量模板

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_entrieswith_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。

我能想到有几种可能的方法:

  1. 使用convertToJson()将无效的json传递给脚本步骤,将其转换为有效的json,然后提取相关值。我以前做过这个,如果你能控制变量中的数据,它通常是有效的。缺点是有转换到有效json失败的风险。
  2. 创建一个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 }}
  1. 如果适用于您的用例,您可以仅为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 }}来使用它们。

相关内容

  • 没有找到相关文章