跳到主要内容

GitLAB

GitLab

image-20230425074157031

目录

[toc]

GitLab简介

image-20230412072857954

image-20230412072916135

DevOps生命周期工具

Git 仓库管理

Wiki文档管理

Issue跟踪

CI/CD

gitlab开源版本:gitlab-ce,国内用得比较多谢。(当然也有企业版本)

国外github用得比较多谢。

国内:https://gitlab.cn/

image-20230412073857914

国外:gitlab.com

专业的需求工具:jira可能是最适合需求的。

大规模组织:可以安装专门的需求管理工具,例如Jira。

小组织:一般使用gitlab也能满足需求了。

image-20230412074130768

image-20230412074207147

image-20230412074257501

image-20230412074411748

image-20230412074454597

image-20230412074512941

1、GitLab组织配置

image-20230417065531856

1.Namespaces 名称空间

image-20230417065644507

不同namespace的项目,其url是不一样的。

用户自己有一个默认的namespace的:

image-20230417070213431

2.Members成员

image-20230417073809492

gitlab里的权限一般会和ldap做集成的。

这里是有很多role可以去选择的:

image-20230417074102329

3.Groups组管理

之前在删除某个gitlab离职用户后,他的项目也被删除了。因此,创建项目一般建议都放置在组里;

image-20230417074210435

2、GitLab项目管理

image-20230421064118512

image-20230421064146584

image-20230421064159445

配置group名称最好与项目组有关的,例如业务的简称等等。项目组的类型分为 Private、Internal、Public三种类型。

  • Private 私有类型(当group为私有类型,后面组下面的项目都是私有类型)
  • Public 公开类型

创建组

image-20230417070027926

image-20230417070057275

生成代码

来到https://start.spring.io网站,初始化一个springboot项目:

生成项目代码:

image-20230421065241432

下载项目代码:

image-20230421065257478

创建项目

在这个页面可以创建一个空的项目、根据一个模板创建项目、导入一个已存在的项目(Gitlab、GitHub等系统)

tstmp_20230422143439

创建项目:

创建一个叫做devops-demo-service私有类型项目

image-20230421065528710

image-20230421065554681

image-20230421065605318

将项目代码推送到刚创建的项目里

  • 我们看下刚才创建的项目代码

demo.zip解压,能看到这个demo目录只是一个纯目录,而不是git仓库

image-20230421065928813

  • 利用刚才创建目录后的提示,将demo内容推送到新创建的项目里去

image-20230421070118932

cd existing_folder
git init --initial-branch=main #这里注意下,git的这个--initial-branch参数需要git高一点的版本,否则会报错。
git remote add origin http://172.29.9.101:8076/devops6/devops-demo-service.git
git add .
git commit -m "Initial commit"
git push -u origin main

推送过程:

这里注意下,git的这个--initial-branch参数需要git高一点的版本,否则会报错。

image-20230421070700679

当前git版本:

image-20230421070725993

但是,这里也可以使用其它方式来实现这个效果

image-20230421073037952

执行过程如下:

注意:自己pc上已经有了这个签名配置了,这里就不再重新配置了哦。

image-20230421073230433

cd demo
git init
git checkout -b main
git remote add origin http://172.29.9.101:8076/devops6/devops-demo-service.git
git add .
git commit -m "Initial commit"
git push -u origin main

image-20230421073531433

image-20230421073539980

来到项目这里,发现已经可以看见代码了:

image-20230421073603212

这边我们再推送一个README.md文件到仓库:

Win@DESKTOP-VUMV922 MINGW64 ~/Desktop/demo (main)
$ echo devops6 > README.md

Win@DESKTOP-VUMV922 MINGW64 ~/Desktop/demo (main)
$ git add .
warning: in the working copy of 'README.md', LF will be replaced by CRLF the next time Git touches it

Win@DESKTOP-VUMV922 MINGW64 ~/Desktop/demo (main)
$ git commit -m "add Readme"
[main 5617ddd] add Readme
1 file changed, 1 insertion(+)
create mode 100644 README.md

Win@DESKTOP-VUMV922 MINGW64 ~/Desktop/demo (main)
$ git push
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 273 bytes | 273.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
To http://172.29.9.101:8076/devops6/devops-demo-service.git
52558bc..5617ddd main -> main

Win@DESKTOP-VUMV922 MINGW64 ~/Desktop/demo (main)

到项目上确认下:(符合预期)

image-20230421074916491

创建特性分支

为什么要拉取分支? 一个分支不够吗? 一般我们使用 master 主干分支存放最新的能够发布生产的代码,而单独创建一些特性分支来做项目需求任务的开发分支。 这样的好处是防止主干分支污染,对分支起到了保护的作用。

下面进入 devops-demo-service 项目主页,然后基于主干分支master,创建特性分支feature-dev-01。操作如下:

image-20230422160240481

image-20230422160303427

特性分支开发与提交

查看当前本地分支,发现没有刚刚远程创建的 feature-dev-01 分支。

Win@DESKTOP-VUMV922 MINGW64 ~/Desktop/demo (main)
$ git branch -a
* main
remotes/origin/main

Win@DESKTOP-VUMV922 MINGW64 ~/Desktop/demo (main)
$

git pull 同步远程仓库所做的更新到本地, 这样远程的feature-dev-01分支就同步到了本地。然后我们使用 git checkout feature-dev-01切换到特性分支。

Win@DESKTOP-VUMV922 MINGW64 ~/Desktop/demo (main)
$ git pull
From http://172.29.9.101:8076/devops6/devops-demo-service
* [new branch] feature-dev-01 -> origin/feature-dev-01
Already up to date.

Win@DESKTOP-VUMV922 MINGW64 ~/Desktop/demo (main)
$ git branch -a
* main
remotes/origin/feature-dev-01
remotes/origin/main

Win@DESKTOP-VUMV922 MINGW64 ~/Desktop/demo (main)
$ git checkout feature-dev-01
Switched to a new branch 'feature-dev-01'
branch 'feature-dev-01' set up to track 'origin/feature-dev-01'.

Win@DESKTOP-VUMV922 MINGW64 ~/Desktop/demo (feature-dev-01)
$

我们更改下README.md文件内容,然后将更改内容提交到远程仓库。

Win@DESKTOP-VUMV922 MINGW64 ~/Desktop/demo (feature-dev-01)
$ echo 情出自愿-事过无悔 > README.md

Win@DESKTOP-VUMV922 MINGW64 ~/Desktop/demo (feature-dev-01)
$ git add .
warning: in the working copy of 'README.md', LF will be replaced by CRLF the next time Git touches it

Win@DESKTOP-VUMV922 MINGW64 ~/Desktop/demo (feature-dev-01)
$ git commit -m "modify README.md"
[feature-dev-01 7cf5639] modify README.md
1 file changed, 1 insertion(+), 1 deletion(-)

Win@DESKTOP-VUMV922 MINGW64 ~/Desktop/demo (feature-dev-01)
$ git push origin feature-dev-01
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 294 bytes | 294.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote:
remote: To create a merge request for feature-dev-01, visit:
remote: http://172.29.9.101:8076/devops6/devops-demo-service/-/merge_requests/new?merge_request%5Bsource_branch%5D=feature-dev-01
remote:
To http://172.29.9.101:8076/devops6/devops-demo-service.git
5617ddd..7cf5639 feature-dev-01 -> feature-dev-01

我们来到gitlab项目页面,刷新下:

image-20230422161012995

这样我们就把本地的特性分支开发的代码提交到了远程特性分支中了, 接下来对应该对该特性分支进行测试验证,没问题后合并到主干分支。

特性分支合并操作

将特性分支 feature-dev-01 代码合并到主干分支main Merge Request。

image-20230422161337200

在这个页面,选择源分支和目标分支。

image-20230422161358912

在这个页面:

  • 1 指定合并请求的标题
  • 2 描述信息,一般都是变更信息
  • 3 指定主管进行审核(最终该用户决定是否合并)
  • 4 指定进行代码审查的同事
  • 5 合并成功后删除源分支(最后很定要删除源分支,可以先保留一个版本后再删除,此处最好取消勾选)

tstmp_20230422161521

image-20230422161452149

交合并后,由管理员审查进行合并。

image-20230422161637570

image-20230422161656699

合并后的效果: 特性分支的更改已经同步到了主干分支。

image-20230422161722371

image-20230422161737760

到此一个基本的项目开发提交代码过程就已经完成了。(多熟悉一下这个过程)

==分支策略管理最佳实践==

image-20230422153000185

还是要避免一个情况,防止main分支被污染。

==最佳实践==:特性分支开发,版本分支发布

image-20230422153123029

image-20220619195729954

image-20220619195839701

案例:

image-20230422153336995

接着继续以main分支创建2个特性分支:feature-dev-02feature-dev-03

以main分支创建1个版本分支:RELEASE-1.1.1

image-20230422162140565

image-20230422162200172

image-20230422162216497

image-20230422162235864

此时,在gitlab web ide里修改特性分支feature-dev-02/03里的代码并提交。

image-20230422162450310

image-20230422164012456

然后,将2个特性分支代码feature-dev-02/03提交合并到版本分支RELEASE-1.1.1

image-20230422163514395

image-20230422163537286

image-20230422163600523

image-20230422164130269

image-20230422164141922

此时,版本分支经过dev-stag-prod环境测试无问题后,就打上一个tag,然后合并到主干分支中去。

确认生产发布成功了,这个时候,你打上一个tag。

image-20230422164348548

image-20230422164407262

image-20230422164423891

验证:

image-20230422164457557

image-20230422164514464

3、GitLab用户管理

image-20230422164742746

image-20230422164806960

image-20230422164818318

gitlab重置用户密码

(测试成功)-2022.5.13

1、web界面方式

image-20220513152204854

image-20220513152213703

2、控制台方式

gitlab版本:gitlab/gitlab-ce:14.9.3-ce.0

👉🏼 忘记密码情况下

image-20220512220302284

[root@devops ~]#docker ps 
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
11a54a1f4a2a gitlab/gitlab-ce:14.9.3-ce.0 "/assets/wrapper" 6 days ago Up 44 hours (healthy) 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:2222->22/tcp devops_tutorial_gitlab
f3f039aa667a jenkins/jenkins:2.332.2-centos7-jdk8 "/sbin/tini -- /usr/…" 4 weeks ago Up 41 hours 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp jenkins
[root@devops ~]#docker exec -it devops_tutorial_gitlab bash
root@11a54a1f4a2a:/# gitlab-rails console -e production
--------------------------------------------------------------------------------
Ruby: ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-linux]
GitLab: 14.9.3 (ec11aba56f1) FOSS
GitLab Shell: 13.24.0
PostgreSQL: 12.7
------------------------------------------------------------[ booted in 73.71s ]

Loading production environment (Rails 6.1.4.6)
irb(main):001:0>
irb(main):002:0> User.all
=> #<ActiveRecord::Relation [#<User id:1 @root>]>
irb(main):003:0> user = User.where(id:1).first
=> #<User id:1 @root>
irb(main):004:0> user.password='12345678'
=> "12345678"
irb(main):005:0> user.password_confirmation='12345678'
=> "12345678"
irb(main):006:0> user.save!
=> true
irb(main):007:0> exit
root@11a54a1f4a2a:/#
# 修改完后,立马生效!

以上亲测有效!

4、GitLab系统管理

image-20230422203537176

1.版本更新

  • rpm : rpm -Uvh
  • docker: 替换新版本镜像
注意跨版本升级需要先升级到当前版本的最后一个版本。

gitlab升级时,高可用,不太好保证,这里用一套蓝环境,一套绿环境,同时只有一套在线;

Gitlab有自己的备份配置,开起来就好了;

2.WebHook触发器

进入GitLab项目设置, 进入 webhook配置页面;

  • 配置要触发的URL,即Jenkins触发器接口URL;
  • 选择发生哪种GitLab事件后触发此Webhook;例如:Push提交代码、Tag创建标签等等;

tstmp_20230422203744

事件:

  • Push 提交事件
  • Tag Push 创建事件
  • MergeRequest 合并事件
  • Issue 问题创建更新事件

这里先随便写一个url http:/192.168.1.200:8080/generic-webhook-trigger/invoke?token=devops03-demo-service,用于测试。

image-20230422213800133

image-20230422213818452

添加webhook后,发现报以下错误:

image-20230422213857900

解决方法:进入admin管理页面设置 > network

tstmp_20230422213936

找到"Outbound requests"勾选允许请求webhooks和服务。(更改后,重启触发即可)保存配置。

tstmp_20230422213955

再次添加webhook后,发现就可以正常添加了:

image-20230422214052697

测试模拟触发

模拟事件触发,点击test按钮选择push事件,此时去看下Jenkins是否成功被触发

tstmp_20230422214214

触发成功则提示: Hook executed successfully: HTTP 200, 此时可以看下Jenkins是否已经触发了一次构建;

Webhook问题排查调试

进入webhook添加页面的最下方,点击你所创建的webhook的 Edit按钮 ;

tstmp_20230422214401

webhook历史记录: 此记录可以判断,当前动作提交是否产生了webhook。

tstmp_20230422214426

点击 View details 可以看到此webhook发送给对端Jenkins的数据信息,和请求状态。

  • 200: 表示触发Jenkins请求成功;
  • Resend Request: 重新发送请求;(此处便于排查调试错误)
  • RequestBody: GitLab传递给Jenkins的数据信息;

tstmp_20230422214508

如果Jenkins触发成功了之后,我们可以在Jenkins的构建日志中查看效果。 这些数据就是gitlab post传递过来的。

tstmp_20230422214542

到此:你基本上已经知道了Gitlab如何触发Jenkins的了。(多看几遍,多练习几遍)

本次自己测试效果:

image-20230422214643769

image-20230422214658391

image-20230422214758764

3. 邮件通知配置

次部分,本次未测试,仅做记录。之前gitlab实验时有用到过次配置。

编辑/etc/gitlab/gitlab.rb文件开启gitlab email。这里以QQ邮箱为例

### GitLab email server settings
###! Docs: https://docs.gitlab.com/omnibus/settings/smtp.html
###! **Use smtp instead of sendmail/postfix.**

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "2560350642@qq.com"
gitlab_rails['smtp_password'] = "exnyvnekjdgwecga"
gitlab_rails['smtp_domain'] = "smtp.qq.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true

### Email Settings
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = '2560350642@qq.com'
gitlab_rails['gitlab_email_display_name'] = 'GitLab Admin'

重新配置

gitlab-ctl stop ;
gitlab-ctl reconfigure ;
gitlab-ctl start gitlab-ctl status

登录gitlab-rails控制台,发送测试邮件。

su - git
gitlab-rails console

irb(main):002:0> Notify.test_email('2560350642@qq.com', 'test email', 'gitlab email test').deliver_now


Notify#test_email: processed outbound mail in 0.5ms
Delivered mail 5eba1b04de4e5_12903fe2ca0c79b0519ec@gitlab-995f97976-2nmb4.mail (1055.9ms)
Date: Tue, 12 May 2020 03:41:56 +0000
From: GitLab Admin <2560350642@qq.com>
Reply-To: GitLab Admin <noreply@192.168.1.200>
To: 2560350642@qq.com
Message-ID: <5eba1b04de4e5_12903fe2ca0c79b0519ec@gitlab-995f97976-2nmb4.mail>
Subject: Message Subject
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>Message Body And Linuxea.com</p></body></html>

=> #<Mail::Message:70243016426420, Multipart: false, Headers: <Date: Tue, 12 May 2020 03:41:56 +0000>, <From: GitLab Admin <2560350642@qq.com>>, <Reply-To: GitLab Admin <noreply@192.168.1.200>>, <To: 2560350642@qq.com>, <Message-ID: <5eba1b04de4e5_12903fe2ca0c79b0519ec@gitlab-995f97976-2nmb4.mail>>, <Subject: Message Subject>, <Mime-Version: 1.0>, <Content-Type: text/html; charset=UTF-8>, <Content-Transfer-Encoding: 7bit>, <Auto-Submitted: auto-generated>, <X-Auto-Response-Suppress: All>>

测试邮件:

tstmp_20230422215015

取消gitlab提交后发送邮件功能

  • 问题现象

之前这里配置了自己邮箱,然后每次提交代码运行后,就会发送邮件,这样很烦的。

image-20230509073754276

image-20230509073805933

image-20230509073813523

  • 这里取消这里的邮箱后,再次测试代码

image-20230509074138079

  • 还是失败了……

image-20230509074115759

  • 问题,那么是哪里的配置导致一直发邮件呢??

……

感觉像是这里的问题……

image-20230509074808890

  • 改下这里的邮箱试试

image-20230509074935104

image-20230509075035565

image-20230509075053492

在把这里的邮箱改下:

image-20230509075134230

  • 再测提交测试

image-20230509075233216

还是有问题,那么我直接再次更新下这里的信息。

image-20230509075348964

再次提交测试:(还是有问题……)

image-20230509075443269

  • 那我再次测试

这里删除这个邮箱:

image-20230509075635422

还是不行。。。

  • 额,最后发现原因了。。。。是jenkins那里的问题。。。gitlab提交代码会触发jenkins流水线,然后会发送邮件的。因此,这里还原配置,配置下gitlab这个项目的触发webhook就好。

image-20230510071426882

image-20230510071432207

  • 再次测试

可以看到,此时就没有再发送邮件了。666

image-20230510071629774

GitLab排错

TS:gitlab推送本地仓库时报错(已解决)

  • 报错现象

推送本地仓库时报错……

image-20230716090425106

Win@DESKTOP-VUMV922 MINGW64 ~/Desktop/learndevops (main)
$ git push --set-upstream origin main
remote: HTTP Basic: Access denied. The provided password or token is incorrect or your account has 2FA enabled and you must use a personal access token instead of a password. See https://jihulab.com/help/topics/git/troubleshooting_git#error-on-git-fetch-http-basic-access-denied
fatal: Authentication failed for 'https://jihulab.com/learndevops/myiac.git/'

  • 解决办法

通过百度得知,需要创建一个personal token才行

https://blog.csdn.net/u010773514/article/details/131186708

image-20230716091458445

image-20230716091119867

image-20230716091127434

这里推送时输入以下token验证方式后,就可以正常推送代码了:

hgjira

C3pwDszxAUtvYcxyLK6s

image-20230716091239617

https://jihulab.com/learndevops/myiac.git

image-20230716091306402

TS:gitlab安装时报错502(博客分享-已解决)-2022.5.5

image-20220505094044376

故障环境

gitlab/gitlab-ce:14.9.3-ce.0
docker 20.10.11
win10 vmwarokstation虚机(centos7.9)

1、故障现象

注:如果后期 web 界面访问时,总报 502,该如何解决?

  • 可以尝试清除防护期爱那个规则。

  • 另外内存要大于 4G,不然后内存不足,也报 502,502属于内部错误;

image-20210426074751889

[root@Devops ~]# iptables -F # 清空规则

[root@Devops ~]# free -mh # 已经使用 4G 以上内存
total used free shared buff/cache available
Mem: 7.1G 4.7G 496M 117M 2.0G 2.0G
Swap: 2.0G 520K 2.0G

2、解决办法

  • 可以尝试清除防护期爱那个规则。

  • 另外内存要大于 4G,不然后内存不足,也报 502,502属于内部错误;

3、测试过程

🍀 自己后面再用docker安装gitlab时,也报502错误了:

报错前机器内存为2G:

image-20220505093433350

image-20210426074751889

将机器内存改为4G以上:

image-20220505093536641

此时,访问就正常了:

image-20220505093820523

image-20220505093603523

FAQ

自己注册的gitlab账号

  • 自己也注册一个公开代码库

image-20230715223948845

https://jihulab.com/users/sign_up

image-20230715224233691

image-20230715224549894

image-20230715224742486

learndevopsmyiac

自己的极狐库如下:

https://jihulab.com/learndevops/myiac.git

image-20230715225503674

添加ssh秘钥

image-20230716074110220

这个和github的方式应该是一样的:

image-20230716082750005

image-20230716082731982

gitlab仓库加tag

image-20230709083919621

image-20230709083955146

image-20230709084011118

下载源代码:

image-20230709084038499

gitlab默认分支为main分支

image-20230421070907852

但git默认的分支为master分支:

image-20230421071214127

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码 x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号 《云原生架构师实战》

image-20230107215126971

🍀 语雀

https://www.yuque.com/xyy-onlyone

image-20230306221144511

🍀 csdn https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

image-20230107215149885

🍀 知乎 https://www.zhihu.com/people/foryouone

image-20230107215203185

最后

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!

image-20220513150137673