如何在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
相关产品推荐
相关产品推荐

