如何在GitLab CI/CD中动态传递数据库名称环境变量?
GitLab CI/CD 多数据库流水线智能选择方案
方案一:手动触发时指定变量
直接利用GitLab的手动流水线触发功能,让团队在触发时选择目标数据库,无需修改代码:
- 移除
gitlab-ci.yml中固定的DB_NAME_*硬编码值,改为依赖动态变量:
variables: # 可选:设置默认值防止无输入时出错 TARGET_DB: "DEMO_DB" DB_NAME_dev: "$TARGET_DB" DB_NAME_qa: "$TARGET_DB" DB_NAME_prod: "$TARGET_DB" deploy: stage: deploy script: - echo "开始部署数据库: $DB_NAME_$CI_ENVIRONMENT_NAME" # 替换成你的实际部署命令 rules: - if: $CI_PIPELINE_SOURCE == "web" # 限制仅手动触发时生效,可选
- 操作时,团队在GitLab页面点击「运行流水线」,在变量输入框中填入
TARGET_DB=ABC或TARGET_DB=XYZ,流水线会自动使用对应数据库名。
方案二:分支绑定变量
如果两个团队有各自的专属分支(比如team-abc、team-xyz),可以用分支级变量自动匹配:
- 进入GitLab项目「设置→CI/CD→变量」,添加两个变量:
- 变量名
TARGET_DB,值ABC,分支限制填team-abc - 变量名
TARGET_DB,值XYZ,分支限制填team-xyz
- 变量名
- 在
gitlab-ci.yml中引用该变量:
variables: DB_NAME_dev: "$TARGET_DB" DB_NAME_qa: "$TARGET_DB" DB_NAME_prod: "$TARGET_DB" deploy: stage: deploy script: - echo "部署数据库: $DB_NAME_$CI_ENVIRONMENT_NAME"
这样团队在各自分支提交代码时,流水线会自动加载对应分支的变量,无需手动输入。
方案三:多作业模板+条件触发
定义通用部署模板,为每个数据库单独创建作业,通过规则控制触发:
- 创建模板文件
.gitlab-ci-template.yml:
.deploy_template: stage: deploy script: - echo "部署数据库: $DB_NAME_$CI_ENVIRONMENT_NAME" # 你的部署逻辑
- 主
gitlab-ci.yml中引入模板并定义多作业:
include: - local: .gitlab-ci-template.yml deploy_abc: extends: .deploy_template variables: DB_NAME_dev: ABC DB_NAME_qa: ABC DB_NAME_prod: ABC rules: - if: $CI_COMMIT_BRANCH == "team-abc" || $TARGET_DB == "ABC" deploy_xyz: extends: .deploy_template variables: DB_NAME_dev: XYZ DB_NAME_qa: XYZ DB_NAME_prod: XYZ rules: - if: $CI_COMMIT_BRANCH == "team-xyz" || $TARGET_DB == "XYZ"
触发时,要么切换到对应分支自动运行,要么手动传入TARGET_DB指定要运行的作业。
方案四:脚本条件赋值
在流水线中通过脚本自动判断分支或输入变量,动态设置数据库名:
deploy: stage: deploy before_script: - | # 根据分支或手动变量设置数据库名 if [[ -n "$TARGET_DB" ]]; then # 手动触发时优先使用传入的变量 export DB_NAME_dev="$TARGET_DB" export DB_NAME_qa="$TARGET_DB" export DB_NAME_prod="$TARGET_DB" elif [[ "$CI_COMMIT_BRANCH" == "team-abc" ]]; then export DB_NAME_dev=ABC export DB_NAME_qa=ABC export DB_NAME_prod=ABC elif [[ "$CI_COMMIT_BRANCH" == "team-xyz" ]]; then export DB_NAME_dev=XYZ export DB_NAME_qa=XYZ export DB_NAME_prod=XYZ else # 默认值 export DB_NAME_dev=DEMO_DB fi script: - echo "部署数据库: $DB_NAME_$CI_ENVIRONMENT_NAME"
这种方式兼顾了分支自动匹配和手动触发的灵活性,不用修改变量配置,全靠脚本逻辑处理。
内容的提问来源于stack exchange,提问作者Laster
相关产品推荐
相关产品推荐

