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

如何在GitLab Runner的config.toml的pre_build_script中使用CI_COMMIT_BRANCH?

问题解答

核心结论

不能直接在GitLab Runner的config.toml的pre_build_script段中获取CI_COMMIT_BRANCH这类流水线预定义变量,变量为空是因为Runner全局配置中的脚本执行时机早于流水线上下文变量的传递时机。

pre_build_script是Runner启动执行器(比如AWS Fargate容器)时就运行的脚本,此时GitLab还未将流水线的上下文变量(包括分支信息)传递到执行环境中,因此这类变量还未初始化,值为空。

解决方案:将逻辑迁移到.gitlab-ci.yml

分支判断、AWS角色切换的逻辑应该放到项目的.gitlab-ci.yml中,因为这是流水线级别的配置,所有预定义变量在此处都能正常获取。

示例实现

可以通过GitLab CI的模板/锚点复用角色切换逻辑,避免重复代码:

# 定义可复用的AWS角色切换模板
.assume_aws_role: &assume_aws_role
  before_script:
    - echo "CI_COMMIT_BRANCH: $CI_COMMIT_BRANCH"
    - |
      if [[ "$CI_COMMIT_BRANCH" == "dev" ]]; then
        account_number="$dev_AWS_ACCOUNT"
      elif [[ "$CI_COMMIT_BRANCH" == "stg" ]]; then
        account_number="$stg_AWS_ACCOUNT"
      elif [[ "$CI_COMMIT_BRANCH" == "main" || "$CI_COMMIT_BRANCH" == "master" ]]; then
        account_number="$main_AWS_ACCOUNT"
      else
        echo "当前分支($CI_COMMIT_BRANCH)不符合AWS部署的预期分支要求。"
        exit 1
      fi
    - echo $account_number
    - |
      eval $(aws sts assume-role \
        --role-arn arn:aws:iam::${account_number}:role/assume-role \
        --role-session-name=gitlab-runner-${CI_COMMIT_BRANCH} \
        --query 'join("", [`export AWS_ACCESS_KEY_ID=`, Credentials.AccessKeyId, `; export AWS_SECRET_ACCESS_KEY=`, Credentials.SecretAccessKey, `; export AWS_SESSION_TOKEN=`, Credentials.SessionToken])' \
        --output text) || exit 1

# Dev环境部署Job
deploy_dev:
  stage: deploy
  extends: .assume_aws_role
  variables:
    dev_AWS_ACCOUNT: "123456789012" # 替换为实际Dev账号ID
  script:
    - # 此处添加你的部署命令(如aws ecs update-service等)
  only:
    - dev

# Stg环境部署Job
deploy_stg:
  stage: deploy
  extends: .assume_aws_role
  variables:
    stg_AWS_ACCOUNT: "234567890123" # 替换为实际Stg账号ID
  script:
    - # 此处添加你的部署命令
  only:
    - stg

# Prod环境部署Job
deploy_prod:
  stage: deploy
  extends: .assume_aws_role
  variables:
    main_AWS_ACCOUNT: "345678901234" # 替换为实际Prod账号ID
  script:
    - # 此处添加你的部署命令
  only:
    - main
    - master

额外建议

  • 账号ID建议存储在项目的CI/CD变量中(GitLab项目设置→CI/CD→变量),避免硬编码在配置文件中,提升安全性。
  • 确保Fargate Runner的任务角色拥有sts:AssumeRole权限,否则无法执行角色切换操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:53:00