GitLab CI/CD环境变量分全局和分支级两层管理:全局变量在Admin Area统一配置,全项目继承;分支级变量通过Scope通配符(如main、dev*)按分支动态注入,优先级高于YAML中定义的同名变量。

在 GitLab CI/CD 中,环境变量分层管理是运维可控性的关键。全局变量适用于所有项目共用的配置(如镜像仓库地址、通用密钥前缀),分支级变量则用于差异化控制(如 main 分支走生产部署,dev 分支走测试环境)。两者不冲突,而是按作用域优先级叠加生效。
全局环境变量:一次配置,全实例生效
适合跨项目复用、需统一管控的值,例如私有镜像仓库域名、默认超时时间、基础工具路径等。
- 进入 GitLab 管理后台(Admin Area)→ Settings → CI/CD → Variables
- 点击 Add variable,填写:
-
Key:如
CI_REGISTRY_BASE(仅字母、数字、下划线) -
Value:如
registry.example.com:5000 -
Type:保持默认
Variable - Protected:勾选(防止非受保护分支意外读取)
-
Mask variable:对敏感值(如 token)建议勾选(值在日志中显示为
***)
-
Key:如
- 保存后,所有项目(包括新建项目)的流水线自动继承该变量,无需在
.gitlab-ci.yml中重复定义
分支级环境变量:按分支动态注入
用于区分部署目标、开关功能、适配不同构建参数。GitLab 不直接支持“分支级变量”字段,而是通过 Scope(作用域)匹配 实现。
OpenClaw 技能 — 给定一个 GitHub 仓库 URL,自动解析出 owner/repo 名称,发现其中的 YAML/properties 配置文件及其配对的中文字段说明;在 `workspace/{repo}/` 目录下按同步日期(格式为 `YYYY-MM-DD`)创建时间戳子目录;写入 `.openclaw-config-state.json` 状态文件。每次用户提问前,先比对远程仓库当前 ref(如 `main` 或 `master`)的最新提交 SHA 与本地状态文件中记录的 SHA:
- 在对应项目的 Settings → CI/CD → Variables 页面添加变量
- 设置 Scope 字段为通配符模式,例如:
-
main→ 仅main分支触发的流水线可见 -
dev*→ 匹配dev、dev-feature-a等分支 -
feature/**→ 匹配所有feature/xxx分支(需 GitLab ≥ 15.0)
-
- 常见组合示例:
- 变量名:
DEPLOY_TARGET,值:prod,Scope:main - 变量名:
DEPLOY_TARGET,值:staging,Scope:dev* - 变量名:
SKIP_TESTS,值:"true",Scope:dependabot/**(跳过依赖更新的测试)
- 变量名:
在 .gitlab-ci.yml 中安全使用变量
变量在脚本中直接引用即可,但要注意语法和时机:
- 普通引用:
echo "Deploying to $DEPLOY_TARGET"(双引号内展开) - 避免空格截断:
ssh -o "StrictHostKeyChecking=no" "$DEPLOY_USER@$DEPLOY_SERVER" - 变量未定义时提供默认值:
echo "${CI_COMMIT_TAG:-no-tag}" - 敏感操作前校验变量存在:
if [[ -z "$API_TOKEN" ]]; then echo "Missing API_TOKEN"; exit 1; fi - 不要在
variables:块中硬编码敏感值——这是反模式,应全部移至 UI 变量管理
调试与验证技巧
变量是否生效,不能只靠猜测:
- 在任意作业中临时加一句:
printenv | grep -E '^(DEPLOY|CI_)',查看实际注入的变量列表 - 触发不同分支的流水线,对比日志中
DEPLOY_TARGET输出是否符合预期 - 使用 GitLab 内置的 CI Lint 工具(项目 → CI/CD → Pipelines → CI Lint)检查 YAML 语法,确认无缩进或拼写错误导致变量未加载
- 注意:UI 中定义的变量优先级高于
.gitlab-ci.yml中variables:定义的同名变量

















