代码之家  ›  专栏  ›  技术社区  ›  Anthony Kong

如何提取和重用此yaml片段的公共部分?

  •  2
  • Anthony Kong  · 技术社区  · 6 年前

    在circleci配置中。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 回复  |  直到 6 年前
        1
  •  1
  •   flyx    6 年前

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

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

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

    由于YAML不允许您做您想做的事情,您可以使用Jinja之类的模板语言,这是Ansible和SaltStack在其YAML配置中实现的。由于CircleCI不支持它,您需要自己编写一个脚本,将输入YAML转换为CircleCI能够理解的版本。这是否是你问题的可行解决方案,取决于你。