You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab容器扫描模板变量传递失败问题求助

问题:GitLab容器扫描任务中VERSION变量传递失效

在使用GitLab官方容器扫描模板(include: - template: Jobs/Container-Scanning.gitlab-ci.yml)时,遇到以下问题:

  • 在container_scanning任务的before_script中,从pre-build阶段的制品读取并导出VERSION变量,echo能显示正确版本,但扫描时GitLab Runner执行的命令中VERSION缺失。
  • 尝试用set-output设置输出变量,却出现echo结果为“}”的异常。

现有配置

原CI/CD配置

container_scanning:
      before_script:
        - result=$(cat $NAME.txt)
        - export VERSION="$result"
        - echo $VERSION
      dependencies:
        - pre-build
      variables:
        CS_IMAGE: "<registry>/$BUILD_PATH/$NAME:$VERSION"
        BUILD_PATH: "base_images"
      parallel:
         matrix:
           - NAME: !reference [.base_images]

Runner执行日志

[DEBUG] [2023-03-31 06:15:32 +0000] [container-scanning]  >  
trivy image --vuln-type os --no-progress --offline-scan --skip-update --security-checks vuln --format template --template @/usr/local/bundle/gems/gcs-5.3.2/lib/template/trivy.tpl --output tmp.json <registry>/base_images/aws-cli:

尝试的修改

before_script部分

- result=$(cat $NAME.txt)
- export VERSION="$result"
- echo VERSION="$result"
- echo "::set-output name=version::$VERSION"

变量配置部分

VERSION: ${{ steps.container_scanning.outputs.version }}
CS_IMAGE: <registry>/$BUILD_PATH/$NAME:$VERSION

问题原因

  1. 变量编译时机冲突:GitLab CI的variables块是在job启动前预编译的,而before_script是在job运行时才执行,因此variables里的$VERSION会被解析为空值,导致CS_IMAGE最终缺失版本号。
  2. set-output用法错误:GitLab 14.0+已废弃::set-output语法,改用$GITLAB_OUTPUT文件输出变量;同时你试图在同一个job中引用steps.container_scanning.outputs.version,这是跨job传递变量的语法,单job内不适用。

解决方案

方案一:动态覆盖CS_IMAGE环境变量(推荐)

直接在before_script中导出CS_IMAGE变量,覆盖variables块的预定义值(运行时环境变量优先级高于预编译变量):

container_scanning:
  before_script:
    - result=$(cat $NAME.txt)
    - export VERSION="$result"
    # 直接生成CS_IMAGE并导出
    - export CS_IMAGE="<registry>/$BUILD_PATH/$NAME:$VERSION"
    - echo "当前扫描镜像:$CS_IMAGE"
  dependencies:
    - pre-build
  variables:
    BUILD_PATH: "base_images"
  parallel:
    matrix:
      - NAME: !reference [.base_images]

方案二:跨job传递VERSION变量(若后续job需要)

如果需要将VERSION传递给其他job,使用GitLab官方推荐的$GITLAB_OUTPUT方式输出变量:

container_scanning:
  before_script:
    - result=$(cat $NAME.txt)
    - export VERSION="$result"
    # 输出变量到GITLAB_OUTPUT文件
    - echo "version=$VERSION" >> "$GITLAB_OUTPUT"
    - export CS_IMAGE="<registry>/$BUILD_PATH/$NAME:$VERSION"
  dependencies:
    - pre-build
  variables:
    BUILD_PATH: "base_images"
  parallel:
    matrix:
      - NAME: !reference [.base_images]
  # 保留模板原有script逻辑
  script:
    - !reference [container_scanning, script]

后续job引用该变量时,写法如下:

another_job:
  needs: [container_scanning]
  variables:
    USE_VERSION: ${{ needs.container_scanning.outputs.version }}
  script:
    - echo "使用版本:$USE_VERSION"

内容的提问来源于stack exchange,提问作者shadow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 12:53:32