Gitlab-ci.yaml:用于发布资产的 for 循环

问题描述 投票:0回答:2

是否可以为我的所有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'

gitlab-ci
2个回答
2
投票

不幸的是,没有内置方法可以利用 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

0
投票

对于那些谷歌搜索的人来说,这里是一个脚本的工作示例(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}
© www.soinside.com 2019 - 2024. All rights reserved.