企业级 CI/CD 持续集成/交付/发布

一:Git、Github、Gitlab 的区别

Git是版本控制系统(git可以理解为是Github/Gitlab客户端工具)
Github是在线的基于Git的代码托管服务。 GitHub是2008年由Ruby on Rails编写而成。GitHub同时提供付费账户和免费账户。这两种账户都可以创建公开的代码仓库,可以创建私有的代码仓库
GitHub官网:www.github.com
github:代码仓库(分为私有仓库和公开仓库)
github账户也分为两种:付费账户、免费帐户
注册一个github账户(可以将脚本、yaml文件、py脚本、项目源码等存放在仓库中)
GitHub是国外的一个网站,所以访问起来会有点慢(https://github.com/
gitee(码云):在线代码仓库(国内: https://gitee.com/
gitlib:私有代码仓库(只供企业内部使用)
Gitlab 创建免费的私人repo(仓库)
1-企业级 CICD 持续集成交付发布 - 图1
1-企业级 CICD 持续集成交付发布 - 图2

二:Git介绍

  • Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
  • Git 是 Linus Torvalds(林纳斯·托瓦兹) 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
  • Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不需要服务器端软件支持。

    1、Git 与 SVN 区别

  • GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。

  • 如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应GIT提供的一些概念和特征。
  • Git 与 SVN 区别点:
    • GIT是分布式的,SVN不是(SVN采用集中式):这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。

举例:
假设有多台服务器,分布式就是说任意一台服务器都可以充当git服务器,可以从任意一台服务器上获取资源,来充当我们的客户端。而集中式是只有一台服务器,客户端想要获取资源只能从这台服务器上获取。

  • GIT把内容按元数据方式存储,而SVN是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。
  • GIT分支和SVN的分支不同:分支在SVN中一点都不特别,就是版本库中的另外的一个目录。

git可以创建多个分支,在子分支上所做的修改不影响主分支。

  • GIT没有一个全局的版本号,而SVN有:目前为止这是跟SVN相比GIT缺少的最大的一个特征。
  • GIT的内容完整性要优于SVN:GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。

    2、Git工作流程

  • git 工作流程
    • 克隆 Git 资源作为工作目录(即克隆资源到本地)。
    • 在克隆的资源上添加或修改文件。
    • 如果其他人修改了,你可以更新资源。
    • 在提交前查看修改。
    • 提交修改。
    • 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
  • Git 的工作流程示意图:

1-企业级 CICD 持续集成交付发布 - 图3

  • git的工作区、暂存区和版本库
    • 工作区:就是你在电脑里能看到的目录。
    • 暂存区:英文叫stage, 或index。一般存放在”git目录”下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
    • 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
  • 工作区、版本库中的暂存区和版本库之间的关系的示意图:

1-企业级 CICD 持续集成交付发布 - 图4
1-企业级 CICD 持续集成交付发布 - 图5

  • 图中左侧为工作区,右侧为版本库。在版本库中标记为 “index” 的区域是暂存区(stage, index),标记为 “master” 的是 master 分支所代表的目录树。
  • 图中 “HEAD” 实际是指向 master 分支的一个”游标”。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
  • 图中的 objects 标识的区域为 Git 的对象库,实际位于 “.git/objects” 目录下,里面包含了创建的各种对象及内容。
  • 当对工作区修改(或新增)的文件执行 “git add” 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
  • 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
  • 当执行 “git reset HEAD” 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
  • 当执行 “git rm —cached “ 命令时,会直接从暂存区删除文件,工作区则不做出改变。
  • 当执行 “git checkout .” 或者 “git checkout — “ 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。
  • 当执行 “git checkout HEAD .” 或者 “git checkout HEAD “ 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

git工作流程总结:
工作区就是克隆出来的目录,然后在目录里做的修改(文件的添加、修改等操作),然后提交到暂存区index(git add 文件),最后提交到.git(本地版本库),然后利用git push 提交到远程仓库(远程版本库)中。
修改==git add == 暂存区=git commint ==本地仓库 ==git push ==远程仓库

三:Git 安装使用

1.yum安装

环境:linux的centos操作系统
[root@xingdian-git ~]# yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel git-core //这步操作不做,这是安装插件
[root@git ~]# yum -y install git //使用此命令安装git
[root@xingdian-git ~]# git –version //查看版本
git version 1.8.3.1

2.Windows 平台上安装

  • 在 Windows 平台上安装 Git 同样轻松,有个叫做 msysGit 的项目提供了安装包,可以到 GitHub 的页面上下载 exe 安装文件并运行:
  • 安装包下载地址:https://gitforwindows.org/

1-企业级 CICD 持续集成交付发布 - 图6

  • 完成安装之后,就可以使用命令行的 git 工具(已经自带了 ssh 客户端)了,另外还有一个图形界面的 Git 项目管理工具。
  • 在开始菜单里找到”Git”->”Git Bash”,会弹出 Git 命令窗口,你可以在该窗口进行 Git 操作。

    3.Mac 平台上安装

  • 在 Mac 平台上安装 Git 最容易的当属使用图形化的 Git 安装工具,下载地址为:http://sourceforge.net/projects/git-osx-installer/

  • 安装界面如下所示:

1-企业级 CICD 持续集成交付发布 - 图7

四:Git使用

  • Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。
  • 这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:
    • /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 —system 选项,读写的就是这个文件。
    • ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 —global 选项,读写的就是这个文件。
    • 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。
  • 在 Windows 系统上,Git 会找寻用户主目录下的 .gitconfig 文件。主目录即 $HOME 变量指定的目录,一般都是 C:\Documents and Settings$USER。
  • 此外,Git 还会尝试找寻 /etc/gitconfig 文件,只不过看当初 Git 装在什么目录,就以此作为根目录来定位。

    1.Git 用户信息

    配置个人的用户名称和电子邮件地址:
    [root@xingdian-git ~]# git config —global user.name “xingdian”
    [root@xingdian-git ~]# git config —global user.email “xingdian@1000phone.com”

  • 如果用了 —global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。

  • 如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 —global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。

    2.查看配置信息

    [root@xingdian-git ~]# git config —list
    user.name=xingdian
    user.email=xingdian@1000phone.com
    这些配置我们也可以在 ~/.gitconfig 或 /etc/gitconfig 看到,如下所示:
    [root@xingdian-git ~]# cat ~/.gitconfig
    [user]
    name = xingdian
    email = xingdian@1000phone.com
    1-企业级 CICD 持续集成交付发布 - 图8

    3.Git 使用(需结合第六部分Github远程仓库一起使用)

    1、ssh 链接
    客户机上产生公钥上传到gitlab的SSH-Keys里,git clone下载和git push上传都没问题,这种方式很安全
    2、ssh连接github
    登录github,这是github的主页(如果没有账户需要注册)
    1-企业级 CICD 持续集成交付发布 - 图9
    创建仓库
    1-企业级 CICD 持续集成交付发布 - 图10
    1-企业级 CICD 持续集成交付发布 - 图11
    1-企业级 CICD 持续集成交付发布 - 图12
    1-企业级 CICD 持续集成交付发布 - 图13
    1-企业级 CICD 持续集成交付发布 - 图14
    找到ssh地址即可下载
    1-企业级 CICD 持续集成交付发布 - 图15
    如果想要上传本地到远程库需要提前做好ssh-key
    1-企业级 CICD 持续集成交付发布 - 图16
    1-企业级 CICD 持续集成交付发布 - 图17
    添加公钥
    1-企业级 CICD 持续集成交付发布 - 图18
    1-企业级 CICD 持续集成交付发布 - 图19
    1-企业级 CICD 持续集成交付发布 - 图20

    4.本地项目与远程服务器项目之间的交互

    [root@xingdian-git ~]# cd existing_folder #进入代码存在的文件夹,或者直接在该文件夹打开
    [root@xingdian-git ~]# git init # 初始化
    [root@xingdian-git ~]# git remote add origin git@XXX.git #添加远程项目地址(可从项目主页复制)
    [root@xingdian-git ~]# git add . #添加该文件夹中所有的文件到git的暂存区
    [root@xingdian-git ~]# git commit -m ‘note’ #提交所有代码到本机的版本库
    [root@xingdian-git ~]# git push -u origin master #将本地的更改提交到远程服务器
    1-企业级 CICD 持续集成交付发布 - 图21
    1-企业级 CICD 持续集成交付发布 - 图22
    1-企业级 CICD 持续集成交付发布 - 图23
    1-企业级 CICD 持续集成交付发布 - 图24
    1-企业级 CICD 持续集成交付发布 - 图25
    1-企业级 CICD 持续集成交付发布 - 图26
    1-企业级 CICD 持续集成交付发布 - 图27
    1-企业级 CICD 持续集成交付发布 - 图28
    1-企业级 CICD 持续集成交付发布 - 图29
    注意:
    github目前默认的主分支是main,本地的内容无法提交到main这个分支

    5.常用的git 命令

    [root@xingdian-git ~]# git init # 初始化
    [root@xingdian-git ~]# git add main.cpp # 将某一个文件添加到暂存区 ,
    [root@xingdian-git ~]# git add . # 将文件夹下的所有的文件添加到暂存区 .代表所有文件
    [root@xingdian-git ~]# git commit -m ‘note’ # 将暂存区中的文件保存成为某一个版本
    [root@xingdian-git ~]# git log # 查看所有的版本日志
    1-企业级 CICD 持续集成交付发布 - 图30
    [root@xingdian-git ~]# git status # 查看现在暂存区的状况
    1-企业级 CICD 持续集成交付发布 - 图31
    [root@xingdian-git ~]# git diff # 查看现在文件与上一个提交-commit版本的区别
    [root@xingdian-git ~]# git reset —hard HEAD^ # 回到上一个版本
    [root@xingdian-git ~]# git reset —hard XXXXX
    # XXX为版本编号,回到某一个版本
    [root@xingdian-git ~]# git pull origin master
    # 从主分支pull到本地
    [root@xingdian-git ~]# git push -u origin master
    # 从本地push到主分支
    [root@xingdian-git ~]# git pull
    # pull默认主分支
    [root@xingdian-git ~]# git push
    # push默认主分支 …

    5.版本穿梭

    版本回退

    用 git log 命令查看:
    # 每一个提交的版本都唯一对应一个 commit 版本号,
    # 使用 git reset 命令退到上一个版本:
    [root@xingdian-git ~]# git reset —hard HEAD^
    [root@xingdian-git ~]# git reflog
    # 查看命令历史,以便确定要回到哪个版本
    [root@xingdian-git ~]# git reset —hard commit_id
    # 比如git reset —hard 3628164

消失的ID号:
回到早期的版本后再查看git log会发现最近的版本消失,可以使用reflog查看消失的版本ID,用于回退到消失的版本
[root@xingdian-git ~]# git reflog
1-企业级 CICD 持续集成交付发布 - 图32
1-企业级 CICD 持续集成交付发布 - 图33

分支管理

1.创建分支
[root@xingdian-git ~]# git checkout -b dev #创建dev分支,然后切换到dev分支
[root@xingdian-git ~]# git checkout #命令加上-b参数表示创建并切换,相当于以下两条命令:
[root@xingdian-git ~]# git branch dev #创建dev分支
[root@xingdian-git ~]# git branch #命令查看当前分支,
[root@git ceshi]# git checkout xiaotian #切换分支
1-企业级 CICD 持续集成交付发布 - 图34
[root@xingdian-git ~]# git branch #命令会列出所有分支,当前分支前面会标一个
[root@xingdian-git ~]# git branch
dev master
[root@xingdian-git ~]# git add readme.txt
git commit -m “branch test” # 在dev分支上正常提交.
注意:
Master分支上,创建完分支后,会自动同步master分支中拥有的内容。但是其余分支中创建的内容,若不同步到主分支,,master中是不会同步显示其余分支中未合并的文件
创建分支时,当前分支的目录下有什么内容,新创建的分支,会同步这个分支的内容
简言之,就是你创建分支的时候,目录下有哪些文件(这个取决于分支
),那么这个分支里就有哪些文件
2.分支切换
[root@xingdian-git ~]# git checkout master # 切换回master分支
# 查看一个readme.txt文件,刚才添加的内容不见了,因为那个提交是在dev分支上,而master分支此刻的提交点并没有变
1-企业级 CICD 持续集成交付发布 - 图35
1-企业级 CICD 持续集成交付发布 - 图36
1-企业级 CICD 持续集成交付发布 - 图37
1-企业级 CICD 持续集成交付发布 - 图38
1-企业级 CICD 持续集成交付发布 - 图39
1-企业级 CICD 持续集成交付发布 - 图40
1-企业级 CICD 持续集成交付发布 - 图41
当遇到在远程仓库中创建了文件,本地仓库提交文件失败的情况:
1-企业级 CICD 持续集成交付发布 - 图42
解决办法:
1-企业级 CICD 持续集成交付发布 - 图43
这样就能提交成功了。
git使用总结:
git command 参数的含义

1.默认情况下,创建一个空目录,我们使用git init对一个目录进行初始化,初始化后会产生 .git 隐藏目录(暂存区…..,版本库[.git])
2.在git init(初始化)后的目录下,进行修改(创建文件,更改文件内容等等)
3.先提交到暂存区【git add .】
4.提交到版本库【git commit -m “node”】
5.指定远程仓库【git remote add origin 地址】
6.提交到远程仓库【git push -u origin master】 本地master分支是第一次提交的时候,默认给我创建的一个名为master的分支

a:如何使用分支 【git branch 名字 === 创建分支】
git branch —list 查看分支
git chechkout xingdian 分支切换
注意:
在哪个分支下修改就提交到哪个分支
举例说明:
[root@git diandian]# touch ddd //创建一个文件
[root@git diandian]# git add ddd //将文件提交到暂存区
[root@git diandian]# git commit -m “ddd” //提交到版本库
[a 8472bc2] ddd
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 ddd
[root@git diandian]# git push -u origin a
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 264 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'a' on GitHub by visiting:
remote: 1-企业级 CICD 持续集成交付发布 - 图44https://github.com/blackmed/diandiancloud/pull/new/a
remote:
To git@github.com:blackmed/diandiancloud.git
[new branch] a -> a
Branch a set up to track remote branch a from origin.
[root@git diandian]# touch e
[root@git diandian]# git add e
[root@git diandian]# git commit -m “e”
[a 2bf23c3] e
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 e
[root@git diandian]# git branch —list
a
master
[root@git diandian]# git push -u origin master
Branch master set up to track remote branch master from origin.
Everything up-to-date
[root@git diandian]#
3.合并分支
[root@xingdian-git ~]# git merge dev # 把dev分支的工作成果合并到master分支上
[root@xingdian-git ~]# git merge # 命令用于合并指定分支到当前分支。
# 合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。
[root@xingdian-git ~]# git branch -d dev #删除dev分支了:
删除后,查看branch,就只剩下master分支了.
1-企业级 CICD 持续集成交付发布 - 图45
1-企业级 CICD 持续集成交付发布 - 图46

五:安装本地 Git 服务器

1、创建用户初始化仓库

[root@xingdian-git ~]# useradd git
[root@xingdian-git ~]# passwd git
[root@xingdian-git ~]# mkdir /git-root/
[root@xingdian-git ~]# cd /git-root/
[root@xingdian-git git-root]# git init —bare shell.git
Initialized empty Git repository in /git-root/shell.git/

  • 注意:git init 和 git init –bare 的区别:
  • 使用—bare选项时,不再生成.git目录,而是只生成.git目录下面的版本历史记录文件,这些版本历史记录文件也不再存放在.git目录下面,而是直接存放在版本库的根目录下面.
  • 用”git init”初始化的版本库用户也可以在该目录下执行所有git方面的操作。但别的用户在将更新push上来的时候容易出现冲突。
  • 使用”git init –bare”方法创建一个所谓的裸仓库,之所以叫裸仓库是因为这个仓库只保存git历史提交的版本信息,而不允许用户在上面进行各种git操作,如果你硬要操作的话,只会得到下面的错误(”This operation must be run in a work tree”)这个就是最好把远端仓库初始化成bare仓库的原因

1-企业级 CICD 持续集成交付发布 - 图47

2、给项目添加权限推送公钥

[root@xingdian-git ~]# chown -R git:git shell.git
这里是客户端推送公钥给git-server
[root@xingdian-git ~]# ssh-copy-id git@192.168.1.102
1-企业级 CICD 持续集成交付发布 - 图48

3、拉取项目推送内容测试

[root@xingdian-git ~]# cd /opt/
[root@xingdian-git opt]# git clone git@192.168.1.102:/git-root/shell.git
Cloning into ‘shell’…
The authenticity of host ‘192.168.1.102 (192.168.1.102)’ can’t be established.
ECDSA key fingerprint is SHA256:mytNPhHxff0nDGl3LGorCnwAscYkBONVssV44ntQFjw.
ECDSA key fingerprint is MD5:a4:30:b9:1c:35:4a:3b:9c:e5:3d:24:7c:62:26:c7:35.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘192.168.1.102’ (ECDSA) to the list of known hosts.
warning: You appear to have cloned an empty repository.

[root@xingdian-git opt]# ls
rh shell
[root@xingdian-git opt]# cd shell/
[root@xingdian-git shell]# vim test1.sh
[root@xingdian-git shell]# git add test1.sh
[root@xingdian-git shell]# git commit -m ‘first commit’
[master (root-commit) 33c5fbf] first commit
1 file changed, 2 insertions(+)
create mode 100644 test1.sh
[root@xingdian-git shell]# git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 230 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.1.102:/git-root/shell.git
* [new branch] master -> master
1-企业级 CICD 持续集成交付发布 - 图49
1-企业级 CICD 持续集成交付发布 - 图50
1-企业级 CICD 持续集成交付发布 - 图51
总结:
当要创建git服务器时,初始化用的是 git init —bare
创建一个git工作目录时,初始化用的是 git init
从远端服务器或者是从git服务器上克隆的项目,不需要本地执行初始化操作(git init),自带 .git的版本库
git pull -u origin master

六:Github 远程仓库

1、github.com 注册账户

2、github 上创建仓库

3、本地服务器生成 ssh 公钥

[root@git ~]# ssh-keygen //接着一路回车即可
1-企业级 CICD 持续集成交付发布 - 图52
1-企业级 CICD 持续集成交付发布 - 图53

4、 github 添加 ssh 公钥

连接远程仓库(创建一个测试存储库)

在 github 网站新建一个仓库,命名为linux
~
[root@xingdian-git ~]# cd /opt
[root@xingdian-git ~]# mkdir linux
[root@xingdian-git ~]# cd linux
~
# git 初始化,然后做第一个基本的git操作(需要在github上创建存储库)
[root@xingdian-git linux]# git init
[root@xingdian-git linux]# touch README
[root@xingdian-git linux]# git add README
[root@xingdian-git linux]# git commit -m ‘first commit’
[root@xingdian-git linux]# git remote add origin git@qfedu.comhub.com:userhub/linux.git
~
# 若出现origin已经存在的错误,删除origin
[root@xingdian-git linux]# git remote rm origin
# 现在继续执行push到远端
~
[root@xingdian-git linux]# git remote add origin git@qfedu.comhub.com:userhub/linux.git
[root@xingdian-git linux]# git push -u origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 205 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@qfedu.comhub.com:fakehydra/linux-.git
* [new branch] master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
# 注意
# 设置存储库链接
[root@xingdian-git ~]# git remote set-url origin git@qfedu.comhub.com:userhub/linux.git
# 如果 push 失败,合并分支到 master 再 push
[root@xingdian-git ~]# git pull —rebase origin master

七:Gitlab Server 部署

资源环境

主机名 IP地址 服务
cicd-gitlab 10.0.1.86 gitlab-ce (13)

1、修改主机名

[root@localhost ~]# hostnamectl —static set-hostname cicd-gitlab

2、关闭防火墙

[root@cicd-gitlab ~]# systemctl stop iptables firewalld
[root@cicd-gitlab ~]# systemctl disable iptables firewalld

3、开启邮件服务

[root@cicd-gitlab ~]# systemctl start postfix
[root@cicd-gitlab ~]# systemctl enable postfix

4、关闭 SELinux

[root@cicd-gitlab ~]# sed -ri ‘/SELINUX=/cSELINUX=disabled’ /etc/selinux/config
[root@cicd-gitlab ~]# setenforce 0 # 临时关闭SELinux
[root@cicd-gitlab ~]# reboot
[root@cicd-gitlab ~]# vim /etc/hosts
10.0.1.86 gitlab.qfedu.com

5、添加 hosts

6、安装 Gitlab 依赖包

[root@cicd-gitlab ~]# yum install -y curl openssh-server openssh-clients postfix cronie policycoreutils-python

7、添加 Gitlab 安装源 (根据需求配置源)

阿里源
[root@cicd-gitlab ~]# vim /etc/yum.repos.d/gitlab-ce.repo
[gitlab-ce]
name=gitlab-ce
baseurl=http://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7
Repo_gpgcheck=0
Enabled=1
gpgcheck=0
清华源:
[root@cicd-gitlab ~]# vim gitlab-ce.repo
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
gpgcheck=0
enabled=1

[root@cicd-gitlab ~]# vim gitlab-ee.repo
[gitlab-ee]
name=Gitlab EE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ee/yum/el$releasever/
gpgcheck=0
enabled=1
官方源:
[root@cicd-gitlab ~]# vim runner_gitlab-ci-multi-runner.repo
[runner_gitlab-ci-multi-runner]
name=runner_gitlab-ci-multi-runner
baseurl=https://packages.gitlab.com/runner/gitlab-ci-multi-runner/el/7/$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packages.gitlab.com/runner/gitlab-ci-multi-runner/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300

[runner_gitlab-ci-multi-runner-source]
name=runner_gitlab-ci-multi-runner-source
baseurl=https://packages.gitlab.com/runner/gitlab-ci-multi-runner/el/7/SRPMS
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packages.gitlab.com/runner/gitlab-ci-multi-runner/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
[root@cicd-gitlab ~]# curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash

8、安装 Gitlab(根据需要选择 ce/ee)

[root@cicd-gitlab ~]# yum -y install gitlab-ce # 自动安装最新版
ce: 社区版
ee:企业版
1-企业级 CICD 持续集成交付发布 - 图54
安装过程中如果遇到这种错误:
1-企业级 CICD 持续集成交付发布 - 图55
可查看以下网址中的解决办法:
https://blog.csdn.net/Kangyucheng/article/details/109898756
https://kangyucheng.blog.csdn.net/article/details/121860327

配置 Gitlab

1、查看Gitlab版本

[root@xingdian-git ~]# head -1 /opt/gitlab/version-manifest.txt
gitlab-ce 13.6.1

2、Gitlab 配置登录链接

设置登录链接
[root@cicd-gitlab ~]# vim /etc/gitlab/gitlab.rb

## GitLab URL
##! URL on which GitLab will be reachable.
##! For more details on configuring external_url see:
##! https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-the-external-url-for-gitlab
# 没有域名,可以设置为本机IP地址
external_url ‘http://10.0.1.86

[root@cicd-gitlab ~]# grep “^external_url” /etc/gitlab/gitlab.rb
external_url ‘http://10.0.1.86‘ #绑定监听的域名或IP

3、初始化 Gitlab (第一次使用配置时间较长)

[root@cicd-gitlab ~]# gitlab-ctl reconfigure
…..

4、启动 Gitlab 服务

[root@cicd-gitlab ~]# gitlab-ctl start

[root@cicd-gitlab ~]# lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 22500 root 7u IPv4 50923 0t0 TCP :http (LISTEN)
nginx 22501 gitlab-www 7u IPv4 50923 0t0 TCP
:http (LISTEN)

使用 Gitlab

1、Gitlab 服务管理

[root@cicd-gitlab ~]# gitlab-ctl start # 启动所有 gitlab 组件;
[root@cicd-gitlab ~]# gitlab-ctl stop # 停止所有 gitlab 组件;
[root@cicd-gitlab ~]# gitlab-ctl restart # 重启所有 gitlab 组件;
[root@cicd-gitlab ~]# gitlab-ctl status # 查看服务状态;
[root@cicd-gitlab ~]# gitlab-ctl reconfigure # 初始化服务;
[root@cicd-gitlab ~]# vim /etc/gitlab/gitlab.rb # 修改默认的配置文件;
[root@cicd-gitlab ~]# gitlab-ctl tail # 查看日志;

2、登陆 Gitlab

在浏览器中输入 http://192.168.152.148 ,然后 change password: ,并使用root用户登录 即可 (后续动作根据提示操作)
登录注意:
1. 执行命令, 进入交互界面
gitlab-rails console -e production
2. 执行如下命令, 修改root密码为你想要的密码, 无需重启即可完成设置
u=User.where(id:1).first # u定义为root用户
u.password=’你的密码’ # 设置root密码, 注意需要符合密码强度
u.password_confirmation=’你的密码’ # 确认当前密码
u.save! # 保存操作
quit # 退出交互界面
1-企业级 CICD 持续集成交付发布 - 图56
修改默认端口

  • 如果需要手工修改nginx的port ,可以在gitlab.rb中设置 nginx[‘listen_port’] = 8000 ,然后再次 gitlab-ctl reconfigure即可
  • 登录 gitlab 如下所示(首次登陆设置 root 密码):

1-企业级 CICD 持续集成交付发布 - 图57
设置中文
1-企业级 CICD 持续集成交付发布 - 图58
1-企业级 CICD 持续集成交付发布 - 图59

Gitlab 设置 HTTPS 方式

1、创建私有密钥

[root@cicd-gitlab ~]# mkdir -p /etc/gitlab/ssl
[root@cicd-gitlab ~]# openssl genrsa -out “/etc/gitlab/ssl/gitlab.example.com.key” 2048
Generating RSA private key, 2048 bit long modulus
……………+++
…………………………………………………………………….+++
e is 65537 (0x10001)

2、创建私有证书

[root@cicd-gitlab ~]# openssl req -new -key “/etc/gitlab/ssl/gitlab.example.com.key” -out “/etc/gitlab/ssl/gitlab.example.com.csr”
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
——-
Country Name (2 letter code) [XX]:cn
State or Province Name (full name) []:sh
Locality Name (eg, city) [Default City]:sh
Organization Name (eg, company) [Default Company Ltd]: #输入空格,然后回车
Organizational Unit Name (eg, section) []: #输入空格,然后回车
Common Name (eg, your name or your server’s hostname) []:gitlab.example.com
Email Address []:admin@example.com

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []: #直接回车
查看
[root@cicd-gitlab ~]# ll /etc/gitlab/ssl/
total 8
-rw-r—r— 1 root root 1066 Jan 2 15:32 gitlab.example.com.csr
-rw-r—r— 1 root root 1679 Jan 2 15:30 gitlab.example.com.key

3、创建CRT签署证书

  • 利用私有密钥和私有证书创建CRT签署证书

[root@cicd-gitlab ~]# openssl x509 -req -days 365 -in “/etc/gitlab/ssl/gitlab.example.com.csr” -signkey “/etc/gitlab/ssl/gitlab.example.com.key” -out “/etc/gitlab/ssl/gitlab.example.com.crt”
Signature ok
subject=/C=cn/ST=sh/L=sh/O= /OU= /CN=gitlab.example.com/emailAddress=admin@example.com
Getting Private key
查看
[root@cicd-gitlab ~]# ll /etc/gitlab/ssl/
total 12
-rw-r—r— 1 root root 1265 Jan 2 15:39 gitlab.example.com.crt
-rw-r—r— 1 root root 1066 Jan 2 15:32 gitlab.example.com.csr
-rw-r—r— 1 root root 1679 Jan 2 15:30 gitlab.example.com.key

4、创建pem证书

利用openssl命令输出pem证书
[root@gitlab ~]# openssl dhparam -out /etc/gitlab/ssl/dhparam.pem 2048
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
………………………………………………..+……………………………………………………………………..+……………………………….+……………………………………………………………………….+……………………………………….+………………………………………………………………………………………………………………….+..+……………………………………………………………………………………………………………………….+…………………………………………………………………………………………………………………………………………………………+……+…………..+……………………………………………..+……………..+……………………………………………………………………………+..+……………………………………………………………………………………………………………………………….+………………………………………………….+………….+………+…………………………………………………..+…………………………………………………………………………………………………………………………………………………………………………………………………………….+……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………….++++

5、查看生成的证书

[root@cicd-gitlab ~]# ll /etc/gitlab/ssl/
total 16
-rw-r—r— 1 root root 424 Jan 2 15:46 dhparam.pem
-rw-r—r— 1 root root 1265 Jan 2 15:39 gitlab.example.com.crt
-rw-r—r— 1 root root 1066 Jan 2 15:32 gitlab.example.com.csr
-rw-r—r— 1 root root 1679 Jan 2 15:30 gitlab.example.com.key

6、更改文件权限

[root@cicd-gitlab ~]# chmod 600 /etc/gitlab/ssl/*
[root@cicd-gitlab ~]# ll /etc/gitlab/ssl/
total 16
-rw———- 1 root root 424 Jan 2 15:46 dhparam.pem
-rw———- 1 root root 1265 Jan 2 15:39 gitlab.example.com.crt
-rw———- 1 root root 1066 Jan 2 15:32 gitlab.example.com.csr
-rw———- 1 root root 1679 Jan 2 15:30 gitlab.example.com.key

7、配置 gitlab

[root@cicd-gitlab ~]# cp /etc/gitlab/gitlab.rb{,.bak}
[root@cicd-gitlab ~]# vim /etc/gitlab/gitlab.rb
## 更改如下
13 external_url ‘https://gitlab.example.com‘ 13行左右
952 nginx[‘redirect_http_to_https’] = true
964 nginx[‘ssl_certificate’] = “/etc/gitlab/ssl/gitlab.example.com.crt”
965 nginx[‘ssl_certificate_key’] = “/etc/gitlab/ssl/gitlab.example.com.key”
979 # nginx[‘ssl_dhparam’] = “/etc/gitlab/ssl/dhparam.pem” # Path to dhparams.pem, eg. /etc/gitlab/ssl/dhparams.pem

8、初始化gitlab相关服务配置

[root@cicd-gitlab ~]# gitlab-ctl reconfigure
Starting Chef Client, version 13.6.4
resolving cookbooks for run list: [“gitlab”]
Synchronizing Cookbooks:
- gitlab (0.0.1)
- package (0.1.0)
- postgresql (0.1.0)
- redis (0.1.0)
- mattermost (0.1.0)
- registry (0.1.0)
- gitaly (0.1.0)
- consul (0.0.0)
- nginx (0.1.0)
- runit (0.14.2)
- letsencrypt (0.1.0)
- acme (3.1.0)
- crond (0.1.0)
- compat_resource (12.19.0)
Installing Cookbook Gems:
Compiling Cookbooks…
Recipe: gitlab::default
directory[/etc/gitlab] action create
- change mode from ‘0755’ to ‘0775’
Converging 493 resources
directory[/etc/gitlab] action create (up to date)
directory[Create /var/opt/gitlab] action create
- create new directory /var/opt/gitlab
- change mode from ‘’ to ‘0755’
- change owner from ‘’ to ‘root’
- change group from ‘’ to ‘root’
directory[/opt/gitlab/embedded/etc] action create
- create new directory /opt/gitlab/embedded/etc
- change mode from ‘’ to ‘0755’
- change owner from ‘’ to ‘root’
- change group from ‘’ to ‘root’
* template[/opt/gitlab/embedded/etc/gitconfig] action create
- create new file /opt/gitlab/embedded/etc/gitconfig
- update content in file /opt/gitlab/embedded/etc/gitconfig from none to 987af3

。。。。过程有点长,需要等一会(看个人服务器配置了)
Running handlers:
Running handlers complete
Chef Client finished, 454/655 resources updated in 02 minutes 16 seconds
gitlab Reconfigured!
# 出现这个表示配置没有问题!

9、nginx 配置(这部分是访问失败时做的操作)

[root@cicd-gitlab ~]# cp /var/opt/gitlab/nginx/conf/gitlab-http.conf{,.bak}
[root@cicd-gitlab ~]# vim /var/opt/gitlab/nginx/conf/gitlab-http.conf
[如果可以正常访问,这里可以不做配置]
37 server_name gitlab.example.com; #在此行下面添加38行的内容
38 rewrite ^(.*)$ https://$host$1 permanent;
1-企业级 CICD 持续集成交付发布 - 图60

10、重启 gitlab

[root@cicd-gitlab ~]# gitlab-ctl restart
ok: run: alertmanager: (pid 6526) 1s
ok: run: gitaly: (pid 6543) 0s
ok: run: gitlab-monitor: (pid 6556) 0s
ok: run: gitlab-workhorse: (pid 6579) 1s
ok: run: logrotate: (pid 6589) 0s
ok: run: nginx: (pid 6597) 1s
ok: run: node-exporter: (pid 6681) 0s
ok: run: postgres-exporter: (pid 6687) 1s
ok: run: postgresql: (pid 6698) 0s
ok: run: prometheus: (pid 6706) 0s
ok: run: redis: (pid 6722) 0s
ok: run: redis-exporter: (pid 6856) 0s
ok: run: sidekiq: (pid 6866) 0s
ok: run: unicorn: (pid 6880) 0s
# 可以看出gitlab的所有服务重启完成

11、浏览器登录 gitlab

https://gitlab.example.com
1-企业级 CICD 持续集成交付发布 - 图61
1-企业级 CICD 持续集成交付发布 - 图62
1-企业级 CICD 持续集成交付发布 - 图63
总结:修改配置文件,停止服务,重新初始化,重新启动

Gitlab 添加 SMTP 邮件功能

1、配置邮件功能

[root@cicd-gitlab ~]# grep -P “^[^#].*smtp_|user_email|gitlab_email” /etc/gitlab/gitlab.rb
gitlab_rails[‘smtp_enable’] = true
gitlab_rails[‘smtp_address’] = “smtp.163.com”
gitlab_rails[‘smtp_port’] = 465
gitlab_rails[‘smtp_user_name’] = “zhuangyaovip@163.com”
gitlab_rails[‘smtp_password’] = “FULLECVMSVNBSDJH”
gitlab_rails[‘smtp_domain’] = “163.com”
gitlab_rails[‘smtp_authentication’] = “login”
gitlab_rails[‘smtp_enable_starttls_auto’] = true
gitlab_rails[‘smtp_tls’] = true
gitlab_rails[‘gitlab_email_enabled’] = true
gitlab_rails[‘gitlab_email_from’] = ‘zhuangyaovip@163.com’
gitlab_rails[‘gitlab_email_display_name’] = ‘Example’
gitlab_rails[‘gitlab_email_reply_to’] = ‘1311529042@qq.com’
gitlab_rails[‘gitlab_email_subject_suffix’] = ‘gitlab’
# gitlab_rails[‘gitlab_email_smime_enabled’] = false
# gitlab_rails[‘gitlab_email_smime_key_file’] = ‘/etc/gitlab/ssl/gitlab_smime.key’
# gitlab_rails[‘gitlab_email_smime_cert_file’] = ‘/etc/gitlab/ssl/gitlab_smime.crt’
# gitlab_rails[‘gitlab_email_smime_ca_certs_file’] = ‘/etc/gitlab/ssl/gitlab_smime_cas.crt’
# user[‘git_user_email’] = “gitlab@#{node[‘fqdn’]}”
注意:
在以上配置中要填写两个不同的邮箱,注意两个邮箱都要开启SMTP,防止接收不到消息。

2、停止gitlab服务

[root@cicd-gitlab ~]# gitlab-ctl stop
ok: down: gitaly: 0s, normally up
ok: down: gitlab-monitor: 1s, normally up
ok: down: gitlab-workhorse: 0s, normally up
ok: down: logrotate: 1s, normally up
ok: down: nginx: 0s, normally up
ok: down: node-exporter: 1s, normally up
ok: down: postgres-exporter: 0s, normally up
ok: down: postgresql: 0s, normally up
ok: down: prometheus: 0s, normally up
ok: down: redis: 0s, normally up
ok: down: redis-exporter: 1s, normally up
ok: down: sidekiq: 0s, normally up
ok: down: unicorn: 1s, normally up

3、修改配置后需要初始化配置

[root@cicd-gitlab ~]# gitlab-ctl reconfigure
……

4、启动服务

[root@cicd-gitlab ~]# gitlab-ctl start
ok: run: gitaly: (pid 37603) 0s
ok: run: gitlab-monitor: (pid 37613) 0s
ok: run: gitlab-workhorse: (pid 37625) 0s
ok: run: logrotate: (pid 37631) 0s
ok: run: nginx: (pid 37639) 1s
ok: run: node-exporter: (pid 37644) 0s
ok: run: postgres-exporter: (pid 37648) 1s
ok: run: postgresql: (pid 37652) 0s
ok: run: prometheus: (pid 37660) 1s
ok: run: redis: (pid 37668) 0s
ok: run: redis-exporter: (pid 37746) 0s
ok: run: sidekiq: (pid 37750) 1s
ok: run: unicorn: (pid 37757) 0s

5、Gitlab 发送邮件测试

[root@cicd-gitlab ~]# gitlab-rails console
Loading production environment (Rails 4.2.10)
irb(main):001:0> Notify.test_email(‘1311529042@qq.com’, ‘Message Subject’, ‘Message Body’).deliver_now

Notify#test_email: processed outbound mail in 2219.5ms

Sent mail to user@destination.com (2469.5ms)
Date: Fri, 04 May 2018 15:50:10 +0800
From: Admin username@domain.cn
Reply-To: Admin username@domain.cn
To: user@destination.com
Message-ID: 5aec10b24cfaa_93933fee282db10c162d@vm1.mail
Subject: Message Subject
Mime-Version: 1.0
Content-Type: text/html;
charset=UTF-8tt
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">

Message Body

=> #, >, >, , >, , , , , , >
irb(main):002:0>quit

6、邮箱客户端查看邮件

1-企业级 CICD 持续集成交付发布 - 图641-企业级 CICD 持续集成交付发布 - 图65

Gitlab 创建项目组 group

1-企业级 CICD 持续集成交付发布 - 图66

组名为plat-sp

1-企业级 CICD 持续集成交付发布 - 图67

Gitlab 去掉用户的自动注册功能(安全)

admin are -> settings -> Sign-up Restrictions 去掉钩钩,然后拉到最下面保存,重新登录
1-企业级 CICD 持续集成交付发布 - 图68

八:Gitlab 开发代码提交处理流程

1、公司代码提交合并流程

  • PM(项目主管/项目经理)在gitlab创建任务,分配给开发人员
  • 开发人员领取任务后,在本地使用git clone拉取代码库
  • 开发人员创建开发分支(git checkout -b dev),并进行开发
  • 开发人员完成之后,提交到本地仓库(git commit )
  • 开发人员在gitlab界面上申请分支合并请求(Merge request)
  • PM在gitlab上查看提交和代码修改情况,确认无误后,确认将开发人员的分支合并到主分支(master)
  • 开发人员在gitlab上Mark done确认开发完成,并关闭issue。这一步在提交合并请求时可以通过描述中填写”close #1”等字样,可以直接关闭issue

    2、创建项目管理用户xingdian

    1-企业级 CICD 持续集成交付发布 - 图69
    同样的方法,再创建 Eric 、Hellen 用户。用户添加完毕后,gitlab 会给用户发一封修改密码的邮件,各用户需要登录自己的邮箱,并点击相关的链接,设置新密码。
    1-企业级 CICD 持续集成交付发布 - 图70

    3、将 xingdian 用户添加到组中,指定为本组的 owner

    1-企业级 CICD 持续集成交付发布 - 图711-企业级 CICD 持续集成交付发布 - 图72

    4、同样的方法将用户Eric、Hellen 添加到组中,并指定为Developer

    1-企业级 CICD 持续集成交付发布 - 图73

    5、使用 xingdian 用户的身份与密码登录到 gitlab 界面中,并创建项目 Project

    1-企业级 CICD 持续集成交付发布 - 图74
    1-企业级 CICD 持续集成交付发布 - 图75
    1-企业级 CICD 持续集成交付发布 - 图76
    1-企业级 CICD 持续集成交付发布 - 图77

    6、为项目创建 Dev分支

    1-企业级 CICD 持续集成交付发布 - 图78
    1-企业级 CICD 持续集成交付发布 - 图79

    7、在 client 上添加 xingdian 的用户

    [git@qfedu.com ~]# useradd xingdian
    [git@qfedu.com ~]# useradd Hellen
    [git@qfedu.com ~]# useradd Eric
    [git@qfedu.com ~]# useradd test
    [git@qfedu.com ~]# su - Tompson
    [Tompson@qfedu.com ~]$ ssh-keygen -C 222@qq.com
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/Tompson/.ssh/id_rsa):
    Created directory ‘/home/Tompson/.ssh’.
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/Tompson/.ssh/id_rsa.
    Your public key has been saved in /home/Tompson/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:SAoAH2zSxqEJqVgKKrxM5XMi6tKe61JMRdwMhwBNIrE Tompson@domain.cn
    The key’s randomart image is:
    +—-[RSA 2048]——+
    |XX==o=. |
    |BOo+.o |
    |E
    =. . |
    |*+.= + . |
    |=oo = . S |
    |.oo |
    |.o |
    |o… |
    |.+=. |
    +——[SHA256]——-+
    [Tompson@qfedu.com ~]$ cat .ssh/id_rsa.pub
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDZ8cRGHej+sZzlmK36W5MUXMLOGdTwFI9Jj44mGuabZCrlYW4GDpL6ppezN+Sur0wHtnKonYJzm8ntqS0S0UHyaPPQPl9Mrs/6Z4VrXZ/4RlqHdWeSrmOwCBQld0l8HvrmP4TyGHrOreO8uZqimd/Z+OiMqnYRZzENX11Pti/Px5g1MtJcoCi9uLtF42QYrt1X/fzAyPU9C5/5ZUq4Jln3EF20bzcA52oAzZIl0jrhI0TeTeW6zYq+KxdHGshL+qG7+Ne+akPOe4Ma5BQjcMZ2dQ2kbGuozXmLT8RDcj9YRKceQsUdTI71lJpwrWKGn8Vhra0EaK3hgoTuvMYaGfOF Tompson@domain.cn

    8、将 xingdian 的公钥复制到 gitlab 中

    使用 xingdian 用户的身份与密码登录到 gitlab界面中,然后在 ssh-key 中添加相关的key
    1-企业级 CICD 持续集成交付发布 - 图80
    1-企业级 CICD 持续集成交付发布 - 图81

    9、为 xingdian 用户配置 git

    [xingdian@qfedu.com ~]$ git config —global user.email “222@qq.com”
    [xingdian@qfedu.com ~]$ git config —global user.name “tom”

[xingdian@qfedu.com ~]$ git clone git@192.168.60.119:plat-sp/chathall.git
Cloning into ‘chathall’…
The authenticity of host ‘192.168.60.119 (192.168.60.119)’ can’t be established.
ECDSA key fingerprint is SHA256:CDxAQmj6gUkIxB6XUofbZ853GuPM5LS2QO4a5dD7jRo.
ECDSA key fingerprint is MD5:4e:20:72:a7:46:c6:d7:5d:bb:9d:ce:c3:f3:da:43:f9.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘192.168.60.119’ (ECDSA) to the list of known hosts.
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
[xingdian@qfedu.com ~]$
[xingdian@qfedu.com ~]$ cd chathall/
[xingdian@qfedu.com chathall]$ ls
Readme.txt
[xingdian@qfedu.com chathall]$

10、创建新文件,添加内容,并提交到 master 分支

[xingdian@qfedu.com chathall]$ vim test.sh
[xingdian@qfedu.com chathall]$ cat test.sh
#!/bin/bash
echo “gitlab test”
[xingdian@qfedu.com chathall]$ git add .
[xingdian@qfedu.com chathall]$ git commit -m ‘201805101649’
[master 80edf6b] 201805101649
1 file changed, 2 insertions(+)
create mode 100644 test.sh
[xingdian@qfedu.com chathall]$
[xingdian@qfedu.com chathall]$ git push -u origin master
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 305 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.60.119:plat-sp/chathall.git
4611654..80edf6b master -> master
Branch master set up to track remote branch master from origin.
[xingdian@qfedu.com chathall]$

11、使用 Eric 用户登录,并 clone 项目

[git@qfedu.com ~]# su - Eric
[Eric@qfedu.com ~]$ ssh-keygen -C Eric@domain.cn
Generating public/private rsa key pair.
Enter file in which to save the key (/home/Eric/.ssh/id_rsa):
Created directory ‘/home/Eric/.ssh’.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/Eric/.ssh/id_rsa.
Your public key has been saved in /home/Eric/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:VZaJvjA5SJZEB+yuRpDBNHCECCZ5R8X0DYcNE0f1B6E Eric@domain.cn
The key’s randomart image is:
+—-[RSA 2048]——+
|O=..Bo*+o+oo. |
|
.+.. o.oooo . |
| . + + ..oo E . .|
| o o =.. . |
| . . S+ . |
| . . . |
| . . |
| o |
| . |
+——[SHA256]——-+

[Eric@qfedu.com ~]$ cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDxQcn4UjRW/5PT5witeV9+S2w8WK5ouawHxEF7s9wuWsT4pqhcu5BN74NG3CPaq1jJZnkV+aQsTw+60BAd1gOK0FBbKWxmohmE61n9vfpUT5igJ72t2jpXjfKwLIHw+Iq5yM4yUhkwSsoBuZkxYSEltnj8OvXaOlCDYnXuGBa9+xO8f5yVIcOtiwRvv+Y1PRRzSIcazPVZax9FLK26t1R4NPiY4xWkIJyK2OrKMeiaBBzyMfWzHdmsCWa51oSrYSmz3PDBXpzIBs3OdKxcaJs9Lc5u87YCV5RMUjLrPcA7nPK6crOabLXhz3d5GSYggMTOByQkyKOo7WlYpARCHOt/ Eric@domain.cn
[Eric@qfedu.com ~]$

12、同样需要使用Eric用户登录gitlab web 界面,并添加相应的ssh-key。然后设置git ,并clone项目

[Eric@qfedu.com ~]$ git config —global user.email “Eric@domain.cn”
[Eric@qfedu.com ~]$ git config —global user.name “Eric”
[Eric@qfedu.com ~]$ git clone git@192.168.60.119:plat-sp/chathall.git
Cloning into ‘chathall’…
The authenticity of host ‘192.168.60.119 (192.168.60.119)’ can’t be established.
ECDSA key fingerprint is SHA256:CDxAQmj6gUkIxB6XUofbZ853GuPM5LS2QO4a5dD7jRo.
ECDSA key fingerprint is MD5:4e:20:72:a7:46:c6:d7:5d:bb:9d:ce:c3:f3:da:43:f9.
Are you sure you want to continue connecting (yes/no)? yes
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (6/6), done.
[Eric@qfedu.com ~]$

13、切换到dev分支,修改文件内容,并将新 code 提交到 dev分支 (Developer角色默认并没有提交master的权限)

[Eric@qfedu.com chathall]$ git checkout dev
Branch dev set up to track remote branch dev from origin.
Switched to a new branch ‘dev’
[Eric@qfedu.com chathall]$ ls
Readme.txt test.sh
[Eric@qfedu.com chathall]$ vim eric.sh
[Eric@qfedu.com chathall]$ cat eric.sh
#!/bin/bash
echo “brahch test”
[Eric@qfedu.com chathall]$ git add .
[Eric@qfedu.com chathall]$ git commit -m ‘201805101658’
[dev 6687039] 201805101658
1 file changed, 1 insertion(+)
[Eric@qfedu.com chathall]$ git push -u origin dev
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 306 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: To create a merge request for dev, visit:
remote: http://192.168.60.119/plat-sp/chathall/merge_requests/new?merge_request%5Bsource_branch%5D=dev
remote:
To git@192.168.60.119:plat-sp/chathall.git
80edf6b..6687039 dev -> dev
Branch dev set up to track remote branch dev from origin.
[Eric@qfedu.com chathall]$
[Eric@qfedu.com chathall]$ git checkout master
Switched to branch ‘master’
[Eric@qfedu.com chathall]$ git branch
dev
* master
[Eric@qfedu.com chathall]$

14、使用Eric 用户登录gitlab web,在界面中 创建一个合并请求

1-企业级 CICD 持续集成交付发布 - 图82

15、使用Tompson用户登录 gitlab web ,找到“合并请求” ,然后将dev分支合并到master分支

1-企业级 CICD 持续集成交付发布 - 图83
1-企业级 CICD 持续集成交付发布 - 图84
合并分支举例说明:
现在有两个分支:一个分支是a,一个分支是b,如果将b合并到a;在仓库中只能看到a分支
1-企业级 CICD 持续集成交付发布 - 图85
1-企业级 CICD 持续集成交付发布 - 图86
1-企业级 CICD 持续集成交付发布 - 图87

九:Gitlab 备份与恢复

gitlab可以使用自身的配置实现数据备份与恢复

1、查看系统版本和软件版本

[root@xingdian-git ~]# cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
13.6.1
[root@xingdian-git ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

2、数据备份

1、查看备份相关的配置项

[root@qfedu.com ~]# vim /etc/gitlab/gitlab.rb
gitlab_rails[‘manage_backup_path’] = true
gitlab_rails[‘backup_path’] = “/data/gitlab/backups”
该项定义了默认备份出文件的路径,可以通过修改该配置,并执行 gitlab-ctl reconfigure 或者 gitlab-ctl restart 重启服务生效。

2、执行备份命令进行备份

[root@qfedu.com ~]# /opt/gitlab/bin/gitlab-rake gitlab:backup:create

3、添加到 crontab 中定时执行

[root@qfedu.com ~]# crontab -e
0 2 * bash /opt/gitlab/bin/gitlab-rake gitlab:backup:create
可以到/data/gitlab/backups找到备份包,解压查看,会发现备份的还是比较全面的,数据库、repositories、build、upload等分类还是比较清晰的。

4、设置备份保留时长

防止每天执行备份,有目录被爆满的风险,打开/etc/gitlab/gitlab.rb配置文件,找到如下配置:
[root@qfedu.com ~]# vim /etc/gitlab/gitlab.rb
gitlab_rails[‘backup_keep_time’] = 604800
设置备份保留7天(7360024=604800),秒为单位,如果想增大或减小,可以直接在该处配置,并通过gitlab-ctl restart 重启服务生效。
备份完成,会在备份目录中生成一个当天日期的tar包。

3、数据恢复

1、安装部署 gitlab server

  1. 具体步骤参见上面:gitlab server 搭建过程

2、恢复 gitlab

1、查看备份相关的配置项

[root@qfedu.com ~]# vim /etc/gitlab/gitlab.rb
gitlab_rails[‘backup_path’] = “/data/gitlab/backups”
修改该配置,定义了默认备份出文件的路径,并执行 gitlab-ctl reconfigure 或者 gitlab-ctl restart 重启服务生效。

2、恢复前需要先停掉数据连接服务

[root@qfedu.com ~]# gitlab-ctl stop unicorn
[root@qfedu.com ~]# gitlab-ctl stop sidekiq
如果是台新搭建的主机,不需要操作,理论上不停这两个服务也可以。停这两个服务是为了保证数据一致性。
如果是台新搭建的主机,不需要操作,理论上不停这两个服务也可以。停这两个服务是为了保证数据一致性。

3、同步备份文件到新服务器

将老服务器/data/gitlab/backups目录下的备份文件拷贝到新服务器上的/data/gitlab/backups
[root@qfedu.com gitlab]# rsync -avz 1530773117_2019_03_05_gitlab_backup.tar 10.0.1.86:/data/gitlab/backups/
注意权限:600权限是无权恢复的。 实验环境可改成了777,生产环境建议修改属主属组
[root@qfedu.com backups]# pwd
/data/gitlab/backups
[root@qfedu.com backups]# chown -R git.git 1530773117_2019_03_05_gitlab_backup.tar
[root@qfedu.com backups]# ll
total 17328900
-rwxrwxrwx 1 git git 17744793600 Jul 5 14:47 1530773117_2018_07_05_gitlab_backup.tar

4、执行命令进行恢复

后面再输入两次 yes 就完成恢复了。
[root@qfedu.com ~]# gitlab-rake gitlab:backup:restore BACKUP=1530773117_2018_07_05_gitlab_backup.tar
注意:backups 目录下保留一个备份文件可直接执行

5、恢复完成启动服务

恢复完成后,启动刚刚的两个服务,或者重启所有服务,再打开浏览器进行访问,发现数据和之前的一致:
[root@qfedu.com ~]# gitlab-ctl start unicorn
[root@qfedu.com ~]# gitlab-ctl start sidekiq

[root@qfedu.com ~]# gitlab-ctl restart