1. Gitlab概述
1.1 GitLab介绍
GitLab是利用Ruby on Rails一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。
GitLab能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。
它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找
1.2 Gitlab服务构成
Nginx:静态web服务器。
gitlab-shell:用于处理Git命令和修改authorized keys列表。
gitlab-workhorse: 轻量级的反向代理服务器。
logrotate:日志文件管理工具。
postgresql:数据库。
redis:缓存数据库。
sidekiq:用于在后台执行队列任务(异步执行)。
unicorn:An HTTP server for Rack applications,GitLab Rails应用是托管在这个服务器上面的。
1.3 Gitlab工作流程
1.4 GitLab Shell
GitLab Shell有两个作用:为GitLab处理Git命令、修改authorized keys列表
当通过SSH访问GitLab Server时,GitLab Shell会:
- 限制执行预定义好的Git命令(git push,git pull,git annex)
- 调用GitLab Rails API检查权限
- 执行pre-receive钩子(在企业版中叫做Git钩子)
- 执行用户请求的动作,处理GitLab的post-receive动作
- 处理自定义的post-receive动作
当通过http(s)访问GitLab Server时,工作流程取决于你是从Git仓库拉取(pull)代码还是向git仓库推送(push)代码:
如果是从Git仓库拉取(pull)代码,GitLab Rails应用会全权负责处理用户鉴权和执行Git命令的工作
如果是向Git仓库推送(push)代码,GitLab Rails应用既不会进行用户鉴权也不会执行Git命令,它会把以下工作交由GitLab Shell进行处理:
- 调用GitLab Rails API 检查权限
- 执行pre-receive钩子(在GitLab企业版中叫做Git钩子)
- 执行你请求的动作
- 处理GitLab的post-receive动作
- 处理自定义的post-receive动作
1.5 GitLab Workhorse
GitLab Workhorse是一个敏捷的反向代理。它会处理一些大的HTTP请求,比如文件上传、文件下载、Git push/pull和Git包下载。其它请求会反向代理到GitLab Rails应用,即反向代理给后端的unicorn。
2. Gitlab的安装部署
- Gitlab要求服务器内存2G以上
2.1 方式一:下载gitlab-ce的rpm包
将对应版本的gitlab-ce下载到本地后,直接yum安装即可
1
2
# 要先将这个rpm包下载到本地
yum install -y gitlab-ce-13.6.1-ce.0.el7.x86_64.rpm
2.2 方式二:配置yum源
在 /etc/yum.repos.d/ 下新建 gitlab-ce.repo,写入如下内容:
1
2
3
4
5
6
[gitlab-ce]
name=gitlab-ce
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/
Repo_gpgcheck=0
Enabled=1
Gpgkey=https://packages.gitlab.com/gpg.key
然后创建cache,再直接安装gitlab-ce
1
2
3
4
5
6
7
8
9
10
yum makecache # 这一步会创建大量的数据
# 直接安装最新版
yum install -y gitlab-ce
# 如果要安装指定的版本,在后面填上版本号即可
yum install -y gitlab-ce-13.6.1
# 如果安装时出现gpgkey验证错误,只需在安装时明确指明不进行gpgkey验证
yum install gitlab-ce -y --nogpgcheck
2.2.1. 单服务启动模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
docker run -d --name gitlab --hostname gitlab.example.com \
-e GITLAB_OMNIBUS_CONFIG="
external_url 'https://gitlab.example.com'
gitlab_rails['gitlab_shell_ssh_port'] = 22
nginx['redirect_http_to_https'] = true
nginx['ssl_dhparam'] = '/etc/gitlab/ssl/dhparam.pem'
nginx['ssl_certificate'] = '/etc/gitlab/ssl/domain.crt'
nginx['ssl_certificate_key'] = '/etc/gitlab/ssl/domain.key'
nginx['custom_gitlab_server_config'] = 'location ^~ /.well-known {\n alias /var/opt/gitlab/letsencrypt/.well-known;\n}\n'
high_availability['mountpoint'] = ['/etc/gitlab', '/var/log/gitlab' '/var/opt/gitlab' # 严格限定gitlab服务启动前,指定文件系统挂完毕
" \
-p 22:22 -p 80:80 -p 443:443 \
-v /srv/gitlab/config:/etc/gitlab \
-v /srv/gitlab/logs:/var/log/gitlab \
-v /srv/gitlab/data:/var/opt/gitlab \
-v /etc/certs:/etc/gitlab/ssl \
--restart=always gitlab/gitlab-ce:latest
2.2.1. Compose服务编排模式(推荐方式)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
docker pull gitlab/gitlab-ce:latest
############################ 多行命令开始 ##########################
cat > docker-compose.yaml <<EOF
version: '2'
services:
Gitlab:
image: 'gitlab/gitlab-ce:latest'
container_name: 'gitlab'
hostname: 'gitlab.example.com'
restart: always
ports:
- '22:22'
- '80:80'
- '443:443'
environment:
GITLAB_OMNIBUS_CONFIG: |
# Add any other gitlab.rb configuration here, each on its own line
external_url 'https://gitlab.example.com'
gitlab_rails['gitlab_shell_ssh_port'] = 22
nginx['redirect_http_to_https'] = true
nginx['ssl_dhparam'] = "/etc/gitlab/ssl/dhparam.pem"
nginx['ssl_certificate'] = "/etc/gitlab/ssl/domain.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/domain.key"
nginx['custom_gitlab_server_config'] = "location ^~ /.well-known {\n alias /var/opt/gitlab/letsencrypt/.well-known;\n}\n"
high_availability['mountpoint'] = ["/etc/gitlab", "/var/log/gitlab", "/var/opt/gitlab"] # 严格限定gitlab服务启动前,指定文件系统挂完毕
volumes:
- /srv/gitlab/config:/etc/gitlab
- /srv/gitlab/logs:/var/log/gitlab
- /srv/gitlab/data:/var/opt/gitlab
- /etc/certs:/etc/gitlab/ssl
EOF
############################ 多行命令结束 ##########################
# 启动服务
docker-compose -f docker-compose.yaml up -d
2.3 gitlab的配置
配置文件位置 /etc/gitlab/gitlab.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[[email protected] test]# vim /etc/gitlab/gitlab.rb
[[email protected] test]# grep "^[a-Z]" /etc/gitlab/gitlab.rb
external_url 'http://10.0.0.51' # 这里一定要加上http://
# 配置邮件服务
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.qq.com"
gitlab_rails['smtp_port'] = 25
gitlab_rails['smtp_user_name'] = "[email protected]" # 自己的qq邮箱账号
gitlab_rails['smtp_password'] = "xxx" # 开通smtp时返回的授权码
gitlab_rails['smtp_domain'] = "qq.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
gitlab_rails['gitlab_email_from'] = "[email protected]" # 指定发送邮件的邮箱地址
user["git_user_email"] = "[email protected]" # 指定接收邮件的邮箱地址
修改好配置文件后,要使用 gitlab-ctl reconfigure 命令重载一下配置文件,否则不生效。
1
2
gitlab-ctl reconfigure # 重载配置文件
gitlab-ctl restart
测试邮件服务器
1
2
gitlab-rails console
Notify.test_email('[email protected]','testbiaoti','testzhegnwen1').deliver_now
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[[email protected] ~]# gitlab-rails console
--------------------------------------------------------------------------------
GitLab: 12.5.0 (1f0ab8978ef)
GitLab Shell: 10.2.0
PostgreSQL: 10.9
--------------------------------------------------------------------------------
Loading production environment (Rails 5.2.3)
irb(main):001:0> Notify.test_email('[email protected]','test','test').deliver_now
Notify#test_email: processed outbound mail in 1.4ms
Sent mail to [email protected] (73.0ms)
Date: Wed, 27 Nov 2019 15:12:58 +0800
From: GitLab <[email protected]>
Reply-To: GitLab <[email protected]>
To: [email protected]
Message-ID: <[email protected]>
Subject: test
Mime-Version: 1.0
Content-Type: text/html;
charset=UTF-8
Content-Transfer-Encoding: 7bit
Auto-Submitted: auto-generated
X-Auto-Response-Suppress: All
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>test</p></body></html>
=> #<Mail::Message:70141649239780, Multipart: false, Headers: <Date: Wed, 27 Nov 2019 15:12:58 +0800>, <From: GitLab <[email protected]>>, <Reply-To: GitLab <[email protected]>>, <To: [email protected]>, <Message-ID: <[email protected]>>, <Subject: test>, <Mime-Version: 1.0>, <Content-Type: text/html; charset=UTF-8>, <Content-Transfer-Encoding: 7bit>, <Auto-Submitted: auto-generated>, <X-Auto-Response-Suppress: All>>
irb(main):002:0>
irb(main):003:0> exit
[[email protected] ~]#
配置gitlab代理
https://docs.gitlab.com/omnibus/settings/environment-variables.html
1
2
3
4
gitaly['env'] = {
"http_proxy" => "http://USERNAME:[email protected]:8080",
"https_proxy" => "http://USERNAME:[email protected]:8080"
}
2.4 Gitlab常用命令
1
2
3
4
5
6
7
8
9
10
11
12
13
gitlab-ctl start # 启动所有 gitlab 组件
gitlab-ctl stop # 停止所有 gitlab 组件
gitlab-ctl restart # 重启所有 gitlab 组件
gitlab-ctl status # 查看服务状态
gitlab-ctl reconfigure # 启动服务
gitlab-ctl show-config # 验证配置文件
gitlab-ctl tail # 查看日志
gitlab-rake gitlab:check SANITIZE=true --trace # 检查gitlab
vim /etc/gitlab/gitlab.rb # 修改默认的配置文件
2.5 gitlab-ctl常用命令介绍
命令 | 说明 |
---|---|
check-config | 检查在gitlab中是否有任何配置。在指定版本中删除的rb |
deploy-page | 安装部署页面 |
diff-config | 将用户配置与包可用配置进行比较 |
remove-accounts | 删除所有用户和组 |
upgrade | 升级 |
service-list | 查看所有服务 |
once | 如果GitLab服务停止了就启动服务,如果已启动就不做任何操作 |
restart | 重启GitLab服务 |
start | 如果GitLab服务停止了就启动服务,如果已启动就重启服务 |
stop | 停止GitLab服务 |
status | 查看GitLab服务状态 |
reconfigure | 重新配置GitLab并启动 |
3. Gitlab的使用
- Gitlab安装好后,设置密码,管理账户为root
3.1 创建Group
- 填上组名即可,这里组名为java
3.2 创建User
- 创建四个User:pm、dev1、dev2、dev3
3.3 添加User到Group中并授权
3.4 创建Project并配置SSH
3.5 在项目中添加成员
3.6 将本地文件推送到Gitlab
1
2
3
4
5
6
7
8
9
10
11
12
13
# 将app01项目克隆下来
git clone [email protected]:java/app01.git
# 初始化配置
git config --global user.name "hgzero"
git config --global user.email "[email protected]"
# 在app01目录下新建一些文件
# 推送到gitlab
git add .
git commit -m "first edition"
git push origin master
4. 制定开发计划
4.1 创建开发计划
- 项目:app01
- 版本:v1.0
4.2 创建里程碑Milestones
- 用pm账号登录gitlab后操作(先要在admin中设置pm账号的密码)
- 要根据开发计划来创建Milestones
4.3 根据开发计划创建issue
- 创建4个issue,分派给dev1和dev2这两个开发人员
**4.4 开发者登录账号查看分派的任务 **
- 然后开发dev1登录gitlab,就能看到任务已经分配过来了
4.5 开发流程
- 公司里的开发开始任务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1. 先从仓库把项目拉下来
git clone [email protected]:java/app01.git
cd app01/
# 2.先创建一个自己的分支,然后进行开发
git checkout -b index # 创建一个叫index的分支,并切换到这个分支
git status
# 3. 开始开发首页
echo "<h1>welcome to this app</h1>" > index.html # 假设就开发了一个index页面
# 4. 开发完成后,把项目传到仓库
git add .
git commit -m "index"
# 如果写成 git commit -m "close #2" ,则表示merge请求允许且merge成功之后,自动删除编号为#2的issue
# 传到index分支
git push origin index
4.6 合并分支
1)开发dev1发送合并分支请求给pm
2)pm收到开发的Merge请求后进行处理
- 使用pm登录,就可以看到pm已经收到了合并请求merge request
3)开发dev1确认任务完成
- 退出pm账户,登入dev1账户:
- 或者点进去后,在侧边栏进行标识Done,然后已经完成的issue,可以将其Close
- 这个时候Milestones的进度已经往前进了一些了:
4.7 开发其他功能
- 然后其他开发者或者自己再次进行开发时,先要把刚刚更新后的内容(master主干)拉回来,然后再进行开发
git checkout master # 切换到master git pull # 从远端仓库拉取数据 # 然后再进行其他操作
5. Gitlab备份恢复
5.1 备份gitlab
1)修改配置文件
- /etc/gitlab/gitlab.rb
1
2
3
4
5
6
7
8
9
# 备份保存的位置,这里是默认位置,可修改成指定的位置
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
# 设置备份保存的时间,超过此时间的日志将会被新覆盖
gitlab_rails['backup_keep_time'] = 604800 # 这里是默认设置,保存7天
# 特别注意:
# 如果自定义了备份保存位置,则要修改备份目录的权限,比如:
# chown -R git.git /data/backup/gitlab
- 配置完成后要重启以使配置生效
1
2
3
4
5
# 重读配置文件
gitlab-ctl reconfigure
# 重启gitlab
gitlab-ctl restart
2)设置定时任务
1
2
3
4
5
6
# 每天凌晨2点定时创建备份
# 将一下内容写入到定时任务中 crontab -e
0 2 * * * /usr/bin/gitlab-rake gitlab:backup:create
# 备份策略建议:
# 本地保留3到7天,在异地备份永久保存
3)备份时间的识别
1
2
3
# 备份后的文件类似这样的形式:1494170842_gitlab_backup.tar,可以根据前面的时间戳确认备份生成的时间
data -d @1494170842
5.2 恢复gitlab
1)停止停止相关数据连接,数据写入服务
1
2
3
# 停止数据写入服务
gitlab-ctl stop puma
gitlab-ctl stop sidekiq
2)进行数据恢复并重启
1
2
3
4
5
# 进行恢复
gitlab-rake gitlab:backup:restore BACKUP=1627839447_2021_08_01_14.1.1-ee # 这个时间戳就是刚刚备份的文件前面的时间戳
# 重启
gitlab-ctl restart
6. gitlab邮件通知配置
- vim /etc/gitlab/gitlab.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = '[email protected]' # 填写发件人的邮箱地址
gitlab_rails['gitlab_email_display_name'] = 'gitlab'
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.163.com" # smtp服务器的地址,如网易的地址
gitlab_rails['smtp_port'] = 25 # 要注意如果使用了SSL/TLS的话,端口可能不是25
gitlab_rails['smtp_user_name'] = "smtp用户名"
gitlab_rails['smtp_password'] = "smtp用户密码"
gitlab_rails['smtp_domain'] = "163.com"
gitlab_rails['smtp_authentication'] = "login"
启用邮件功能 Gitlab 的 Compose 配置 GITLAB_OMNIBUS_CONFIG 节点下增加如下几行:
1
2
3
4
5
6
7
8
9
10
11
########## 邮件服务配置 ##########
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.exmail.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_tls'] = true
gitlab_rails['smtp_user_name'] = "账号"
gitlab_rails['smtp_password'] = "密码"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['gitlab_email_from'] = "发件人邮箱"
7. 使用SourceTree进行项目开发
7.1 项目拉取
- 先把项目克隆下来
- 如果ssh的方式克隆失败,可能是因为SSH Key没找到,可以在这里添加
7.2 创建分支进行功能开发
1)新建立一个叫“pay”的分支
2)进行功能开发
7.3 提交项目
1)开发pay功能完成后进行提交
- 可以看到SourceTree中已经有“未提交的更改”
2)添加“用户信息”
** 3)进行提交**
- 注释也可以写成 close #3 ,作用是提交完成后关闭3号issue
7.4 推送到仓库
- 然后就可以在gitlab上进行发送merge请求了,后面就可以进行其他操作了
7.5 项目上线
1)当所有工作完成之后,就可以进行上线了
2)打标签
- 上线先打个标签
** 3)删除无用分支**
- 然后删除已经合并到主干中的不必要的分支,如index、pay等
- 最后一定要注意时间一定要同步,不然会错乱
8. Gitlab调优
gitlab对内存资源的消耗比较厉害 其中尤以 sidekiq队列 及 unicorn服务 两个组件对内存消耗最多 可以再容器启动时对相关参数进行微调:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
unicorn['worker_processes'] = 1
unicorn['worker_memory_limit_min'] = "300 * 1 << 20"
unicorn['worker_memory_limit_max'] = "400 * 1 << 20"
unicorn['worker_timeout'] = 15
sidekiq['concurrency'] = 10
sidekiq_cluster['enable'] = false
sidekiq_cluster['ha'] = false
redis['maxclients'] = "100"
nginx['worker_processes'] = 2
nginx['worker_connections'] = 512
nginx['keepalive_timeout'] = 300
nginx['cache_max_size'] = '200m'
mattermost['enable'] = false
mattermost_nginx['enable'] = false
gitlab_pages['enable'] = false
pages_nginx['enable'] = false
postgresql['shared_buffers'] = "256MB"
postgresql['max_connections'] = 30
postgresql['work_mem'] = "8MB"
postgresql['maintenance_work_mem'] = "16MB"
postgresql['effective_cache_size'] = "1MB"
postgresql['checkpoint_timeout'] = "5min"
postgresql['checkpoint_warning'] = "30s"
配置调整后需要重载一下
1
2
3
4
docker exec gitlab gitlab-ctl reconfigure
docker-compose down
docker-compose up -d
9. Gitlab 启用 ContainerRegistry
ContainerRegistry
是Gitlab
内置的Docker Registry
集成组件- 集成后每个项目可获得私有的
Docker
镜像存储空间 ContainerRegistry
可以复用Gitlab
域名 或者 独立域名- 这里配置为复用域名(此时
ContainerRegistry
将复用Gitlab
的TLS
证书)
docker-compose.yaml
中Gitlab服务的GITLAB_OMNIBUS_CONFIG
节点下增加如下配置:
1
2
3
4
5
6
7
8
9
registry_external_url "https://gitlab.example.com:4567" # ContainerRegistry的外部访问地址
registry_nginx['ssl_certificate'] = "/etc/gitlab/ssl/domain.crt"
registry_nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/domain.key"
gitlab_rails['registry_host'] = "gitlab.example.com"
gitlab_rails['registry_port'] = "4567"
gitlab_rails['registry_api_url'] = "http://localhost:5000"
gitlab_rails['gitlab_default_projects_features_builds'] = false
gitlab_rails['gitlab_default_projects_features_container_registry'] = false
- 端口开放增加
- 4567:4567
- 服务重启
docker-compose restart Gitlab
ContainerRegistry
集成后可以通过 Gitlab
账户登录: docker login gitlab.example.com:4567
日常维护命令
1
2
3
4
5
6
7
8
9
10
11
12
# Gitlab维护
docker exec gitlab gitlab-ctl status # gitlab各组件服务状态
docker exec gitlab gitlab-ctl start/restart/stop [组件名] # gitlab所有组件的统一控制(其中Unicorn组件重启完成前GitLab会报502)
docker exec gitlab gitlab-ctl tail [/var/log/gitlab下的某子目录] # 实时查看日志
docker exec gitlab update-permissions # 修复gitlab版本升级后出现的权限问题
docker exec gitlab gitlab-ctl reconfigure # 重载配置
docker exec -t gitlab gitlab-rake gitlab:backup:create # 创建备份
# ContainerRegistry维护
docker exec gitlab gitlab-ctl registry-garbage-collect # 垃圾回收,清理废弃layer(registry停机)
Import Repository(Repo By Url)
1
2
3
# 账号密码若存在特殊字符则需要url编码
https://username:[email protected]:port/group/project.git
10. GitLab重置用户名密码
打开终端,访问:
1
gitlab-rails console
输入:
1
2
3
4
user = User.where(id: 1).first
user.password='123456'
user.password_confirmation = '123456'
user.save! #注意加上 “!”
然后退出命令行即可。
1
quit
1
2
3
4
5
gitlab-rails console production 命令 开始初始化密码
# 在irb(main):001:0> 后面通过 u=User.where(id:1).first 来查找与切换账号(User.all 可以查看所有用户)
# 通过u.password='12345678'设置密码为12345678(这里的密码看自己喜欢):
# 通过u.password_confirmation='12345678' 再次确认密码
# 通过 u.save!进行保存
11. HTTPS SSL 支持
- nginx反向代理方式
- 注意docker 内部没有ca支持, 需要手动添加
- 域名提供商提供的免费证书
- 这种证书直接用,如果是自签名证书,需要添加自己的ca root证书到服务器
12. Gitlab恢复数据出现must be owner of解决方法
按正常Gitlab备份数据gitlab-rake gitlab:backup:create
1
2
3
4
5
6
7
8
9
ERROR: must be owner of extension plpgsql
ERROR: must be owner of schema public
ERROR: schema “public” already exists
ERROR: must be owner of schema public
ERROR: must be owner of extension plpgsql
WARNING: no privileges could be revoked for “public”
WARNING: no privileges could be revoked for “public”
WARNING: no privileges were granted for “public”
WARNING: no privileges were granted for “public”
解决方法:
**1. 修改postgresql配置 **
1
2
3
cd /var/opt/gitlab/postgresql/data
$ vi /var/opt/gitlab/postgresql/data/postgresql.conf
listen_addresses = '*'
找到listen_addresses = ” 改为listen_addresses = ‘*’
修改 /var/opt/gitlab/postgresql/data/pg_hba.conf 在这个文件最后面加入
1
2
3
4
$ vi /var/opt/gitlab/postgresql/data/pg_hba.conf
local all all trust
host all all 127.0.0.1/32 trust
host all all ::1/128 trust #ipv6 可以不配置
2. 重启gitlab生效
1
gitlab-ctl restart
3. 修改gitlab账号为超级用户
进入postgresql命令行
1
2
3
cd /opt/gitlab/embedded/bin
su gitlab-psql
./psql -h 127.0.0.1 gitlabhq_production
查看账户权限
1
\du
执行修改gitlab用户为超级权限
1
ALTER USER gitlab WITH SUPERUSER;
退出
1
\q
4. 从1462989681编号备份中恢复
1
gitlab-rake gitlab:backup:restore BACKUP=1462989681
这样Gitlab恢复数据就不会再报must be owner of extension plpgsql错误。
4. 重启gitlab
1
gitlab-ctl restart
本文作者:夜法之书 写作不易,转载请注明来源地址!
参考链接:
- https://www.cnblogs.com/hgzero/p/14088215.html
- http://www.51blogs.net/2017/11/10/1110113243.html
- https://my.oschina.net/u/2400083/blog/808097