Можно ли использовать абстракцию в файле YAML? - PullRequest
0 голосов
/ 25 апреля 2019

Можно ли использовать от arguments или abstraction до сведение к минимуму повторяющегося кода в файле YAML ?

Я пишу файл YAML, который запускает развертывание и до ипосле развертывания я хотел бы сделать вызовы в свободный канал, указывающий, что развертывание начинается и заканчивается, а также в случае сбоя.

Вот что я написал, но это звучит слишком многословно :

example_deploy:
    - call: notify
    in:
      msgText: "Deployment starting for environment *${environment}*"
    - try:
      - ${oneops.environmentCommitAndDeploy(environment = 'production', platform = '${platform}', deployAllPlatforms = false )}
      error:
    - log: "Error trying to deploy: ${lastError.cause}"
    - call: notify
      in:
        msgText: " :fire: Deployment failed for environment *${environment}* http://concord.com/#/process/${txId}/log"
    - exit
  - call: notify
    in:
      msgText: " :party: Deployment succeeded for environment *${environment}* http://concord.com/#/process/${txId}/log"
  notify:
  - task: slack
    in:
      channelId: ${alerts}
      username: ${slackname}
      iconEmoji: ${slackEmojiLooper}
      text: "${msgText}"

Теперь, если я хочу иметь example_deploy_2 и сделать то же самоеТип вещи, я должен переписать весь этот код?или есть способ получить "функцию" или абстрагировать повторяющиеся части YAML ?

ОБНОВЛЕНИЕ Я использовал call для абстрагирования вызововчтобы расслабиться, но теперь я задаюсь вопросом, могу ли я иметь общий вызов, чтобы расслабиться и динамически обновить сообщение - потому что теперь я повторяю параметры, которые я передаю блокам кода, которые я определил как called

Пример

  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:
      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"
      channelId: ${alerts}
      username: ${slackname}
      iconEmoji: ${slackEmojiConcord}

  slack_deploy_success:
  - slack.postMessage:
      text: " :party: Deployment succeeded for environment *${environment}* http://concord.com/#/process/${txId}/log"
      channelId: ${alerts}
      username: ${slackname}
      iconEmoji: ${slackEmojiConcord}

1 Ответ

1 голос
/ 25 апреля 2019

Единственный механизм в спецификации 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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...