Gitlab CE 16.8.2 CI/CD设置页500错误及变量缺失求助
问题:GitLab CE 16.8.2 CI/CD设置页500错误修复后变量功能异常
背景与初始问题
- GitLab CE 16.8.2环境中,所有项目打开CI/CD设置页时触发500错误
已执行的修复操作
针对初始问题执行了以下数据库命令(通过gitlab-psql进入数据库):
UPDATE projects SET runners_token = null, runners_token_encrypted = null; -- 执行结果:UPDATE 153 UPDATE namespaces SET runners_token = null, runners_token_encrypted = null; -- 执行结果:UPDATE 258 UPDATE application_settings SET runners_registration_token_encrypted = null; -- 执行结果:UPDATE 1 UPDATE ci_runners SET token = null, token_encrypted = null; -- 执行结果:UPDATE 4
执行后CI/CD设置页可正常访问,但出现新异常:
- WebUI显示「获取变量时出错」,无法查看已存在的CI/CD变量
- 新增变量时提示「我们这边出了问题,请重试」
排查线索
- 数据库
ci_variables表中存在完整变量数据(包含encrypted_value、encrypted_value_salt、encrypted_value_iv等加密字段),示例数据:
gitlabhq_production=# select * from ci_variables; id | key | value | encrypted_value | encrypted_value_salt | encrypted_value_iv | project_id | protected | environment_scope | masked | variable_type | raw | description ----+--------------------+-------+-----------------+----------------------+--------------------+------------+-----------+-------------------+--------+---------------+-----+------------- 21 | ssh_host_ecdsa_key | | <redacted> | <redacted> | <redacted> | 159 | f | * | f | 2 | f | (25 rows)
- 在测试服务器恢复数月前的备份后,变量功能可正常使用
问题根源分析
执行的数据库更新命令未直接修改ci_variables表,但破坏了GitLab内部加密上下文的一致性:
- GitLab的CI变量加密依赖应用内部加密密钥,且与项目/命名空间的runner令牌等加密数据共享加密上下文
- 批量清空
runners_token_encrypted等字段后,GitLab加密服务出现上下文校验异常,导致无法正确解密ci_variables中的加密值 - 旧备份可正常工作,说明当前环境加密上下文已被破坏,而非变量数据本身损坏
最优解决办法
方案1:恢复加密上下文(优先推荐)
- 从执行数据库命令前的最新备份中,恢复
projects、namespaces、application_settings、ci_runners表的加密字段数据:- 若有数据库快照,导出这些表的原始数据并导入当前环境
- 若使用GitLab官方备份,针对性恢复对应表数据(避免覆盖其他最新业务数据)
- 重启GitLab服务:
gitlab-ctl restart
方案2:重新生成加密变量(无可用备份时)
- 导出
ci_variables表中的变量元数据(跳过加密字段):COPY (SELECT id, key, project_id, protected, environment_scope, masked, variable_type, raw, description FROM ci_variables) TO '/tmp/ci_variables_metadata.csv' WITH CSV HEADER; - 清空当前
ci_variables表:TRUNCATE ci_variables; - 基于导出的元数据,通过GitLab API或WebUI重新录入所有变量
- 重启GitLab服务验证功能
方案3:校验加密密钥一致性
检查当前环境与备份环境的加密密钥是否一致:
- 查看
/etc/gitlab/gitlab-secrets.json文件,确认db_key_base等加密密钥与备份服务器匹配 - 若不一致,替换为备份中的密钥后重启GitLab服务
内容的提问来源于stack exchange,提问作者Scott C
相关产品推荐
相关产品推荐

