问题现象

在 GitLab 中将一个**公有(Public)项目改为私有(Private)**时,点击保存后失败,页面无明确错误提示。

GitLab 公有转私有失败截图

查找日志

方法一:查看 production.log

# 查看 GitLab Rails 生产日志
tail -f /var/log/gitlab/gitlab-rails/production.log

在执行"改为私有"操作的同时观察日志,会发现关键报错:

OpenSSL::Cipher::CipherError ()

方法二:使用 gitlab-ctl tail(官方推荐)

gitlab-ctl tail gitlab-rails

原因

GitLab 在修改项目可见性时,会尝试对某些敏感字段(如 runner token)进行加密/解密操作。如果加密密钥或 token 数据异常,就会抛出 OpenSSL::Cipher::CipherError


解决方法

进入 GitLab 数据库控制台

gitlab-rails dbconsole

清空 runner token 相关字段

-- 清空项目的 runner token
UPDATE projects SET runners_token = null, runners_token_encrypted = null;

-- 清空命名空间的 runner token
UPDATE namespaces SET runners_token = null, runners_token_encrypted = null;

-- 清空应用设置的注册 token
UPDATE application_settings SET runners_registration_token_encrypted = null;

-- 清空 CI runner 的 token
UPDATE ci_runners SET token = null, token_encrypted = null;

执行后输出示例:

UPDATE 16   -- 更新了 16 个项目
UPDATE 33   -- 更新了 33 个命名空间
UPDATE 1    -- 更新了 1 条应用设置
UPDATE 0    -- 没有 CI runner(可选)

数据库控制台执行结果

验证

执行完上述 SQL 后,不需要重启服务,立即生效。回到 GitLab Web 界面,再次点击"保存"即可成功将项目改为私有。


参考链接


注意事项

注意点 说明
清空 token 的影响 清空后 CI runner 需要重新注册,项目 runner token 会失效
不需要重启 SQL 执行后立即生效,无需重启 GitLab 服务
先备份数据库 生产环境操作前建议先备份 gitlab-rake gitlab:backup:create
日志定位 遇到类似问题优先查看 production.loggitlab-ctl tail gitlab-rails

Professional English Terms

Term Meaning
OpenSSL::Cipher::CipherError OpenSSL 加密/解密错误,通常由密钥或数据异常引起
Runner Token GitLab Runner 用于注册和认证的令牌
gitlab-rails dbconsole GitLab Rails 数据库控制台,可直接执行 SQL
Project Visibility 项目可见性(Public / Internal / Private)