时值 GitLab 14 大版本更新,官方对于这个版本给出了非常高的评价,让我非常好奇,所以为了探究新版本到底有哪些变化,我对 GitLab 社区版、极狐版做了试用对比。

写在前面

作为一个 GitLab 老用户,从 2013 年开始使用它,并在过去的四年中,我写过十几篇 GitLab 相关的文章,介绍了如何在容器环境中更简单的使用和维护 GitLab,以及如何进行数据迁移。

在官方版本发布的版本更新公告中,对于这次更新的评价非常高:寄托 GitLab 的未来,以及 DevOps 的未来。

“Even more than that, GitLab 14 represents the future of GitLab, and the future of DevOps.”。

所以,对于这个版本到底更新了哪些内容?引起了我强烈的好奇心。

此外,之前看到极狐团队官方采访视频,了解到这个项目自去年年底就启动了。在本地化功能上做了一些改善,所以我非常好奇这七个月以来,这个针对中国市场的版本到底有哪些不同,接下来如果使用 GitLab 作为协作工具,是否能够直接上车本土化的极狐版本呢?

准备容器环境

为了保障测试过程相对顺畅,这里能使用官方镜像的软件,直接使用官方镜像。而像暂时没有提供镜像的极狐版,我会试着基于官方镜像进行容器镜像封装,尽可能避免折腾。

如果你也希望快速的进行体验,可以使用下面的脚本来初始化 Docker 环境(代码仓库 https://github.com/soulteary/linux-scripts):

curl -o- https://raw.githubusercontent.com/soulteary/linux-scripts/main/docker-with-mirror.sh | bash

curl -o- https://raw.githubusercontent.com/soulteary/linux-scripts/main/docker-compose.sh | bash

在安装完毕 Docker 环境后,就可以开始进行软件新版本试用啦。

使用容器体验 GitLab 14 社区版

使用容器启动 GitLab 14 社区版,还是比较容易的:

version: "3"

services:
  gitlab:
    restart: always
    image: gitlab/gitlab-ce:14.0.2-ce.0
    container_name: gitlab
    hostname: gitlab.soulteary.com
    ports:
      - "80:80"
      - "443:443"
      - "2222:22"
    volumes:
      - ./config:/etc/gitlab
      - ./data:/var/opt/gitlab
    environment:
      TZ: Asia/Shanghai
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://gitlab.soulteary.com'
        gitlab_rails['lfs_enabled'] = true
        gitlab_rails['time_zone'] = 'Asia/Shanghai'        

将上面的内容保存为 docker-compose.yml,使用 docker-compose up -d 启动服务。

稍等片刻,使用 IP 或者域名访问网站,就能看到熟悉的 GitLab 登陆界面啦。

GitLab 14 CE 登陆界面

不过,从几个版本之前,GitLab 在安装完毕之后就取消了初始化管理员密码的引导。所以,此刻在不知道管理员初始密码的状况下,我们将无法登陆系统。

重置 GitLab 用户密码

官方文档中的“Install GitLab using Docker swarm mode”小节中,对于首次登陆时的管理员密码的处理使用了 “compose secrets” 的方式来进行定义。

实际上,我们还有更简单的方式来解决 GitLab 首次安装不知道管理员密码,无法登陆的问题。在官方文档中,介绍了如何重置密码,结合我们上面的配置,使用下面的命令,可以快速手动重置管理员账号的密码:

docker exec -it gitlab gitlab-rake "gitlab:password:reset[root]"

Enter password: 
Confirm password: 

Password successfully updated for user with username root.

简单浏览 GitLab v14 界面功能

输入两次长度在8位以上的相同密码后,我们就能使用管理员账号 root 和刚刚修改的密码登陆系统了。

GitLab 14 CE 登陆后的界面

可以看到界面和之前差别不大,或许是最近一直在使用 Gitea ,总感觉 GitLab 14 界面尺寸上略有微调。

GitLab 14 CE 新的顶部导航

相比较老版本,比较明显的变化是顶部导航被折叠到了一起,虽然官方说这样效率更高,但是作为开发过若干云平台界面的老前端来说,我个人觉得虽然看起来简洁了,但是高频按钮明显还是拿出来更具有“效率”,单纯追求视觉简洁,在效率工具场景设计上属于“开倒车”行为呀。

GitLab 14 CE 项目侧边栏

打开系统提供的一个“默认仓库”,可以看到侧边栏“丰富”了不少,许多功能都被从之前的 CI 中抽了出来。相比较之前的版本,这个版本的 GitLab 默认会创建一个新的项目,复用容器内提供的 Prometheus Grafana 用于监控 GitLab 实例本身的运行状况,这个设计比较巧,值得点赞。

如果你不需要这个项目或者功能,打开管理后台关闭这个功能,仓库就会被自动删除掉了。

GitLab CE14 切换界面语言

在个人偏好设置界面,能够看到官方提供了语言切换功能,可以看到中文是完成度最高的语言,顺手切换掉。点击保存设置,页面会提示“Preferences saved.”,刷新后能够看到界面已经变更为了部分中文。再次访问系统默认项目,挨着翻一下项目侧边栏,看看会有什么变化:好像确实如翻译提示的那样,有一半左右的内容被汉化了,其他包括界面功能、排版并没有任何变化。

GitLab CE14 项目安全和合规管理

再次打开默认创建的项目,可以看到“安全合规”被提升到了一级菜单,不过除了第一项之外的功能都需要付费使用,阻挠了我继续探索的脚步。

GitLab CE14 项目部署环境

在 v13 版本中,GitLab 出现了部署环境管理功能,这个功能支持通过调整动态版本功能开关进行小范围的部署测试。不过这个功能在免费版本中有 200 个功能标记的限制。另外,这个功能并不是零门槛使用,需要关联一个 K8S 集群。对于小团队而言,这个功能的定价或许会直接影响开发过程与 GitLab 绑定有多深入。毕竟,如果定价便宜,远低于招聘成本,应该还是挺香的。

GitLab CE14 项目监控

前文提到了 GitLab 默认集成了 Prometheus ,在这个版本中,可以轻松的创建和定制看板,做到一站式监控业务状态。

这个看板包含并不仅限于常规的 QPS / 性能指标,还支持你自定义的业务指标。不过个人建议如果做业务监控,还是优先使用平台提供的 PaaS 服务,或者根据自己的业务量,预估资源占用,进行自建更靠谱一些。毕竟单机模式下,CPU 和磁盘 IO 都比较有限,难以保障可靠性。至于 GitLab 高可用模式,是否能够提供生产级别的监控服务,还需要进一步验证。

GitLab CE14 基础设施

基础设施部分,目前支持的有 AWS EKS 和 Google GKE 的 K8S 集群,Serverless 平台支持自家的“GitLab First Look”,还支持 HashCorp 提供的Terraform 功能。官方在配置集群的界面添加了一个导购链接,文案上说和 GCP 合作,通过这个地址注册可以多获得一定的试用免费额度。

GitLab CE14 软件包仓库

相比较自建仓库,比如 Nexus、Harbor、Registry,GitLab 内置了支持多种语言的软件包仓库,比用户自建要省事一些。不过还是之前的顾虑,单机情况下,存储可靠性、系统升级、备份还原的数据可靠性,以及整体的服务稳定性的保障承诺需要明确给出,至于多机版本,有待进一步探究。

GitLab CE14 价值流分析

“价值流分析”这个功能是我最喜欢的,如果正式用起来,或许可以把一堆项目管理软件都省掉,就在 GitLab 里就能完成整个软件开发生态的全部工作。恰逢 Phabricator 被官方宣布停止维护,或许在开源软件候选清单里,GitLab 的排位会再上升一些。

GitLab CE14 系统集成

最后,我想围观一下 GitLab 14 系统集成有什么新的应用,但很可惜的是没有看到什么新鲜的“家伙”。

接着来看看极狐版本的 GitLab 吧。

使用容器体验 GitLab 14 极狐版

GitLab 极狐版

极狐版的 GitLab 下载页面暂时没有提供 Docker 容器,所以我们需要封装一个镜像,为了保持客观,我们直接复用英文版本的容器环境进行体验。

基于社区版环境封装镜像

英文版的 GitLab 镜像,目前基于 Ubuntu 20.04 构建,所以这里我们需要先下载 极狐版的 GitLab 软件包:

wget https://omnibus.gitlab.cn/ubuntu/focal/gitlab-jh_14.0.1-jh.0_amd64.deb

顺手看一下文件校验值:

c4ae070ac043c33b665ca42380dfc5ef473410e1cc6a5aa6f4a6177e432f6d66  gitlab-jh_14.0.1-jh.0_amd64.deb

既然极狐版本是 14.0.1 ,那么我们也优先使用 14.0.1 的社区版镜像为基础环境进行尝试,直接使用 deb 包进行覆盖安装,来尽可能复用“原汁原味”的镜像环境。

FROM gitlab/gitlab-ce:14.0.1-ce.0

COPY gitlab-jh_14.0.1-jh.0_amd64.deb /tmp/

RUN  dpkg -i /tmp/gitlab-jh_14.0.1-jh.0_amd64.deb && \
     rm /tmp/gitlab-jh_14.0.1-jh.0_amd64.deb

将上面的内容保存为 Dockerfile,使用 docker build -t soulteary/gitlab:14.0.1-jh.0 . 进行镜像构建,不出意外,你将看到类似下面的内容:

Sending build context to Docker daemon  1.027GB
Step 1/3 : FROM gitlab/gitlab-ce:14.0.1-ce.0
 ---> f85d08f83476
Removing intermediate container b6f7f5e13d10
 ---> 3a1e7f9792ac
Step 2/3 : COPY gitlab-jh_14.0.1-jh.0_amd64.deb /tmp/
 ---> 95dd6ee6b868
Step 3/3 : RUN  dpkg -i /tmp/gitlab-jh_14.0.1-jh.0_amd64.deb &&      rm /tmp/gitlab-jh_14.0.1-jh.0_amd64.deb
 ---> Running in f3e874f1a980
Selecting previously unselected package gitlab-jh.
dpkg: considering removing gitlab-ce in favour of gitlab-jh ...
dpkg: yes, will remove gitlab-ce in favour of gitlab-jh
(Reading database ... 87432 files and directories currently installed.)
Preparing to unpack .../gitlab-jh_14.0.1-jh.0_amd64.deb ...
Unpacking gitlab-jh (14.0.1-jh.0) ...
Setting up gitlab-jh (14.0.1-jh.0) ...
It looks like GitLab has not been configured yet; skipping the upgrade script.

       *.                  *.
      ***                 ***
     *****               *****
    .******             *******
    ********            ********
   ,,,,,,,,,***********,,,,,,,,,
  ,,,,,,,,,,,*********,,,,,,,,,,,
  .,,,,,,,,,,,*******,,,,,,,,,,,,
      ,,,,,,,,,*****,,,,,,,,,.
         ,,,,,,,****,,,,,,
            .,,,***,,,,
                ,*,.
  


     _______ __  __          __
    / ____(_) /_/ /   ____ _/ /_
   / / __/ / __/ /   / __ `/ __ \
  / /_/ / / /_/ /___/ /_/ / /_/ /
  \____/_/\__/_____/\__,_/_.___/
  

Thank you for installing GitLab!
GitLab was unable to detect a valid hostname for your instance.
Please configure a URL for your GitLab instance by setting `external_url`
configuration in /etc/gitlab/gitlab.rb file.
Then, you can start your GitLab instance by running the following command:
  sudo gitlab-ctl reconfigure

For a comprehensive list of configuration options please see the Omnibus GitLab readme
https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md

Help us improve the installation experience, let us know how we did with a 1 minute survey:
https://gitlab.fra1.qualtrics.com/jfe/form/SV_6kVqZANThUQ1bZb?installation=omnibus&release=14-0

Removing intermediate container f3e874f1a980
 ---> a9861f84aa94
Successfully built a9861f84aa94
Successfully tagged soulteary/gitlab:14.0.1-jh.0

镜像构建完毕后,还是使用几乎相同内容的配置文件,来准备启动服务:(修改了镜像名称)

version: "3"

services:
  gitlab:
    restart: always
    image: soulteary/gitlab:14.0.1-jh.0
    container_name: gitlab
    hostname: gitlab.soulteary.com
    ports:
      - "80:80"
      - "443:443"
      - "2222:22"
    volumes:
      - ./config:/etc/gitlab
      - ./data:/var/opt/gitlab
    environment:
      TZ: Asia/Shanghai
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://gitlab.soulteary.com'
        gitlab_rails['lfs_enabled'] = true
        gitlab_rails['time_zone'] = 'Asia/Shanghai'        

启动服务后,会发现出现系统出现报错而无法运行:

gitlab    | Relevant File Content:
gitlab    | ----------------------
gitlab    | /opt/gitlab/embedded/cookbooks/cache/cookbooks/gitlab/libraries/gitlab_rails.rb:
gitlab    | 
gitlab    |  97:      # rubocop:enable Metrics/PerceivedComplexity
gitlab    |  98:  
gitlab    |  99:      def parse_external_url
gitlab    | 100:        return unless Gitlab['external_url']
gitlab    | 101:  
gitlab    | 102:        uri = URI(Gitlab['external_url'].to_s)
gitlab    | 103:  
gitlab    | 104>>       raise "GitLab external URL must include a schema and FQDN, e.g. http://gitlab.example.com/" unless uri.host
gitlab    | 105:  
gitlab    | 106:        Gitlab['user']['git_user_email'] ||= "gitlab@#{uri.host}"
gitlab    | 107:        Gitlab['gitlab_rails']['gitlab_host'] = uri.host
gitlab    | 108:        Gitlab['gitlab_rails']['gitlab_email_from'] ||= "gitlab@#{uri.host}"
gitlab    | 109:  
gitlab    | 110:        case uri.scheme
gitlab    | 111:        when "http"
gitlab    | 112:          Gitlab['gitlab_rails']['gitlab_https'] = false
gitlab    | 113:          Nginx.parse_proxy_headers('nginx', false)
gitlab    | 

翻看官方社区,发现这个问题应该早在三年前的v10.1.4就被修复了,虽然在这个帖子中,没有提到是如何解决的,但是这并难不倒使用了 GitLab N 年的老用户。

编辑 config/gitlab.rb 文件,将文件中的 external_url 'GENERATED_EXTERNAL_URL' 修改为 external_url='GENERATED_EXTERNAL_URL',再次使用 docker-compose down && docker-compose up -d 启动镜像,第一次启动会出现错误,再次执行命令,会看到程序对错误内容进行了修复,倒杯饮料稍等片刻,将看到极狐版本的登陆界面。

简单浏览极狐版 GitLab 功能

GitLab 极狐版 登陆界面

相比较社区版本,这个版本的界面默认换成了中文,我们使用同样的方式重置 root 用户的密码,并尝试登陆,体验软件功能。

GitLab 极狐版 默认界面

登陆进去后,第一感觉是发现除了左上角的 Logo 不同之外,似乎和社区版没有任何区别。翻看顶部导航菜单、系统默认创建的监控仓库的侧边栏,发现和社区版本还是完全一致。

或许切换语言后,界面功能会有不同,抱着幻想,同样使用用户“偏好设置”里的语言切换功能,对界面语言进行切换:将语言切换为中文。

GitLab 极狐版 切换语言

然而,在语言切换界面切换语言之前,看到中文汉化进度居然和社区版本一致,心想莫非…

切换语言后,“故地重游”了一番,发现和社区版还真没有什么太大的不同。

GitLab 极狐版 项目仓库界面

深入体验,点击默认仓库中的 “安全与合规”功能中的 “启动GitLab Ultimate试用”按钮,或者打开管理后台点击购买许可证,发现官方网站居然出现了 404 Not Found,看来这个版本还在迭代开发中,并不是完全体。

中国版 GitLab 似乎有些服务没有迁移过来

打开后台首页,我们会看到版本上方醒目的“尽快更新”(ASAP)的提示,这里估计是 GitLab 官方版本检查接口还没有做好?这个版本已经是最新版的中国发行版了啊。

后台版本检查提示该升级了

其实对于用户来说,上述都是小问题,如果本地版本在集成上添加了适应国情的钉钉、微信、飞书,这个版本还会是一个比较香的选择,毕竟有官方团队维护嘛。

极狐版本应用集成

然而,在我打开管理后台的应用集成界面时,发现和之前社区版还是没有差别

基于企业版环境封装镜像

看到上面的试用结果,我陷入了自我怀疑,难道是因为我使用的是社区版本的镜像作为基础运行环境造成的?那换成企业版本镜像又如何?

这次为了避免镜像中原有软件对于测试的影响,虽然 GitLab 支持使用 deb 包进行替换安装,但是这次我先对原有软件进行卸载,再进行软件的安装。

FROM gitlab/gitlab-ee:14.0.3-ee.0

RUN dpkg -P gitlab-ee
RUN rm -rf /opt/gitlab/sv/sshd/

COPY gitlab-jh_14.0.1-jh.0_amd64.deb /tmp/

RUN  dpkg -i /tmp/gitlab-jh_14.0.1-jh.0_amd64.deb && \
     rm /tmp/gitlab-jh_14.0.1-jh.0_amd64.deb

构建镜像和启动镜像,依旧使用上文中的配置。过程中还是会遇到那个“GitLab external URL must include a schema and FQDN”的错误,解决方式依旧是修改 gitlab.rb 配置文件,并重新启动,直到 GitLab 成功运行起来。

基于企业镜像构建的极狐版

然而,基于企业版镜像再次构建之后,软件似乎也没有什么区别。甚至打开管理后台,软件版本检查展示的还是上文中提到的“尽快更新”提示,这里为了确认到底是我封装容器环境问题,还是官方服务问题,进入容器翻了下软件的具体实现:

# cat ./embedded/service/gitlab-rails/lib/version_check.rb
# frozen_string_literal: true

require "base64"

# This class is used to build image URL to
# check if it is a new version for update
class VersionCheck
  def self.data
    { version: Gitlab::VERSION }
  end

  def self.url
    encoded_data = Base64.urlsafe_encode64(data.to_json)

    "#{host}/check.svg?gitlab_info=#{encoded_data}"
  end

  def self.host
    'https://version.gitlab.com'
  end
end

VersionCheck.prepend_mod

在浏览器看到页面实际调用地址如下:

https://version.gitlab.cn/check.svg?gitlab_info=eyJ2ZXJzaW9uIjoiMTQuMC4xLWpoIn0=

结合上面的实现,针对请求参数进行 base64 decode 可以得到版本为:{\"version\":\"14.0.1-jh\"}。那这个问题的原因,就和封装软件镜像无关了,或许是官方工作人员没有来得及更新页面上的版本号,以及还没有安排上本土化功能吧。

其他

极狐官方提醒软件下载用户,准备 4GB 以上的资源来准备运行 GitLab,实测目前版本,如果不进行配置调整,至少需要 6GB 到 7GB 的内存空间,所以针对国内用户,或许应该在 GitLab 官方版本上做一些快速配置调整,尽可能让用户以更少的资源将软件运行起来,投入使用。

最后

说实话,对于 GitLab 14 大版本更新,还是有一些惊喜,因为对于非头部大厂,参与研发的工程师完整的使用 DevOps 理念进行工作的门槛变的更低了,公司低成本搭建一套“开发工作平台”的成本也变的非常低。但是也有不少比较失望的地方,比如一味推云服务绑定,SaaS 绑定,抹杀了许多了技术架构出现创新的可能,也不利于与内部系统进行快速集成。更让我失望的是,看到视频宣传,原本以为已经可用的 GitLab 中国版还处于非常初级的阶段。

不论如何,作为一个老用户,看到官方开始重视和认可中国市场,并创建独立的公司进行运营,还是会对它充满期待,希望未来的 GitLab 和中国版可以越来越好。

–EOF