提升產品質量 1 自動化測試 2 持續集成 3 代碼質量管理工具 4 程序員鼓勵師
既然這麼好?爲何有些公司沒有
設計架構規劃‐代碼的存儲‐構建‐測試、預生產、部署、監控
vcs `version control system` 版本控制系統是一種記錄一個或若干個文件內容變化,以便未來查閱特定版本內容狀況的系統 記錄文件的全部歷史變化 隨時可恢復到任何一個歷史狀態 多人協做開發
分佈式的版本控制系統,在每一個使用者電腦上就有一個完整的數據倉庫,沒有網絡依然可使用Git。固然爲了習慣及團隊協做,會將本地數據同步到Git服務器或者GitHub等代碼倉庫。html
[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 「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
初始化工做目錄、對已存在的目錄或者對已存在的目錄均可進行初始化 mkdirgit_data cdgit_data/ #初始化 gitinit #查看工做區狀態 gitstatus 隱藏文件介紹: branches#分支目錄 config#定義項目特有的配置選項 description#僅供gitweb程序使用 HEAD#指示當前的分支 hooks#包含git鉤子文件 info#包含一個全局排除文件(exclude文件) objects#存放全部數據內容,有info和pack兩個子文件夾 refs#存放指向數據(分支)的提交對象的指針 index#保存暫存區信息,在執行gitinit的時候,這個文件尚未
[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
分支便是平行空間,假設你在爲某個手機系統研發拍照功能,代碼已經完成了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
標籤也是指向了一次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界面,您的代碼文件能夠被任何人克隆,使得開發者爲開源項貢獻代碼變得更加容易,固然也能夠付費購買私有庫,
這樣高性價比的私有庫真的是幫助到了不少團隊和企業 一、註冊用戶 # 課前註冊好用戶 二、配置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 # 拉取遠程倉庫最新代碼、而後進行上傳
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
一、配置外觀 管理區域-外觀 二、關閉自動註冊-可根據實際需求操做 管理區域-設置-關閉自動註冊 三、建立組-用戶-項目 建立組
設置組名稱、描述等建立羣組 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)
對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開發的一種持續集成工具,用於監控持續重複的工做,旨在提供一個開放易用的軟件平臺,使軟件的持續集成變成可能。
裝備兩臺服務器 關閉selinux和防火牆 內存2G 50G+硬盤 jenkins 10.0.0.201 nexus 10.0.0.202
上傳JDK和jenkins rpm安裝包,使用rpm -ivh進行安裝,安裝完JDK運維java測試是否安裝成功 rpm -ivh jdk-8u181-linux-x64.rpm rpm -ivh jenkins-2.99-1.1.noarch.rpm
啓動用戶修改成root JENKINS_USER="root" [root@CentOS7 ~]# systemctl start jenkins [root@CentOS7 ~]# systemctl enable jenkins 訪問頁面進行配置 http://10.0.0.201:8080
[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
/usr/lib/jenkins/:jenkins安裝目錄,WAR包會放在這裏 /etc/sysconfig/jenkins:jenkins配置文件,「端口」,「JENKINS_HOME」等均可以在這裏配置 /var/lib/jenkins/:默認的JENKINS_HOME /var/log/jenkins/jenkins.log:Jenkins日誌文件
執行一條shell命令、查看運行的當前路徑,構建後的產物存儲在/var/lib/jenkins/workspace/ nginx
jenkins端配置從git獲取代碼,因爲咱們dev用戶是配置在jenkins上,因此無需認證便可下載代碼 git
#!/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
[root@git ~]# git clone git@10.0.0.203:oldboy/monitor.git 克隆後更改代碼進行推送
系統管理-系統設置選項下程序員
進行認證配置進入gitlab點擊用戶設置找到訪問令牌Access Tokens github
下一步設置項目中的執行後操做。而後進行構建測試返回結果
查看測試結果
Maven是一個項目管理和綜合工具。Maven提供給開發人員構建一個完整的生命週期框架。 開發團隊能夠自動完成該項目的基礎設施建設,Maven使用標準的目錄結構和默認構建生命週期。 Apache的開源項目主要服務於JAVA平臺的構建、依賴管理、項目管理。 Project Object Model,項目對象模型。經過xml格式保存的pom.xml文件。該文件用於管理:源代碼、配置文件、開發者的信息和 角色、問題追蹤系統、組織信息、項目受權、項目的url、項目的依賴關係等等。該文件是由開發維護,咱們運維 人員能夠不用去關心。
官網:http://maven.apache.org/download.cgi 清華鏡像:https://mirrors.tuna.tsinghua.edu.cn/apache/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
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目錄下
部署私服 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
建立前上傳代碼到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上獲取
構建執行的命令,先清除在打包
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
CI/CD持續集成/持續部署 持續集成(Continuous integration)是一種軟件開發實踐,即團隊開發成員常常集成它們的工做,經過每一個成員天天至少集成一次,也 就意味着天天可能會發生屢次集成。每次集成都經過自動化的構建(包括編譯,發佈,自動化測試)來驗證,從 而儘早地發現集成錯誤。 好比(你家裝修廚房,其中一項是鋪地磚,邊角地磚要切割大小。若是一次全切割完再鋪上去,發現尺寸有誤的話 浪費和返工時間就大了,不如切一塊鋪一塊。這就是持續集成。) 持續部署(continuous deployment)是經過自動化的構建、測試和部署循環來快速交付高質量的產品。某種程度上表明瞭一個開發團隊 工程化的程度,畢竟快速運轉的互聯網公司人力成本會高於機器,投資機器優化開發流程化相對也提升了人的效率。 好比(裝修廚房有不少部分,每一個部分都有檢測手段,如地磚鋪完了要測試漏水與否,線路鋪完了要通電測試電 路通順,水管裝好了也要測試冷水熱水。若是所有裝完了再測,出現問題可能會互相影響,好比電路不行可能要 把地 磚給挖開……。那麼每完成一部分就測試,這是持續部署。) 持續交付 Continuous Delivery:頻繁地將軟件的新版本,交付給質量團隊或者用戶,以供評審儘早發現生產環境中存在的問題;若是評 審經過,代碼就進入生產階段好比(所有裝修完了,你去驗收,發現地磚顏色不合意,水池過小,竈臺位置不對 ,返工嗎?因此不如沒完成一部 分,你就去用一下試用驗收,這就是持續交付。) 敏捷思想中提出的這三個觀點,還強調一件事:經過技術手段自動化這三個工做。加快交付速度。
Jenkins?2.0的精髓是Pipeline?as?Code,是幫助Jenkins實現CI到CD轉變的重要角色。什麼是Pipeline,簡單來 說,就是一套運行於Jenkins上的工做流框架,將本來獨立運行於單個或者多個節點的任務鏈接起來,實現單個任 務難以完成的複雜發佈流程。Pipeline的實現方式是一套Groovy?DSL,任何發佈流程均可以表述爲一段Groovy腳 本,而且Jenkins支持從代碼庫直接讀取腳本,從而實現了Pipeline?as?Code的理念。
Pipeline 是一個用戶定義的 CD 流水線模式。Pipeline 代碼定義了一般包含構建、測試和發佈步驟的完整的構建過程。 Node node 是一個機器,它是 Jenkins 環境的一部分,而且可以執行 Pipeline。同時,node 代碼塊也是腳本式 Pipeline 語法的關鍵特性。 Stage Stage 塊定義了在整個 Pipeline 中執行的概念上不一樣的任務子集(例如「構建」,「測試」和「部署」階段),許多插件使用它來可視化或呈現 Jenkins 管道狀態/進度。 Step 一項任務。從根本上講,一個步驟告訴 Jenkins 在特定時間點(或過程當中的「步驟」)要作什麼。例如,使用 sh step:sh 'make' 能夠執行 make 這個 shell 命令。
聲明式 腳本式 腳本式語法格式: 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" } } } }
更改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"' } } } }