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

GitLab CI阶段间变量传递及同阶段多镜像脚本实现问询

解决方案

一、跨阶段传递AWS STS凭证

要把stage_one获取的AWS临时凭证传递到stage_two,用GitLab CI的**制品(artifacts)**就能实现,具体步骤如下:

1. 在stage_one中保存凭证到文件并配置制品

修改stage_one的脚本,把STS返回的凭证写入一个环境变量文件,然后通过artifacts声明要传递的文件:

stage_one:
  stage: transform
  image: alpineimage
  script: 
    - apt update && apt install -y awscli
    # 调用STS获取凭证并写入aws-credentials.env文件
    - aws sts assume-role \
        --role-arn arn:aws:iam::123456789012:role/MyAssumedRole \
        --role-session-name MySessionName \
        --query "Credentials.[AccessKeyId,SecretAccessKey,SessionToken]" \
        --output text | awk '{printf "AWS_ACCESS_KEY_ID=%s\nAWS_SECRET_ACCESS_KEY=%s\nAWS_SESSION_TOKEN=%s", $1, $2, $3}' > aws-credentials.env
  artifacts:
    paths:
      - aws-credentials.env
    expire_in: 1h # 设置过期时间,降低凭证泄露风险

2. 在stage_two中加载凭证文件

stage_two会自动下载stage_one生成的制品文件,直接读取并导出变量即可使用:

stage_two:
  stage: transform
  image: someotherimage
  script:
    # 加载凭证文件中的环境变量
    - export $(cat aws-credentials.env | xargs)
    # 这里执行需要AWS权限的操作,比如aws s3 ls、aws lambda invoke等

二、同一阶段使用不同镜像运行脚本(无需传递凭证)

GitLab CI单个job只能绑定一个镜像,但可以在同一个stage下创建多个独立job,每个job用不同镜像,两种实现方式:

方式1:共享前置凭证job

先做一个专门获取凭证的前置job,同一stage下的其他job都依赖它,直接复用凭证:

# 前置job:获取AWS凭证
get_aws_credentials:
  stage: prepare
  image: alpineimage
  script: 
    - apt update && apt install -y awscli
    - aws sts assume-role \
        --role-arn arn:aws:iam::123456789012:role/MyAssumedRole \
        --role-session-name MySessionName \
        --query "Credentials.[AccessKeyId,SecretAccessKey,SessionToken]" \
        --output text | awk '{printf "AWS_ACCESS_KEY_ID=%s\nAWS_SECRET_ACCESS_KEY=%s\nAWS_SESSION_TOKEN=%s", $1, $2, $3}' > aws-credentials.env
  artifacts:
    paths:
      - aws-credentials.env
    expire_in: 1h

# 同一transform阶段的不同镜像job
stage_job_alpine:
  stage: transform
  image: alpineimage
  needs: [get_aws_credentials] # 依赖凭证job
  script:
    - export $(cat aws-credentials.env | xargs)
    # 执行alpine镜像专属的脚本

stage_job_other:
  stage: transform
  image: someotherimage
  needs: [get_aws_credentials]
  script:
    - export $(cat aws-credentials.env | xargs)
    # 执行someotherimage镜像专属的脚本

方式2:每个job单独获取凭证

如果你的AWS角色允许重复调用STS,也可以直接在每个镜像的job里单独执行assume-role,省去传递凭证的步骤:

stage_job_alpine:
  stage: transform
  image: alpineimage
  script: 
    - apt update && apt install -y awscli
    - export $(printf "AWS_ACCESS_KEY_ID=%s AWS_SECRET_ACCESS_KEY=%s AWS_SESSION_TOKEN=%s" \
        $(aws sts assume-role \
        --role-arn arn:aws:iam::123456789012:role/MyAssumedRole \
        --role-session-name MySessionName-Alpine \
        --query "Credentials.[AccessKeyId,SecretAccessKey,SessionToken]" \
        --output text))
    # 执行脚本

stage_job_other:
  stage: transform
  image: someotherimage
  script:
    # 先确保镜像有AWS CLI,没有的话先安装
    - apt update && apt install -y awscli
    - export $(printf "AWS_ACCESS_KEY_ID=%s AWS_SECRET_ACCESS_KEY=%s AWS_SESSION_TOKEN=%s" \
        $(aws sts assume-role \
        --role-arn arn:aws:iam::123456789012:role/MyAssumedRole \
        --role-session-name MySessionName-Other \
        --query "Credentials.[AccessKeyId,SecretAccessKey,SessionToken]" \
        --output text))
    # 执行脚本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:07:09