我有一个.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循环来安装插件?
答案 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
文件,如果文件已更改,请与其他更改一起提交)。