Gitlab EE/JH “体验版” 教程

发布于 2022-07-09  2.27k 次阅读


前言

Gitlab我去年就已经搭好了, 不过今年才用上, 一路过来踩了太多坑了, 实在是被搞的忍不住了, 稍微动动手为后人造福吧
谁才是真正的英雄!

本来都不需要写教程的, 这破gitlab升到了15版本后, 就有点小问题了, 正好这次我给研究了个大概的明白, 好了不废话了

环境

Gitlab-EE 15.1.2
Docker-CE 20.10.9
Portainer-CE 2.14.0

⚠注意: 本文以下所有操作均为 Docker 部署的 Gitlab EE 版本
⚠注意: 若使用 Gitlab CE 版, 请先自行转换到 Gitlab EE 版本

Gitlab EE 配置

关于Gilab搭建: 以后有机会再写教程, 目前我用的是 Portainer 里的 Stacks 功能, 编写个 docker-compose 可快速更新配置

1. Gitlab EE 映射路径

确保已经将配置文件夹映射出来, 并且自己需要找得到目录, 后续需要使用

volumes:
    - <you volume>/config:/etc/gitlab # gitlab 的配置文件目录
    - <you volume>/logs:/var/log/gitlab # gitlab log目录
    - <you volume>/data:/var/opt/gitlab # gitlab 数据目录

2. Gitlab EE 版本确认

由于Gitlab的升级比较麻烦, 必须根据官方给的升级路径来弄, 所以先确认好自己的版本, 低于 15 的版本操作手法是有点不一样的, 后面会讲到

若想要升级, 请先自行到官方文档, 查询自己的版本如何进行 !!!备份!!!
!备份!
!备份!
!备份!
然后根据官方给的 升级路径, 一个版本一个版本的升上 15

官方文档链接:
英文(比较全/新) https://docs.gitlab.com/ee
中文(勉强能用) https://docs.gitlab.cn/jh/index.html

3. 进入配置文件目录, 添加脚本文件

在映射出来的配置文件目录创建 license 文件夹

添加文件 gen.rb, 部分信息可自行修改

require "openssl"
require "gitlab/license"

key_pair = OpenSSL::PKey::RSA.generate(2048)
File.open("license_key", "w") { |f| f.write(key_pair.to_pem) }

public_key = key_pair.public_key
File.open("license_key.pub", "w") { |f| f.write(public_key.to_pem) }

private_key = OpenSSL::PKey::RSA.new File.read("license_key")
Gitlab::License.encryption_key = private_key

license = Gitlab::License.new
license.licensee = {
  "Name" => "RNM",          # 可自行更改
  "Company" => "MHY",       # 可自行更改
  "Email" => "rnm@mhy.com", # 可自行更改
}
license.starts_at = Date.new(2022, 1, 1) # 开始时间
license.expires_at = Date.new(2099, 1, 1) # 结束时间
license.notify_admins_at = Date.new(2098, 12, 1)
license.notify_users_at = Date.new(2098, 12, 1)
license.block_changes_at = Date.new(2099, 1, 1)
license.restrictions = { active_user_count: 114514 } # 授权的用户数

puts "License:"
puts license

data = license.export
puts "Exported license:"
puts data
File.open("Gitlab.gitlab-license", "w") { |f| f.write(data) }

public_key = OpenSSL::PKey::RSA.new File.read("license_key.pub")
Gitlab::License.encryption_key = public_key

data = File.read("Gitlab.gitlab-license")
$license = Gitlab::License.import(data)

puts "Imported license:"
puts $license

unless $license
  raise "The license is invalid."
end

if $license.restricted?(:active_user_count)
  active_user_count = 10000
  if active_user_count > $license.restrictions[:active_user_count]
    raise "The active user count exceeds the allowed amount!"
  end
end

if $license.notify_admins?
  puts "The license is due to expire on #{$license.expires_at}."
end

if $license.notify_users?
  puts "The license is due to expire on #{$license.expires_at}."
end

module Gitlab
  class GitAccess
    def check(cmd, changes = nil)
      if $license.block_changes?
        return build_status_object(false, "License expired")
      end
    end
  end
end

puts "This instance of GitLab Enterprise Edition is licensed to:"
$license.licensee.each do |key, value|
  puts "#{key}: #{value}"
end

if $license.expired?
  puts "The license expired on #{$license.expires_at}"
elsif $license.will_expire?
  puts "The license will expire on #{$license.expires_at}"
else
  puts "The license will never expire."
end

添加文件 flash.sh

#!/bin/sh

# 清理旧 license 文件
rm -f Gitlab.gitlab-license
rm -f license_key
rm -f license_key.pub

# 生成 license 文件
ruby gen.rb

# 备份秘钥文件
if [ ! -f "/etc/gitlab/license/.license_encryption_key.pub.bak" ]; then
cp /opt/gitlab/embedded/service/gitlab-rails/.license_encryption_key.pub \
    /etc/gitlab/license/.license_encryption_key.pub.bak
fi

# 备份 license 逻辑文件
if [ ! -f "/etc/gitlab/license/license.rb.bak" ]; then
cp /opt/gitlab/embedded/service/gitlab-rails/ee/app/models/license.rb \
    /etc/gitlab/license/license.rb.bak
fi

# 对 license 逻辑进行修改
cp /etc/gitlab/license/license.rb.bak /etc/gitlab/license/license.rb
sed -i 's/restricted_attr(:plan).presence || STARTER_PLAN/restricted_attr(:plan).presence || ULTIMATE_PLAN/g' \
    /etc/gitlab/license/license.rb

# 覆盖原文件
cp -f /etc/gitlab/license/license_key.pub /opt/gitlab/embedded/service/gitlab-rails/.license_encryption_key.pub
cp -f /etc/gitlab/license/license.rb /opt/gitlab/embedded/service/gitlab-rails/ee/app/models/license.rb

4. 进入Gitlab容器内执行脚本

非 Docker 用户, 自行判断如何执行

docker exec -it 也可用 Portainer

进入 /etc/gitlab/license 确保文件已映射

Portainer

运行 flash.sh 脚本: ./flash.sh

运行结果

这时候可以将这一大串密匙复制出来, 也可以提取 Gitlab.gitlab-license 文件, 这就是之后要用的 许可证

5. 重启容器, 进入Gitlab管理员页面

跑完脚本一定要重启容器(Gitlab服务)! 不然刷入的密匙无法生效

打开Gitlab设置面板: https://<YOU GITLAB HOST>/admin/application_settings/general

拉到最底部, 添加许可证, 可 上传文件 也可 直接输入 许可证内容
添加许可证

许可证详情

这样就搞定拉, 不过要注意一下方案是不是 Ultimate , 如果不是的话, 自行去修改 license.rb 文件并且覆盖源文件, 并重启

简单来说, 就是定位 def plan, 然后修改下面那行代码, 将 || 后面的字替换成 ULTIMATE_PLAN , 就ok了 (别人写的教程好多都没讲清楚, 我一开始都一头雾水)

ULTIMATE_PLAN 修改

Gitlab EE 15 版本以下的用户注意

由于我现在升上来了, 不清楚下面版本的 添加许可证文件 这玩意放哪去了

14版的如果按照上面的方法找不到 添加许可证
直接访问这个链接去添加 https://<YOU GITLAB HOST>.com/admin/license/new

更低的版本我就不清楚了, 没用过, 请自行查阅官方文档吧, 这玩意还是有写的

关于 Gitlab JH 版

源码可知, 极狐版用的是 jh 目录下的东西

直接在脚本文件末尾加上覆盖就好了

if [ -f "/opt/gitlab/embedded/service/gitlab-rails/jh/.license_encryption_key.pub" ]; then
    cp -f /etc/gitlab/license/license_key.pub /opt/gitlab/embedded/service/gitlab-rails/jh/.license_encryption_key.pub
fi

尾声

好爽哦

"体验版"自己玩玩就好了, 别张扬, 老实说我现在没给玩明白这EE有啥好用的功能

哎, 国内关于Gitlab的文章还是太乱七八糟了, 我写个CI/CD的脚本, 都费劲的一批, 完全看不懂, 最后还是抄官方的软件才稍微懂了点, 这玩意比Github难用多了, 非必要别碰, 真的

贴两个曾经帮到我的文章吧
https://conf.top/post/506
https://shaffer.cn/qingyou/gitlab-ee-license-crack

咕咯!
咕


一位被疯狂压榨的底层工作人员