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安装即可

bash
# 要先将这个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,写入如下内容:

bash
[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

bash
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. 单服务启动模式

bash
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服务编排模式(推荐方式)

bash
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

bash
[root@centos7 test]# vim /etc/gitlab/gitlab.rb
 
[root@centos7 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'] = "hgzerowzh@qq.com"  # 自己的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'] = "hgzerowzh@qq.com"  # 指定发送邮件的邮箱地址
user["git_user_email"] = "shit@qq.com"   # 指定接收邮件的邮箱地址

修改好配置文件后,要使用 gitlab-ctl reconfigure 命令重载一下配置文件,否则不生效。

bash
gitlab-ctl reconfigure # 重载配置文件
gitlab-ctl restart

测试邮件服务器

bash
gitlab-rails console
Notify.test_email('rollinghell@foxmail.com','testbiaoti','testzhegnwen1').deliver_now
bash
[root@test102 ~]# 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('andycrusoe@gmail.com','test','test').deliver_now
Notify#test_email: processed outbound mail in 1.4ms
Sent mail to anliven@126.com (73.0ms)
Date: Wed, 27 Nov 2019 15:12:58 +0800
From: GitLab <gitlab@192.168.16.102>
Reply-To: GitLab <noreply@192.168.16.102>
To: anliven@126.com
Message-ID: <5dde21fa612d4_3a1b3fcb38fcf9c0651b@test102.mail>
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 <gitlab@192.168.16.102>>, <Reply-To: GitLab <noreply@192.168.16.102>>, <To: anliven@126.com>, <Message-ID: <5dde21fa612d4_3a1b3fcb38fcf9c0651b@test102.mail>>, <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
[root@test102 ~]#
 

配置gitlab代理

ruby
gitaly['env'] = {
    "http_proxy" => "http://USERNAME:PASSWORD@example.com:8080",
    "https_proxy" => "http://USERNAME:PASSWORD@example.com:8080"
}

也可以使用单独模块代理

ruby
# Needed for proxying Git clones
gitaly['env'] = {
    "http_proxy" => "http://USERNAME:PASSWORD@example.com:8080",
    "https_proxy" => "http://USERNAME:PASSWORD@example.com:8080"
}

gitlab_workhorse['env'] = {
    "http_proxy" => "http://USERNAME:PASSWORD@example.com:8080",
    "https_proxy" => "http://USERNAME:PASSWORD@example.com:8080"
}

gitlab_pages['env'] = {
    "http_proxy" => "http://USERNAME:PASSWORD@example.com:8080",
    "https_proxy" => "http://USERNAME:PASSWORD@example.com:8080"
}

# If you use the docker registry
registry['env'] = {
    "http_proxy" => "http://USERNAME:PASSWORD@example.com:8080",
    "https_proxy" => "http://USERNAME:PASSWORD@example.com:8080"
}

应用生效 gitlab-ctl reconfigure

2.4 Gitlab常用命令

bash
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

bash
# 将app01项目克隆下来
git clone git@10.0.0.51:java/app01.git
 
# 初始化配置
git config --global user.name "hgzero"
git config --global user.email "hgzero@qq.com"
 
# 在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 开发流程

  • 公司里的开发开始任务
bash
# 1. 先从仓库把项目拉下来
git clone git@10.0.0.51: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
bash
# 备份保存的位置,这里是默认位置,可修改成指定的位置
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
 
# 设置备份保存的时间,超过此时间的日志将会被新覆盖
gitlab_rails['backup_keep_time'] = 604800  # 这里是默认设置,保存7天
 
# 特别注意:
#     如果自定义了备份保存位置,则要修改备份目录的权限,比如:
#     chown -R git.git /data/backup/gitlab
  • 配置完成后要重启以使配置生效
bash
# 重读配置文件
gitlab-ctl reconfigure
 
# 重启gitlab
gitlab-ctl restart

2)设置定时任务

bash
# 每天凌晨2点定时创建备份
# 将一下内容写入到定时任务中 crontab -e
0 2 * * * /usr/bin/gitlab-rake gitlab:backup:create
 
# 备份策略建议:
#     本地保留3到7天,在异地备份永久保存

3)备份时间的识别

bash
# 备份后的文件类似这样的形式:1494170842_gitlab_backup.tar,可以根据前面的时间戳确认备份生成的时间
 
data  -d  @1494170842

5.2 恢复gitlab

1)停止停止相关数据连接,数据写入服务

bash
# 停止数据写入服务
gitlab-ctl stop puma
gitlab-ctl stop sidekiq

2)进行数据恢复并重启

bash
# 进行恢复
gitlab-rake gitlab:backup:restore BACKUP=1627839447_2021_08_01_14.1.1-ee  # 这个时间戳就是刚刚备份的文件前面的时间戳
 
# 重启
gitlab-ctl restart

6. gitlab邮件通知配置

  • vim /etc/gitlab/gitlab.rb
bash
gitlab_rails['time_zone'] = 'Asia/Shanghai'
 
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = 'example@163.com' # 填写发件人的邮箱地址
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 节点下增加如下几行:

bash
########## 邮件服务配置 ##########
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服务 两个组件对内存消耗最多
可以再容器启动时对相关参数进行微调:

yaml
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"
 

配置调整后需要重载一下

bash
docker exec gitlab gitlab-ctl reconfigure
docker-compose down
docker-compose up -d
 

9. Gitlab 启用 ContainerRegistry

  • ContainerRegistryGitlab内置的Docker Registry集成组件
  • 集成后每个项目可获得私有的 Docker 镜像存储空间
  • ContainerRegistry 可以复用 Gitlab 域名 或者 独立域名
  • 这里配置为复用域名(此时ContainerRegistry 将复用 GitlabTLS 证书)
  1. docker-compose.yaml中Gitlab服务的 GITLAB_OMNIBUS_CONFIG 节点下增加如下配置:
bash
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
 
  1. 端口开放增加 - 4567:4567
  2. 服务重启 docker-compose restart Gitlab

ContainerRegistry 集成后可以通过 Gitlab 账户登录: docker login gitlab.example.com:4567


日常维护命令

bash
# 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)

bash
# 账号密码若存在特殊字符则需要url编码
https://username:password@host:port/group/project.git
 

10. GitLab重置用户名密码

打开终端,访问:

bash
gitlab-rails console

输入:

bash
user = User.where(id: 1).first
user.password='123456'
user.password_confirmation = '123456'
user.save! #注意加上 “!”

然后退出命令行即可。

bash
quit
bash
 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

sql
ERROR: must be owner of extension plpgsql
ERROR: must be owner of schema public
ERROR: schemapublic” already exists
ERROR: must be owner of schema public
ERROR: must be owner of extension plpgsql
WARNING: no privileges could be revoked forpublic”
WARNING: no privileges could be revoked forpublic”
WARNING: no privileges were granted forpublic”
WARNING: no privileges were granted forpublic

解决方法:

**1. 修改postgresql配置 **

bash
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
在这个文件最后面加入

bash
$ 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生效

bash
gitlab-ctl restart

3. 修改gitlab账号为超级用户

进入postgresql命令行

bash
cd /opt/gitlab/embedded/bin
su gitlab-psql
./psql -h 127.0.0.1 gitlabhq_production

查看账户权限

bash
\du

执行修改gitlab用户为超级权限

bash
ALTER USER gitlab WITH SUPERUSER;

退出

bash
\q

4. 从1462989681编号备份中恢复
bash
gitlab-rake gitlab:backup:restore BACKUP=1462989681

这样Gitlab恢复数据就不会再报must be owner of extension plpgsql错误。

4. 重启gitlab

bash
gitlab-ctl restart

13. Gitlab Pages

官方文档:https://docs.gitlab.com/ee/user/project/pages/

Gitlab Pages 使用 GitLab Pages daemon 服务,它是用 GO 语言实现的简单 HTTP 服务,并且可以监听外部 IP 地址以及为自定义域名和自定义证书提供支持。它通过 SNI 支持动态证书并且默认通过 HTTP2 协议发送页面。最后推荐你去看官方文档 README 以便全面了解它的工作原理。

启用 Pages

打开 gitlab.rb

none
sudo vim /etc/gitlab/gitlab.rb

修改 Pages 配置:

bash
# Pages 服务地址
pages_external_url "http://git.17lai.io"
# 启用 pages
gitlab_pages['enable'] = true
# fails to start in Docker
gitlab_pages['inplace_chroot'] = true

Gitlab 使用当前配置:

bash
sudo gitlab-ctl reconfigure

# stdout
> gitlab Reconfigured!

如果没有域名怎么办呢?可以参考 Linux智能DNS服务搭建之Bind服务

使用 Pages

官方的案例库:https://gitlab.com/pages

用户文档

一般有两种类型的Pages可以创建

在GitLab中,usernames或groupnames是唯一的,我们经常把他们称为namespaces。在一个GitLab实例中只能有一个namespace。

下面是Gitlab Pages类型、Project Name和 website URL对照表:

img
img

GitLab Pages前提条件:

简而言之,这是上传web站点到GitLab Pages需要的:

  1. Gitlab Pages使用的域名(向管理员询问)。
  2. 创建一个Project。
  3. 仓库的根目录放一个.gitlab-ci.yml,其中有个叫做pages的job。
  4. 设置一个GitLab Runner构建web站点。

部署简单的 html 项目

  1. 我们在自己的 gitlab 上面创建一个测试项目:plain-html
  2. 把项目拉取到本地:
none
# 换成你自己的仓库地址
git clone git@git.17lai.io:pages/plain-html.git
  1. 在项目中新建 public 目录,然后添加 index.htmlstyle.css 文件:
markup
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="generator" content="GitLab Pages">
    <title>Plain HTML site using GitLab Pages</title>
    <link rel="stylesheet" href="style.css">
  </head>
  <body>
    <div class="navbar">
      <a href="https://pages.gitlab.io/plain-html/">Plain HTML Example</a>
      <a href="https://gitlab.com/pages/plain-html/">Repository</a>
      <a href="https://gitlab.com/pages/">Other Examples</a>
    </div>

    <h1>Hello World!</h1>

    <p>
      This is a simple plain-HTML website on GitLab Pages, without any fancy static site generator.
    </p>
  </body>
</html>
css
body {
  font-family: sans-serif;
  margin: auto;
  max-width: 1280px;
}

.navbar {
  background-color: #313236;
  border-radius: 2px;
  max-width: 800px;
}

.navbar a {
  color: #aaa;
  display: inline-block;
  font-size: 15px;
  padding: 10px;
  text-decoration: none;
}

.navbar a:hover {
  color: #ffffff;
}
  1. 在项目根目录添加 .gitlab-ci.yml 文件:
yaml
# This file is a template, and might need editing before it works on your project.
# Full project: https://gitlab.com/pages/plain-html
pages:
  tags:
    - html
  stage: deploy
  script:
    - mkdir .public
    - cp -r * .public
    - mv .public public
  artifacts:
    paths:
      - public
  only:
    - master
  1. 提交代码:
none
git add .
git commit -m"feat(pages):  开启 pages 服务"
git push

最后我们回到 gitlab 服务,在 plain-html 仓库中的 Settings / pages 页面可以看到已经有对应的服务地址了:

img
img

gitlab 服务的域名跟 pages 的不要使用同一个,防止 XSS 攻击。

Container Registry

官方文档:https://docs.gitlab.com/ee/user/packages/container_registry/

本节修改中

开启 Container Registry

修改gitlab配置文件: vim /etc/gitlab/gitlab.rb

bash
//外部访问地址,此处被nginx代理,暴露给外部访问
registry_external_url 'http://xxx.com'
//启用
gitlab_rails['registry_enabled'] = true
//registry 服务ip
gitlab_rails['registry_host'] = "172.29.1.70"
//registry 服务真正端口
gitlab_rails['registry_port'] = "5000"

这里需要注意的是,registry_external_url是外部访问的url,如docker需要pull和push,都是访问该路径。然后,刷新配置,重启:

bash
gitlab-ctl reconfigure
gitlab-ctl restart

访问Docker

bash
# docker login https://xxx.com -u root -p xxx
Login Succeeded

默认需要SSL,请使用反向代理

官方文档有说明,如果启用了双重验证(Two-Factor Authentication)则不应该输入密码,而是token:

bash
docker login xxx.com -u <username> -p <token>

CI

GitLab Continuous Integration (GitLab CI/CD)

  • CI: Continuous Integration:持续集成。
  • CD: Coninuous delivery and deployment:持续交付和部署。

Gitlab CI/CD 是以可持续方法论进行软件开发的内建工具(continuous integration service )。

在使用 Gitlab CI 之前,我们需要先了解几个概念:

Stage

阶段:通俗的讲就是步骤(把一件事分解成多个步骤来完成)。 从最上面的图中可以看到在 CI 中可能会有:BuildUnit TestIntegration Tests 等多个阶段。

Job

任务:就是我们在每个阶段具体要做的事情,而一个阶段可能会有多个任务。

Pipelines

一条流水线 ( pipeline)就是 一组 在各个阶段执行的任务。在同一阶段的多个任务是可以并行的(如果 Runner 足够多的话),当全部的任务都执行成功之后流水线将会进入下一个阶段。反之,如果其中有一个任务失败,流水线的下一个阶段将不再执行。

Runners

在 Gitlab CI 中,Runner 负责运行定义在 .gitlab-ci.yml 中的代码。Runner 为三种:Shared RunnersGroup RunnersSpecific Runners,分别表示全局共用 Runner、组共用 Runner、单个项目指定的 Runner。

.gitlab-ci.yml

Gitlab CI 的配置文件,该文件声明了流水线的结构和顺序,以任务为最小单元。

文件中允许定义的元素:

  1. image:docker 镜像,当 Gitlab-Runner 的类型为 docker 时,会根据该属性指定的镜像为脚本执行容器。
  2. services: 指定另一个 docker 镜像,主要用于提供服务层的能力,比如 mysql
  3. before_script:任务执行前的钩子事件,比如一个 node 项目,我们可以在这里安装依赖。
  4. after_script:任务执行后的钩子事件,当所有的任务都执行完毕之后被调用,不管任务是否执行成功。
  5. stages:定义流水线中的阶段,默认的为 buildtestdeploy。如果我们要在任务中指定其他的 stage,则需要使用该属性先申明。
  6. cache:需要缓存的文件,比如 node 项目可以把 node_modules 缓存起来。提示:可以定义在 .gitlab-ci.yml 顶级表示项目级别的,也可以申明在单个任务中。
  7. variables:变量,同样可以在顶级或者单个任务中申明。
  8. pages:内置的一个任务,用于上传任务执行的结果到 Gitlab Pages
  9. include:合并其他的 .gitlab-ci.yml 文件配置。
  10. 在单个任务中申明的元素:
    1. script:需要执行的脚本。
    2. stage:标识该任务所属的阶段。
    3. tags:为任务打上标签,用于选择特定的 Runner
    4. only:用于表明何时创建该任务。
    5. except:用于表明何时不创建该任务。
    6. when:用于表明何时运行该任务。
    7. allow_failure:允许失败,该任务失败时不会影响整个流水线的结果。
    8. artifacts:任务执行的结果,比如执行 打包任务 后的产出资源。
    9. dependencies:依赖的其他任务。
    10. retry:当任务失败时最多重试的次数。
    11. coverage:指定如何从任务结果中提取代码覆盖率。
    12. parallel:允许并行的任务实例个数。

请注意版本问题,每个属性对版本的要求并不一致,具体的可以点击属性查看官方文档。

使用 Gitlab CI

使用 Gitlab CI 服务的两种方式: 1. Auto DevOps 2. 手动配置 CI/CD

Auto DevOps

Auto DevOps 是 Gitlab 11.0 推出的新功能,它提供了预定义的 CI/CD 配置,允许我们自动检测、构建、测试、发布以及监控应用。

暂未使用,待补充。

手动配置 CI/CD

手动配置主要就 2 个步骤,配置 .gitlab-ci.yml 文件,添加 Gitlab Runner 运行该文件。


下面,我们看看如何配置 Gitlab Runner:

Gitlab Runner

Gitlab Runner 是一个开源项目,用来运行 .gitlab-ci.yml 中定义的任务并把结果返给 Gitlab。

安装

官方文档:https://docs.gitlab.com/runner/install/linux-repository.html

首先,添加离线仓库:

none
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash

然后,安装最新版本:

none
sudo apt-get install gitlab-runner
注册

官方文档:https://docs.gitlab.com/runner/register/index.html

首先,我们进入要配置 Runner 的 Gitlab 仓库,在 Settings -> CI / CD 页面展开 Runners 配置面板可以看到已经分配的 Runner 以及注册 Runner 需要的参数:

img
img

然后,我们使用 Gitlab-Runner 命名开始注册:

none
gitlab-runner register

执行完会该命令,终端会有交互,要求我们输入以下参数:

  1. gitlab-ci coordinator url :gitlab 服务地址
  2. gitlab-ci token:上图中的 token
  3. description:描述信息
  4. tags:标签,对应 .gitlab-ci.yml 任务中配置的 tags,只有 tags 匹配的任务才会被该 Runner 执行。
  5. executor:执行器,即任务脚本执行的环境

如果使用 docker 执行,则需要事先安装 Docker 环境。

参数填写完毕之后,一个 Runner 便被注册成功了:

img
img

我们回到 gitlab 仓库页面,然后刷新便可以看到 _fzBq4PN 这个 Runner 已经被注册到该项目:

img
img

我们可以点击 编辑图标 对该 Runner 进行修改。我比较喜欢把 Run untagged jobs 选项勾上,这样就不用每个任务都添加对应的 tags 了(因为现在涉及到的都是一些简单的流程)。

总结

首先,CI/CD 是一种软件开发流程,Gitlab CI/CD 是 Gitlab 为实现该流程而提供的一个内置工具(服务)。 其次,我们有 Auto DevOps手动配置 两种方式使用,本文讲解的主要是 手动配置 方式。

加速Gitlab Runner

gitlab runner构建镜像每次RUN 安装依赖包,都远程下载?可以缓存加速吗? 可以的!

在将GitLab Runner注册到GitLab page上,让GitLab page可以和你的Runner通信时,有一步是填写使用的executor

none
输入Runner的executor:
Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:

如果你选择Docker作为Runner的executor,你还要选择默认的docker image来运行job(当然,你也可以在.gitlab-ci.yml里指明你需要用的image),这句话就跟文章使用gitlab-runner往k8s上发送curl命令实现pod中容器使用的镜像版本更新,地址: 开头讲述的那样,不过.gitlab-ci.yml里指明的image优先级高。

注册完成后你可以在/etc/gitlab-runner里发现 config.toml文件,该文件是Runner的配置文件

接下来就牵涉到一个重要的话题 —— Executor

  1. Shell Executor
    以宿主机作为Runner的所有jobs的执行器。Runner将会从远程仓库pull你的工程,工程的目录为:/builds。如果你使用了cache,那么cache将会存在/cache/。
    但是,它需要将构建所需的所有依赖手动安装到安装了Runner的同一台计算机上,比如使用到的git,jdk,maven,docekr等
  2. Docker Executor
    所有jobs的执行环境为指定的docker image所生成的container,每个job都会生成一个container并且在job结束后立即销毁。这个说的就是config.toml文件和.gitlab-ci.yml中指定的image
    Docker executor默认将所有的builds存储在/builds/(这里的路径是container里的路径,Runner配置文件config.toml里的build_dir字段可以重新指明build的目录,默认对应于宿主机的目录是在宿主机的docker volume下:/var/lib/docker/volumes//_data/),默认将所有的caches存储在container里的/cache目录(config.toml里的cache_dir字段可以重新指明cache的目录),注意build_dir和cache_dir指向的均是container里的目录,要想将container里的数据持久化,需要用到volumes字段,这个字段的使用和docker volume的使用是类似的,只需在config.toml的[runner.docker]部分添加volumes = [“/cache”, “:rw”]即可实现container里/cache目录数据的永久保存以及将host目录挂载到相应的container目录并具有读写的功能。
    比如:
none
# 仅作展示,未显示完整
[runners.docker]
  image = "jdd.io/jre:1.8.275"
  volumes = ["/cache","/run/docker.sock:/run/docker.sock"]

当你使用docker 或 docker+machine executors时,你可以通过设置pull_policy来决定Runner如何pull docker image。pull_policy有三种值:

none
always —— Runner始终从远程pull docker image。
if-not-present —— Runner会首先检查本地是否有该image,如果有则用本地的,如果没有则从远程拉取。
never —— Runner始终使用本地的image。

注意:这一步就是本文开头提到的,使用本地镜像,不用再从dockerhub上拉取了

none
# 仅作展示,未显示完整
[runners.docker]
  image = "jdd.io/jre:1.8.275"
  pull_policy="if-not-present" # 添加这个选项就可以了
  volumes = ["/cache","/run/docker.sock:/run/docker.sock"]

当你使用docker, docker+machine 或 kubernetes作为executor时,GitLab Runner将会使用特定的container来处理Git、artifacts 和cache 操作。

权限管理

以管理员的身份登入gitlab,点击Settings,然后选择Members,可以通过输入名字选择要分配权限的小组成员,然后分配角色,选择权限有效时间,点击Add to Project就把人员拉近到项目中。

GitLab的角色有以下四种:

  • Guest:可以创建issue、发表评论,不能读写版本库
  • Reporter:可以克隆代码,不能提交,可以赋予测试、产品经理此权限
  • Developer:可以克隆代码、开发、提交、push,可以赋予开发人员此权限
  • MainMaster:可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,一般GitLab管理员或者CTO才有此权限

访问权限 - Visibility Level:

这个是在建立项目时就需要选定的,主要用于决定哪些人可以访问此项目,包含3种

  • Private - 私有,只有属于该项目成员才有原先查看
  • Internal - 内部,用个Gitlab账号的人都可以clone
  • Public - 公开,任何人可以clone

本文作者:夜法之书 写作不易,转载请注明来源地址!

参考链接:

  1. https://www.cnblogs.com/hgzero/p/14088215.html
  2. http://www.51blogs.net/2017/11/10/1110113243.html
  3. https://my.oschina.net/u/2400083/blog/808097

系列教程

全部文章RSS订阅

Gitlab 使用系列

Gitlab RSS 分类订阅

Devops系列

Devops 分类 RSS 订阅

项目管理系列

AI 分类 RSS 订阅


作者: 夜法之书
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 夜法之书 !
评论
数据加载中 ...
 上一篇

阅读全文

transmission 使用及其配置
transmission 使用及其配置 transmission 使用及其配置
BT下载好工具,最低内存占用的工具,最低资源占用!transmission 使用及其配置全介绍,以及一些常见问题。
2021-08-18
下一篇 

阅读全文

docker使用简明教程
docker使用简明教程 docker使用简明教程
现在最流行的轻量级虚拟机,docker使用简明教程,指导你快速入门DOcker,掌握最流行的科技,快速提升生产力。
2021-08-01
  目录
  1. 1. Gitlab概述
    1. 1.1 GitLab介绍
    2. 1.2 Gitlab服务构成
    3. 1.3 Gitlab工作流程
    4. 1.4 GitLab Shell
    5. 1.5 GitLab Workhorse
  2. 2. Gitlab的安装部署
  3. 3. Gitlab的使用
  4. 4. 制定开发计划
  5. 5. Gitlab备份恢复
  6. 6. gitlab邮件通知配置
  7. 7. 使用SourceTree进行项目开发
  8. 8. Gitlab调优
  9. 9. Gitlab 启用 ContainerRegistry
  10. 日常维护命令
  11. 10. GitLab重置用户名密码
  12. 11. HTTPS SSL 支持
  13. 12. Gitlab恢复数据出现must be owner of解决方法
  14. 13. Gitlab Pages
  15. Container Registry
  16. CI
  17. 加速Gitlab Runner
  18. 权限管理
  19. 参考链接:
  20. 系列教程
支付宝扫码领红包