如何在GitLab-CI.yml中用循环简化Release的Assets链接配置?
批量简化GitLab CI Release配置的方案
当然可以批量处理,下面提供两种实用方案来简化你的Release配置:
方案一:通过脚本动态生成资产链接
直接在release job的脚本里循环处理conf列表,生成符合要求的资产链接参数,再调用release-cli创建发布。这种方式灵活,不管conf数量多少都能适配:
release: stage: release image: registry.gitlab.com/gitlab-org/release-cli:latest # 定义需要处理的conf列表,也可以从目录动态读取 variables: CONF_ITEMS: "conf_a conf_b conf_c conf_d conf_e" script: - | # 初始化资产链接字符串 ASSET_LINKS="" # 循环遍历每个conf,拼接链接内容 for conf in $CONF_ITEMS; do ASSET_LINKS+="{\"name\":\"$conf\",\"url\":\"https://gitlab.com/-/jobs/${BT_JOB_ID}/artifacts/raw/build/$conf/$conf.tar\"}," done # 移除最后多余的逗号 ASSET_LINKS=$(echo "$ASSET_LINKS" | sed 's/,$//') - | # 调用release-cli创建发布 release-cli create \ --tag-name "$CI_COMMIT_TAG" \ --name "Release $CI_COMMIT_TAG" \ --description "Release created using the release-cli." \ --assets-links "[$ASSET_LINKS]" only: - tags
如果你的conf文件是动态生成的(比如build目录下自动生成的),可以把CONF_ITEMS换成动态读取的命令:
CONF_ITEMS=$(ls build/ | grep ^conf_ | cut -d'/' -f1)
方案二:利用YAML锚点减少重复(适合固定数量的conf)
如果conf列表固定,也可以用YAML锚点定义模板,再重复引用,虽然不如脚本灵活,但能减少部分重复代码:
# 定义conf链接模板 .conf_link_template: &conf_link_template name: "" url: "https://gitlab.com/-/jobs/${BT_JOB_ID}/artifacts/raw/build/conf/conf.tar" release: tag_name: $CI_COMMIT_TAG name: 'Release $CI_COMMIT_TAG' description: 'Release created using the release-cli.' assets: links: - <<: *conf_link_template name: conf_a url: 'https://gitlab.com/-/jobs/${BT_JOB_ID}/artifacts/raw/build/conf_a/conf_a.tar' - <<: *conf_link_template name: conf_b url: 'https://gitlab.com/-/jobs/${BT_JOB_ID}/artifacts/raw/build/conf_b/conf_b.tar' # 其他conf同理
不过这种方式还是需要手动每个conf写一次,不如脚本方案彻底,更适合conf数量少且固定的场景。
关键注意事项
- 确保
BT_JOB_ID变量能在release job中正常获取,比如在之前的build job里通过artifacts:reports:dotenv传递该变量。 - 如果使用动态读取conf列表的方式,要保证build目录已经存在对应的文件,避免空值导致配置错误。
内容的提问来源于stack exchange,提问作者Furlings
相关产品推荐
相关产品推荐

