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

如果你也希望快速的进行体验,可以使用下面的脚本来初始化 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通过账号密码下载 gitlab 登陆_docker

不过,从几个版本之前,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通过账号密码下载 gitlab 登陆_docker_02

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

gitlab通过账号密码下载 gitlab 登陆_git_03

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

gitlab通过账号密码下载 gitlab 登陆_Docker_04

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

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

gitlab通过账号密码下载 gitlab 登陆_gitlab通过账号密码下载_05

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

gitlab通过账号密码下载 gitlab 登陆_docker_06

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

gitlab通过账号密码下载 gitlab 登陆_Docker_07

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

gitlab通过账号密码下载 gitlab 登陆_Docker_08

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

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

gitlab通过账号密码下载 gitlab 登陆_docker_09

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

gitlab通过账号密码下载 gitlab 登陆_Docker_10

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

gitlab通过账号密码下载 gitlab 登陆_Docker_11

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

gitlab通过账号密码下载 gitlab 登陆_git_12

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

gitlab通过账号密码下载 gitlab 登陆_git_13

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

使用容器体验 GitLab 14 极狐版

基于社区版环境封装镜像
英文版的 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通过账号密码下载 gitlab 登陆_git_14

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

gitlab通过账号密码下载 gitlab 登陆_git_15

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

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

gitlab通过账号密码下载 gitlab 登陆_Docker_16

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

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

gitlab通过账号密码下载 gitlab 登陆_docker_17

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

gitlab通过账号密码下载 gitlab 登陆_docker_18

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

gitlab通过账号密码下载 gitlab 登陆_gitlab通过账号密码下载_19

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

gitlab通过账号密码下载 gitlab 登陆_gitlab通过账号密码下载_20

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

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

这次为了避免镜像中原有软件对于测试的影响,虽然 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 成功运行起来。

gitlab通过账号密码下载 gitlab 登陆_docker_21

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

# 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