前言
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
确保文件已映射
运行 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了 (别人写的教程好多都没讲清楚, 我一开始都一头雾水)
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
咕咯!
Comments | 6 条评论
博主 萝莉控
好的.加油
博主 LoserAngel
我这里 15.6 ,方法已经没用了
博主 Himeko
@LoserAngel 去官方仓库把 license.rb 下载下来, 修改后直接映射进容器就行
@LoserAngel 我现在就在用 15.6.2 版本
博主 夜羽
该评论为私密评论
博主 salt
问题来了,gitlab 的仓库在哪看.不能是github上面的gitlab-ce吧
博主 Himeko
@salt 多谷歌几下就出来了
https://gitlab.com/gitlab-org/gitlab