Devops-day1-Git+GitLab介绍及使用
Git+GitLab介绍及使用
一、持续集成简介
1.软件开发生命周期
软件开发生命周期又叫做 SDLC(Software Development Life Cycle),它是集合了计划、开发、测试 和部署过程 的集合。
1)需求分析
这是生命周期的第一阶段,根据项目需求,团队执行一个可行性计划的分析。项目需求可能是公司内部 或者客户提出的。这阶段主要是对信息的收集,也有可能是对现有项目的改善和重新做一个新的项目。还要 分析项目的预算多长,可以从哪方面受益及布局,这也是项目创建的目标。
2)设计
第二阶段就是设计阶段,系统架构和满意状态(就是要做成什么样子,有什么功能),和创建一个项目计 划。计划可以使用图表,布局设计或者文者的方式呈现。
3)实现
第三阶段就是实现阶段,项目经理创建和分配工作给开者,开发者根据任务和在设计阶段定义的目标进 行开发代码。依据项目的大小和复杂程度,可以需要数月或更长时间才能完成。
4)测试
测试人员进行代码测试 ,包括功能测试、代码测试、压力测试等。
5)进化
最后进阶段就是对产品不断的进化改进和维护阶段,根据用户的使用情况,可能需要对某功能进行修改, bug 修复,功能增加等。
2.敏捷开发
敏捷开发的核心:迭代开发、增量开发
1)迭代开发
对于大型软件项目,传统的开发方式是采用一个大周期(比如一年)进行开发,整个过程就是一次"大 开发"; 迭代开发的方式则不一样,它将开发过程拆分成多个小周期,即一次"大开发"变成多次"小开 发",每次小开发 都是同样的流程,所以看上去就好像重复在做同样的步骤。
2)增量开发
软件的每个版本,都会新增一个用户可以感知的完整功能。也就是说,按照新增功能来划分迭代。
3)敏捷开发如何迭代?
虽然敏捷开发将软件开发分成多个迭代,但是也要求,每次迭代都是一个完整的软件开发周期,必须按 照软件工程的方法论,进行正规的流程管理。
3.持续集成
-
持续集成,简称CI(Continuous integration),指频繁地(一天多次)将代码集成到主干。
-
目的:让产品可以快速迭代,同时还能保持高质量
-
核心措施:代码集成到主干之前,必须通过自动化 测试。只要有一个测试用例失败,就不能集
通过持续集成,团队可以快速的从一个功能到另一个功能,简而 言之,敏捷软件开发很大一部分都要归功于持续集成。在持续集成的过程当中主要包括以下步骤:提交、测试、 构建(容器需要构建, 编译型语言编译)、部署及回滚。
1)持续集成三要素
1> 一个自动构建过程,从检出代码、编译构建、运行测试、结果记录、测试统计等都是自动完成的,无需 人工干预.
2> 一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时作为构建过程的素材库,一般使用 SVN 或 Git。
3> 一个持续集成服务器,Jenkins 就是一个配置简单和使用方便的持续集成服务器。
2)持续集成的好处
1> 降低风险,由于持续集成不断去构建,编译和测试,可以很早期发现问题,所以修复的代价就少。
2> 对系统健康持续检查,减少发布风险带来的问题。
3> 减少重复性工作。
4> 持续部署,提供可部署单元包。
5> 持续交付可供使用的版本。
6> 增强团队信心。
二、GitLab私有代码仓库
GitLab 是一个用于仓库管理系统的开源项目,使用 Git 作为代码管理工具,并在此基础上搭建起来的 web 服务。
GitLab 和 GitHub 一样属于第三方基于 Git 开发的作品(私有仓库),GITLAB 免费且开源(基于 MIT 协议),与 Github 类似, 可以注册用户,任意提交你的代码,添加 SSHKey 等等。
不同的是,GitLab 是可以部署到自己的服务器 上,数据库等一切信息都掌握在自己手上,适合团队内部协作开发,你总不可能把团队内部的智慧总放在别人的服务器上吧?简单来说可把 GitLab 看作个人版的 GitHub。
1.Git(代码管理工具)
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git 是 Linus Torvalds 为 了帮助管理 Linux 内核开发而是一个开放源码的版本控制软件。Git 与常用的版本控制工具 CVS, Subversion 等 不同,它采用了分布式版本库的方式,不必有服务器端软件支持。
git的优缺点:
-
优点:
-
- 适合分布式开发,强调个体。
- 公共服务器压力和数据量都不会太大。
- 速度快、灵活。
- 任意两个开发者之间可以很容易的解决冲突。
- 离线工作。
-
缺点:
-
- 资料少(起码中文资料很少)。
- 学习周期相对而言比较长。
- 不符合常规思维。
- 代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。
-
代码提交流程
创建test目录 初始化(git init) 添加到暂存区(git add) 提交至缓存区(git commit) 将代码上传到服务器,然后解压 将代码上传到服务器中,然后通过软连接的方式部署 PS:指定回滚版本:git log查看回滚id >> git reset --hard [回滚id] PS:无法实现批量部署,无法实现批量回滚,更无法实现批量测试。 =============================================================== 自动集成(java、golang)、自动部署、自动测试: DevOps 代码: 编译型语言:需要编译,后运行 脚本型语言:直接运行 工具: 实现自动集成、自动部署:Jenkins 代码管理:git ---> gitlab、github、gitee
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rTQResaa-1619606813030)(https://i.loli.net/2021/04/28/x165vSqQNCXUkts.png)]
1)安装Git
[root@k8s-master1 ~]# yum install git -y
[root@k8s-master1 ~]# git --version
git version 1.8.3.1
2)新建代码仓库
[root@k8s-master1 ~]# mkdir test
[root@k8s-master1 ~]# cd test
# 初始化
[root@k8s-master1 test]# git init
Initialized empty Git repository in /root/test/.git/
# 初始化成功
[root@k8s-master1 test]# ll -a
total 4
drwxr-xr-x 3 root root 18 Apr 13 16:46 .
dr-xr-x---. 18 root root 4096 Apr 13 16:46 ..
drwxr-xr-x 7 root root 119 Apr 13 16:46 .git
3)编辑、提交代码
1.输入内容到新文件内
[root@k8s-master1 test]# echo 123 > index.html
# 查看状态,提示未添加到暂存区
[root@k8s-master1 test]# git status
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# index.html
nothing added to commit but untracked files present (use "git add" to track)
2.将代码提交至git暂存区
[root@k8s-master1 test]# git add index.html
# 查看状态,提示未添加到缓冲区
[root@k8s-master1 test]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: index.html
3.将代码提交至git缓冲区,至此算一个版本完成
[root@k8s-master1 test]# git commit -m 'init' .
-m : 添加注释
# 再次重新编辑index.html(相当于编辑v2版本~)
[root@k8s-master1 test]# echo 222 > index.html
[root@k8s-master1 test]# git add index.html
[root@k8s-master1 test]# git commit -m 'init'
[master ae571fd] init
1 file changed, 1 insertion(+), 1 deletion(-)
# 此时查看日志记录,提交过两次
[root@k8s-master1 test]# git log
commit ae571fd4eb576120843cd2d969a217d18b59b9cf
Author: Peng <1710724925@qq.com>
Date: Tue Apr 13 17:05:38 2021 +0800
init
commit a200c47171eef55cce2809d2fb51756fe3358ef4
Author: Peng <1710724925@qq.com>
Date: Tue Apr 13 17:05:06 2021 +0800
init
# 当前内容如下
[root@k8s-master1 test]# cat index.html
222
4)测试回滚
# 回滚到上个版本
[root@k8s-master1 test]# git reset --hard a200c47171eef55cce2809d2fb51756fe3358ef4
HEAD is now at a200c47 init
# 回滚成功
[root@k8s-master1 test]# cat index.html
111
[root@k8s-master1 test]# git reset --hard ae571fd4eb576120843cd2d969a217d18b59b9cf
HEAD is now at ae571fd init
# 撤销回滚
[root@k8s-master1 test]# cat index.html
222
5)设置用户名和邮箱
- 访问:https://gitee.com/
- 用户名:账号用户名
- 邮箱:需手动绑定一个
# 绑定用户名、邮箱
[root@k8s-master1 test]# git config --global user.name "Peng"
[root@k8s-master1 test]# git config --global user.email "1710724925@qq.com"
# 查看绑定
[root@k8s-master1 data]# git config -l | grep user
user.email=1710724925@qq.com
user.name=Peng
# 指定查看
[root@k8s-master1 test]# git config --get user.name
Peng
[root@k8s-master1 test]# it config --get user.email
1710724925@qq.com
6)链接远程仓库
命令功能:
git status 查看工作目录的状态
git add <file> 将文件添加到暂存区
git commit -m "commnet" 提交更改,添加备注信息(此时将暂存区的信息提交到本地仓库)
git push origin master 将本地仓库的文件 push 到远程仓库(若 push 不成功,可加 -f 进行强
推操作)
1.克隆远程仓库到本地(下载)
# 例如在网页编辑一句代码并保存,从本地获取,复制文件的http连接
[root@k8s-master1 test]# git clone https://gitee.com/zhenpengzhang/data.git
# 查看,多了远端的data仓库
[root@k8s-master1 data]# tree
.
├── data
│ └── remote.html
└── index.html
# 查看内容
[root@k8s-master1 data]# cat data/remote.html
i am remote a file!
2.提交到本地代码远程仓库(上传)
[root@k8s-master1 data]# git push -u origin master
Username for 'https://gitee.com': [gitee登录账号]
Password for 'https://15517127859@gitee.com': [gitee登录密码]
Counting objects: 3, done.
Writing objects: 100% (3/3), 209 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-5.0]
To https://gitee.com/chenyang0910/data.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
PS:
7)使用SSh将代码提交到远程
[root@k8s-master1 data]# vim .git/config
# usl更改为ssh的地址:网页点击代码-克隆-复制ssh地址
git@gitee.com:zhenpengzhang/data.git
# 创建配备秘钥,复制填写到远端个人账户
# 头像-设置-ssh公钥-填写保存
[root@k8s-master1 data]# ssh-keygen -t rsa
[root@k8s-master1 data]# cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCx8mmUPXxOs0Mjg+2renQuuFbPf+GbFHk8t+/yiK4WHG4hXVuVhlww
# 成功推送到远端
[root@k8s-master1 data]# git push -u origin master
Warning: Permanently added 'gitee.com,212.64.62.183' (ECDSA) to the list of known hosts.
Counting objects: 5, done.
Writing objects: 100% (3/3), 241 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-5.0]
To git@gitee.com:chenyang0910/data.git
63004c0..dd584e3 master -> master
Branch master set up to track remote branch master from origin.
2.GitLab(远程代码仓库)
官网:https://about.gitlab.com/
Gitlab是依赖于Git的远程代码仓库,类似于GitHub、Gitee,不同的是GitHub、Gitee的公网上代码仓库, Gitlab是可以私有化部署的免费远程代码仓库
准备机器 | IP | 配置要求 |
---|---|---|
gitlab | 192.168.12.82 | 内存3g+/硬盘20G+ |
- 基础优化
setenforce 0
systemctl disable --now firewalld
sed -i 's#enforcing#disabled#g' /etc/sysconfig/selinux
1)部署GitLab
# 下载安装包
[root@gitlab ~]# mkdir packages && cd packages
[root@gitlab packages]# wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-13.0.3-ce.0.el7.x86_64.rpm
# 安装依赖包
[root@gitlab packages]# yum install -y curl policycoreutils-python openssh-server perl
# 安装gitlab
[root@gitlab packages]# yum install gitlab-ce-13.0.3-ce.0.el7.x86_64.rpm
# 修改配置文件:外部url改为本机ip,端口80
[root@gitlab packages]# vim /etc/gitlab/gitlab.rb
external_url 'http://192.168.12.82'
nginx['listen_port'] = 80
# 刷新配置(默认启动)
[root@gitlab packages]# gitlab-ctl reconfigure
# PS:中途卡主,是因为服务器配置不够,ctrl+c 强制结束,增加内存,再次执行 gitlab-ctl reconfigure 即可成功!
2)用户组、用户及项目
-
创建用户组[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HkblFAL9-1619606813037)(https://i.loli.net/2021/04/28/UjpfCL6941gG3h5.png)]
-
创建用户
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T57Kdz04-1619606813041)(https://i.loli.net/2021/04/28/k7SQry4UXoPuELT.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vlfWzBv9-1619606813049)(https://i.loli.net/2021/04/28/xNIrVEaOSLm5pR3.png)]
- 创建项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JjBpr4OH-1619606813052)(https://i.loli.net/2021/04/28/FvVHnQyNGJ8B6bw.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rVeRFlIG-1619606813054)(https://i.loli.net/2021/04/28/schEWS6PujqtZL5.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WXAluNji-1619606813056)(https://i.loli.net/2021/04/28/4n3IHOlaPfSR5FA.png)]
- 添加组员至组内
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dJTaL4m9-1619606813058)(https://i.loli.net/2021/04/28/bH7NxsL5OmyGvtC.png)]
1.Guest:可以创建issue、发表评论,不能读写版本库
2.Reporter:可以克隆代码,不能提交,QA、PM 可以赋予这个权限
3.Developer:可以克隆代码、开发、提交、push,普通开发可以赋予这个权限
4.Maintainer:可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心开发可以赋予这个 权限
5.Owner:可以设置项目访问权限 - Visibility Level、删除项目、迁移项目、管理组成员,开发组组 长可以赋予这个权限
- 修改权限
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f0zI0HcM-1619606813062)(https://i.loli.net/2021/04/28/8CtFduErhWIzOMa.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eZwKLWNa-1619606813065)(https://i.loli.net/2021/04/28/K7qjAeQBhX62yYR.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c8fWc9Av-1619606813068)(https://i.loli.net/2021/04/28/WwbRXiCTaHVkFfm.png)]
gitlab基础使用
一、组件介绍
1、nginx: 静态web服务器在这里插入代码片
2、gitlab-shell: 用于处理Git命令和修改authorized keys列表
3、gitlab-workhorse: 轻量级的反向代理服务器,可以处理一些大的HTTP请求(磁盘上的 CSS、JS 文件、文件上传下载等),处理 Git Push/Pull 请求,处理到Rails 的连接会反向代理给后端的unicorn(修改由 Rails 发送的响应或发送给 Rails 的请求,管理 Rails 的长期 WebSocket 连接等)。
4、logrotate:日志文件管理工具
5、postgresql:repository 中的数据(元数据,issue,合并请求 merge request 等 , 可以登录 Web 的用户
6、redis:缓存每个客户端的sessions和后台队列,负责分发任务。Redis需求的存储空间很小,大约每个用户25KB
7、sidekiq:用于在后台执行队列任务(异步执行)
8、unicorn:Gitlab 自身的 Web 服务器(Ruby Web Server),包含了 Gitlab 主进程,负责处理快速/一般任务,与 Redis 一起工作,配置参考:CPU核心数 + 1 = unicorn workers数量。
1. 通过检查存储在 Redis 中的用户会话来检查权限
2. 为 Sidekiq 制作任务
3. 从仓库(warehouse)取东西或在那里移动东西
9、gitlab-shell:用于 SSH 交互,而不是 HTTP。gitlab-shell 通过 Redis 与 Sidekiq 进行通信,并直接或通过 TCP 间接访问 Unicorn。用于处理Git命令和修改authorized keys列表
10、Gitaly:后台服务,专门负责访问磁盘以高效处理 gitlab-shell 和 gitlab-workhorse 的git 操作,并缓存耗时操作。所有的 git 操作都通过 Gitaly 处理,并向 GitLab web 应用程序提供一个 API,以从 git(例如 title, branches, tags, other meta data)获取属性,并获取 blob(例如 diffs,commits,files)
11、Sidekiq:后台核心服务,可以从redis队列中提取作业并对其进行处理。后台作业允许GitLab通过将工作移至后台来提供更快的请求/响应周期。Sidekiq任务需要来自Redis
12、prometheus:提供监控
二、常用命令
1.服务控制命令
1)启动/停止/重启所有 gitlab 组件:
gitlab-ctl start/stop/restart
2)启动指定模块组件:
gitlab-ctl start redis/postgresql/gitlab-workhorse/logrotate/nginx/sidekiq/unicorn
3)停止指定模块组件:
gitlab-ctl stop 模块名
4)查看服务状态
gitlab-ctl status
5)生成配置并启动服务
gitlab-ctl reconfigure
2.其他常用管理命令
1)查看版本
cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
2)检查gitlab
gitlab-rake gitlab:check SANITIZE=true --trace
3)实时查看日志
gitlab-ctl tail
4)关系数据库升级
gitlab-rake db:migrate
5)清理redis缓存
gitlab-rake cache:clear
6)升级gitlab-ce版本
# 关闭gitlab服务
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
gitlab-ctl stop nginx
# 备份gitlab
gitlab-rake gitlab:backup:create
# 升级rpm包
rpm -Uvh gitlab-ce-xxx.rpm
# 启动并查看gitlab版本信息
gitlab-ctl reconfigure
gitlab-ctl restart
head -1 /opt/gitlab/version-manifest.txt
# 常见报错
Error executing action `run` on resource 'ruby_block[directory resource: /var/opt/gitlab/git-data/repositories]'
# 解决方法:
sudo chmod 2770 /var/opt/gitlab/git-data/repositories
7)升级postgreSQL最新版本
gitlab-ctl pg-upgrade
3.日志
1)实时查看所有日志
gitlab-ctl tail
2)实时查看某个组件日志
gitlab-ctl tail [组件名称]
4.常用配置文件目录
主配置文件: /etc/gitlab/gitlab.rb
文档根目录: /opt/gitlab
默认存储库位置: /var/opt/gitlab/git-data/repositories
Nginx配置文件: /var/opt/gitlab/nginx/conf/gitlab-http.conf
Postgresql数据目录: /var/opt/gitlab/postgresql/data
5.gitlab管理员密码重置
[root@test bin]# gitlab-rails console production
-------------------------------------------------------------------------------------
GitLab: 11.10.4 (62c464651d2)
GitLab Shell: 9.0.0
PostgreSQL: 9.6.11
-------------------------------------------------------------------------------------
Loading production environment (Rails 5.0.7.2)
irb(main):001:0> user = User.where(id:1).first
=> #<User id:1 @root>
irb(main):002:0> user.password = 'qwer1234'
=> "qwer1234"
irb(main):003:0> user.password_confirmation = 'qwer1234'
=> "qwer1234"
irb(main):004:0> user.save
Enqueued ActionMailer::DeliveryJob (Job ID: 4752a4a4-4e85-4e8b-9f27-72788abfe97c) to Sidekiq(mailers) with arguments: "DeviseMailer", "password_change", "deliver_now", #<GlobalID:0x00007f519e7501d8 @uri=#<URI::GID gid://gitlab/User/1>>
=> true
irb(main):005:0> exit
6.使用smtp来发送邮件通知
vim /etc/gitlab/gitlab.rb
gitlab_rails['smtp_address'] = "smtp.yourdomain.com"
gitlab_rails['smtp_port'] = 25
gitlab_rails['smtp_user_name'] = "xxx"
gitlab_rails['smtp_password'] = "xxx"
gitlab_rails['smtp_domain'] = "smtp.yourdomain.com"
gitlab_rails['smtp_authentication'] = 'plain'
gitlab_rails['smtp_enable_starttls_auto'] = true
7.置gitlab访问模式为https
# 创建ssl证书存放目录
mkdir -p /etc/gitlab/ssl
chmod 0700 /etc/gitlab/ssl
# 上传证书,修改证书访问权限
chmod 600 /etc/gitlab/ssl/gitlab.xxx.com.crt
# 修改住配置,支持ssl访问
vim /etc/gitlab/gitlab.rb
external_url "[https://gitlab.bjwf125.com] (https://gitlab.bjwf125.com)"
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.xxx.com.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.xxx.com.key"
# 重启
gitlab-ctl reconfigure
# 开启防火墙
firewall-cmd --zone=public --add-port=443/tcp --permanent
firewal-cmd reload
8.Gitlab备份
gitlab备份的默认目录是/var/opt/gitlab/backups
1)备份命令
gitlab-rake gitlab:backup:create
#该命令会在备份目录(默认:/var/opt/gitlab/backups/)下创建一个tar压缩包xxxxxxxx_gitlab_backup.tar,其中开头的xxxxxx是备份创建的时间戳,这个压缩包包括GitLab整个的完整部分。
2)自动备份
#通过任务计划crontab 实现自动备份
0 2 * * * /usr/bin/gitlab-rake gitlab:backup:create
# 每天两点备份gitlab数据
3)备份配置文件
vim /etc/gitlab/gitlab.rb
gitlab_rails['manage_backup_path'] = true
gitlab_rails['backup_path'] = "/data/gitlab/backups" #指定gitlab备份目录
gitlab_rails['backup_archive_permissions'] = 0644 #生成的备份文件权限
gitlab_rails['backup_keep_time'] = 7776000 #备份保留天数为3个月(即90天,这里是7776000秒)
#重载生效
gitlab-ctl reconfigure
9.备份恢复
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
gitlab-rake gitbab:backup:restore BACKUP=xxxxxx(恢复文件)
gitlab-ctl start 启动gitlab