Jenkins+Maven+Sonar

  • 一、持续集成基础理论知识
  • 1. 持续集成CI
  • 1. 集成
  • 2. 持续集成
  • 3. 持续集成带来的好处
  • 4. 持续集成的目的
  • 5. 什么情况下需要使用持续集成
  • 2. 持续交付
  • 3. 持续部署
  • 4. 持续集成实施流程
  • 二、分布式版本控制系统实践
  • 1. 版本控制系统概述
  • 1. 版本控制系统 version control system
  • 2. 传统版本控制与现在版本控制
  • 3. 版本控制系统解决的问题
  • 4. 常见版本控制系统
  • 5. 集中式版本控制系统工具SVN
  • 6. 分布式版本控制系统工具Git
  • 2. Git基本概述
  • 1. git基本简介
  • 2. git实验准备
  • 3. git安装配置
  • 3. Git基本命令
  • 1. 实战一、git提交目录文件至本仓库
  • 2. 实战二、git将文件改名并至新提交到本地仓库
  • 3. 实战三、比对本地工作目录文件内容、暂存区文件内容、本地仓库文件内容之间的差异
  • 4. 实战四、如何理解 git commit 提交操作
  • 5. 实战五、git commit保存了状态后,回退
  • 4. git分支管理
  • 1. 分支
  • 2. 分支在实际软件开发中的作用
  • 3. 如何创建分支,又如何合并分支
  • 4. 分支合并时处理冲突
  • 5. git标签
  • 1. git标签的作用
  • 2. 为什么要使用git标签
  • 3. git标签基本使用
  • 6. 远程仓库
  • 三、Gitlab版本控制系统实战
  • 1. Gitlab版本库基本概述
  • 1. Gitlab
  • 2. Gitlab与GitHub的区别
  • 3. Gitlab的优势和应用场景
  • 2. Gitlab服务组成
  • 3. Gitlab安装配置
  • 4. Gitlib中文汉化
  • 5. Gitlab日常使用


一、持续集成基础理论知识

1. 持续集成CI
1. 集成

在说持续集成前,我们先了解下什么是“集成”。在实际的软件开发中,常常会有如下两种场景:

  1. 现在有一个电商平台需要开发,由于电商平台某块众多,此时就需要不同的开发人员开发不同的某块,晨后将所有人开发好的代码集成到个系统中。集成完毕后需要对其进行部署上线。
  2. 随着时问的推移,该系统无论是bug修复、还是新功能开发,后续都需要对系统进行不断的更新迭代。
2. 持续集成

持续集成指的是,频繁地(一天多次)将代码集成到主干。(PS:虽复如上集成工作。)

jenkins 集成LDAP_jenkins 集成LDAP

3. 持续集成带来的好处
  • 快速发现误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易。
  • 节省人力成本。
  • 加快软件开发进度。
  • 实时交付。
  • 防分支大幅偏离主干。如果不经常集成,主干又在不断更新,会导致以后集成难度变大,或难以集成。
4. 持续集成的目的

边产品可以快速送代,同的还能保持高质量。
它的核心措施是,代码集成到干之前,先进行自动化测试。只要有一个测试用例失败,就不能集成,当然持续集成并不能完全的消除Bug,而是让它们非常容易发现和改正。

5. 什么情况下需要使用持续集成

如果项目开发的规模比较小,软件集成不是问题。
但是如果项目很大,需要不新添加新功能,或不断的升级产品、则需要进行反复集成,这个时候就需要用到持续集成来简化我们的工作。

2. 持续交付

持续交付指的是在持续集成的环境础之上,将代码部到预生产环境。

持续交付:代码开发->单元测试->合并代码->测试->手动->部署到生产环境。

jenkins 集成LDAP_敏捷开发_02

3. 持续部署

持续部署是持续交付的下步,指代码在任何的刻都是可部部署的,最后将部署到产环境的过程自动化。

持续部署和持续交付的区别就是最终部署到生产环境是自 动化的。

持续部署:代码开发->单元测试->合并代码->测试->自动->部署到生产。

jenkins 集成LDAP_git_03

4. 持续集成实施流程

根据持续集成的设计,代码从提交到生产,整个过程有以下几步:


jenkins 集成LDAP_敏捷开发_04

二、分布式版本控制系统实践

1. 版本控制系统概述
1. 版本控制系统 version control system

将每次文件的变化,集中在一个系统中加以版本记录,以便后续查阅特定文件版本的历史记录的系统。
企业真实案例:产品要求开发a功能,之后项目又需要修改为b功能,开发完之后又要改c功能,最后又说还是用a功能。没有版本控系统之前,操作起来非常的麻烦。


jenkins 集成LDAP_敏捷开发_05

2. 传统版本控制与现在版本控制

如果使用传统的版本控制是什么样子的?

jenkins 集成LDAP_jenkins 集成LDAP_06

现在的版本控制系统又是如何管理的?能对比版本之间的区别,同的还能实现快速回退功能。


jenkins 集成LDAP_jenkins 集成LDAP_07

3. 版本控制系统解决的问题
  • 追溯文件历史变更。
  • 多人团队协同开发。
  • 代码集中统一管理。
4. 常见版本控制系统

常见的版本控制系统分为两种:svn为集中版本控制系统的代表,git为分布式版本控制系统的代表。

5. 集中式版本控制系统工具SVN

集中式的版本控制系统,只有一个中央数据仓库,如果中央数据仓库故障,所有的使用者都无法使用SVN,因为每次进行版本控制工作都需要与远程务器建立通信,否则无法工作。

jenkins 集成LDAP_git_08

6. 分布式版本控制系统工具Git

相对于集中版本控制系统,分式式版本控制系统会将远程代码仓库完整镜像下来后,进行本地离线版本控制,每一次的提交都不依赖远程版务器,待有网络时再与远程仓库进行版本同步。
简单理解:SVN依敕网络、Git不依赖网络。


jenkins 集成LDAP_敏捷开发_09

2. Git基本概述
1. git基本简介

Linus在1991年创建了开源的linux,从此,Linux系统不断发展,已经成最大的版务器系统软件了。
Linus虽然创建linux,但linux的壮大是靠全世界热心的志愿青参与的,这么多人在世界各地为linus编写代码,那linux的代码是如何管理的呢?
2002年前diff纯手动、2005年使用商业BitKeeperLinus花两周编写Git分布式版本控制系统。

2. git实验准备

主机名称eth0、安装epelbase、基础软件包、关闭仿火墙,同步系统时间很重要、更改时区。

3. git安装配置
  • 安装git非常简单,只需一条命令即可。
[root@iz2ze0j4s19xhxuqg75l0zz ~]# yum install git -y
Loaded plugins: fastestmirror, product-id, search-disabled-repos, subscription-manager

This system is not registered with an entitlement server. You can use subscription-manager to register.

Loading mirror speeds from cached hostfile
base                                                                               | 3.6 kB  00:00:00     
docker-ce-stable                                                                   | 3.5 kB  00:00:00
...

# 查看版本
[root@iz2ze0j4s19xhxuqg75l0zz ~]# git --version
git version 1.8.3.1
  • 通常配置git,只需要配置你是谁,你的箱是什么。这样就知道是谁提交了什么的内容。
[root@iz2ze0j4s19xhxuqg75l0zz ~]# git config --global user.name "名字"
[root@iz2ze0j4s19xhxuqg75l0zz ~]# git config --global user.email "邮箱"
[root@iz2ze0j4s19xhxuqg75l0zz ~]# git config --global color.ui true

[root@iz2ze0j4s19xhxuqg75l0zz ~]# ls -a
.              .bash_logout   .cshrc          nginx              .pki               .tcshrc
..             .bash_profile  .docker         .npm               .pydistutils.cfg   .viminfo
aaa            .bashrc        .gitconfig      .oracle_jre_usage  .rediscli_history  .viminfo.tmp
.bash_history  .cache         .mysql_history  .pip               .ssh
[root@iz2ze0j4s19xhxuqg75l0zz ~]# cat .gitconfig
[user]
	name = 名字
	email = 邮箱
[color]
	ui = true
3. Git基本命令
1. 实战一、git提交目录文件至本仓库
  • 首先创建git版本库,这个目录里面的所有文件都可以被git管理起来,每个文件的修改、删除,git都能跟踪,以便任何时刻可以追踪历史,或者将来某个时刻可以“还原”。
# 创建git工作目录
[root@iz2ze0j4s19xhxuqg75l0zz ~]# mkdir git
[root@iz2ze0j4s19xhxuqg75l0zz ~]# cd git
[root@iz2ze0j4s19xhxuqg75l0zz git]# mkdir demo
[root@iz2ze0j4s19xhxuqg75l0zz git]# cd demo

# 初始化该目录为git仓库
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git init
Initialized empty Git repository in /root/git/demo/.git/

# 查看git状态
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)
  • git仓库目录中新增几个文件。
[root@iz2ze0j4s19xhxuqg75l0zz demo]# touch file1 file2 file3
# 查看状态
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	file1
#	file2
#	file3
nothing added to commit but untracked files present (use "git add" to track)
  • 使用 git add .将本地又件提交至暂存区。
# 也可以使用git add file 添加单个文件到暂存区
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git add .

# 再次查看状态
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#	new file:   file1
#	new file:   file2
#	new file:   file3
  • 最后将暂存内容提交到本地仓库,只有 git commit提交后,git才会对该文件进行版本的管理。
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git commit -m "添加文件file1 file2 file3"
[master (root-commit) 9845429] 添加文件file1 file2 file3
 3 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 file1
 create mode 100644 file2
 create mode 100644 file3
 
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git status
# On branch master
nothing to commit, working directory clean
2. 实战二、git将文件改名并至新提交到本地仓库
  • 修改本地file1文件为file4
[root@iz2ze0j4s19xhxuqg75l0zz demo]# mv file1 file4
[root@iz2ze0j4s19xhxuqg75l0zz demo]# ll
total 0
-rw-r--r-- 1 root root 0 Nov 24 13:16 file2
-rw-r--r-- 1 root root 0 Nov 24 13:16 file3
-rw-r--r-- 1 root root 0 Nov 24 13:16 file4
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git status
# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	deleted:    file1
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	file4
no changes added to commit (use "git add" and/or "git commit -a")
  • 移除本地仓库中的file1,然后将新添加的file4添加到暂存区。
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git rm file1
rm 'file1'
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git add file4
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	renamed:    file1 -> file4
#
  • 最后将暂存区内容提交到本地仓库。
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git commit -m "修改file1为file4"
[master c8b30bc] 修改file1为file4
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename file1 => file4 (100%)
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git status
# On branch master
nothing to commit, working directory clean
  • 如上的方法非常的麻烦,那么git提供了简单改名的方法,使用git mv即可。
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git mv file4 file1
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	renamed:    file4 -> file1
#
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git commit -m "修改file4为file1"
[master b8b0335] 修改file4为file1
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename file4 => file1 (100%)
3. 实战三、比对本地工作目录文件内容、暂存区文件内容、本地仓库文件内容之间的差异
  • 本地file1内容与暂存区file1内容比较之问差异。
# 给file1新增点儿内容
[root@iz2ze0j4s19xhxuqg75l0zz demo]# echo "canying" >> file1
# 本地file1内容与暂存区file1内容进行比较
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git diff file1
diff --git a/file1 b/file1
index e69de29..6049a7d 100644
--- a/file1  #表示变动前的版本
+++ b/file1	 #表示变动后的版本
@@ -0,0 +1 @@
+canying
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git add .
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git diff file1
  • 暂存区file1内容与本地仓库file1内容比较之间差异。
# 本地文件已经提交至暂存区,所以比较不会有任何差异
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git diff file1

#暂存区与本地仓库比较会存在差异
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git diff --cached file1
diff --git a/file1 b/file1
index e69de29..6049a7d 100644
--- a/file1
+++ b/file1
@@ -0,0 +1 @@
+canying
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git commit -m "new file1"
[master 7bc9f90] new file1
 1 file changed, 1 insertion(+)
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git diff --cached file1
4. 实战四、如何理解 git commit 提交操作

我们可以将 git commt操作与虚拟机的快照对比?简单来说就是每次commit,相对于对文件做了次快照?
FQ:我们知道commit相当于对文件快照,那我们如何得知该文件快照了多少次,都修改了哪些内容呢?

# 查看历史的git commit快照操作
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git log
commit 7bc9f90e526593ee82ffeb3986d0d56f1dc95884
Author: 名字 <邮箱>
Date:   Tue Nov 24 14:21:44 2020 +0800
    new file1
# 简单显示commit信息
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git log --oneline
7bc9f90 new file1
b8b0335 修改file4为file1
c8b30bc 修改file1为file4“
9845429 添加文件file1 file2 file3
# 显示最近一次提交
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git log -1
# 显示最近两次提交
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git log -2
5. 实战五、git commit保存了状态后,回退

如果是使用的虚拟机,直接找到要回退的快照位置点击转到即可实现,那git又是如何实现快速回功能的?

  • 如果本地工作目录修改文件错误想回退怎么办?
# 误操作清空了本地file1文件
[root@iz2ze0j4s19xhxuqg75l0zz demo]# >file1
# 此时检查状态
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	modified:   file1
#
no changes added to commit (use "git add" and/or "git commit -a")

# 通过git status 提示状态进行回退
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git checkout file1
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git status
# On branch master
nothing to commit, working directory clean
# 检查文件是否恢复
[root@iz2ze0j4s19xhxuqg75l0zz demo]# cat file1
canying
  • 如果文件丛本地目录提交到暂存区后,想回退怎么办?
# 误操作清空文件file1 并提交至缓存区
[root@iz2ze0j4s19xhxuqg75l0zz demo]# >file1
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git add .
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	modified:   file1
#
[root@iz2ze0j4s19xhxuqg75l0zz demo]# cat file1

# 通过提示可以使用 git reset HEAD fiLe将提交的内容撤出暂存区
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git reset HEAD file1
Unstaged changes after reset:
M	file1
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	modified:   file1
#
no changes added to commit (use "git add" and/or "git commit -a")

# 再通过暂存区覆盖本地工作目录,即完成回退
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git checkout -- file1
[root@iz2ze0j4s19xhxuqg75l0zz demo]# cat file1
canying
  • 如果提交多次内容至本地仓库,想回退怎么办?
# 模拟第一次提交
[root@iz2ze0j4s19xhxuqg75l0zz demo]# echo "oldbody" >>file1
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git add .
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git commit -m "新增file1文件-->oldbody"
[master 20b8d5c] 新增file1文件-->oldbody
 1 file changed, 1 insertion(+)

#模拟第二次提交
[root@iz2ze0j4s19xhxuqg75l0zz demo]# echo "oldqiang" >>file1
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git add .
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git commit -m "新增file1文件-->oldqiang"
[master 9033816] 新增file1文件-->oldqiang
 1 file changed, 1 insertion(+)
 
# 此时想回到最初的状态
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git log --oneline
9033816 新增file1文件-->oldqiang
20b8d5c 新增file1文件-->oldbody
7bc9f90 new file1
b8b0335 修改file4为file1
c8b30bc 修改file1为file4“
9845429 添加文件file1 file2 file3

# 找到想回退版本的commitID,然后进行撤回
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git reset --hard 7bc9f90
HEAD is now at 7bc9f90 new file1

# 此时想回到oldqiang那个版本
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git log --oneline
7bc9f90 new file1
b8b0335 修改file4为file1
c8b30bc 修改file1为file4“
9845429 添加文件file1 file2 file3
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git reflog
7bc9f90 HEAD@{0}: reset: moving to 7bc9f90
9033816 HEAD@{1}: commit: 新增file1文件-->oldqiang
20b8d5c HEAD@{2}: commit: 新增file1文件-->oldbody
7bc9f90 HEAD@{3}: commit: new file1
b8b0335 HEAD@{4}: commit: 修改file4为file1
c8b30bc HEAD@{5}: commit: 修改file1为file4“
9845429 HEAD@{6}: commit (initial): 添加文件file1 file2 file3
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git reset --hard 9033816
HEAD is now at 9033816 新增file1文件-->oldqiang
4. git分支管理
1. 分支
2. 分支在实际软件开发中的作用

假设你准备开发一个手机拍照功能,但是需要两周才能完成,第一周你写了50%的代码,如果立提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险,现在有了分支,就不用担心了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

3. 如何创建分支,又如何合并分支
  • 创建分支。
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git branch devops
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git branch
  devops
* master
  • 切换分支。
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git checkout devops
Switched to branch 'devops'
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git branch
* devops
  master
[root@iz2ze0j4s19xhxuqg75l0zz demo]# ls
file1  file2  file3
  • dev分支添加新功能,然后提交至本地仓库。
[root@iz2ze0j4s19xhxuqg75l0zz demo]# touch file7
[root@iz2ze0j4s19xhxuqg75l0zz demo]# touch file8
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git add .
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git commit -m "new file7-8"
[devops 06482f4] new file7-8
 5 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 file4
 create mode 100644 file5
 create mode 100644 file6
 create mode 100644 file7
 create mode 100644 file8
  • 合并分支,基于dev分支,将master分支的内容合并至dev分支上,在dev上进行测试功能。
# 主分支新家内容
[root@iz2ze0j4s19xhxuqg75l0zz demo]# touch file9 file10
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git add .
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git commit -m "new file9-10"
[master b325b93] new file9-10
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 file10
 create mode 100644 file9 
#devops分支合并主分支内容
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git merge master -m "devops合并master内容"
Merge made by the 'recursive' strategy.
 file10 | 0
 file9  | 0
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 file10
 create mode 100644 file9
#主分支合并devops
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git merge devops
  • 删除分支。
[root@iz2ze0j4s19xhxuqg75l0zz demo]#  git branch devops --d
Deleted branch devops (was 4b5416c).
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git branch
* master
4. 分支合并时处理冲突

jenkins 集成LDAP_敏捷开发_10

5. git标签
1. git标签的作用

git仓库内的数据有改善或者功能更新时,我们经常会打一个类似于软件版本号的标签tag,这样通过标签就可以将版本库中的某个版本给记灵下来,便于我们后续将特定时期的数据取出来用。简单来说:标签也是版本库的一个快照。

2. 为什么要使用git标签

gitcommit,为什么还要引入tag
“请把上周一的那个版本打包发,commit号是6a5819e...”,“一乱七八槽的数字不好找!”
如果换一个力法:
“请把上周的那个版本打包发布,版本号是v1.2。按照tag v1.2查找commit就行!
所以,tag就是一个让人容易记住的名字,它跟某个commit绑在一起。

3. git标签基本使用
  • 对当前最新提交的代码创建标签,-a标签名称,-m标签描述。
# 将当前最新代码进行标签
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git tag -a "v1.0" -m "项目刚刚发布"
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git tag
v1.0

# 创建标签指定commitID
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git tag -a "v1.1" b325b93 -m "合并主分支后的内容"
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git tag
v1.0
v1.1
  • 查看具体标签。
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git log -l
fatal: Option 'l' requires a value
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git show v1.0
tag v1.0
Tagger: 姓名 <邮箱>
Date:   Tue Nov 24 16:52:49 2020 +0800
项目刚刚发布
...
  • 删除标签
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git tag -d v1.1
Deleted tag 'v1.1' (was be3f8d2)
[root@iz2ze0j4s19xhxuqg75l0zz demo]# git tag 
v1.0
6. 远程仓库
# 关联(添加)远程仓库
git remote add origin https://gitee.com/canying6/aliyun-test.git
# 将本地仓库添加到远程仓库
git add .
git commit -m "new file"
git push -u origin master
# 删除远程仓库
git remote remove origin (origin是逻辑删除)
# 新人拉取远程项目
git clone https://gitee.com/canying6/aliyun-test.git
# 更新项目;
git pull origin master

# linux生成密钥对
[root@iz2ze0j4s19xhxuqg75l0zz demo]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:A0cyr4yOP9hqiU+6nzwlsSpt0m+XupSHP2h+sLQc8bc root@iz2ze0j4s19xhxuqg75l0zz
The key's randomart image is:
+---[RSA 2048]----+
|      o .        |
|       =         |
|      . o        |
|  . .o +         |
|   o.oo S        |
|  oo=o. ..       |
| =oO=*.o .       |
|=+O+Xo= E        |
|+B*B**..         |
+----[SHA256]-----+
[root@iz2ze0j4s19xhxuqg75l0zz demo]# 
[root@iz2ze0j4s19xhxuqg75l0zz demo]# cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDj8loJQI4ZNoen/iFKYf7Ce59WbtzamukCJcZwXOPpbREz5zP0pfyCTBbAl3BJmDZeGnLXkvE/MxaDEVrC4FyU6wZDiV0bbjjFKMTGoyAxBcfr+2Y50rBSy8+nXjxbtIImrTyiAhPVvSWmn/8WMQScEJpGdrYoPZZSzH5WxcwrJYv5b0x3eZnQ6B8la0TjmqBBAuWjcApn7GeRyPcPfqUtTikiDf9fIGyf7Vel8XGN5FvhA4qtv+tAPr3YGr4P38+CyRHwoT5iC+5qcEoQ1enQbCcmf2AJURIYtgPl+S1AeDEdxTqyHWtnUUG9BiqSkkvEep04IkswdY4nWv5V3OpP root@iz2ze0j4s19xhxuqg75l0zz

三、Gitlab版本控制系统实战

1. Gitlab版本库基本概述
1. Gitlab

Gitlab是一个开源分布式的版本控制系统。Ruby语言开发完成。
Gitlab主要实现的功能、管理项目源代码、对源代码进行版本控制、以及代码复用与查找。

2. Gitlab与GitHub的区别

GitlabGitHub相同点:两者都是提供代码托管版务,在很大程度上GitLab是仿GitHub来做的。
GitlabGitHub不同点:最大的不同在于GitHub创建私有仓库收费、Gitlab创建私有仓库免费。
PS:从代码私有性方面来看,公司不希望员工获取到全部的代码,这个时候Gitlab无疑是最佳的选择。但对于开源项目而言, GitHub依然是代码托管的首选平台。

3. Gitlab的优势和应用场景
  • 开源免费,搭建简单、维护成本较低、适合中小型公司。
  • 权限管理,实现代码对部分可见,确保项目的安全性。
  • 离线同步,保证我们不在实时依赖网络的环境进行代码提交。
2. Gitlab服务组成
3. Gitlab安装配置
  • 环境准备。
# 安装依赖
sudo yum install -y curl policycoreutils-python openssh-server postfix

# 启动SSH和postfix
sudo systemctl enable sshd
sudo systemctl start sshd
sudo systemctl enable postfix
sudo systemctl start postfix

# 开放端口
sudo firewall-cmd --add-service=ssh --permanent
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload
  • yum安装Gitlib
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
sudo yum install -y gitlab-ce
  • 配置Gitlab服务,访问域名及邮箱
[root@iz2ze0j4s19xhxuqg75l0zz git]# vim /etc/gitlab/gitlab.rb 
external_url 'http://gitlab.canying.com'

# 配置邮箱
### Email Settings
gitlab_rails['gitlab_email_enabled'] = true
##! If your SMTP server does not like the default 'From: gitlab@gitlab.example.com'
##! can change the 'From' with this setting.
gitlab_rails['gitlab_email_from'] = '248919076@qq.com'
gitlab_rails['gitlab_email_display_name'] = 'canying-gitlab'

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "248919076@qq.com"
gitlab_rails['smtp_password'] = "qq邮箱授权码"
gitlab_rails['smtp_domain'] = "qq.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
#关闭(内存小)
prometheus['enable'] = false
  • 初始化Gitlab服务器,启动Gitlab服务器
# 初始化Gitlab服务器
[root@iz2ze0j4s19xhxuqg75l0zz git]# gitlab-ctl reconfigure
#启动
[root@iz2ze0j4s19xhxuqg75l0zz git]# gitlab-ctl start |stop| restart | status
# 每次修改 /etc/gitlab/gitlab.rb 都需要 reconfigure
# 查看gitlab的版本
[root@localhost gitlab]# cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
13.6.1
[root@localhost gitlab]#
4. Gitlib中文汉化
# 解压
[root@localhost gitlabhanhuabao]# tar -zxvf gitlab-12-3-stable-zh.tar.gz
# 停止gitlab
[root@localhost gitlab]# gitlab-clt stop
#拷贝补丁
[root@localhost gitlabhanhuabao]# \cp -r gitlab-12-3-stable-zh/* /opt/gitlab/embedded/service/gitlab-rails
# 重启gitlab
[root@localhost opt]# gitlib-clt start
# 卸载gitlab
rpm -e gitlab-ce
# 查看gitlab进程(并杀死第一个进程,不用管日志)
ps aux | grep gitlab
# 删除所有包含gitlab文件
find / -name gitlab | xargs rm -rf
#没权限就
rm -rf  /opt/gitlab
rm -rf  /etc/gitlab
rm -rf  /var/log/gitlab
5. Gitlab日常使用
# 备份
[root@localhost gitlab]# vim /etc/gitlab/gitlab.rb
...
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"	#自定义备份路径
gitlab_rails['backup_keep_time'] = 604800		#备份保留七天
...
[root@localhost gitlab]# gitlab-rake gitlab:backup:create
2020-11-27 16:41:24 +0800 -- Dumping database ... 
Dumping PostgreSQL database gitlabhq_production ... [DONE]
2020-11-27 16:41:27 +0800 -- done
...
[root@localhost ~]# cd /var/opt/gitlab/backups
[root@localhost backups]# ll
总用量 140
-rw-------. 1 git git 143360 11月 27 16:41 1606466488_2020_11_27_12.0.3_gitlab_backup.tar
# 每天凌晨两点自动备份
[root@localhost ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@localhost ~]# crontab -l
00 02 * * * gitlab-rake gitlab:backup:create &>/dev/null

# 备份恢复
[root@localhost ~]# gitlab-ctl stop sidekiq
[root@localhost ~]# gitlab-ctl stop unicorn
[root@localhost ~]# gitlab-rake gitlab:backup:restore BACKUP=1606466488_2020_11_27_12.0.3
# 重启项目