如何为这个yaml片段提取和重用公共部分?

时间:2018-03-17 03:59:56

标签: yaml circleci

在circleci config.yml文件中,我以这种方式定义了许多作业:

defaults: &defaults
  working_directory: ~/repo/appengine
  docker:
    - image: circleci/python

version: 2
jobs:
  deploy_uat:
    <<: *defaults
    steps:
      - attach_workspace:
          at: ~/repo
      - checkout
      - run: *setup_secret
      - run: *enable_npm
      - run: *appengine_dep
      - run: *webview_dep
      - run: *apps_dep
      - run:
          name: Setup key file
          command: |
            mkdir ~/gcloud_keys
            echo ${GCLOUD_UAT_ENV_KEY} | base64 --decode --ignore-garbage > ${HOME}/gcloud_keys/uat-env.json
      - run: deployt.sh uat
  deploy_dev:
    # ... Skipped for brevity
  deploy_staging:
    # ...

我想进一步简化yaml代码到这样的

defaults: &defaults
  working_directory: ~/repo/appengine
  docker:
    - image: circleci/python

# Common steps
deploy_steps: &deploy_steps
  steps:
    - attach_workspace:
        at: ~/repo
    - checkout
    - run: *setup_secret
    - run: *enable_npm
    - run: *appengine_dep
    - run: *webview_dep
    - run: *apps_dep

version: 2
jobs:
  deploy_uat:
    <<: *defaults
    steps:
      *deploy_steps
      - run:
          name: Setup key file
          command: |
            mkdir ~/gcloud_keys
            echo ${GCLOUD_UAT_ENV_KEY} | base64 --decode --ignore-garbage > ${HOME}/gcloud_keys/uat-env.json
      - run: deployt.sh uat

  deploy_dev:
    <<: *defaults
    steps:
      *deploy_steps
      - run:
          name: Setup key file
          command: |
            mkdir ~/gcloud_keys
            echo ${GCLOUD_DEV_ENV_KEY} | base64 --decode --ignore-garbage > ${HOME}/gcloud_keys/dev-env.json
      - run: deployt.sh dev

  deploy_staging:
    <<: *defaults
    steps:
      *deploy_steps
      - run:
          name: Setup key file
          command: |
            mkdir ~/gcloud_keys
            echo ${GCLOUD_STAGING_ENV_KEY} | base64 --decode --ignore-garbage > ${HOME}/gcloud_keys/staging-env.json
      - run: deployt.sh staging

但是,如果我这样做,我在*deploy_steps

找不到预期的密钥错误

如果我将其更改为

  deploy_uat:
    <<: *defaults
    steps:
      <<: *deploy_steps
      # ... 

我得到了同样的错误

编写简单的yaml配置的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

嗯,steps的值应该是一个数组。在第一种情况下,有一个别名指向映射(包含steps键),后跟两个序列项。这不是一个有效的YAML结构,甚至无法通过解析器。

在第二种情况下,您使用的是(已弃用的)merge key。这只是为映射定义的,序列没有等价物。

你想要做的是在YAML中合并两个序列。没有办法做到这一点,因为YAML不是一种编程语言,并且不支持对输入数据进行转换(除了合并键,当前YAML开发人员认为从一开始就是一个坏主意)。

由于YAML不允许你做你想做的事,你可以转向像Jinja这样的模板语言,这是Ansible和SaltStack在YAML配置中做的事情。由于CircleCI不支持它,您需要自己编写一个脚本来将输入YAML转换为CircleCI所理解的版本。是否这是解决问题的可行方法,由您决定。