GitLab 不能在任意版本之间直接跨级升级。跨越多个大版本时,必须先经过官方指定的必经版本(required upgrade stops),并在每一站等待后台迁移全部完成,再进入下一站。
本文适用于使用官方 Linux Package(以前称 Omnibus)安装的单节点 GitLab CE/EE。Docker、Helm、源码安装、多节点、Geo 和零停机升级的流程不同,应使用对应的官方文档。
GitLab 会调整必经版本和条件。实际操作前必须重新使用官方工具计算,不能长期照搬某一条示例路径。
一、计算升级路径
打开 GitLab Support 团队维护的 Upgrade Path 工具,输入当前版本和目标版本,保存工具生成的完整路径。
先确认当前版本和版本类型:
1 | sudo gitlab-rake gitlab:env:info |
规划路径时遵守以下规则:
- 以 Upgrade Path 工具的实时结果为准。
- 每个
主版本.次版本都安装该系列最新补丁。例如路径要求经过18.5,应安装最新的18.5.z,而不是18.5.0。 - 不要执行不带版本号的
apt install gitlab-ee或dnf upgrade gitlab-ee,否则可能跳过必经版本。 - 每到一个必经版本,都要阅读该版本到下一版本之间的 Upgrade notes。
- 每一站的后台迁移未完成前,不得安装下一站。
从 GitLab 17.5 开始,必经版本采用 x.2.z、x.5.z、x.8.z 和 x.11.z 的节奏。旧版本还有额外或条件性停留点,不能只套用这个规律。
截至本文更新时,官方列出的常见必经版本如下:
| 大版本 | 常规必经版本 |
|---|---|
| GitLab 15 | 15.0.5、15.4.6、15.11.13 |
| GitLab 16 | 16.3.9、16.7.10、16.11.10 |
| GitLab 17 | 17.3.7、17.5.5、17.8.7、17.11.7 |
| GitLab 18 | 最新的 18.2.z、18.5.z、18.8.z、18.11.z |
| GitLab 19 | 最新的 19.2.z、19.5.z、19.8.z、19.11.z |
多 Web 节点、大型 CI 表、NPM Package Registry 或用户量较大的实例可能需要额外停留点。不要根据上表省略工具给出的条件性版本。目标版本尚未发布时,应停在当前可用且受支持的最新补丁版本。
二、升级前准备
1. 检查系统和组件
确认目标 GitLab 支持当前操作系统,并阅读路径中每个版本的升级说明。保证 PostgreSQL、Redis 和 Gitaly 正常运行,并预留足够磁盘空间。
1 | sudo gitlab-ctl status |
大型生产实例应先在生产环境副本中完整演练,记录每一站的安装和后台迁移耗时。
2. 执行健康检查
1 | sudo gitlab-rake gitlab:check SANITIZE=true |
解决异常后再继续。还应测试登录、项目列表、Issue/Merge Request、Git clone/push 和 CI Job。
3. 确认后台迁移已完成
在“管理员 -> 监控 -> 后台迁移”中确认没有 Queued、Finalizing 或 Failed 任务。
较新版本可以使用 Rake task:
1 | # GitLab 18.9 及以上 |
旧版本没有对应任务时,可以查询数据库:
1 | sudo gitlab-psql -c "SELECT job_class_name, table_name, column_name, job_arguments FROM batched_background_migrations WHERE status NOT IN (3, 6);" |
结果必须为零行。失败的迁移必须先修复和重试,不要直接在数据库中标记完成。
如果启用了 Elasticsearch/Advanced Search,还要检查搜索迁移:
1 | sudo gitlab-rake gitlab:elastic:list_pending_migrations |
4. 创建可恢复的备份
1 | # 数据库、Git 仓库、上传文件等 |
至少还要单独保存:
/etc/gitlab/gitlab.rb/etc/gitlab/gitlab-secrets.json/var/opt/gitlab/backups/中刚生成的备份
将备份复制到异机或对象存储,并验证恢复流程。GitLab 备份通常只能恢复到相同版本和相同版本类型(CE/EE)的实例,不能把旧版本备份直接恢复到新版 GitLab。
5. 安排维护窗口
暂停新的 CI/CD Pipeline 和 Job;生产环境可以开启 Maintenance Mode。现代 Linux Package 升级会自行停止和启动所需服务,不必像旧教程那样手动只停止 Unicorn、Sidekiq 和 NGINX。新版本已使用 Puma,旧的 Unicorn 命令不再适用。
三、逐站安装指定版本
假设工具给出的路径为:
1 | 当前版本 -> STOP_1 -> STOP_2 -> TARGET |
下面的命令每次只能填写下一站。<version> 要替换为完整版本号,例如 17.11.7;CE/EE 包名必须与当前实例一致。
Debian/Ubuntu
1 | # GitLab EE |
查询实际可用版本:
1 | apt-cache madison gitlab-ee |
RHEL/AlmaLinux/Rocky Linux 8/9
1 | # EL9,GitLab EE |
查询可用版本:
1 | dnf --showduplicates list gitlab-ee |
不要在一条命令中连续安装所有版本。每安装一站,都必须完成下一节的检查。
四、每个必经版本都要检查
1 | sudo gitlab-rake gitlab:env:info |
同时测试 Web 登录、Git clone/push、Merge Request 和 CI/CD。
GitLab 的后台迁移由 Sidekiq 执行。安装完成不表示迁移已经结束,大型实例可能需要数小时甚至更久。只有所有迁移均为 Finished/Finalized,且没有 Failed 任务,才能进入下一站。
完整循环如下:
1 | 安装下一必经版本 |
五、到达目标版本后的检查
1 | sudo gitlab-rake gitlab:env:info |
最后确认:
- 后台迁移全部完成。
- 恢复 CI/CD Pipeline 和 Job。
- 关闭 Maintenance Mode。
- 将 GitLab Runner 升级到兼容版本。
- 检查错误日志、Sidekiq 队列、磁盘、邮件、LDAP/SSO、Container Registry、Pages 和对象存储。
- 记录每一站版本、起止时间、迁移耗时和异常处理过程。
六、失败与回滚
升级失败时不要继续安装下一版本,也不要仅靠降级软件包回滚。数据库 schema 可能已经改变,直接安装旧 RPM/DEB 可能进一步损坏实例。
正确做法是停止操作、保存日志,并按官方回滚文档将软件、数据库、仓库、配置和 secrets 一起恢复到升级前的同一版本。生产环境在没有经过恢复演练前,不应开始跨大版本升级。