在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配置的正确方法是什么?
答案 0 :(得分:1)
嗯,steps
的值应该是一个数组。在第一种情况下,有一个别名指向映射(包含steps
键),后跟两个序列项。这不是一个有效的YAML结构,甚至无法通过解析器。
在第二种情况下,您使用的是(已弃用的)merge key。这只是为映射定义的,序列没有等价物。
你想要做的是在YAML中合并两个序列。没有办法做到这一点,因为YAML不是一种编程语言,并且不支持对输入数据进行转换(除了合并键,当前YAML开发人员认为从一开始就是一个坏主意)。
由于YAML不允许你做你想做的事,你可以转向像Jinja这样的模板语言,这是Ansible和SaltStack在YAML配置中做的事情。由于CircleCI不支持它,您需要自己编写一个脚本来将输入YAML转换为CircleCI所理解的版本。是否这是解决问题的可行方法,由您决定。