1. 初识GitLab

1.1 GitLab是什么?

GitLab 是一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面进行访问公开的或者私人项目。GitLab 由乌克兰程序员 DmitriyZaporozhets 和 ValerySizov 开发,它由 Ruby写成。后来,一些部分用Go语言重写,现今并在国内外大中型互联网公司广泛使用。GitLab 分为社区版(CE)和企业版(EE),社区版免费,企业版是要收费的。

常用功能如下:

  • 代码托管服务。
  • 访问权限控制。
  • 问题跟踪,bug的记录、跟踪和讨论。
  • Wiki,项目中一些相关的说明和文档。
  • 代码审查,可以查看、评论代码。

    GitLab 和 GitHub 的区别? gitlab 是一个基于 git 实现的在线代码仓库软件,提供 web 可视化管理界面,通常用于企业团队内部协作开发 github 是一个基于 git 实现的在线代码托管仓库,亦提供可视化管理界面,同时免费账户和提供付费账户,提供开放和私有的仓库,大部分的开源项目都选择github作为代码托管仓库

1.2 GitLab常用组件

  • nginx:静态Web服务器
  • gitlab-shell:用于处理 Git 命令和修改 authorized keys 列表,gitlab 是以 Git 为底层的,操作实际上最后就是调用 gitlab-shell 命令进行处理。
  • gitlab-workhorse:轻量级的反向代理服务器。它会处理一些大的 HTTP请求,比如文件上传、文件下载、Git push/pull 和 Git 包下载。其它请求会反向代理到 GitLab Rails 应用,即反向代理给后端的 unicorn。
  • unicorn:GitLab Rails 应用是托管在这个服务器上面的。
  • sidekiq:用于在后台执行队列任务(异步执行)
  • logrotate:日志文件管理工具
  • postgresql:数据库
  • redis:缓存数据库

    1.3 GitLab-CI

    Gitlab-CI 是 Gitlab 官方提供的持续集成服务,从 Gitlab 8.0 版本开始,Gitlab 就全面集成了 Gitlab-CI,并且对所有项目默认开启。从 Gitlab 7.12 版本开始,GitLab CI 使用 YAML 文件(.gitlab-ci.yml) 来管理项目配置,我们可以在仓库的根目录下新建 .gitlab-ci.yml 文件,自己定义持续集成流程模板,并且在 Gitlab 中配置 Runner,在之后的每次提交合并中将会触发 CI pipeline,并且可以通过 Gitlab 的 hook, 在代码提交的各个环节自动地完成一系列的构建工作,总之对于一些非复杂性的集成需求,都是可以满足的。

GitLab-Runner 是配合 GitLab-CI 进行使用的。一般地,GitLab 里面的每一个工程都会定义一个属于这个工程的软件集成脚本 .gitlab-ci.yml,用来自动化地完成一些软件集成工作。当这个工程的仓库代码发生变动时,比如有人 push了代码,GitLab 就会将这个变动通知 GitLab-CI。这时 GitLab-CI 会找出与这个工程相关联的 Runner,并通知这些 Runner 把代码更新到本地并执行预定义好的执行脚本。Runner可以分布在不同的主机上,同一个主机上也可以有多个 Runner。GitLab-Runner 可以分类两种类型:Shared Runner(共享型)和Specific Runner(指定型):

  • Shared Runner:这种 Runner 是所有工程都能够用的。只有Gitlab系统管理员能够创建 Shared Runner。
  • Specific Runner:这种 Runner 只能为指定的工程服务。拥有该工程访问权限的人都能够为该工程创建Shared Runner。

所以,GitLab-Runner 就是一个用来执行软件集成脚本的东西。你可以想象一下:Runner 就像一个个的工人,而 GitLab-CI 就是这些工人的一个管理中心,所有工人都要在 GitLab-CI 里面登记注册,并且表明自己是为哪个工程服务的。当相应的工程发生变化时,GitLab-CI 就会通知相应的工人执行软件集成脚本。GitLab - 图1
image.png

1.4 GitLab-ce安装

1、安装所需依赖环境。

  1. # policycoreutils -安全漏洞工具;openssh-server -加密远程登录工具;postfix -邮件功能
  2. yum install curl policycoreutils openssh-server openssh-clients postfix -y
  3. # 如果以上无法安装,使用:dnf install -y wget policycoreutils openssh-server openssh-clients postfix
  4. # 启用 sshd 服务
  5. systemctl enable --now sshd
  6. # 开放 http 端口
  7. firewall-cmd --permanent --add-service=http
  8. systemctl reload firewalld
  9. # 启用邮件服务
  10. systemctl enable --now postfix

2、Linux 系统参数设置

  1. # Linux系统参数
  2. # sysctl fs.file-max # 系统级别所有进程可以打开的文件描述符的数量
  3. # ulimit -n # 用户/进程级别能够打开的文件句柄的数量
  4. # ulimit -u # 可以运行的最大并发进程数
  5. # 修改 /etc/sysctl.conf
  6. vim /etc/sysctl.conf
  7. fs.file-max=131072
  8. # 使修改配置立即生效
  9. sysctl -p
  10. # 修改 /etc/security/limits.conf,设置用户/进程级别能够打开的文件句柄数 和 进程数
  11. vim /etc/security/limits.conf
  12. * - nofile 131072
  13. * - nproc 8192
  14. # 修改以后,需要重新登录才能生效

3、安装 Gitlab-CE,这里采用的是离线安装,版本是 gitlab-ce-13.7.1-ce.0.el8.x86_64.rpm。

  1. # 需要先将gitlab下载到本地
  2. yum install -y gitlab-ce-13.7.1-ce.0.el8.x86_64.rpm

4、Gitlab-CE 程序的默认安装路径为/opt/gitlab/,程序数据及配置文件保存路径为/var/opt/gitlab,具体如下:

  • gitlab 主要配置文件:/etc/gitlab/gitlab.rb
  • 代码仓库保存位置:/var/opt/gitlab/git-data/repositories/
  • 代码仓库备份位置:/var/opt/gitlab/backups/
  • postgresql 数据及配置目录:/var/opt/gitlab/postgresql/data/
  • redis 默认配置目录:/var/opt/gitlab/redis
  • 各服务的日志目录:/var/log/gitlab/

    1.5 GitLab配置

    1、编辑 Gitlab-CE 配置文件,设置访问服务器的 url 或 ip以及配置时区。 ```shell vi /etc/gitlab/gitlab.rb

配置服务器ip和时区

external_url ‘http://192.168.58.101:9002/gitlab‘ # 修改为服务器的url或ip,指的是gitlab的访问地址 gitlab_rails[‘time_zone’] = ‘Asia/Shanghai’

配置邮件发送,下面的所有qq账号都只是发件人的账号,收件人账号不在这里配置。

gitlab_rails[‘smtp_enable’] = true gitlab_rails[‘smtp_address’] = “smtp.qq.com” gitlab_rails[‘smtp_port’] = 465 gitlab_rails[‘smtp_user_name’] = “2711845964@qq.com” # 自己的qq邮箱账号 gitlab_rails[‘smtp_password’] = “umnnlyikqlfjdegi” # 开通smtp时返回的授权码 gitlab_rails[‘smtp_domain’] = “qq.com” gitlab_rails[‘smtp_authentication’] = “login” gitlab_rails[‘smtp_enable_starttls_auto’] = true gitlab_rails[‘smtp_tls’] = true gitlab_rails[‘smtp_openssl_verify_mode’] = ‘none’ gitlab_rails[‘gitlab_email_from’] = “2711845964@qq.com” # 指定发送邮件的邮箱地址 gitlab_rails[‘gitlab_email_reply_to’] = ‘2711845964@qq.com’ user[“git_user_email”] = “2711845964@qq.com”

  1. 2、使用 `gitlab-ctl reconfigure` 命令重载一下配置文件。
  2. <a name="VxbxB"></a>
  3. ## 1.6 配置SSH
  4. 1、查看本地 ssh 秘钥是否存在,有就复制。
  5. ```shell
  6. cat ~/.ssh/id_rsa.pub

2、如果本地不存在 ssh 秘钥,则新建,邮箱随便写。

  1. ssh-keygen -t rsa -C "xiaoming@qq.com"

3、将 id_rsa.pub 公钥复制粘贴到 gitlab 上,就可以使用 ssh 来下载代码。

  1. git clone git@192.168.58.12:java/springboot_cicd.git

1.7 配置用户注册发送邮件

image.png

2. GitLab使用

2.1 基本命令

启动之后打开浏览器访问:http://url,首次访问会被重定向到密码修改界面,修改管理员账户(默认为 root) 的密码,修改完成后自动跳转到登录页面,用 root 和修改后的密码登录即可。我这里设置的密码是 123456789。

  1. gitlab-ctl reconfigure # 重置配置文件
  2. gitlab-ctl show-config # 验证配置文件
  3. gitlab-ctl start # 启动所有 gitlab 组件
  4. gitlab-ctl stop # 停止所有 gitlab 组件
  5. gitlab-ctl restart # 重启所有 gitlab 组件
  6. gitlab-ctl status # 查看服务状态
  7. gitlab-ctl tail # 查看日志
  8. gitlab-rake gitlab:check SANITIZE=true --trace # 检查gitlab
  9. vim /etc/gitlab/gitlab.rb # 修改默认的配置文件

2.2 中文修改

image.png

2.3 创建用户并添加到组

先创建组、后创建用户 yxw、pm、dev1、dev2、dev3,并将用户加入到指定组里。同时设置 pm 账号密码为 123456789。
image.png

2.4 创建项目

1、创建一个空白项目 springcloud,并指定由哪个组处理。
image.png
2、添加一个 ssh 秘钥。

  1. ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDaFPI9pABMIdg2YHuDuhRGKuZnClg3fFI+N+BNDjY4USqXmQ2kNfE9ehzBZA+E46gpdzBs1C0BceymTFs4MEdzUS5VdlfqNIpZhRHMClQocXTDOdrvrwXBvnu23yDZiWvOmVJA7Zu0G9VZGIwHMIEXJkY6gc7j8vqnddNPY23O6AIrlewpdIBQVnjVOLmRWoEYRfDdsxc+T76OuS1LqRZJDCy9/2Ou4PKrTgo/NdosXSFtaPQcZz0gVmors7RJJjQRihLMeSt2CUxW2Ejp+UMk6bWCBQIPOb1nxD1H0ChPHd501XFZ5QdG4xpFE3f6ufvVLTPLalqNN1WmJRSCpAyzZr/tlDt7ERKdUSYs1d0fzh1f/wHmnfEOsG7fA/shVqA7GNji0zKc9sKQT+jlnAhplAy1lHIlaxscQEA9wjjkQziBwg5bl1RKI2jSA9Az0ZVjET2uSj9o5JQdAb2S/YuF5CfsvPMzl2pXA00dIefaALB2iPYc8HPN+HrANKkuhzU= yanxuwei666@163.com

3、项目组中添加成员,yxw、dev1、dev2。
image.png

2.5 推送本地文件

  1. # 将springcloud项目克隆下来
  2. git clone git@192.168.107.100:java/springcloud.git
  3. # 初始化配置,如果已经配置,可以跳过
  4. git config --global user.name "yxw"
  5. git config --global user.email "yanxuwei666@163.om"
  6. # 在该目录下新建一些文件
  7. # 推送到gitlab
  8. git add .
  9. git commit -m "first edition"
  10. git push origin master

2.6 GitLab权限

Gitlab 用户在组中有五种权限:Guest、Reporter、Developer、Maintainer、Owner。

  • Guest:可以创建issue、发表评论,不能读写版本库。
  • Reporter:可以克隆代码,不能提交,QA、PM可以赋予这个权限。
  • Developer:可以克隆代码、开发、提交、push,RD可以赋予这个权限。
  • Maintainer:可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心RD负责人可以赋予这个权限。
  • Owner:可以设置项目访问权限 - Visibility Level、删除项目、迁移项目、管理组成员,开发组leader可以赋予这个权限。

    PM:项目经理( Project Manager ) RD: 研发(Research and Development) QA:测试(QUALITY ASSURANCE) OP:运维(Operations)

3. 制定开发计划

3.1 创建开发计划

  • 项目:app01
  • 版本:v1.0

GitLab - 图8

3.2 创建里程碑Milestones

  • 用 pm 账号登录 gitlab 后操作(先要在 admin 中设置 pm 账号的密码)。
  • 要根据开发计划来创建 Milestones。

image.png
image.png

3.3 根据开发计划创建issue

  • 创建4个 issue,分派给dev1和dev2这两个开发人员

image.png

3.4 开发者登录账号查看分派的任务

  • 然后开发dev1登录gitlab,就能看到任务已经分配过来了。

image.png

3.5 开发流程

  • 公司里的开发开始任务 ```java

    1. 先从仓库把项目拉下来

    git clone git@192.168.107.100:java/springcloud.git cd springcloud/

2.先创建一个自己的分支,然后进行开发

git checkout -b index # 创建一个叫index的分支,并切换到这个分支 git status

3. 开始开发首页

echo “

welcome to this app

“ > index.html # 假设就开发了一个index页面

4. 开发完成后,把项目传到仓库

git add . git commit -m “index”

如果写成 git commit -m “close #2” ,则表示merge请求允许且merge成功之后,自动删除编号为#2的issue

传到index分支

git push origin index

<a name="CHtDg"></a>
## 3.6 合并分支
1、**开发 dev1 发送合并分支请求给 pm。**<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/446852/1638340853701-e3ca3b09-4eca-4588-83c3-9a865ced6bef.png#clientId=u59da19a6-13bf-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=290&id=u7c360313&margin=%5Bobject%20Object%5D&name=image.png&originHeight=579&originWidth=1917&originalType=binary&ratio=1&rotation=0&showTitle=false&size=69017&status=done&style=none&taskId=uc3619e98-b66a-406e-9ab4-871726fe1ca&title=&width=958.5)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/446852/1638340936628-fa0c9c71-00b8-45ad-bc09-a3fa95013177.png#clientId=u59da19a6-13bf-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=411&id=ub1152162&margin=%5Bobject%20Object%5D&name=image.png&originHeight=756&originWidth=1467&originalType=binary&ratio=1&rotation=0&showTitle=false&size=53211&status=done&style=none&taskId=uec50df56-5769-4e57-aecc-a18d79cd714&title=&width=798.5)<br />2、开发 dev2 发送合并分支请求给 pm。<br />3、pm 收到开发的 Merge 请求后进行处理。<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/446852/1638341230508-ade5f08d-518d-443e-a60b-53ccb4940efb.png#clientId=u59da19a6-13bf-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=301&id=u75ff20c7&margin=%5Bobject%20Object%5D&name=image.png&originHeight=601&originWidth=1630&originalType=binary&ratio=1&rotation=0&showTitle=false&size=80943&status=done&style=none&taskId=u7df08bfb-8d69-4187-9949-d083f5892b6&title=&width=815)<br />4、**开发 dev1 确认任务完成,进入 dev1 账户。**<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/446852/1638341774087-8de651f3-b53a-4602-81a8-e9f7b5e20f19.png#clientId=u59da19a6-13bf-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=225&id=ud1bd56e1&margin=%5Bobject%20Object%5D&name=image.png&originHeight=450&originWidth=1656&originalType=binary&ratio=1&rotation=0&showTitle=false&size=43767&status=done&style=none&taskId=u7e1a79a0-14be-42ff-841c-c3e24536035&title=&width=828)<br />5、这个时候 Milestones 的进度已经往前进了一些了。
<a name="a1yrg"></a>
## 3.7 开发其他功能

- 然后其他开发者或者自己再次进行开发时,先要把刚刚更新后的内容(master主干)拉回来,然后再进行开发。
```git
git checkout master  # 切换到master
git pull             # 从远端仓库拉取数据# 然后再进行其他操作

常见错误

GitLab启动出现502

解决办法1:虚拟机 2G 带不动 GitLab,将内存升级到 3G。
解决办法2:端口被占用,修改 /etc/gitlab/gitlab.rb 文件,指定端口。
解决办法3:等几分钟,就好了。