是否可以为我的所有conf(
conf_a
,conf_b
...)创建一个for循环或类似的东西来简化这个.gitlab-ci.yml
:
release:
tag_name: $CI_COMMIT_TAG
name: 'Release $CI_COMMIT_TAG'
description: 'Release created using the release-cli.'
assets:
links:
- name: conf_a
url: 'https://gitlab.com/-/jobs/${BT_JOB_ID}/artifacts/raw/build/conf_a/conf_a.tar'
- name: conf_b
url: 'https://gitlab.com/-/jobs/${BT_JOB_ID}/artifacts/raw/build/conf_b/conf_b.tar'
- name: conf_c
url: 'https://gitlab.com/-/jobs/${BT_JOB_ID}/artifacts/raw/build/conf_c/conf_c.tar'
- name: conf_d
url: 'https://gitlab.com/-/jobs/${BT_JOB_ID}/artifacts/raw/build/conf_d/conf_d.tar'
- name: conf_e
url: 'https://gitlab.com/-/jobs/${BT_JOB_ID}/artifacts/raw/build/conf_e/conf_e.tar'
不幸的是,没有内置方法可以利用 yaml 定义中的循环进行发布。
但是,
release:
关键字或多或少只是一种将脚本步骤添加到调用 script:
二进制文件的 release-cli
的简写方式。
有了这种理解,就可以直接制作一个直接使用 release-cli
release-cli
的任何实用程序/语言。
作为一个简单的示例,您可以在 bash 中的循环中生成资产链接参数,然后使用这些参数来调用
release-cli
。
myjob:
variables:
CONF_FILES: "conf_a conf_b conf_c conf_d conf_e"
script: |
# generate asset link arguments in a loop
asset_args=()
for conf_name in "$CONF_FILES"; do
url="${CI_PROJECT_URL}/-/jobs/${BT_JOB_ID}/artifacts/raw/build/${conf_name}/${conf_name}.tar"
asset_info='{"name":"'$conf_name'","url":'$url'"}'
asset_args+=(--assets-link $asset_info)
done
# invoke release-cli with those args
# modify as needed.
release-cli create \
--tag-name $CI_COMMIT_TAG \
--description "desc" \
"${asset_args[@]}"
此脚本未经测试,但基本思想应该很清楚 - 您可以使用您喜欢的任何工具或语言来完成使用以编程方式生成的参数调用
release-cli
的相同任务。
不过,如果您只有少量资产,目前还不清楚这是否会使 YAML 比原来的 YAML 更干净。当然,如果您有数十或数百个资产,这可能非常有用。
您还可以将脚本提交到存储库本身,然后像这样调用它:
myjob:
variables:
CONF_FILES: "conf_a conf_b conf_c conf_d conf_e"
script:
- ./create-release.sh
对于那些谷歌搜索的人来说,这里是一个脚本的工作示例(release-cli 图像中的 ash 与 bash 不同)。它将二进制工件上传到 gitlab 包注册表并创建一个版本
go_release:
stage: release
image: registry.gitlab.com/gitlab-org/release-cli:latest
variables:
PACKAGE_REGISTRY_URL: '$CI_API_V4_URL/projects/$CI_PROJECT_ID/packages/generic/$CI_PROJECT_NAME'
needs:
- job: go_build
rules:
- if: '$CI_COMMIT_TAG =~ /^v?\d+\.\d+\.\d+$/'
before_script:
- apk add curl
script:
- cd $GO_BIN_DIR
- echo "Creating release"
- |
asset_args=""
for FILE in *; do
echo "Uploading $FILE to the package registry"
URL=${PACKAGE_REGISTRY_URL}/${CI_COMMIT_TAG}/${FILE}
curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file ${FILE} $URL
asset_info='{"name":"'$FILE'","url":"'$URL'"}'
asset_args=$asset_args" --assets-link "$asset_info
done
- |
release-cli create \
--name "Release $CI_COMMIT_TAG" \
--tag-name $CI_COMMIT_TAG \
${asset_args}