从YAML文件读取JSON数据

时间:2019-04-06 07:49:58

标签: json continuous-integration gitlab yaml continuous-deployment

我有一个.gitlab-ci.yml文件,用于在发布阶段安装一些插件(craftcms / aws-s3,craftcms / redactor等)。该文件提供如下(部分):

# run the staging deploy, commands may be different baesed on the project
deploy-staging:
  stage: publish
  variables:
    DOCKER_HOST: 127.0.0.1:2375

    # ...............
    # ...............


    # TODO: temporary fix to the docker/composer issue
    - docker-compose -p "ci-$CI_PROJECT_ID" --project-directory $CI_PROJECT_DIR -f build/docker-compose.staging.yml exec -T craft composer --working-dir=/data/craft require craftcms/aws-s3
    - docker-compose -p "ci-$CI_PROJECT_ID" --project-directory $CI_PROJECT_DIR -f build/docker-compose.staging.yml exec -T craft composer --working-dir=/data/craft require craftcms/redactor

我有一个JSON文件,其中包含插件的数据。该文件是下面提供的.butler.json.

{
  "customer_number": "007",
  "project_number": "999",
  "site_name": "Welance",
  "local_url": "localhost",
  "db_driver": "mysql",


  "composer_require": [
      "craftcms/redactor",
      "craftcms/aws-s3",
      "nystudio107/craft-typogrify:1.1.17"
],
  "local_plugins": [
  "welance/zeltinger",
    "ansmann/ansport"
 ]
}

如何从"composer_require"文件内的"local_plugins".butler.json中获取插件名称,并在.gitlab-ci.yml文件中创建一个for循环来安装插件?

1 个答案:

答案 0 :(得分:1)

由于YAML不是一种编程语言,因此您无法在.gitlab-ci.yml创建循环。它仅描述数据。您可以使用jq之类的工具在脚本中查询值(cat .butler.json | jq '.composer_require'),但不能从那里设置变量(变量为feature request)。

您可以使用诸如Jinja之类的模板引擎(通常与YAML配合使用,例如Ansible和SaltStack)从模板生成.gitlab-ci.yml。有一个命令行工具j2cli,它将变量作为JSON输入,您可以像这样使用它:

j2 gitlab-ci.yml.j2 .butler.json > .gitlab-ci.yml

然后您可以使用Jinja表达式遍历数据并在gitlab-ci.yml.j2中创建相应的YAML:

{% for item in composer_require %}
  # build your YAML
{% endfor %}

缺点是您需要将已处理的.gitlab-ci.yml签入到存储库中。可以通过pre-commit-hook完成此操作(在每次提交之前,重新生成.gitlab-ci.yml文件,如果文件已更改,请与其他更改一起提交)。