持續集成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等代碼倉庫。html

 

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界面,您的代碼文件能夠被任何人克隆,使得開發者爲開源項貢獻代碼變得更加容易,固然也能夠付費購買私有庫,
這樣高性價比的私有庫真的是幫助到了不少團隊和企業 一、註冊用戶 # 課前註冊好用戶 二、配置ssh-key 三、建立項目 四、克隆項目到本地 五、推送新代碼到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/

安裝環境:
一、  CentOS 6或者7
二、  2G內存(實驗)生產(至少4G)
三、  安裝包:gitlab-ce-10.2.2-ce
四、  禁用防火牆,關閉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漢化:
一、下載漢化補丁
git clone https://gitlab.com/xhang/gitlab.git
二、查看所有分支版本
git branch -a
三、對比版本、生成補丁包
git diff remotes/origin/10-2-stable remotes/origin/10-2-stable-zh > ../10.2.2-zh.diff
四、中止服務器
gitlab-ctl stop
五、打補丁
patch -d /opt/gitlab/embedded/service/gitlab-rails -p1 < /tmp/10.2.2-zh.diff 
六、啓動和從新配置
gitlab-ctl start
gitlab-ctl reconfigure

  

07. gitlab使用

一、配置外觀
管理區域-外觀
二、關閉自動註冊-可根據實際需求操做
管理區域-設置-關閉自動註冊
三、建立組-用戶-項目
建立組

 

設置組名稱、描述等建立羣組 java

 

 

建立用戶 node

 

 

 設置密碼python

 

 

 四、把用戶添加到組裏面
管理區域-選擇建立的oldboy組進行添加用戶、權限給開發人員-增長用戶到羣組 mysql

 

 

 

 五、建立倉庫
管理區域-建立倉庫 linux

 

六、登錄dev用戶測試是否能看到空的git-test倉庫
七、添加ssh-keys到gitlab 注:一個服務器的key只能添加到一個gitlab服務器上,一個用戶能夠添加多個key ssh-keygen -t rsa
八、添加遠程倉庫、推送本地代碼到遠程倉庫 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 # 推送代碼到遠程倉庫
八、克隆代碼到另一臺主機 若是不作認證會讓輸入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
九、設置保護主分支

測試dev分支推送代碼則顯示爲拒絕,若是仍是能夠推送請查看配置保護分支選項
[root@web01 get_test]# git checkout master
[root@web01 get_test]# git merge dev
[root@web01 get_test]# git push -u origin master

十、返回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/ nginx

9.4.6.jenkins獲取git源碼,這裏咱們有碼雲導入一個HTML頁面的監控平臺到gitlab倉庫

jenkins端配置從git獲取代碼,因爲咱們dev用戶是配置在jenkins上,因此無需認證便可下載代碼 git

 

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 github

 

 


 

 

 

 

 

 


 


下一步設置項目中的執行後操做。而後進行構建測試返回結果 

 

 

查看測試結果 

 

 10.建立Maven項目

Maven是一個項目管理和綜合工具。Maven提供給開發人員構建一個完整的生命週期框架。
開發團隊能夠自動完成該項目的基礎設施建設,Maven使用標準的目錄結構和默認構建生命週期。
Apache的開源項目主要服務於JAVA平臺的構建、依賴管理、項目管理。
Project Object Model,項目對象模型。經過xml格式保存的pom.xml文件。該文件用於管理:源代碼、配置文件、開發者的信息和
角色、問題追蹤系統、組織信息、項目受權、項目的url、項目的依賴關係等等。該文件是由開發維護,咱們運維
人員能夠不用去關心。

10.一、下載Maven 3安裝包

官網:http://maven.apache.org/download.cgi
清華鏡像:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/

10.二、安裝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.三、編輯/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.四、建立Maven私服nexus

部署私服 xenus  下載https://www.sonatype.com/download-oss-sonatype
配置倉庫兩個選項
一、項目下的pom.xml配置、只生效當前的項目
二、在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服務器和數據庫

一、安裝JDK
二、安裝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

十一、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"'
            }
        }
    }
}
相關文章
相關標籤/搜索