背景: 因gitlab存在漏洞需升级至最新版本,当前发布的最新版本为16.8.0-ee。当前服务的安装方式是通过传统的yum方式,为了日后升级方便,这次将迁移至docker 容器运行。

整个过程分为以下部分:

  • GitLab 备份
  • Docker 迁移部署
  • 还原备份
  • GitLab 版本升级
  • 功能验证

一、备份

1.1 仓库备份

Gitlab 的备份相对比较简单,直接使用以下命令即可:

sudo gitlab-rake gitlab:backup:create

注意,备份的过程非常漫长请耐心等待(当然取决于你的所有仓库大小) 备份好的文件存放在:/var/opt/gitlab/backups 也就是Gitlab 的安装目录,一般情况下是这个,如果找不到则需要自行百度一下。备份文件类似这样 1705434707_2024_01_17_13.4.3-ee_gitlab_backup.tar。备份的路径如果找不到,可以在/etc/gitlab/gitlab.rb 中的gitlab_rails['backup_path']找到。

1.2 配置文件备份

  • 备份所有的配置文件 /etc/gitlab/*

  • 备份nginx配置文件 /var/opt/gitlab/nginx/*

1.3 停止服务

sudo gitlab-ctl stop

二、迁移部署

docker 容器部署也相对比较简单,官方文档:GitLab Docker images | GitLab,当然官方的操作是很复杂的,这里我们使用docker-compose 来部署就非常简单。

2.1 创建Docker目录

首先,我们先建好目录,来保存Docker我们的数据:

cd /data/gitlab # 这里切换到你实际保存的路径
mkdir data
mkdir etc
mkdir log
mkdir backups
###################################################
ll
drwxr-xr-x. 2 root root 4096 1月  20 21:38 backups
drwxr-xr-x. 2 root root 4096 1月  20 21:38 data
drwxr-xr-x. 2 root root 4096 1月  20 21:40 etc
drwxr-xr-x. 2 root root 4096 1月  20 21:38 log

然后,把刚才在1.2中的配置移到这里的etc 目录中来,如:

# pwd
/data/gitlab/etc

# ll
-rw-------. 1 root root 111413 1月  21 00:01 gitlab.rb
-rw-------. 1 root root  18896 1月  21 00:01 gitlab-secrets.json
drwxr-xr-x. 2 root root   4096 1月  21 00:01 trusted-certs

2.2 创建容器

我们使用docker-compose 来创建文件,先切换到你的dockerfiles目录,没有可以自己建一个。

特别注意:切记一步到位!版本一定是你当前服务器的版本!!

特别注意:切记一步到位!版本一定是你当前服务器的版本!!

特别注意:切记一步到位!版本一定是你当前服务器的版本!!

首先,查看当前版本号命名为:

cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
# 以下输出的就是你当前的版本号
13.4.3-ee

然后,创建gitlab.yml 配置文件,参考以下文件即可。

cd /data/dockerfiles/
vim gitlab.yml

gitlab.yml 配置文件:

version: '3.6'
services:
  gitlab:
    image: 'gitlab/gitlab-ee:13.4.3-ee.0' # 注意:这里的版本号与上面输出的必须一致!
    restart: always
    hostname: 'gitlab'
    container_name: 'gitlab'
    privileged: true
    environment:
      TZ: 'Asia/Shanghai'
      GITLAB_OMNIBUS_CONFIG: |
        # 以下的配置文件从 /etc/gitlab/gitlab.rb 里面复制过来即可
        # 以下是作者的服务器配置,不建议照搬!
        external_url 'http://192.168.1.1'
        puma['port'] = 8010
        gitlab_rails['time_zone'] = 'Asia/Shanghai'
        gitlab_rails['gitlab_default_theme'] = 2
        gitlab_rails['object_store']['enabled'] = false
        gitlab_rails['object_store']['connection'] = {}
        gitlab_rails['object_store']['storage_options'] = {}
        gitlab_rails['object_store']['proxy_download'] = false
        gitlab_rails['object_store']['objects']['artifacts']['bucket'] = nil
        gitlab_rails['object_store']['objects']['external_diffs']['bucket'] = nil
        gitlab_rails['object_store']['objects']['lfs']['bucket'] = nil
        gitlab_rails['object_store']['objects']['uploads']['bucket'] = nil
        gitlab_rails['object_store']['objects']['packages']['bucket'] = nil
        gitlab_rails['object_store']['objects']['dependency_proxy']['bucket'] = nil
        gitlab_rails['object_store']['objects']['terraform_state']['bucket'] = nil
        gitlab_rails['manage_backup_path'] = true
        gitlab_rails['backup_path'] = "/var/gitlab/backups"
        gitlab_rails['backup_archive_permissions'] = 0644
        gitlab_rails['backup_keep_time'] = 432000 
        git_data_dirs({
          "default" => {
          "path" => "/var/gitlab/data"
          }
        })
    ports:
      - '8090:80' # 端口号映射,服务器默认是80,这里建议先改成8080升级成功后再改回来。
    volumes: # 以下是在2.1中创建好的目录
      - '/data/gitlab/etc:/etc/gitlab'
      - '/data/gitlab/log:/var/log/gitlab'
      - '/data/gitlab/data:/var/gitlab/data'
      - '/data/gitlab/backups:/var/gitlab/backups'
    shm_size: '256m'

2.3 启动容器

docker-compose -f gitlab.yml up -d

查看运行情况

# docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS                             PORTS                                   NAMES
222ae262217d        gitlab/gitlab-ee:13.4.3-ee.0   "/assets/wrapper"        17 seconds ago      Up 11 seconds (health: starting)   22/tcp, 443/tcp, 0.0.0.0:8090->80/tcp   gitlab

第一次启动比较慢,耐心等待几分钟。(这里作者等了8分钟)

等待过程中,可以使用以下命令查看容器的运行日志情况。

docker logs -f --tail 100 gitlab

这里有时间可以继续往下看,或者查看第四点先。

启动完成后在浏览器访问验证是否启动成功:http://127.0.0.1:8090

Gitlab从13版本升级至16及迁移docker容器操作-RAE

看到这里已经成功跑起来了,咱们先不着急登录,继续按照下面的步骤把恢复一下备份先。

三、还原备份文件

3.1 复制备份文件

1.1中备份好的文件复制到2.1中的目录:/data/docker/backups

cp 1705765212_2024_01_20_13.4.3-ee_gitlab_backup.tar /data/gitlab/backups/

这里复制过程也是比较漫长的,作者这里有几十个G的大小,耐心等待一下。

等待过程可以先跳到执行4.1 进行docker镜像下载。

3.2 执行还原

执行以下命令:

# 1.进入容器
docker exec -it gitlab /bin/bash

# 2.停止服务
sudo gitlab-ctl stop unicorn
sudo gitlab-ctl stop puma
sudo gitlab-ctl stop sidekiq
# 查看服务是否正常停止
sudo gitlab-ctl status |grep down
# down: puma: 57s, normally up; run: log: (pid 872) 2008s
# down: sidekiq: 1846s, normally up; run: log: (pid 899) 2003s

# 3.查看备份文件
cd /var/gitlab/backups
ls
# 1705765212_2024_01_20_13.4.3-ee_gitlab_backup.tar

# 4.执行还原,注意这里文件名不需要【_gitlab_backup.tar】
gitlab-rake gitlab:backup:restore BACKUP=1705765212_2024_01_20_13.4.3-ee
# Unpacking backup....

恢复过程还需要输入3次的yes,

之后还是继续漫长的等待····

3.3 还原验证

还原结束后,重启服务并检查是否正常。

sudo gitlab-ctl restart
sudo gitlab-rake gitlab:check SANITIZE=true

最后登录进去查看各个仓库及功能是否正常。

至此,Gitlab迁移至docker 容器完成! 接下来进行升级操作。

四、版本升级

首先,版本是不能一步到位升级上去的。 需要遵循小版本逐步升级,官方提供升级路径,输入你当前的版本号就可以了。Upgrade Path (gitlab-com.gitlab.io)

例如作者这里的是13.4.7 ,选择升级方式为docker,官方给出的结果是这样的。

Gitlab从13版本升级至16及迁移docker容器操作-RAE

4.1 镜像下载

我们把官网的升级路径做成一个脚本文件,先把容器镜像先下载下来。

vim gitlab-docker.sh

#!/bin/bash
docker pull gitlab/gitlab-ee:13.8.8-ee.0
docker pull gitlab/gitlab-ee:13.12.15-ee.0
docker pull gitlab/gitlab-ee:14.0.12-ee.0
docker pull gitlab/gitlab-ee:14.3.6-ee.0
docker pull gitlab/gitlab-ee:14.9.5-ee.0
docker pull gitlab/gitlab-ee:14.10.5-ee.0
docker pull gitlab/gitlab-ee:15.0.5-ee.0
docker pull gitlab/gitlab-ee:15.4.6-ee.0
docker pull gitlab/gitlab-ee:15.11.13-ee.0
docker pull gitlab/gitlab-ee:16.1.6-ee.0
docker pull gitlab/gitlab-ee:16.3.7-ee.0
docker pull gitlab/gitlab-ee:16.7.3-ee.0
docker pull gitlab/gitlab-ee:16.8.0-ee.0

4.2 逐一升级

首先,停止容器。

docker-compose -f gitlab.yml stop

然后修改gitlab.yml 的容器版本

version: '3.6'
services:
  gitlab:
    image: 'gitlab/gitlab-ee:13.8.8-ee.0'  # 根据上面的版本号顺序逐一修改
# ... 这里省略其他....

附:从13.4.7版本升级到16.8.0版本过程版本

13.8.8 => 13.12.15 => 14.0.12 => 14.3.6 => 14.9.5 => 14.10.5 => 15.0.5 => 15.4.6 => 15.11.13 => 16.1.6 => 16.3.7 => 16.7.3 => 16.8.0

重启容器

docker-compose -f gitlab.yml up -d

# 看看容器日志有没有什么异常或报错
docker logs -f -t --tail 100 gitlab

特别注意:一定要留意后台迁移任务是否都已经执行完毕,只有全部执行完毕后才能继续操作。

查看后台迁移状态地址:http://127.0.0.1:8090/admin/background_migrations

Gitlab从13版本升级至16及迁移docker容器操作-RAE

等待升级完成后,进入系统查看功能是否正常。正常后依此类推,重复以上操作即可。

4.3 定时备份

docker-compose 跑的 GitLab 如果需要用 crontab 方式来进行备份的话,docker-compose exec 后面记得加 -T:

-T 为不分配 TTY,如果不加的话,利用 crontab 来运行会报: the input device is not a TTY
docker-compose exec -T gitlab gitlab-backup create