GitLab Pipeline YAML如何动态嵌套引用变量适配多环境
GitLab CI 动态匹配环境对应AWS账号实现方案
GitLab CI原生支持嵌套变量展开,不需要为每个环境拆分独立job,直接通过变量动态拼接就能实现账号自动匹配,具体实现如下:
纯变量配置实现(GitLab 13.10及以上版本推荐)
利用GitLab CI的嵌套变量引用+内置大小写转换能力,直接在job的变量块完成动态取值,不需要修改原有业务脚本:
# 全局预定义的账号配置保持不变 variables: AWS_ACCOUNT_DEV: 000000000 AWS_ACCOUNT_NONPROD: 000000000 Import Alertmanager Endpoint: stage: import dependencies: - "Validate Credentials" tags: - ${runner} rules: - if: $CI_PROJECT_ID != $MONITORING_PROJECT_ID variables: # 将传入的小写env值转为大写,匹配预定义变量的后缀格式 ENV_UPPER: ${env^^} # 动态拼接变量名,读取对应环境的AWS账号ID TARGET_AWS_ACCOUNT: ${AWS_ACCOUNT_${ENV_UPPER}} # 用动态获取的账号ID拼接IAM角色ARN AWS_IAM_DEPLOYER_ROLE: "arn:aws:iam::${TARGET_AWS_ACCOUNT}:role/${runner_role}" # 后续原有job逻辑保持不变即可 ...
兼容老版本/带校验的脚本实现
如果使用的GitLab版本低于13.10,或者需要增加传参合法性校验,避免非法env值导致后续流程报错,可以在job的前置脚本里完成动态解析:
Import Alertmanager Endpoint: stage: import dependencies: - "Validate Credentials" tags: - ${runner} rules: - if: $CI_PROJECT_ID != $MONITORING_PROJECT_ID before_script: # 小写env转大写 - export ENV_UPPER=$(echo "$env" | tr '[:lower:]' '[:upper:]') # 读取对应环境的AWS账号配置 - export TARGET_AWS_ACCOUNT=$(printenv "AWS_ACCOUNT_${ENV_UPPER}") # 校验参数合法性,传入未配置的环境值时直接抛出明确错误 - | if [ -z "$TARGET_AWS_ACCOUNT" ]; then echo "参数错误:未配置环境[${env}]对应的AWS账号ID,请检查传入的env取值是否合法" exit 1 fi # 动态拼接IAM角色ARN - export AWS_IAM_DEPLOYER_ROLE="arn:aws:iam::${TARGET_AWS_ACCOUNT}:role/${runner_role}" # 原有业务脚本逻辑保持不变 script: - ...
扩展说明
后续新增环境时,只需要在全局variables块中新增一条AWS_ACCOUNT_<大写环境名>: <对应账号ID>的配置即可,不需要修改job的任何逻辑,传入对应小写的env参数就能自动匹配。
内容的提问来源于stack exchange,提问作者t27
相关产品推荐
相关产品推荐

