Единственный механизм в спецификации YAML, который позволяет
сведение к минимуму повторения использует
якорь на узле и
ссылаясь на этот узел, используя псевдоним. Это работает для обоих листовых узлов
(то есть скалярные значения любого вида) и для узлов сбора
(отображения, последовательности). Псевдонимы для привязанных коллекций по существу
«заменить» целое поддерево под коллекцией.
В дополнение к этому есть слияние
ключ <<
в отображении, которое
реализуется большинством погрузчиков YAML (обычно на стадии строительства),
где вы можете иметь одно или несколько отображений, которые предоставляют пары ключ-значение для
ключи, которые не указаны в сопоставлении с ключом слияния
(напрямую или через ранее обработанные слияния).
Кроме того, любая программа, использующая загрузчик YAML, может расширить загрузчик.
(обычно это строительный механизм, но это можно было сделать раньше
в процессе загрузки), как они считают нужным, но такие механизмы
не считается частью YAML.
Механизм слияния может быть развернут на вашем YAML, чтобы уменьшить количество строк. Если ваш пример
изменяется на example.yaml
:
example_deploy:
- call: slack_start_deploy
- try:
- ${transitionVariableUpdate(platform = '${platform}', environment = '${environment}', component = '${component_ear}' variables = { appVersion = '${BRANCH_NAME}-${BUILD_NUMBER}' })}
- ${environmentCommitAndDeploy(environment = 'qa', platform = '${platform}', deployAllPlatforms = false )}
error:
- log: "Error trying to deploy: ${lastError.cause}"
- call: slack_deploy_error
- exit
- call: slack_deploy_success
slack_start_deploy:
- slack.postMessage: &pm
text: "${entryPoint} Deployment starting for environment *${environment}*"
channelId: ${alerts}
username: ${slackname}
iconEmoji: ${slackEmojiConcord}
slack_deploy_error:
- slack.postMessage:
text: " :fire: ${entryPoint} Deployment failed for environment *${environment}* http://concord.com/#/process/${txId}/log"
<<: *pm
slack_deploy_success:
- slack.postMessage:
text: " :party: Deployment succeeded for environment *${environment}* http://concord.com/#/process/${txId}/log"
<<: *pm
(Обратите внимание, что я изменил отступ для ваших error:
и - call: ...
строк, как показано
недействительный файл YAML)
В приведенном выше примере &pm
является привязкой для узла отображения с четырьмя ключами. *pm
являются псевдонимами
используя это отображение, каждый раз используя исходное значение для text
.
Следующая программа на Python показывает, загружая, а затем сбрасывая, как ключи слияния расширяются до
Ваш оригинал во время загрузки.
import sys
from pathlib import Path
import ruamel.yaml
example = Path('example.yaml')
yaml = ruamel.yaml.YAML(typ='safe')
yaml.default_flow_style = False
data = yaml.load(example)
yaml.dump(data, sys.stdout)
, что дает:
error:
- log: 'Error trying to deploy: ${lastError.cause}'
- call: slack_deploy_error
- exit
- call: slack_deploy_success
example_deploy:
- call: slack_start_deploy
- try:
- ${transitionVariableUpdate(platform = '${platform}', environment = '${environment}',
component = '${component_ear}' variables = { appVersion = '${BRANCH_NAME}-${BUILD_NUMBER}'
})}
- ${environmentCommitAndDeploy(environment = 'qa', platform = '${platform}', deployAllPlatforms
= false )}
slack_deploy_error:
- slack.postMessage:
channelId: ${alerts}
iconEmoji: ${slackEmojiConcord}
text: ' :fire: ${entryPoint} Deployment failed for environment *${environment}*
http://concord.com/#/process/${txId}/log'
username: ${slackname}
slack_deploy_success:
- slack.postMessage:
channelId: ${alerts}
iconEmoji: ${slackEmojiConcord}
text: ' :party: Deployment succeeded for environment *${environment}* http://concord.com/#/process/${txId}/log'
username: ${slackname}
slack_start_deploy:
- slack.postMessage:
channelId: ${alerts}
iconEmoji: ${slackEmojiConcord}
text: ${entryPoint} Deployment starting for environment *${environment}*
username: ${slackname}