欢迎来到李洋的博客

回首境界: 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

持续集成gitlib & Jenkins

01.devops介绍

1.1.Devops是什么

开发 development
运维 operations 

1.2.Devops能干嘛

提高产品质量
    1 自动化测试
    2 持续集成
    3 代码质量管理工具
    4 程序员鼓励师

1.3.Devops如何实现 

 

既然这么好?为什么有些公司没有 
设计架构规划‐代码的存储‐构建‐测试、预生产、部署、监控

02.Git版本控制系统 

 

2.1.版本控制系统简介

vcs `version control system`
版本控制系统是一种记录一个或若干个文件内容变化,以便将来查阅特定版本内容情况的系统
记录文件的所有历史变化
随时可恢复到任何一个历史状态
多人协作开发

2.2.为什么需要版本控制系统

 

2.3.常见版本管理工具

SVN
集中式的版本控制系统,只有一个中央数据仓库,如果中央数据仓库挂了或者不可访问,所有的使用者无法使用SVN,无
法进行提交或备份文件。

分布式的版本控制系统,在每个使用者电脑上就有一个完整的数据仓库,没有网络依然可以使用Git。当然为了习惯及团队协作,会将本地数据同步到Git服务器或者GitHub等代码仓库。

 

2.4.牛逼的人不需要解释这句话被LINUX展现的淋漓尽致

 

03 .Git安装

3.1. 系统环境准备 

[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 #关闭防火墙

3.2. Git安装部署 

 

[root@git‐git ~]# yum install git # 安装Git
[root@git ~]# git config
‐‐global 使用全局配置文件
‐‐system 使用系统级配置文件
‐‐local 使用版本库级配置文件

[root@git‐git ~]# git config –‐global user.name “lizhenya” # 配置git使用用户
[root@git‐git ~]# git config –‐global user.email “lizhenya@mail.com” # 配置git使用邮箱
[root@git‐git ~]# git config –‐global color.ui true # 语法高亮

 

查看配置结果:
[root@git‐git ~]# git config –‐list
  user.name=oldboy
  user.email=oldboy@mail.com
  color.ui=true

[root@git ~]# cat .gitconfig
  [user]
    name = lizhenya
    email = lizhenya@qq.com
  [color]
    ui = true

  

3.3.git初始化

初始化工作目录、对已存在的目录或者对已存在的目录都可进行初始化
mkdirgit_data
cdgit_data/

#初始化
gitinit

#查看工作区状态
gitstatus

隐藏文件介绍:
branches#分支目录
config#定义项目特有的配置选项
description#仅供gitweb程序使用
HEAD#指示当前的分支
hooks#包含git钩子文件
info#包含一个全局排除文件(exclude文件)
objects#存放所有数据内容,有info和pack两个子文件夹
refs#存放指向数据(分支)的提交对象的指针
index#保存暂存区信息,在执行gitinit的时候,这个文件还没有

  

04 .Git常规使用

4.1. 创建数据-提交数据

 

4.2. git四种状态

 

4.3. git基础命令

[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 <file>..." 以包含要提交的内容)
#
#       a
#       b
#       c
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

[root@git git_data]# git add a
[root@git git_data]# git status
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
#   (使用 "git rm --cached <file>..." 撤出暂存区)
#
#       新文件:    a
#
# 未跟踪的文件:
#   (使用 "git add <file>..." 以包含要提交的内容)
#
#       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

[root@git git_data]# git add .         # 使用git add . 或者* 添加目录中所有改动过的文件
[root@git git_data]# git status
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
#   (使用 "git rm --cached <file>..." 撤出暂存区)
#
#       新文件:    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 <file>..." 撤出暂存区)
#
#       新文件:    a
#       新文件:    b
#
# 未跟踪的文件:
#   (使用 "git add <file>..." 以包含要提交的内容)
#
#       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 <file>..." 更新要提交的内容)
#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
#       删除:      a
#
# 未跟踪的文件:
#   (使用 "git add <file>..." 以包含要提交的内容)
#
#       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 <file>..." 撤出暂存区)
#
#       删除:      a
#
# 未跟踪的文件:
#   (使用 "git add <file>..." 以包含要提交的内容)
#
#       a.txt
[root@git git_data]# git add a.txt
[root@git git_data]# git status
# 位于分支 master
# 要提交的变更:
#   (使用 "git reset HEAD <file>..." 撤出暂存区)
#
#       重命名:    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 <file>..." 撤出暂存区)
#
#       重命名:    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: lizhenya <lizhenya@qq.com>                  # 作者个人信息
Date:   Thu Aug 23 07:54:23 2018 +0800              # 时间

    modified a                                      # -m 个人写的提交描述信息

commit 56925321114eb9adf09b42a733a6f9f3edd9ad65
Author: lizhenya <lizhenya@qq.com>
Date:   Thu Aug 23 07:39:41 2018 +0800

    rename a.txt a

commit 7adfca06559ef7739dffdc11ecb7fb8800a9931a
Author: lizhenya <lizhenya@qq.com>
Date:   Thu Aug 23 07:36:47 2018 +0800

    commit a.txt

commit b4017a876cfed78425fe58e7ecbcd49199ed5a11
Author: lizhenya <lizhenya@qq.com>
Date:   Thu Aug 23 07:22:29 2018 +0800

[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 <file>..." 更新要提交的内容)
#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)   # 看提示使用此命令覆盖工作区的改动
#
#       修改:      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 <file>..." 撤出暂存区)
#
#       修改:      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更新记录,所以当然就看不到了,要是想”还原到未来”的历史更新点,可以用gitreflog命令
来查看所有的历史记录:

[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

  

4.4. git分支

分支即是平行空间,假设你在为某个手机系统研发拍照功能,代码已经完成了80%,但如果将这不完整的代码直接
提交到git仓库中,又有可能影响到其他人的工作,此时我们便可以在该软件的项目之上创建一个名叫”拍照功能”
的分支,这种分支只会属于你自己,而其他人看不到,等代码编写完成后再与原来的项目主分支合并下即可,
这样即能保证代码不丢失,又不影响其他人的工作。

  

一般在实际的项目开发中,我们要尽量保证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

4.5.git标签使用

标签也是指向了一次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参数

05. github使用

 

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               # 拉取远程仓库最新代码、然后进行上传

06. gitlab安装

 

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

  

07. gitlab使用

1、配置外观
管理区域-外观
2、关闭自动注册-可根据实际需求操作
管理区域-设置-关闭自动注册
3、创建组-用户-项目
创建组

 

设置组名称、描述等创建群组 

 

 

创建用户 

 

 

 设置密码

 

 

 4、把用户添加到组里面
管理区域-选择创建的oldboy组进行添加用户、权限给开发人员-增加用户到群组 

 

 

 

 5、创建仓库
管理区域-创建仓库 

 

6、登陆dev用户测试是否能看到空的git-test仓库
7、添加ssh-keys到gitlab 注:一个服务器的key只能添加到一个gitlab服务器上,一个用户可以添加多个key ssh-keygen -t rsa
8、添加远程仓库、推送本地代码到远程仓库 git remote add origin git@10.0.0.203: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 git@10.0.0.203: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)

  

08. gitlab备份

对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

09. jenkins

官网 jenkins.io
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

9.1 安装准备

装备两台服务器 关闭selinux和防火墙
内存2G 50G+硬盘
jenkins  10.0.0.201
nexus    10.0.0.202

9.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

9.3.配置jenkins

启动用户修改为root
JENKINS_USER="root"
[root@CentOS7 ~]# systemctl start jenkins
[root@CentOS7 ~]# systemctl enable jenkins
访问页面进行配置
http://10.0.0.201:8080

9.4.插件安装(跳过安装插件,直接上传插件到目录)和修改登录密码

9.4.1.自动安装可选插件

9.4.2.手动下载插件上传安装

9.4.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

9.4.4.jenkins主要的目录

/usr/lib/jenkins/:jenkins安装目录,WAR包会放在这里
/etc/sysconfig/jenkins:jenkins配置文件,“端口”,“JENKINS_HOME”等都可以在这里配置
/var/lib/jenkins/:默认的JENKINS_HOME
/var/log/jenkins/jenkins.log:Jenkins日志文件

9.4.5.创建一个自由风格的项目freestyle-job

 

执行一条shell命令、查看运行的当前路径,构建后的产物存储在/var/lib/jenkins/workspace/ 

9.4.6.jenkins获取git源码,这里我们有码云导入一个HTML页面的监控平台到gitlab仓库

jenkins端配置从git获取代码,由于我们dev用户是配置在jenkins上,所以无需认证即可下载代码 

 

9.4.7.执行立即构建获取到代码 

 

9.4.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.4.9.使用jenkins调用部署脚本(此处写脚本全路径脚本名称)测试

 

9.4.10.(钩子)配置自动触发构建、需要设置安全令牌Secret token

 

9.4.11.克隆代码到master上更改代码后进行推送测试是否自动触发

[root@git ~]# git clone git@10.0.0.203:oldboy/monitor.git

克隆后更改代码进行推送  

9.4.12.Jenkins配置jenkins返回构建状态到gitlab

系统管理-系统设置选项下

 

进行认证配置进入gitlab点击用户设置找到访问令牌Access Tokens 

 

 


 

 

 

 

 

 


 


下一步设置项目中的执行后操作。然后进行构建测试返回结果 

 

 

查看测试结果 

 

 10.创建Maven项目

Maven是一个项目管理和综合工具。Maven提供给开发人员构建一个完整的生命周期框架。
开发团队可以自动完成该项目的基础设施建设,Maven使用标准的目录结构和默认构建生命周期。
Apache的开源项目主要服务于JAVA平台的构建、依赖管理、项目管理。
Project Object Model,项目对象模型。通过xml格式保存的pom.xml文件。该文件用于管理:源代码、配置文件、开发者的信息和
角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。该文件是由开发维护,我们运维
人员可以不用去关心。

10.1、下载Maven 3安装包

官网:http://maven.apache.org/download.cgi
清华镜像:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/

10.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

10.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 (清除) : 清除上次编译的结果 cd hello-world mvn package #会去maven的中央仓库去下载需要的依赖包和插件到.m2目录下

10.4、创建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

10.5.创建一个Maven项目 

创建前上传代码到gitlab服务器,把java项目添加到gitlab仓库中

cd hello-world/
git init 
git remote add origin git@10.0.0.203:oldboy/maven.git 
git add . git commit -m “Initialcommit” git push -u origin master
系统管理-全局工具配置

 

 

源码从gitlab上获取

 

构建执行的命令,先清除在打包

  

10.6.部署tomcat服务器和数据库

1、安装JDK
2、安装TOMCAT
rz apache-tomcat-8.0.27.tar.gz
tar zvxf apache-tomcat-8.0.27.tar.gz  -C  /application/
mv  /application/apache-tomcat-8.0.27  /application/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 'root'
mysql ‐uroot ‐proot ‐e 'create database jeesns;'
yum install sshpass ‐y
sshpass ‐p123456 scp /opt/jeesns/jeesns‐web/database/jeesns.sql root@10.0.0.12:/tmp

sshpass ‐p123456 ssh root@10.0.0.12 'mysql ‐uroot ‐proot jeesns </tmp/jeesns.sql'

  

d:远程推送war包

sshpass-p123456sshroot@10.0.0.12‘mv/application/tomcat/webapps/*/opt’

sshpass-p123456scp-rp/opt/jeesns/jeesns-web/target/jeesns-web.war 10.0.0.12:/application/tomcat/webapps/ROOT.war

11、JenkinsPipeline项目

CI/CD持续集成/持续部署 
持续集成(Continuous integration)是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也
就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从
而尽早地发现集成错误。
比如(你家装修厨房,其中一项是铺地砖,边角地砖要切割大小。如果一次全切割完再铺上去,发现尺寸有误的话 浪费和返工时间就大了,不如切一块铺一块。这就是持续集成。)

持续部署(continuous deployment)是通过自动化的构建、测试和部署循环来快速交付高质量的产品。某种程度上代表了一个开发团队
工程化的程度,毕竟快速运转的互联网公司人力成本会高于机器,投资机器优化开发流程化相对也提高了人的效率。
比如(装修厨房有很多部分,每个部分都有检测手段,如地砖铺完了要测试漏水与否,线路铺完了要通电测试电
路通顺,水管装好了也要测试冷水热水。如果全部装完了再测,出现问题可能会互相影响,比如电路不行可能要
把地 砖给挖开……。那么每完成一部分就测试,这是持续部署。) 

持续交付 Continuous Delivery:频繁地将软件的新版本,交付给质量团队或者用户,以供评审尽早发现生产环境中存在的问题;如果评
审通过,代码就进入生产阶段比如(全部装修完了,你去验收,发现地砖颜色不合意,水池太小,灶台位置不对
,返工吗?所以不如没完成一部 分,你就去用一下试用验收,这就是持续交付。)

敏捷思想中提出的这三个观点,还强调一件事:通过技术手段自动化这三个工作。加快交付速度。

  

11.1.什么是pipeline?

 

Jenkins?2.0的精髓是Pipeline?as?Code,是帮助Jenkins实现CI到CD转变的重要角色。什么是Pipeline,简单来
说,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任
务难以完成的复杂发布流程。Pipeline的实现方式是一套Groovy?DSL,任何发布流程都可以表述为一段Groovy脚
本,并且Jenkins支持从代码库直接读取脚本,从而实现了Pipeline?as?Code的理念。

 

  

 

11.2.Pipeline?概念

Pipeline 是一个用户定义的 CD 流水线模式。Pipeline 代码定义了通常包含构建、测试和发布步骤的完整的构建过程。
Node 
    node 是一个机器,它是 Jenkins 环境的一部分,并且能够执行 Pipeline。同时,node 代码块也是脚本式 Pipeline 语法的关键特性。 
Stage 
    Stage 块定义了在整个 Pipeline 中执行的概念上不同的任务子集(例如“构建”,“测试”和“部署”阶段),许多插件使用它来可视化或呈现 Jenkins 管道状态/进度。 
Step 
    一项任务。从根本上讲,一个步骤告诉 Jenkins 在特定时间点(或过程中的“步骤”)要做什么。例如,使用 sh step:sh 'make' 可以执行 make 这个 shell 命令。

11.3.jenkinsfile

声明式 脚本式 
脚本式语法格式:
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项目

在仓库创建一个jenkinsfile文件进行调用

 

 

jenkins端进行获取测试
 

更改jenkinsfile文件进行测试 
pipeline{
agent any
stages{
    stage("get code"){
    steps{
    echo "get code"
    }
}
stage("unit test"){
steps{
    echo "unit test"
}
}
stage("package"){
    steps{
    sh 'tar zcf /opt/web-${BUILD_ID}.tar.gz ./* --exclude=./git --exclude=Jenkinsfile'
}
}
stage("deploy"){
    steps{
    sh 'ssh 10.0.0.9 "cd /usr/share/nginx && mkdir web-${BUILD_ID}"'
    sh 'scp /opt/web-${BUILD_ID}.tar.gz 10.0.0.9:/usr/share/nginx/web-${BUILD_ID}'
    sh 'ssh 10.0.0.9 "cd /usr/share/nginx/web-${BUILD_ID} && tar xf web-${BUILD_ID}.tar.gz && rm -rf web-${BUILD_ID}.tar.gz"'
    sh 'ssh 10.0.0.9 "cd /usr/share/nginx && rm -rf html && ln -s web-${BUILD_ID} /usr/share/nginx/html"'
            }
        }
    }
}

posted on 2019-08-19 15:38  miss_xxy  阅读(437)  评论(0)    收藏  举报

导航

levels of contents