`Devops 是一种理念 一种文化 对应的方法论是6sigma、约束理论等管理模式`
提高产品质量
1 自动化测试
2 持续集成
3 代码质量管理工具
4 程序员鼓励师
既然这么好?为什么有些公司没有
设计架构规划-代码的存储-构建-测试、预生产、部署、监控
遥想当年,软件程序员的大部分办公司那时还被称作实验室,程序员那时还叫做科学家。为了开发出一套优秀的软件,程序员们必须深入了解他们需要的应用相关的所有问题。他们必须清楚知道这个软件应用在什么场合,这个软件是必须在什么系统上运行。本质上说,程序员对所要开发的软件的所有环节都有透彻的了解,从规格说明书编写、到软件开发、到测试、到部署、再到技术支持。
随着用户需求增多,产业规模逐渐扩大,用户不断的进行更多的索求。更快的速度,更多的功能,更多的用户,更多的所有所有。
我们的老一辈程序员们将很难在这种爆发性的过度的需求索取中幸存。最好的取胜办法就是往不同的方向进化成不同的新物种。很快,程序员这个称号就开始绝迹于江湖,而那些叫做开发者、软件工程师、网络管理员、数据库开发者、网页开发者、系统架构师、测试工程师等等更多的新物种就开始诞生。快速进化和快速适应外界的挑战成为了他们的DNA的一部分。这些新的种族可以在几个星期内就完成进化。网页开发者很快就能进化成后台开发者,前台开发者,PHP开发者,Ruby开发者,Angular开发者…多得让人侧目。这种分工的产生是一种必然发展的结果,每个人各司其职,各自负责其中一环,使劳动力和资本得到最大程度的利用。也是符合亚当·斯密对社会分工理论的概述
题外话:
亚当斯密认为,分工的起源是由人的才能具有自然差异,
那是起因于人类独有的交换与易货倾向,
交换及易货系属私利行为,其利益决定于分工,
假定个人乐于专业化及提高生产力,经由剩余产品之交换行为,
促使个人增加财富,此等过程将扩大社会生产,促进社会繁荣,并达私利与公益之调和。
很快他们就都忘却了他们都是起源于程序员这个共同的祖先的事实,忘却了曾经有过这么一个单纯且平静的,想要让这个世界变得更好的科学家。然后他们开始不断的剑拔弩张,都声称自己才是“程序员”的纯血统继承人。
随着时间的转移,各门各派开始独占山头,很少进行交流互动,只有在迫不得已的时刻才会进行沟通。他们开始不再为同源的遥远的同宗兄弟们的成功而欢呼雀跃,甚至再也不会时把的遥寄张明信片进行嘘寒问暖。
但是在深夜仰望星空的时候,他们还是会发现他们的心底深处的程序员基因还是会不停的闪烁着,期盼着这闪烁的火花能照亮整个银河系并带来和平。 正所谓天下大势合久必分,分久必合。
vcs `version control system` (windows软件 SVN linux软件 gitlab)
版本控制系统是一种记录一个或若干个文件内容变化,以便将来查阅特定版本内容情况的系统
记录文件的所有历史变化
随时可恢复到任何一个历史状态
多人协作开发
SVN–>windows
集中式的版本控制系统,只有一个中央数据仓库,如果中央数据仓库挂了或者不可访问,所有的使用者无法使用SVN,无法进行提交或备份文件。
集中式(SVN) | 分布式(git) | |
---|---|---|
是否有中央服务器 | 有。开发人员需要从中央服务器获得最新版本的项目然后在本地开发,开发完推送给中央服务器。因此脱离服务器开发者是几乎无法工作的 | 没有中央服务器,开发人员本地都有 Local Repository |
网络依赖 | 必须要联网才能工作,而且对网络的依赖性较强,如果推送的文件比较大而且网络状况欠佳,则提交文件的速度会受到很大的限制。 | 分布式在没有网络的情况下也可以执行commit、查看版本提交记录、以及分支操作,在有网络的情况下执行 push 到 Remote Repository。 |
文件存储格式 | 按照原始文件存储,体积较大 | 按照元数据方式存储,体积很小 |
是否有版本号 | 有 | 没有 |
分支操作的影响 | 创建新的分支则所有的人都会拥有和你一样的分支 | 分支操作不会影响其他开发人员 |
提交 | 提交的文件会直接记录到中央版本库 | 提交是本地操作,需要执行push操作才会到主要版本库 |
使用场景总结:
当研发成本比较低,协作开发人数不多,开发人员对于版本管理的水平参差不齐的时候,或者对于代码的安全性要求更高一点的时候,适合用svn。
而对于很多人参与开发,代码量比较大,或者高频次协作,跨公司,跨地域合作的情况下,更适合用git。
李纳斯 托瓦兹编写了linux内核,但是为了将其优化 仅靠一人之力难以完成,聪明的他想到了将内核代码开源,于是世界上千千万万的程序员都来进行内核优化,为其打上补丁。
可是从千万份代码中手动进行版本对比,并将优化后的功能写入内核十分困难且繁杂。这时一家公司主动联系他 可以让林纳斯免费使用版本控制系统,但是他的手下的员工对版本控制系统进行了破解。 东窗事发之后,大发雷霆的公司找到托瓦兹要求他进行道歉,但托瓦兹属于狠人一个,在他的字典中没有“道歉”俩字,立马回绝了公司的要求。
此时的托瓦兹拿起桌上的啤酒一饮而尽,虽然醉上心头,但神情坚定,他仰天大笑:“爷给你整一个!” 于是便有了后来全世界使用最多的git ,而git的本意也有饭桶的意思,也同时代表作者自嘲的意味。 (这种“没有枪没有炮敌人给我们造”的精神体现了革命乐观主义和独立自主、自力更生的精神)
root@git-git~]# cat /etc/redhat-release #查看系统版本
CentOS Linux release 7.1.1503 (Core)
[root@git-git ~]# uname -r #查看内核版本
3.10.0-229.el7.x86_64
[root@git-git ~]# getenforce #确认Selinux关闭状态
Disabled
[root@git-git ~]# systemctl stop firewalld #关闭防火墙
[root@git-git ~]# yum install git
# 安装Git
[root@git ~]# git config
--global 使用全局配置文件
--system 使用系统级配置文件
--local 使用版本库级配置文件
[root@git-git ~]# git config –-global user.name “gaoxu”
# 配置git使用用户
[root@git-git ~]# git config –-global user.email “[email protected]”
# 配置git使用邮箱
[root@git-git ~]# git config –-global color.ui true
# 语法高亮
[root@git-git ~]# git config –-list
user.name=gaoxu
[email protected]
color.ui=true
[root@git ~]# cat .gitconfig
[user]
name = gaoxu
email = [email protected]
[color]
ui = true
初始化工作目录、对已存在的目录或者对已存在的目录都可进行初始化
# 第一步:选择一个合适的地方,创建一个空目录
mkdir git_data
cd git_data/
# 初始化 使用这个命令把工作区初始化
git init
# 查看工作区状态
git status
隐藏文件介绍:
branches # 分支目录
config # 定义项目特有的配置选项
description # 仅供git web程序使用
HEAD # 指示当前的分支
hooks # 包含git钩子文件
info # 包含一个全局排除文件(exclude文件)
objects # 存放所有数据内容,有info和pack两个子文件夹
refs # 存放指向数据(分支)的提交对象的指针
index # 保存暂存区信息,在执行git init的时候,这个文件还没有
[root@git git_data]# git status
# 位于分支 master
# 初始提交
无文件要提交(创建/拷贝文件并使用 "git add" 建立跟踪)
创建文件进行测试
[root@git git_data]# touch a b c
[root@git git_data]# git status
# 位于分支 master
#
# 初始提交
#
# 未跟踪的文件:
# (使用 "git add ..." 以包含要提交的内容)
#
# a
# b
# c
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
提交分支查看状态
[root@git git_data]# git add a
[root@git git_data]# git status
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
# (使用 "git rm --cached ..." 撤出暂存区)
#
# 新文件: a
#
# 未跟踪的文件:
# (使用 "git add ..." 以包含要提交的内容)
#
# b
# c
[root@git git_data]# ll .git/
总用量 20
drwxr-xr-x 2 root root 6 8月 23 05:44 branches
-rw-r--r-- 1 root root 92 8月 23 05:44 config
-rw-r--r-- 1 root root 73 8月 23 05:44 description
-rw-r--r-- 1 root root 23 8月 23 05:44 HEAD
drwxr-xr-x 2 root root 4096 8月 23 05:44 hooks
-rw-r--r-- 1 root root 96 8月 23 07:06 index # git add a 把文件提交到了暂存区
drwxr-xr-x 2 root root 20 8月 23 05:44 info
drwxr-xr-x 5 root root 37 8月 23 07:06 objects
drwxr-xr-x 4 root root 29 8月 23 05:44 refs
git add . git status git rm --cached c (删除缓存区的c文件)
[root@git git_data]# git add . # 使用git add . 或者* 添加目录中所有改动过的文件
[root@git git_data]# git status
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
# (使用 "git rm --cached ..." 撤出暂存区)
#
# 新文件: a
# 新文件: b
# 新文件: c
[root@git git_data]# git rm --cached c
rm 'c'
[root@git git_data]# ll
总用量 0
-rw-r--r-- 1 root root 0 8月 23 07:05 a
-rw-r--r-- 1 root root 0 8月 23 07:05 b
-rw-r--r-- 1 root root 0 8月 23 07:05 c
[root@git git_data]# git status
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
# (使用 "git rm --cached ..." 撤出暂存区)
#
# 新文件: a
# 新文件: b
#
# 未跟踪的文件:
# (使用 "git add ..." 以包含要提交的内容)
#
# c
删除文件
1.先从暂存区撤回到工作区、然后直接删除文件
git rm --cached c
rm -f c
2.直接从暂存区域同工作区域一同删除文件命令
git rm -f b
提交代码到仓库并查看状态
[root@git git_data]# git commit -m "commit a" # 提交到本地仓库
[master(根提交) b4017a8] commit a
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 a
[root@git git_data]# git status
# 位于分支 master
无文件要提交,干净的工作区
修改文件名称
修改文件名称两种方法
1. [root@git git_data]# mv a a.txt
[root@git git_data]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add/rm ..." 更新要提交的内容)
# (使用 "git checkout -- ..." 丢弃工作区的改动)
#
# 删除: a
#
# 未跟踪的文件:
# (使用 "git add ..." 以包含要提交的内容)
#
# a.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@git git_data]# git rm --cached a # 从暂存区删除a文件
rm 'a'
[root@git git_data]# git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD ..." 撤出暂存区)
#
# 删除: a
#
# 未跟踪的文件:
# (使用 "git add ..." 以包含要提交的内容)
#
# a.txt
[root@git git_data]# git add a.txt
[root@git git_data]# git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD ..." 撤出暂存区)
#
# 重命名: a -> a.txt # 识别到a和a.txt相同为重命名
[root@git git_data]# git commit -m "commit a.txt"
2.直接用git命令重命名
[root@git git_data]# git mv a.txt a 把工作区域和暂存区域的文件同时修改文件名称
[root@git git_data]# git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD ..." 撤出暂存区)
#
# 重命名: a.txt -> a
git commit -m "rename a.txt a"
git status 只能查看区域状态的不同,不能查看文件内容的变化。
git diff 查看内容的不同
[root@git git_data]# echo aaa > a
[root@git git_data]# git diff a # 比对本地工作目录和暂存区文件的不同
diff --git a/a b/a
index e69de29..72943a1 100644#
--- a/a
+++ b/a
@@ -0,0 +1 @@
+aaa
[root@git git_data]# git add a # 提交a文件到暂存区域、在用git diff是相同的
[root@git git_data]# git diff --cached a # 比对的是暂存区和本地仓库文件的不同处
diff --git a/a b/a
index e69de29..72943a1 100644
--- a/a
+++ b/a
@@ -0,0 +1 @@
+aaa
提交暂存区
[root@git git_data]# git commit -m "modified a" # 提交后在比对则暂存区和本地仓库内容相同
[master 4c57a60] modified a
1 file changed, 1 insertion(+)
[root@git git_data]# git diff --cached a
[root@git git_data]#
git commit # 相当于虚拟机的镜像、任何操作都被做了一次快照,可恢复到任意一个位置
[root@git git_data]# git log 查看历史的git commit快照操作
commit 4c57a605997f511149bfec53d9018b503e77f961 # 哈希唯一标识的字符串
Author: gaoxu <[email protected]> # 作者个人信息
Date: Thu Aug 23 07:54:23 2018 +0800 # 时间
modified a # -m 个人写的提交描述信息
commit 56925321114eb9adf09b42a733a6f9f3edd9ad65
Author: gaoxu <[email protected]>
Date: Thu Aug 23 07:39:41 2018 +0800
rename a.txt a
commit 7adfca06559ef7739dffdc11ecb7fb8800a9931a
Author: gaoxu <[email protected]>
Date: Thu Aug 23 07:36:47 2018 +0800
commit a.txt
commit b4017a876cfed78425fe58e7ecbcd49199ed5a11
Author: gaoxu <[email protected]>
Date: Thu Aug 23 07:22:29 2018 +0800
git log 功能释义
[root@git git_data]# git log --oneline # 一行简单的显示commit信息
4c57a60 modified a
5692532 rename a.txt a
7adfca0 commit a.txt
b4017a8 commit a
[root@git git_data]# git log --oneline --decorate # 显示当前的指针指向哪里
4c57a60 (HEAD, master) modified a
5692532 rename a.txt a
7adfca0 commit a.txt
b4017a8 commit a
[root@git git_data]# git log -p # 显示具体内容的变化
[root@git git_data]# git log -1 # 只显示1条内容
恢复历史数据
1.只更改了当前目录
[root@git git_data]# echo "333" >> a
[root@git git_data]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add ..." 更新要提交的内容)
# (使用 "git checkout -- ..." 丢弃工作区的改动) # 看提示使用此命令覆盖工作区的改动
#
# 修改: a
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@git git_data]# git checkout -- a # 从暂存区覆盖本地工作目录
[root@git git_data]# git status
# 位于分支 master
无文件要提交,干净的工作区
[root@git git_data]# cat a
aaa
2.修改了本地目录且同时提交到了暂存区
[root@git git_data]# echo ccc >> a # 添加新内容
[root@git git_data]# git add . # 提交到暂存区
[root@git git_data]# git diff --cached #比对暂存区和本地仓库的内容
diff --git a/a b/a
index 72943a1..959479a 100644
--- a/a
+++ b/a
@@ -1 +1,2 @@
aaa
+ccc
[root@git git_data]# git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD ..." 撤出暂存区)
#
# 修改: a
[root@git git_data]# git reset HEAD a # 本地仓库覆盖暂存区域
重置后撤出暂存区的变更:
M a
[root@git git_data]# git diff a
diff --git a/a b/a
index 72943a1..959479a 100644
--- a/a
+++ b/a
@@ -1 +1,2 @@
aaa
+ccc
[root@git git_data]# git diff --cached a
[root@git git_data]#
3.修改了工作目录后提交到了暂存区和本地仓库后进行数据恢复
echo bbb >>a # 提交新的bbb文件到a
git commit -m "add bbb"
echo ccc >> a
git commit -am "add ccc" # 这时候发现改错代码了,想还原某一次提交的文件快照
[root@git git_data]# git log --oneline
59ba2a9 add ccc
dbead4c add bbb
4c57a60 modified a
5692532 rename a.txt a
7adfca0 commit a.txt
b4017a8 commit a
`Git服务程序中有一个叫做HEAD的版本指针,当用户申请还原数据时,其实就是将HEAD指针指向到某个特定的提交版本,但是因为Git是分布式 版本控制系统,为了避免历史记录冲突,故使用了SHA-1计算出十六进制的哈希字串来区分每个提交版本,另外默认的HEAD版本指针会指向到最近的一次提交版本记录`
[root@git git_data]# git reset --hard 4c57a60
HEAD 现在位于 4c57a60 modified a
`刚刚的操作实际上就是改变了一下HEAD版本指针的位置,就是你将HEAD指针放在那里,那么你的当前工作版本就会定位在那里,要想把内容再还原到最新提交的版本,先看查看下提交版本号`
[root@git git_data]# cat a # 打开发现回退错了,应该回退到bbb版本
aaa
[root@git git_data]# git log --oneline # 这时候查看log没有commit bbb的历史了
4c57a60 modified a
5692532 rename a.txt a
7adfca0 commit a.txt
b4017a8 commit a
`怎么搞的?竟然没有了add bbb这个提交版本记录?
原因很简单,因为我们当前的工作版本是历史的一个提交点,这个历史提交点还没有发生过add bbb 更新记录,所以当然就看不到了,要是想”还原到未来”的历史更新点,可以用git reflog命令来查看所有的历史记录:`
[root@git git_data]# git reflog # 使用git reflog 可查看总历史内容
4c57a60 HEAD@{0}: reset: moving to 4c57a60
59ba2a9 HEAD@{1}: commit: add ccc
dbead4c HEAD@{2}: commit: add bbb
4c57a60 HEAD@{3}: commit: modified a
5692532 HEAD@{4}: commit: rename a.txt a
7adfca0 HEAD@{5}: commit: commit a.txt
b4017a8 HEAD@{6}: commit (initial): commit a
[root@git git_data]# git reset --hard dbead4c # 然后使用reset回到bbb的版本内容下
HEAD 现在位于 dbead4c add bbb
[root@git git_data]# cat a
aaa
bbb
分支即是平行空间,假设你在为某个手机系统研发拍照功能,代码已经完成了80%,
但如果将这不完整的代码直接提交到git仓库中,又有可能影响到其他人的工作,
此时我们便可以在该软件的项目之上创建一个名叫”拍照功能”的分支,
这种分支只会属于你自己,而其他人看不到,
等代码编写完成后再与原来的项目主分支合并下即可,
这样即能保证代码不丢失,又不影响其他人的工作。
主干分支一般用于正式发布
其他开发人员将主分支进行克隆,命名成为其他分支,在此基础上进行修改,不影响主分支的代码完整性。修改完成后通过将分支合并到master然后进行发布。
热修复分支: 运行过程中出现bug,用来进行修复的分支,一般不添加新功能只打补丁。
`一般在实际的项目开发中,我们要尽量保证master分支是非常稳定的,仅用于发布新版本,平时不要随便直接修改里面的数据文件,而工作的时候则可以新建不同的工作分支,等到工作完成后在合并到master分支上面,所以团队的合作分支看起来会像上面图那样。
[root@git git_data]# git log --oneline --decorate
dbead4c (HEAD, master) add bbb # 默认分支指向你最后一次的提交 HEAD头、指针
4c57a60 modified a
5692532 rename a.txt a
7adfca0 commit a.txt
b4017a8 commit a
`HEAD 指针指向哪个分支、说明你当前在哪个分支下工作`
[root@git git_data]# git branch testing # 新建testing分支
[root@git git_data]# git branch
* master # *号在哪里就说明当前在哪个分支上入下图所示
testing
[root@git git_data]# git log --oneline --decorate # 通过命令查看分支指向
dbead4c (HEAD, testing, master) add bbb
4c57a60 modified a
5692532 rename a.txt a
7adfca0 commit a.txt
b4017a8 commit a
[root@git git_data]# git checkout testing # 切换到testing分支、对应的HEAD指针也指向了testing 与此同时代码也会被复制一份拉取到自己的测试分支
切换到分支 'testing'
[root@git git_data]# git branch
master
* testing
[root@git git_data]# touch test
[root@git git_data]# git add .
[root@git git_data]# git commit -m "commit test"
[root@git git_data]# git checkout master # 切换到master分支后指针指向到了master
切换到分支 'master'
[root@git git_data]# git branch
* master
testing
[root@git git_data]# ll # 正常情况下是没有test文件的、保证master分支是线上环境的
总用量 4
-rw-r--r-- 1 root root 8 8月 23 08:42 a
[root@git git_data]# touch master
[root@git git_data]# git add .
[root@git git_data]# git commit -m "commit master"
合并分支
[root@git git_data]# git merge testing # 提示输入描述信息 相当于git的-m参数
[root@git git_data]# git log --oneline --decorate
3258705 (HEAD, master) Merge branch ‘testing’
f5ae1d8 commit master
ad4f25a (testing) commit test
dbead4c add bbb
4c57a60 modified a
5692532 rename a.txt a
7adfca0 commit a.txt
b4017a8 commit a
冲突合并
[root@git git_data]# echo "master" >> a
[root@git git_data]# git commit -am "modified a master"
[root@git git_data]# git checkout testing
`切换到分支 'testing'
[root@git git_data]# git branch
master
* testing
[root@git git_data]# cat a
aaa
bbb
[root@git git_data]# echo "testing" >>a
[root@git git_data]# git commit -am "modified a on testing branch"
[root@git git_data]# git checkout master
[root@git git_data]# git merge testing
自动合并 a
冲突(内容):合并冲突于 a
`自动合并失败,修正冲突然后提交修正的结果。
[root@git git_data]# cat a # 冲突的文件自动标识到文件里,手动更改冲突要保留的代码
[root@git git_data]# git commit -am "merge testing to master" # 进行提交即可
[root@git git_data]# git log --oneline --decorate
bba413d (HEAD, master) merge testing to master
34d7a55 (testing) modified a on testing branch
ec1a424 modified a master
3258705 Merge branch 'testing'
f5ae1d8 commit master
ad4f25a commit test
`删除分支-d参数
[root@git git_data]# git branch -d testing
`已删除分支 testing(曾为 34d7a55)。
[root@git git_data]# git branch
* master
产生冲突的原因 : 其他分支拉取了master分支上的代码但是master又进行了修改 导致两个master与 slave分支不一致 当切换到master分支上进行合并分支时 git会提示文件有不同之处,可以直接vim进行修改手动保存自己需要的地方 然后进行git add .提交到缓存仓库 然后 git commit -m “merge…” 提交 此时查看自己的工作区状态 git status 保持干净
标签也是指向了一次commit提交,是一个里程碑式的标签,回滚打标签直接加标签号,不需要加唯一字符串不好记
[root@git git_data]# git tag -a v1.0 -m "aaa bbb master tesing version v1.0" # -a指定标签名字 -m 指定说明文字
[root@git git_data]# git tag
v1.0
[root@git git_data]# git tag -a v2.0 dbead4c -m "add bbb version v2.0" # 指定某一次的提交为标签
[root@git git_data]# git show v1.0 # 查看v1.0的信息 git show 加标签查看
[root@git git_data]# git reset --hard v2.0 # 直接还原数据到v2.0 HEAD 现在位于 dbead4c add bbb
[root@git git_data]# ll
总用量 4
-rw-r--r-- 1 root root 8 8月 23 11:26 a
-rw-r--r-- 1 root root 0 8月 23 11:25 b
[root@git git_data]# git tag -d v2.0 # 删除标签 -d参数
Github顾名思义是一个Git版本库的托管服务,是目前全球最大的软件仓库,拥有上百万的开发者用户,也是软件开发和寻找资源的最佳途径,Github不仅可以托管各种Git版本仓库,还拥有了更美观的Web界面,您的代码文件可以被任何人克隆,使得开发者为开源项贡献代码变得更加容易,当然也可以付费购买私有库,这样高性价比的私有库真的是帮助到了很多团队和企业
1、注册用户 # 课前注册好用户
2、配置ssh-key
3、创建项目
4、克隆项目到本地
5、推送新代码到github
[root@git git_data]# git remote
origin
`克隆http到本地进行测试.
cd /tmp/
git clone https://github.com/oldboylzy/git_test.git
`低版本的系统存在版本问题提示
fatal: unable to access 'https://github.com/oldboylzy/oldboy.git/': Peer reports incompatible or unsupported protocol version
yum update -y nss curl libcurl #升级版本即可
[root@git git_test]# touch d
[root@git git_test]# git add .
[root@git git_test]# git commit -m "add d"
[root@git git_test]# git push -u origin master
[root@git git_data]# cd /root/git_data/
[root@git git_data]# git pull # 拉取远程仓库最新代码、然后进行上传
GitLab简介
GitLab 是一个用于仓库管理系统的开源项目。使用Git作为代码管理工具,并在此基础上搭建起来的web服务。可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。它还提供一个代码片段收集功能可以轻松实现代码复用。
常用的网站:
官网:https://about.gitlab.com/
国内镜像:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/
安装环境:
1、 CentOS 6或者7
2、 2G内存(实验)生产(至少4G)
3、 安装包:gitlab-ce-10.2.2-ce
4、 禁用防火墙,关闭selinux
https://about.gitlab.com/installation/#centos-7 # git官网
yum install -y curl policycoreutils-python openssh-server # 安装依赖
cd /home/oldboy/tools
rz -bye gitlab-ce-10.2.2-ce.0.el7.x86_64.rpm # 上传gitlab安装包 下载方式可通过国内清华源gitlab-ce社区版本下载
vim /etc/gitlab/gitlab.rb # gitlab 配置文件
更改url地址为本机IP地址 external_url 'http://10.0.0.203'
gitlab-ctl reconfigure # 更改配置文件后需重新配置
/opt/gitlab/ # gitlab的程序安装目录
/var/opt/gitlab # gitlab目录数据目录
/var/opt/gitlab/git-dfata # 存放仓库数据
gitlab-ctl status # 查看目前gitlab所有服务运维状态
gitlab-ctl stop # 停止gitlab服务
gitlab-ctl stop nginx # 单独停止某个服务
gitlab-ctl tail # 查看所有服务的日志
通过浏览器输入IP地址进行访问gitlab
10.0.0.203
Gitlab的服务构成:
nginx: 静态web服务器
gitlab-workhorse: 轻量级的反向代理服务器
logrotate:日志文件管理工具
postgresql:数据库
redis:缓存数据库
sidekiq:用于在后台执行队列任务(异步执行)。(Ruby)
unicorn:An HTTP server for Rack applications,GitLab Rails应用是托管在这个服务器上面的。(Ruby Web Server,主要使用Ruby编写)
gitlab汉化:
1、下载汉化补丁
git clone https://gitlab.com/xhang/gitlab.git
2、查看全部分支版本
git branch -a
3、对比版本、生成补丁包
git diff remotes/origin/10-2-stable remotes/origin/10-2-stable-zh > ../10.2.2-zh.diff
4、停止服务器
gitlab-ctl stop
5、打补丁
patch -d /opt/gitlab/embedded/service/gitlab-rails -p1 < /tmp/10.2.2-zh.diff
6、启动和重新配置
gitlab-ctl start
gitlab-ctl reconfigure
7、创建dev分支,然后切换到dev分支
git checkout -b dev
-b 创建
1、配置外观
管理区域-外观
2、关闭自动注册-可根据实际需求操作
管理区域-设置-关闭自动注册
3、创建组-用户-项目
创建组
6、`登陆dev用户测试是否能看到空的git-test仓库
7、`添加ssh-keys到gitlab 注:一个服务器的key只能添加到一个gitlab服务器上,一个用户可以添加多个key
ssh-keygen -t rsa
8、`添加远程仓库、推送本地代码到远程仓库
git remote add origin [email protected]:oldboy/get_test.git # 添加远程仓库
git remote rename origin old-origin # 远程 origin 如果已经存在则重新命名或者新添加仓库名称不同
git push -u origin --all # 推送代码到远程仓库
8、`克隆代码到另外一台主机
`如果不做认证会让输入gitlab的密码、我们使用key进行认证
ssh-keygen -t rsa
`把公钥复制到dev用户下进行测试
`然后在克隆代码
git clone [email protected]:oldboy/get_test.git
`测试推送代码到dev下
git branch dev
git checkout dev
touch dev
git add .
git commit -m "add dev"
git push -u origin dev # 推送dev分支到远程仓库
`提交合并请求进行分支合并到master主分支
`合并后在gitlab服务端master上没有dev、要先进行pull
cd /root/git_data
git pull
9、设置保护主分支
`测试dev分支推送代码则显示为拒绝,如果还是可以推送请查看配置保护分支选项
[root@web01 get_test]# git checkout master
[root@web01 get_test]# git merge dev
[root@web01 get_test]# git push -u origin master
10、返回master端测试推送,由于其他分支进行推送,和master端内容不一致,所以无法进行推送,使用git pull把代码拉取到本地,或者git fetch 把代码拉取到本地仓库后进行合并(注意:git pull = git tetch+git merge)
`对gitlab进行备份将会创建一个包含所有库和附件的归档文件。对备份的恢复只能恢复到与备份时的gitlab相同的版本。将gitlab迁移到另一台服务器上的最佳方法就是通过备份和还原。
gitlab提供了一个简单的命令行来备份整个gitlab,并且能灵活的满足需求。
`备份文件将保存在配置文件中定义的backup_path中,文件名为TIMESTAMP_gitlab_backup.tar,TIMESTAMP为备份时的时间戳。TIMESTAMP的格式为:EPOCH_YYYY_MM_DD_Gitlab-version。
如果自定义备份目录需要赋予git权限
`配置文件中加入
gitlab_rails['backup_path'] = '/data/backup/gitlab'
gitlab_rails['backup_keep_time'] = 604800 备份保留的时间(以秒为单位,这个是七天默认值),
mkdir /data/backup/gitlab
chown -R git.git /data/backup/gitlab
完成后执行gitlab-ctl reconfigure
官网 jenkins.io
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
1.安装准备
装备两台服务器 关闭selinux和防火墙
内存2G 50G+硬盘
jenkins 10.0.0.201
nexus 10.0.0.202
2.安装JDK运行环境和jenkins服务
上传JDK和jenkins rpm安装包,使用rpm -ivh进行安装,安装完JDK运维java测试是否安装成功
rpm -ivh jdk-8u181-linux-x64.rpm
rpm -ivh jenkins-2.99-1.1.noarch.rpm
3.配置jenkins
启动用户修改为root
JENKINS_USER="root"
[root@CentOS7 ~]# systemctl start jenkins
[root@CentOS7 ~]# systemctl enable jenkins
访问页面进行配置
http://10.0.0.201:8080
4.插件安装(跳过安装插件,直接上传插件到目录)和修改登录密码
1.自动安装可选插件
2.手动下载插件上传安装
3.插件放入插件目录
[root@CentOS7 ~]# cd /var/lib/jenkins/
[root@CentOS7 jenkins]# ll jobs为每次构建后构建的结果目录,plugins为插件目录
总用量 36
-rw------- 1 root root 1822 8月 26 00:35 config.xml
-rw------- 1 root root 156 8月 26 00:31 hudson.model.UpdateCenter.xml
-rw------- 1 root root 1712 8月 26 00:32 identity.key.enc
-rw------- 1 root root 94 8月 26 00:32 jenkins.CLI.xml
-rw-r--r-- 1 root root 4 8月 26 00:35 jenkins.install.InstallUtil.lastExecVersion
-rw-r--r-- 1 root root 4 8月 26 00:35 jenkins.install.UpgradeWizard.state
drwxr-xr-x 2 root root 6 8月 26 00:31 jobs
drwxr-xr-x 3 root root 18 8月 26 00:32 logs
-rw------- 1 root root 907 8月 26 00:32 nodeMonitors.xml
drwxr-xr-x 2 root root 6 8月 26 00:32 nodes
drwxr-xr-x 2 root root 6 8月 26 00:31 plugins
-rw------- 1 root root 64 8月 26 00:31 secret.key
-rw-r--r-- 1 root root 0 8月 26 00:31 secret.key.not-so-secret
drwx------ 4 root root 4096 8月 26 00:32 secrets
drwxr-xr-x 2 root root 23 8月 26 00:32 userContent
drwxr-xr-x 3 root root 18 8月 26 00:34 users
上传插件包解压到plugins下执行重启 systemctl restart jenkins
4.jenkins主要的目录
/usr/lib/jenkins/:jenkins安装目录,WAR包会放在这里
/etc/sysconfig/jenkins:jenkins配置文件,“端口”,“JENKINS_HOME”等都可以在这里配置
/var/lib/jenkins/:默认的JENKINS_HOME
/var/log/jenkins/jenkins.log:Jenkins日志文件
5.创建一个自由风格的项目freestyle-job
丢弃旧的构建
执行一条shell命令、查看运行的当前路径,构建后的产物存储在/var/lib/jenkins/workspace/
6.jenkins获取git源码,这里我们有码云导入一个HTML页面的监控平台到gitlab仓库
jenkins端配置从git获取代码,由于我们dev用户是配置在jenkins上,所以无需认证即可下载代码
7.执行立即构建获取到代码
8.写一个脚本把从git仓库里获取的代码上传到web服务器站点目录下
#!/bin/sh
DATE=$(date +%Y-%m-%d-%H-%M-%S)
CODE_DIR=“/var/lib/jenkins/workspace/my-freestyle-job”
WEB_DIR=“/usr/share/nginx/”
get_code_tar(){
cd $CODE_DIR && tar zcf /opt/web-$DATE.tar.gz ./*
}
scp_code_web(){
scp /opt/web-$DATE.tar.gz 10.0.0.7:$WEB_DIR
}
code_tarxf(){
ssh 10.0.0.7 "cd $WEB_DIR &&mkdir web-$DATE && tar xf web-$DATE.tar.gz -C web-$DATE"
}
ln_html(){
ssh 10.0.0.7 "cd $WEB_DIR && rm -rf html && ln -s web-$DATE html"
}
main(){
get_code_tar;
scp_code_web;
code_tarxf;
ln_html;
}
main
9.使用jenkins调用部署脚本(此处写脚本全路径脚本名称)测试
10.配置自动触发构建、需要设置安全令牌Secret token
在这里插入图片描述
11.克隆代码到master上更改代码后进行推送测试是否自动触发
[root@git ~]# git clone [email protected]:oldboy/monitor.git
克隆后更改代码进行推送
12.Jenkins配置jenkins返回构建状态到gitlab
系统管理-系统设置选项下
进行认证配置进入gitlab点击用户设置找到访问令牌Access Tokens
下一步设置项目中的执行后操作。然后进行构建测试返回结果
查看测试结果
参数化构建,通过tag传递参数达到发布和代码回滚的操作
接下来测试一下设置的变量,执行的界面自动变成参数化执行
注: 接下来安装插件、在可选插件中搜索Git Parameter 直接安装即可,已安装则忽略次步骤
进入到项目把前面的参数化去掉重新选择使用git parameter
下一步把git拉取代码的master更改为$git_version变量
添加两个参数选项变量deploy和rollback选项
下一步修改脚本的传参
[root@jenkins scripts]# cat deploy_rollback.sh
#!/bin/sh
DATE=$(date +%Y-%m-%d-%H-%M-%S)
CODE_DIR="/var/lib/jenkins/workspace/my-freestyle-job"
WEB_DIR="/usr/share/nginx/"
get_code_tar(){
cd $CODE_DIR && tar zcf /opt/web-$DATE-${git_version}.tar.gz ./*
}
scp_code_web(){
scp /opt/web-$DATE-${git_version}.tar.gz 10.0.0.7:$WEB_DIR
}
code_tarxf(){
ssh 10.0.0.7 "cd $WEB_DIR &&mkdir web-$DATE-${git_version} && tar xf web-$DATE-${git_version}.tar.gz -C web-$DATE-${git_version}"
}
ln_html(){
rcode=$(ssh 10.0.0.7 "find $WEB_DIR -type d -name "web-*-$git_version"")
ssh 10.0.0.7 "cd $WEB_DIR && rm -rf html && ln -s $rcode html"
}
main(){
get_code_tar;
scp_code_web;
code_tarxf;
ln_html;
}
if [ "$deploy_env" == "deploy" ];then
main
elif [ "$deploy_env" == "rollback" ];then
ln_html
fi
当重复执行构建后会生成多个相同版本的文件,利用jenkins变量值解决重复性构建问题
jenkins变量
1. GIT_COMMIT 当前版本提交产生的哈希唯一值
2. GIT_PREVIOUS_SUCCESSFUL_COMMIT 已经提交过的版本的哈希唯一值
使用以上两个值做比较,如果已提交则退出,如果没有提交过则继续执行构建,更改脚本做判断
if [ "$deploy_env" == "deploy" ];then
if [ "$GIT_COMMIT" == "$GIT_PREVIOUS_SUCCESSFUL_COMMIT" ];then
echo "构建失败该 $git_version 版本号已部署"
else
main
fi
elif [ "$deploy_env" == "rollback" ];then
ln_html
fi
Maven是一个项目管理和综合工具。Maven提供给开发人员构建一个完整的生命周期框架。
开发团队可以自动完成该项目的基础设施建设,Maven使用标准的目录结构和默认构建生命周期。
Apache的开源项目主要服务于JAVA平台的构建、依赖管理、项目管理。
Project Object Model,项目对象模型。通过xml格式保存的pom.xml文件。该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。该文件是由开发维护,我们运维人员可以不用去关心。
1、下载Maven 3安装包
官网:http://maven.apache.org/download.cgi
清华镜像:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/
2、安装Maven
tar xf apache-maven-3.3.9-bin.tar.gz
mv apache-maven-3.3.9 /usr/local/
ln -s /usr/local/apache-maven-3.3.9/ /usr/local/maven
/usr/local/maven/bin/mvn -v
3、编辑/etc/profile文件,在末尾添加
export PATH=/usr/local/apache-maven-3.3.9/bin/:$PATH
mvn -v 查看版本号
上传一个简单的java项目包hello-world.tar.gz进行解压
进入目录执行打包命令
validate(验证): 验证项目正确,并且所有必要信息可用。
compile(编译): 编译项目源码
test(测试): 使用合适的单元测试框架测试编译后的源码。
package(打包): 源码编译之后,使用合适的格式(例如JAR格式)对编译后的源码进行打包。
integration-test(集成测试): 如果有需要,把包处理并部署到可以运行集成测试的环境中去。
verify(验证): 进行各种测试来验证包是否有效并且符合质量标准。
install(安装): 把包安装到本地仓库,使该包可以作为其他本地项目的依赖。
deploy(部署): 在集成或发布环境中完成,将最终软件包复制到远程存储库,以与其他开发人员和项目共享。
mvn clean (清除) : 清除上次编译的结果
mvn package -Dmaven.test.skip=true 跳过测试用例
cd hello-world
mvn package #会去maven的中央仓库去下载需要的依赖包和插件到.m2目录下
5、创建Maven私服nexus
部署私服 xenus 下载https://www.sonatype.com/download-oss-sonatype
配置仓库两个选项
1、项目下的pom.xml配置、只生效当前的项目
2、在maven配置全局所有项目生效
上传JDK和nexus安装包
rpm -ivh jdk-8u121-linux-x64.rpm
mv nexus-3.13.0-01 /usr/local/
ln -s /usr/local/nexus-3.13.0-01 /usr/local/nexus
/usr/local/nexus/bin/nexus start
10.0.0.202:8081 admin admin123
配置Maven全局配置文件
/usr/local/maven/conf/settings.xml
6.创建一个Maven项目
创建前上传代码到gitlab服务器,把java项目添加到gitlab仓库中
cd hello-world/
git init
git remote add origin [email protected]:oldboy/maven.git
git add .
git commit -m "Initial commit"
git push -u origin master
系统管理-全局工具配置
源码从gitlab上获取
构建执行的命令,先清除在打包
7.部署tomcat服务器和数据库
1、安装JDK
2、安装TOMCAT
rz apache-tomcat-8.0.27.tar.gz
tar zvxf apache-tomcat-8.0.27.tar.gz
mv /application/apache-tomcat-8.0.27 /usr/local/tomcat
#tomcat启动加速的方法
vim /usr/java/jdk1.8.0_181-amd64/jre/lib/security/java.security
修改117行为:securerandom.source=file:/dev/urandom
/application/tomcat/bin/startup.sh
为项目准备好数据库jeesns,设置数据库root用户密码为root
yum installl mariadb-server -y
mysql_secure_installation
mysqladmin -uroot password 'xxx'
mysql -uroot -proot -e 'create database jeesns;'
yum install sshpass -y
sshpass -p123456 scp /opt/jeesns/jeesns-web/database/jeesns.sql [email protected]:/tmp
sshpass -p123456 ssh [email protected] 'mysql -uroot -proot jeesns
d:远程推送war包
sshpass -p123456 ssh [email protected] 'mv /usr/local/tomcat/webapps/* /opt'
sshpass -p123456 scp -rp /opt/jeesns/jeesns-web/target/jeesns-web.war 10.0.0.12:/application/tomcat/webapps/ROOT.war
配置maven自动化上线和回滚
和html类似先提交两个tag版本v1.0和v2.0
vim jeesns-web/src/main/webapp/WEB-INF/templates/front/index.ftl
修改推荐阅读 为推荐阅读v1.0
git add .
git commit -m "v1.0"
gi tag -a v1.0 -m "v1.0"
git push -u origin v1.0
修改推荐阅读 为推荐阅读v2.0
git add .
git commit -m "v2.0"
gi tag -a v1.0 -m "v2.0"
git push -u origin v2.0
配置maven项目
配置根据版本号进行拉取代码
以下是java脚本内容(请根据具体需求自行更改)
[root@jenkins scripts]# cat maven.sh
#!/bin/sh
DATE=$(date +%Y-%m-%d-%H-%M-%S)
CODE_DIR="/var/lib/jenkins/workspace/my-maven-job"
WEB_DIR="/usr/local/tomcat/webapps"
get_code_scp(){
ssh 10.0.0.7 "cd $WEB_DIR && mkdir java-${git_version}"
cd $CODE_DIR && scp jeesns-web/target/*.war 10.0.0.7:$WEB_DIR/java-${git_version}
}
code_tarxf(){
ssh 10.0.0.7 “cd W E B D I R / j a v a − WEB_DIR/java- WEBDIR/java−{git_version} && unzip *.war && rm -rf *.war”
}
ln_html(){
ssh 10.0.0.7 “cd KaTeX parse error: Expected 'EOF', got '&' at position 11: WEB_DIR/ &̲& rm -rf ROOT &…{git_version} ROOT && /usr
/local/tomcat/bin/shutdown.sh && /usr/local/tomcat/bin/startup.sh”
}
main(){
get_code_scp;
code_tarxf;
ln_html;
}
if [ “ d e p l o y e n v " = = " d e p l o y " ] ; t h e n i f [ " deploy_env" == "deploy" ];then if [ " deployenv"=="deploy"];thenif["GIT_COMMIT” == “$GIT_PREVIOUS_SUCCESSFUL_COMMIT” ];then
echo “构建失败该 g i t v e r s i o n 版本号已部署 " e l s e m a i n f i e l i f [ " git_version 版本号已部署" else main fi elif [ " gitversion版本号已部署"elsemainfielif["deploy_env” == “rollback” ];then
ln_html
fi
代码质量检测SonarQube
1. SonarQube基础java开发,需安装open JDK8版本
2. SonarQube需要依赖MySQL数据库,至少5.6版本以上
3. SonarQube的小型实例至少4G内存,如果大型实例需要16G内存
安装软件
yum -y install git java unzip wget
安装数据库
下载mysqlyum源
https://dev.mysql.com/downloads/repo/yum/
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
rpm -ivh mysql80-community-release-el7-3.noarch.rpm
更改默认安装版本为5.6 enabled=1
vim /etc/yum.repos.d/mysql-community.repo
[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
[mysql80-community]
name=MySQL 8.0 Community Server
baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/7/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
下一步安装MySQL5.6
yum install mysql-community-server -y
service mysql start
如果端口监听到tcp6,增加一条配置重启即可
[root@sonar ~]# grep bind /etc/my.cnf
bind-address=0.0.0.0
或者关闭系统的tcp6
vim /etc/sysctl.conf 加入以下三条配置
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
sysctl -p
配置数据库密码
mysqladmin -uroot passwd gaoxu123
创建sonar库
mysql -uroot -plizhenya123 -e "CREATE DATABASE sonar DEFAULT CHARACTER SET utf8;"
mysql -u root -plizhenya123 -e "show databases"
SonarQube服务安装
下载sonar 并使用sonar用户启动
https://www.sonarqube.org/downloads/
unzip sonarqube-7.0.zip
mv sonarqube-7.0 /usr/local/
ln -s /usr/local/sonarqube-7.0/ /usr/local/sonarqube
useradd sonar
chown -R sonar.sonar /usr/local/sonarqube-7.0/
配置sonar连接本地数据库
vim /usr/local/sonarqube/conf/sonar.properties
sonar.jdbc.username=root
sonar.jdbc.password=lizhenya123
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewrieBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
使用普通用户启动sonarqube
su - sonar -c "/usr/local/sonarqube/bin/linux-x86-64/sonar.sh start"
启动后的端口为9000使用浏览器直接访问http://10.0.0.203:9000/about 用户名admin 密码admin
生成一个tokin,只显示一次记录好 jenkins: 0807eba6dcceabe5bce653a9c4efe95ce6a8ac99
配置管理sonar 安装插件
1.安装中文汉化插件
在页面上找到administrator > Marketplace > 搜索框 chinese,出现一个 chinese pack 然后点击install,安装完点击restart 重启生效
2.默认已安装C JAVA Python PHP JS 等代码质量分析工具,如果一个项目使用了JAVA CSS JS HTML,默认情况下sonar只会检测JAVA,JS等代码的漏洞和bug,如果安装了HTML、CSS等插件,则会检测该项目代码中JAVA JS HTML CSS代码的漏洞和bug
手动安装插件
[root@sonar ~]# mv /usr/local/sonarqube/extensions/plugins /usr/local/sonarqube/extensions/plugins_back
rz -bye plugins.tar.gz
tar xf plugins.tar.gz -C /usr/local/sonarqube/extensions
chown sonar.sonar -R /usr/local/sonarqube/extensions/plugins
su - sonar -c "/usr/local/sonarqube/bin/linux-x86-64/sonar.sh restart"
jenkins服务器测试推送html代码至SonarQube检测 下载客户端
客户端其他版本下载地址搜索对应版本 例如:SonarScanner 4.0
https://docs.sonarqube.org/7.9/analysis/scan/sonarscanner/
右键复制下载并配置服务器地址
wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.2.0.1873-linux.zip
[root@lzy sonar-scanner]# cat /usr/local/sonar-scanner/conf/sonar-scanner.properties
#Configure here general information about the environment, such as SonarQube server connection details for example
#No information about specific project should appear here
#----- Default SonarQube server
sonar.host.url=http://10.0.0.203:9000
sonar.login=0807eba6dcceabe5bce653a9c4efe95ce6a8ac99
#----- Default source code encoding
sonar.sourceEncoding=UTF-8
cd /var/lib/jenkins/workspace/my-freestyle-job
/usr/local/sonar-scanner/bin/sonar-scanner \
-Dsonar.projectKey=html \
-Dsonar.sources=. \
执行成功后的结果在页面查看
方法1
cd /var/lib/jenkins/workspace/my-maven-job
/usr/local/sonar-scanner/bin/sonar-scanner \
-Dsonar.projectKey=java \
-Dsonar.sources=.
方法2
cd /var/lib/jenkins/workspace/my-maven-job
mvn sonar:sonar \
-Dsonar.host.url=http://10.0.0.203:9000 \
-Dsonar.login=0807eba6dcceabe5bce653a9c4efe95ce6a8ac99
将sonar集成到jenkins中需要安装插件,前面安装包已下载
系统管理->系统设置->sonarQube 告诉jenkins SonarQubeServer服务端地址
1.Name随意填写
2.URL添加SonarQube的地址
3token添加一个secret text 填写之前安装SonarQube的Token
2)jenkins配置执行sonar-scanner命令的家目录,让jenkins能找到该命令 系统管理->全局工具配置
3)配置html项目中增加构建项sonar 上下对换位置,先测试代码后发布到web
Analysis properties项填写完保存执行,最后在SonarQube中查看结果
sonar.projectName=${JOB_NAME} # 项目在sonarqube上的显示名称
sonar.projectKey=html # 项目的唯一表示,不能重复
sonar.sources=. # 扫描那个项目的源码
4)配置java项目增加构建项sonar
`Analysis properties 项填写(看项目选择第一个或第二个)
sonar.projectName=${JOB_NAME}
sonar.projectKey=java
sonar.sources=.
sonar.java.binaries=jeesns-service/target/sonar
方法2使用maven
clean
verify
sonar:sonar
-Dsonar.host.url=http://10.0.0.203:9000
-Dsonar.login=0807eba6dcceabe5bce653a9c4efe95ce6a8ac99
钉钉目前系统已关闭自定义功能,所以目前暂时无法使用状态,使用微信方式
-----------------------------------------------------
jenkins集成钉钉,项目发布结果通过钉钉的方式发送给运维人员
1.实现简单
2.时时提醒
3.便于查看
4.邮件配置复杂
5.邮件容易被当做垃圾邮件被拒收
1)创建群组
2)添加机器人电脑端选择群设置->群智能助手->添加更多->自定义通过webhook接入自定义服务
AgentId
1000002
Secret
q7Q7IfUOKDWs0WXnN0IF6vESqBpxpV6opVyuSKUxexY
----------------------------------------------
jenkins集成微信,工作中档git有新代码提交会触发钩子自动完成上线,运维和开发人员不须时刻盯着jenkins,通过微信的方式显示给运维和开发人员
选择完成后把下面信息进行完善->使用自己微信扫描二维码进行管理后-点注册
上次一张图片->填写应用名称-可见范围->创建应用-保存好agentld和secret写入py脚本
1.由于jenkins没有官网的插件来完成此功能,所以我们只能用网络上一些开源的插件(线下班不需要以下步骤,已集合在plugins)
github下载代码
https://github.com/daniel-beck/changelog-environment-plugin
解压到某个目录-》进入目录执行以下操作
cd 到 changelog-environment-plugin-master 下,执行
mvn verify
时间较长,会在changelog-environment-plugin-master/target/下有个changelog-environment.hpi文件,上传到jenkins即可使用
2.配置jenkins
jenkins进入到项目中->构建环境多了Add Changelog Information to Environment->点击选择
Entry Format中添加 %3$s(at %4$s via %1$s),参数分别为ChangeLog内容,时间,提交人。
Date Format中添加 yyyy-MM-dd HH:mm:ss 就是时间格式。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WTn82MLA-1592734092183)(持续集成教程_files/5db6d70f1935854f57000005.png)]
构建后操作选择Post build task # 如果没有此选择请安装Hudson Post build task 插件,SCM_CHANGELOG须安装changelog插件,上传py脚本->jenkins服务器上安装python requests模块
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum -y install python-pip
pip2.7 install requests
echo "==========Start Notify=============="
echo ${SCM_CHANGELOG} > /tmp/${JOB_NAME}_change.log
python /server/scripts/jenkins_notify.py ${BUILD_URL} /tmp/${JOB_NAME}_change.log ${JOB_NAME}
rm -fv /tmp/${JOB_NAME}_change.log
CI/CD持续集成/持续部署
持续集成(Continuous integration)是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
比如(你家装修厨房,其中一项是铺地砖,边角地砖要切割大小。如果一次全切割完再铺上去,发现尺寸有误的话浪费和返工时间就大了,不如切一块铺一块。这就是持续集成。)
持续部署(continuous deployment)是通过自动化的构建、测试和部署循环来快速交付高质量的产品。某种程度上代表了一个开发团队工程化的程度,毕竟快速运转的互联网公司人力成本会高于机器,投资机器优化开发流程化相对也提高了人的效率。
比如(装修厨房有很多部分,每个部分都有检测手段,如地砖铺完了要测试漏水与否,线路铺完了要通电测试电路通顺,水管装好了也要测试冷水热水。如果全部装完了再测,出现问题可能会互相影响,比如电路不行可能要把地砖给挖开……。那么每完成一部分就测试,这是持续部署。)
持续交付 Continuous Delivery:频繁地将软件的新版本,交付给质量团队或者用户,以供评审尽早发现生产环境中存在的问题;如果评审通过,代码就进入生产阶段
比如(全部装修完了,你去验收,发现地砖颜色不合意,水池太小,灶台位置不对,返工吗?所以不如没完成一部分,你就去用一下试用验收,这就是持续交付。)
敏捷思想中提出的这三个观点,还强调一件事:通过技术手段自动化这三个工作。加快交付速度。
1.什么是pipeline
Jenkins 2.0的精髓是Pipeline as Code,是帮助Jenkins实现CI到CD转变的重要角色。什么是Pipeline,简单来说,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程。Pipeline的实现方式是一套Groovy DSL,任何发布流程都可以表述为一段Groovy脚本,并且Jenkins支持从代码库直接读取脚本,从而实现了Pipeline as Code的理念。
2.Pipeline 概念
Pipeline 是一个用户定义的 CD 流水线模式。Pipeline 代码定义了通常包含构建、测试和发布步骤的完整的构建过程。
Node
node 是一个机器,它是 Jenkins 环境的一部分,并且能够执行 Pipeline。同时,node 代码块也是脚本式 Pipeline 语法的关键特性。
Stage
Stage 块定义了在整个 Pipeline 中执行的概念上不同的任务子集(例如“构建”,“测试”和“部署”阶段),许多插件使用它来可视化或呈现 Jenkins 管道状态/进度。
Step
一项任务。从根本上讲,一个步骤告诉 Jenkins 在特定时间点(或过程中的“步骤”)要做什么。例如,使用 sh step:sh 'make' 可以执行 make 这个 shell 命令。
3.jenkins file
声明式 脚本式
脚本式语法格式:
pipeline{
agent any
stages{
stage("get code"){
steps{
echo "get code from scm"
}
}
stage("package"){
steps{
echo "packge code"
}
}
stage("deploy"){
steps{
echo "deploy packge to node1"
}
}
}
}
创建一个pipeline项目
在jenkins端进行获取测试
更改jenkinsfile文件进行测试
pipeline{
agent any
// agent { label ‘node1’ }
stages{
stage(“get code”){
steps{
sh ‘/usr/local/sonar-scanner/bin/sonar-scanner -Dsonar.projectKey=html -Dsonar.projectName=KaTeX parse error: Expected 'EOF', got '}' at position 42: …=.' }̲ } …{BUILD_ID}.tar.gz ./* --exclude=./git --exclude=jenkinsfile’
}
}
stage(“deploy”){
steps{
sh ‘ssh 10.0.0.8 “cd /usr/share/nginx && mkdir web- B U I L D I D " ′ s h ′ s c p / o p t / w e b − {BUILD_ID}"' sh 'scp /opt/web- BUILDID"′sh′scp/opt/web−{BUILD_ID}.tar.gz 10.0.0.8:/usr/share/nginx/web- B U I L D I D ′ s h ′ s s h 10.0.0.8 " c d / u s r / s h a r e / n g i n x / w e b − {BUILD_ID}' sh 'ssh 10.0.0.8 "cd /usr/share/nginx/web- BUILDID′sh′ssh10.0.0.8"cd/usr/share/nginx/web−{BUILD_ID} && tar xf web-KaTeX parse error: Expected 'EOF', got '&' at position 19: …ILD_ID}.tar.gz &̲& rm -rf web-{BUILD_ID}.tar.gz”’
sh ‘ssh 10.0.0.8 “cd /usr/share/nginx && rm -rf html && ln -s web-${BUILD_ID} /usr/share/nginx/html”’
}
}
}
}
分布式构建
如果项目需要定期集成,同时每次集成都需要较长时间。如果都运行在master服务器上,会消耗过多资源,导致其他项目搁置无法集成,这时就需要在建立多台设备,并配置作为slave机器来为master提供负载服务。
1.找一台或者目前已有的服务器配置为slave端 #当前使用soar服务器作为slave测试
在sonar上安装java jdk git和soanr客户端 # 如已安装则略过
[root@sonar ~]# yum -y install java git
scpjenkins上已配置好的客户端到此服务器 sonar和maven
jenkins服务器操作 注意带版本号做软链接
scp -r /usr/local/sonar-scanner 10.0.0.203:/usr/local/
scp -r /usr/local/maven/ 10.0.0.203:/usr/local/
mkdir /server/scripts -p
scp /server/scripts/deploy_rollback.sh 10.0.0.203:/server/scripts/
ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.203
点击系统管理->节点管理->新建节点
做免秘钥认证拷贝jenkins公钥到slave,私钥配置到jenkins
ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.203
配置环境目录->保存-查看日志运行状态
配置成功后的状态
slave服务器上做连接web的免秘钥认证
ssh-keygen -t rsa
ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.7