У меня есть файл json в репозитории, в котором я хотел бы получить значения для каждого ключа в зависимости от выбранной среды. На данный момент выбранные параметры могут получить всю часть json выбранной среды. Например, я выбрал «Обновить» в приведенном ниже примере, но не знаю, как вызвать значение для каждого из них, например, «Печать этого» .....
$.[env].domain
$.[env].resources
$.[env].resources.db-schemas
$.[env].resources.db-schemas.[name].jvm
$.[env].jvm
$.[env].jvm.[type]
$.[env].jvm.[type](.jvm-name).ip
$.[env].jvm.[type](.jvm-name.port)
Вывод, который я получаю, таков:
"level": 1,
"domain": "develop.autosample.co.uk",
"resources": {
"db-schemas": {
"rule": {
"schema": "pegarules",
"database": "sas_develop",
"jvm": ["primary", "secondary"]
},
.......
.......
Но я хочу иметь возможность вызывать каждый ключ и значение выбранной среды json. Крутой скрипт:
#!/usr/bin/env groovy
node{
properties([
parameters([
choice(
name: 'environment',
choices: ['','Upgrade','BV' ],
description: 'environment to choose'
),
])
])
deleteDir()
dir('dir-switch') {
stage('Checkout') {
// git branch: 'test-upgrade-json', url: 'https://gitlab.xxxxxxx/pipeline.git'
// stash includes: '**', name: 'upgrade-pega'
checkout([$class: 'GitSCM', branches: [[name: '*/test-upgrade-json']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'jenkins-user-github', url: 'https://gitlab.xxxxx/pipeline.git']]])
}
stage('Get Environment') {
sh """
ls -lart ./*
ls ${env.WORKSPACE}
cp -R ./upgrade-pega/environment/env.json /${env.WORKSPACE}/dir-switch
ls /${env.WORKSPACE}/dir-switch
"""
}
def obj = readJSON file: './env.json'
def list = obj[params.environment];
println list
list.each { println it }
///// print each key and value in the json to be able to used in the code pipeline
stage('JVM check content') {
///// print each key and value in the json to be able to used in the code pipeline
}
}
}
JSON-файл:
{
"upgrade": {
"level": 1,
"domain": "develop.autosample.co.uk",
"resources": {
"db-schemas": {
"rule": {
"schema": "pegarules",
"database": "sas_develop",
"jvm": ["primary", "secondary"]
},
"data": {
"schema": "pegadata",
"database": "sas_develop",
"jvm": ["primary", "secondary"]
},
"report": {
"schema": "pegareports",
"database": "sas_develop",
"jvm": ["primary", "secondary"]
}
}
},
"jvm": {
"load-balancer": null,
"pega": [{
"jenkins-name": "ent-giem-sasw02",
"host": "ent-giem-sasw02",
"ip": "x.x.x.x"
}],
"db": {
"primary": {
"jenkins-name": "ent-giem-sasrd26",
"host": "ent-giem-sasrd26",
"ip": "x.x.x.x",
"port": 5432
},
"secondary": {
"jenkins-name": "ent-giem-sasrd98",
"host": "ent-giem-pgrd98",
"ip": "x.x.x.x",
"port": 5432
}
}
}
}
}
Могу ли я сохранить этот, например, обновленный образец исходящего json в переменную или файл и начать использовать jq?
У вас уже есть объект JSON в памяти с переменной list
. Теперь вы просто используете его в своем файле Steps или Jenkins.
На вашем месте я бы переименовал что-то, чтобы сделать его более понятным, например obj
-> envConfig
и list
-> envSettings
. Но вы можете ссылаться на такие вещи, как так:
stage('JVM...') {
sh "echo ${envSettings.jvm.pega['jenkins-name']}"
}
Кроме того, я не уверен, что вы спрашиваете. Итерация по свойствам не работает (т.е. list.each { println( it ) }
) или что-то еще?
@cyrus сократил образец json, а также ожидаемый результат. JSON теперь представляет собой одну среду, а не две.