GitLab 自带的 Web UI 里 不能一次性批量输入多个 CI/CD 变量,它是一个一个添加的。
不过有几种变通方式可以实现"批量添加":
1. 用 GitLab API 批量创建
GitLab 提供了 CI/CD Variables API,可以用脚本循环调用,比如:
bash
#!/bin/bash
# 批量添加项目变量
GITLAB_URL="https://gitlab.example.com"
PROJECT_ID="12345"
TOKEN="your_access_token"
declare -A vars=(
["VAR1"]="value1"
["VAR2"]="value2"
["VAR3"]="value3"
)
for key in "${!vars[@]}"; do
curl --request POST \
--header "PRIVATE-TOKEN: $TOKEN" \
--form "key=$key" \
--form "value=${vars[$key]}" \
"$GITLAB_URL/api/v4/projects/$PROJECT_ID/variables"
done
这样可以一次性批量导入几十上百个变量。
2. 用 GitLab Terraform Provider
如果你公司 CI/CD 基础设施用 IaC(Infrastructure as Code),可以在 .tf
里声明所有变量,然后一次性 terraform apply
。这样版本可控,也方便批量修改。
3. 用 .gitlab-ci.yml
+ .env
文件间接加载
虽然这不是直接往 GitLab 存变量,但可以把变量放在仓库的加密文件中,然后在 job 开始时读取:
yaml
variables:
VAR_FILE: ".ci/env.list"
job_name:
script:
- export $(cat $VAR_FILE | xargs)
不过这种方式变量会在 pipeline log 中出现(需要注意敏感信息泄露风险)。
一个Python 脚本,可以批量导入 GitLab 项目的 CI/CD 变量(用 API 实现),支持从 CSV 文件读取变量。
假设 CSV 文件格式如下(无表头):
csv
VAR1,value1
VAR2,value2
VAR3,value3
Python 批量导入脚本
python
import csv
import requests
# ==== 配置区 ====
GITLAB_URL = "https://gitlab.example.com" # GitLab 地址
PROJECT_ID = 12345 # 项目 ID
PRIVATE_TOKEN = "your_access_token" # GitLab Personal Access Token
CSV_FILE = "variables.csv" # 变量文件路径
PROTECTED = False # 是否保护变量(True/False)
MASKED = False # 是否隐藏变量值(True/False)
# ==============
API_URL = f"{GITLAB_URL}/api/v4/projects/{PROJECT_ID}/variables"
HEADERS = {"PRIVATE-TOKEN": PRIVATE_TOKEN}
def add_variable(key, value, protected=False, masked=False):
data = {
"key": key,
"value": value,
"protected": protected,
"masked": masked
}
resp = requests.post(API_URL, headers=HEADERS, data=data)
if resp.status_code == 201:
print(f"[OK] Added variable: {key}")
elif resp.status_code == 400 and "key" in resp.json().get("message", {}):
print(f"[SKIP] Variable '{key}' already exists.")
else:
print(f"[ERROR] Failed to add {key}: {resp.status_code}, {resp.text}")
def main():
with open(CSV_FILE, newline='', encoding="utf-8") as csvfile:
reader = csv.reader(csvfile)
for row in reader:
if len(row) < 2:
continue
key, value = row[0].strip(), row[1].strip()
if key and value:
add_variable(key, value, PROTECTED, MASKED)
if __name__ == "__main__":
main()
使用方法
-
创建 Access Token
- 进入 GitLab → 用户设置 → Access Tokens
- 选中
api
权限,生成 token,填到PRIVATE_TOKEN
-
准备 CSV 文件
- 文件名默认为
variables.csv
(可修改脚本配置) - 每行
KEY,value
,不加引号,值里如果有逗号用引号包起来
- 文件名默认为
-
运行脚本
bashpip install requests python3 import_variables.py
批量导出一个项目的ci变量再批量导入另一个:
- 导出 :调用
GET /projects/:id/variables
把源项目的所有 CI/CD 变量拉下来并保存到 JSON 或 CSV - 导入 :读取这个文件,再调用
POST /projects/:id/variables
写入目标项目
这样就能批量迁移。
示例 Python 脚本:批量迁移 CI/CD 变量
python
import requests
import json
# ==== 配置 ====
GITLAB_URL = "https://gitlab.example.com" # GitLab 地址
PRIVATE_TOKEN = "your_access_token" # 需要有 API 权限
SOURCE_PROJECT_ID = 12345 # 源项目 ID
TARGET_PROJECT_ID = 67890 # 目标项目 ID
EXPORT_FILE = "ci_vars.json" # 临时保存变量的文件
# ==============
HEADERS = {"PRIVATE-TOKEN": PRIVATE_TOKEN}
def export_variables(project_id, file_path):
url = f"{GITLAB_URL}/api/v4/projects/{project_id}/variables"
resp = requests.get(url, headers=HEADERS)
resp.raise_for_status()
vars_list = resp.json()
with open(file_path, "w", encoding="utf-8") as f:
json.dump(vars_list, f, ensure_ascii=False, indent=2)
print(f"[OK] Exported {len(vars_list)} variables from project {project_id} to {file_path}")
def import_variables(project_id, file_path):
url = f"{GITLAB_URL}/api/v4/projects/{project_id}/variables"
with open(file_path, "r", encoding="utf-8") as f:
vars_list = json.load(f)
for var in vars_list:
data = {
"key": var["key"],
"value": var["value"],
"protected": var.get("protected", False),
"masked": var.get("masked", False),
"environment_scope": var.get("environment_scope", "*")
}
resp = requests.post(url, headers=HEADERS, data=data)
if resp.status_code == 201:
print(f"[OK] Added {var['key']} to project {project_id}")
elif resp.status_code == 400 and "key" in resp.json().get("message", {}):
print(f"[SKIP] {var['key']} already exists in target project")
else:
print(f"[ERROR] Failed to add {var['key']}: {resp.status_code} {resp.text}")
if __name__ == "__main__":
# 1. 导出源项目变量
export_variables(SOURCE_PROJECT_ID, EXPORT_FILE)
# 2. 导入到目标项目
import_variables(TARGET_PROJECT_ID, EXPORT_FILE)
用法
-
生成 Access Token
- 用户 → Access Tokens → 勾选
api
权限
- 用户 → Access Tokens → 勾选
-
修改脚本里的配置(URL、Token、源项目 ID、目标项目 ID)
-
运行
bashpip install requests python3 migrate_ci_vars.py
⚠️ 注意事项
- 如果目标项目已有同名变量,脚本会跳过(可改成先删除再添加)
- API 会导出变量值(如果是 Masked 变量也能获取),所以文件要妥善保管
- 变量的
environment_scope
也会保留