变量体系
变量来源与优先级
同名变量高优先级覆盖低优先级(高 → 低):
- Trigger 触发时传入的变量(API / trigger job 传递)
- Project 级变量(Settings → CI/CD → Variables)
- Group / Subgroup 级变量
- Instance 级变量(管理员设置)
.gitlab-ci.yml中variables定义(Job 级 > 全局级)- 预定义变量(Predefined)
另:带 environment scope 精确匹配的变量,优先于 scope 为 * 的同名变量。
常用预定义变量
| 变量 | 说明 |
|---|---|
CI_COMMIT_SHA / CI_COMMIT_SHORT_SHA | 完整/短 commit hash |
CI_COMMIT_BRANCH / CI_COMMIT_TAG / CI_COMMIT_REF_NAME | 分支名 / tag 名 / 二者之一 |
CI_COMMIT_REF_SLUG | 分支名的 URL 安全形式,常用作 cache key |
CI_COMMIT_MESSAGE | 提交信息 |
CI_PIPELINE_ID / CI_PIPELINE_IID | 实例级 / 项目内流水线 ID |
CI_PIPELINE_SOURCE | 触发来源(push/schedule/web/api/…) |
CI_PIPELINE_URL | 流水线页面地址 |
CI_JOB_ID / CI_JOB_NAME / CI_JOB_STAGE | Job 元信息 |
CI_JOB_TOKEN | 当前 Job 的临时 token(拉依赖、读写 registry) |
CI_PROJECT_DIR | 代码检出目录 |
CI_PROJECT_PATH / CI_PROJECT_NAME | group/name / 项目名 |
CI_DEFAULT_BRANCH | 默认分支 |
CI_REGISTRY / CI_REGISTRY_IMAGE | Registry 地址 / 本项目镜像路径 |
CI_REGISTRY_USER / CI_REGISTRY_PASSWORD | 登录 registry 的临时凭据 |
CI_MERGE_REQUEST_IID | MR 编号(仅 MR pipeline 有值) |
CI_MERGE_REQUEST_SOURCE_BRANCH_NAME | MR 源分支 |
CI_MERGE_REQUEST_TARGET_BRANCH_NAME | MR 目标分支 |
CI_ENVIRONMENT_NAME / CI_ENVIRONMENT_URL | environment 名 / URL |
GITLAB_USER_LOGIN / GITLAB_USER_EMAIL | 触发者账号 |
CI_API_V4_URL | API 地址,配合 token 调 REST API |
CI_DEBUG_TRACE | 设 true 打印变量展开过程(⚠️ 会泄露敏感值,调试后移除) |
完整列表以官方 predefined variables 文档为准,各 GitLab 版本略有差异。
自定义变量
Settings → CI/CD → Variables → Add variable:
| 选项 | 说明 |
|---|---|
| Key / Value | 变量名与值 |
| Type: Variable / File | File 类型把值写入临时文件,变量本身是文件路径 |
| Protect variable | 仅 protected 分支/tag 的 Job 可用 |
| Mask variable | 日志中显示为 [MASKED];值需 ≥8 字符且仅含 Base64 合法字符集 |
| Expand variable reference | 允许值中引用其他变量($OTHER) |
| Environment scope | 限定生效环境(如仅 production),* 表示全部 |
yml 中定义:
variables:
APP_ENV: staging
DB_PASSWORD:
value: "" # 留空则运行时手动输入(manual job 场景)
description: "数据库密码"
RAW_CONFIG:
value: '$BASE_CONFIG'
expand: false # 禁止展开,保留字面量Job 级 variables 覆盖全局定义。
高频陷阱
- Protected 变量取不到:非 protected 分支上值为空。MR pipeline 按目标分支是否 protected 判断。解法:把分支设为 protected,或变量不勾 Protect(改用 Mask + 最小权限凭据)。
- Mask 失败:值含换行、特殊字符或太短时,勾选 Mask 会保存失败或日志仍明文。常见做法是 Base64 编码后存入、脚本里解码。
- File 类型用法:
$KUBECONFIG_FILE是路径不是内容,要cat $KUBECONFIG_FILE或cp $KUBECONFIG_FILE ~/.kube/config。 - 密钥泄露:
set -x、env、echo $VAR、CI_DEBUG_TRACE都会把变量打进日志;masked 只掩盖变量原值,拼接/转码后的输出不保证被掩盖。
安全进阶
- OIDC / ID tokens:
id_tokens关键字换取 JWT,向 AWS/GCP/Azure/Vault 换临时凭据,免维护长期密钥:
deploy:
id_tokens:
AWS_ID_TOKEN:
aud: https://gitlab.example.com
script:
- aws sts assume-role-with-web-identity --role-arn $ROLE_ARN --web-identity-token $AWS_ID_TOKEN ...- External Secrets:
secrets:关键字对接 HashiCorp Vault 等,密钥不进 yml、不进 UI 配置。 - 最小权限原则:
CI_JOB_TOKEN的可用范围可在 Settings → CI/CD → Job token permissions 收紧。
相关
- cicd-overview:概念与快速上手
- cicd-yaml-syntax:yml 语法参考
- cicd-runner:Runner 配置
- cicd-recipes:部署示例中大量用到 File 类型变量