You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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内部加密上下文的一致性:

  1. GitLab的CI变量加密依赖应用内部加密密钥,且与项目/命名空间的runner令牌等加密数据共享加密上下文
  2. 批量清空runners_token_encrypted等字段后,GitLab加密服务出现上下文校验异常,导致无法正确解密ci_variables中的加密值
  3. 旧备份可正常工作,说明当前环境加密上下文已被破坏,而非变量数据本身损坏

最优解决办法

方案1:恢复加密上下文(优先推荐)

  1. 从执行数据库命令前的最新备份中,恢复projects、namespaces、application_settings、ci_runners表的加密字段数据:
    • 若有数据库快照,导出这些表的原始数据并导入当前环境
    • 若使用GitLab官方备份,针对性恢复对应表数据(避免覆盖其他最新业务数据)
  2. 重启GitLab服务:
    gitlab-ctl restart
    

方案2:重新生成加密变量(无可用备份时)

  1. 导出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;
    
  2. 清空当前ci_variables表:
    TRUNCATE ci_variables;
    
  3. 基于导出的元数据,通过GitLab API或WebUI重新录入所有变量
  4. 重启GitLab服务验证功能

方案3:校验加密密钥一致性

检查当前环境与备份环境的加密密钥是否一致:

  • 查看/etc/gitlab/gitlab-secrets.json文件,确认db_key_base等加密密钥与备份服务器匹配
  • 若不一致,替换为备份中的密钥后重启GitLab服务

内容的提问来源于stack exchange,提问作者Scott C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 19:52:28