CI/CD自動集成-發布-部署
-
持續集成
:簡稱CI。持續集成(continuous integration)是指開發者在代碼開發過程中,可以頻繁將代碼部署集成到主干,並進行自動化測試。持續集成的優點:快速發現錯誤,容易定位到錯誤。防止分支大幅度偏離主干。 -
持續交付
:簡稱CD。是指在持續集成的基礎之上,將代碼部署到預生產環境。持續交付可以看作是持續集成的下一步,無論如何更新,軟件是隨時隨地可交付的。 -
持續部署
:CD 在持續交付的基礎之上,把部署到生產環境的過程自動化。
持續集成流程:
-
開發者將新版本 push 到
Gitlab
。 -
Gitlab
隨后觸發jenkins master
節點進行一次 build。(或者通過web hook
定時檢測) -
jenkins master
節點將這個 build 任務分配給若干個注冊的 slave 結點中的一個,這個 slave 結 點根據一個事先設置好的腳本進行 build。這個腳本可以做的事情很多,比如編譯,測試,生成測試報告等等。這些原本需要手動完成的任務都可以交給jenkins
來做。 -
我們在 build 中要迚行編譯,這里使用了分布式編譯器
distcc
來加快編譯速度。
CICD流程
gitlab
創建代碼項目--->gitlab
部署公鑰--->jenkins
安裝插件--->創建新項目--->綁定私鑰--->添加觸發器--->測試部署--->增加 Build Pipeline 插件以流程圖的形式展示各個 Job 的順序
GitLab
GitLab
是一個利用 Ruby on Rails
開發的開源應用程序,實現一個自托管的 Git
項目倉庫,可通過Web
界面進行訪問公開的或者私人項目。Ruby on Rails
是一個可以使你開發、部署、維護 web
應用程序變 得簡單的框架。
GitLab
擁有與 Github
類似的功能,能夠瀏覽源代碼,管理缺陷和注釋。可以管理團隊對倉庫的訪問, 它非常易於瀏覽提交過的版本並提供一個文件歷叱庫。它還提供一個代碼片段收集功能可以輕松實現代碼 復用,便於日后有需要的時候進行查找。
GitLab
中文網:https://www.gitlab.com/installation/#centos-7
清華大學鏡像站: https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/
GitLab
包含軟件:
alertmanager
gitaly
gitlab-exporter
gitlab-workhorse
grafana
logrotate
nginx
node-exporter
postgres-exporter
postgresql
prometheus
redis
redis-exporter
sidekiq
unicorn
GitLab安裝
# 服務器節點內存需要大於4G
# 安裝依賴
yum install -y policycoreutils-python
# 上傳rpm包
rpm -ivh gitlab-ce-10.2.3-ce.0.el7.x86_64.rpm
# 配置gitlab域名
vim /etc/gitlab/gitlab.rb
external_url 'http://192.168.1.63:9999'
# 初始化gitlab,會重置為最原始的配置
gitlab-ctl reconfigure
# 查看狀態
gitlab-ctl status
# 瀏覽器訪問驗證
http://192.168.1.63/users/sign_in
# 關閉 gitlab:
gitlab-ctl stop
# 啟動 gitlab:
gitlab-ctl start
# 重啟 gitlab:
gitlab-ctl restart
# gitlab啟動報warning: redis: unable to open supervise/ok: file does not exist;解決如下:
systemctl restart gitlab-runsvdir
# GitLab的配置文件
/etc/gitlab/gitlab.rb //可以自定義一些郵件服務等
日志地址:/var/log/gitlab/ // 對應各服務 服務地址:/var/opt/gitlab/ // 對應各服務的主目錄 倉庫地址:/var/opt/gitlab/git-data //記錄項目倉庫等提交信息
# 查看所有的logs; 按 Ctrl-C 退出
sudo gitlab-ctl tail
# 拉取/var/log/gitlab下子目錄的日志
sudo gitlab-ctl tail gitlab-rails
# 拉取某個指定的日志文件
sudo gitlab-ctl tail nginx/gitlab_error.log
# 檢查gitlab
gitlab-rake gitlab:check SANITIZE=true --trace
GitLab漢化
# 方式1
# 漢化gitlib
tar zxvf gitlab-patch-zh.tat.gz
yum install -y git patch
git diff v10.2.3 v10.2.3-zh > ../10.2.3-zh.diff
chmod -R 777 gitlab
patch -d /opt/gitlab/embedded/service/gitlab-rails -p1 < ../10.2.3-zh.diff
# 方式2:
# 下載漢化包並解壓
gitlab-12-3-stable-zh.zip
# 備份原文件
cp -rp /opt/gitlab/embedded/service/gitlab-rails{,.bak_$(date +%F)}
# 將漢化包覆蓋過去(\也需要敲)
\cp -rf ./* /opt/gitlab/embedded/service/gitlab-rails
# 重啟gitlab,注意順序,
sudo gitlab-ctl start
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
GitLab卸載
# 卸載gitlab
gitlab-ctl stop
rpm -e gitlab-ce
ps aux | grep gitlab
#殺掉第一個進程(就是帶有好多.............的進程)
kill -9 18777
find / -name gitlab | xargs rm -rf
GitLab使用
設置gitlab用戶root可以通過ssh公鑰直接下載代碼
將代碼發布到web服務器
可以通過執行命令或腳本的方式迚行代碼發布,我使用 root 用戶在各個 web 服務器上發布代碼。大 家也可以建立一些普通用戶如果 www 或 apache 來發布。如果使用普通用戶發布代碼,要保持所有服務 器上的用戶 id 一致,這樣沒有權限的問題
使用git克隆代碼,復制左側鏈接.
git clone http://192.168.1.63:9999/root/harry.git
GitLab和GitHub的區別:
相同點: 二者都是基於web
的Git
倉庫,在很大程度上 GitLab
是仿照 GitHub
來做的,它們都提供了分享開源項目的平台,為開發團隊提供了存儲、分享、發布和合作開發項目的中心化於存儲的場所。
不同點:
1、GitHub
如果要使用私有倉庫,是需要付費的。GitLab
可以在上面創建私人的免費倉庫。
2、GitLab
讓開發團隊對他們的代碼倉庫擁有更多的控制,相比於 GitHub
,它有不少的特色:允許 免費設置倉庫權限;允許用戶選擇分享一個 project 的部分代碼;允許用戶設置 project 的獲取權限,進一步的提升安全性;可以設置獲取到團隊整體的改進進度通過 innersourcing
讓不在權限范圍內的人訪問不到該資源。
總結:從代碼私有性方面來看,有時公司並不希望員工獲取到全部的代碼,這個時候 GitLab
無疑是更好的選擇。但對於開源項目而言,GitHub
依然是代碼托管的首選。
Git使用
git
:是一種版本控制系統,是一個命令,是一種工具
gitlib
:是用於實現 git 功能的開發庫
github
:是一個基於 git 實現的在線代碼托管倉庫,包含一個網站界面,向互聯網開放
gitlab
:是一個基於 git 實現的在線代碼倉庫托管軟件,一般用於在企業內部網絡搭 git私服 注: gitlab-ce
社區版 ; gitlab-ee
是企業版,收費。
# 安裝git
yum install -y git
安裝完成后,需要先配置自己的git環境。配置工作只需一次,以后升級時還會 沿用現在的配置。
第一個要配置的是你個人的用戶名稱和電子郵件地址。這兩條配置很重要,每次 Git 提交時都會引用 這兩條信息,說明是誰提交了更新,所以會隨更新內容一起被永久納入歷史記錄。
git常用命令
git config --global user.name “name“ #設置全局用戶名
git config --global user.email mail #設置全局郵箱
git config --global --list #列出用戶全局設置
git add index.html #添加文件到暫存區
git commit -m “描述內容“ #提交文件到工作區
git status #查看工作區的狀態
git push #提交代碼到 git 服務器上
git pull #獲取代碼到本地
git log #查看操作日志
vim .gitignore #定義忽略文件
git reset --hard HEAD^ #git 版本回滾, HEAD 為當前版本,加一個^為上一個,^^為上上一 個版本
git reflog # #獲取每次提交的 ID,可以使用--hard 根據提交的 ID 迚行版本回退
git reset --hard 5ae4b06 #回退到指定 id 的版本
git branch #查看當前所處的分支
git checkout -- file #從服務器更新某個那文件覆蓋本地的文件
工作區和暫存區及分支概述:
1、工作區就是編輯文件的目錄區域,需要將工作區的修改好的文件 add 到暫存區才能提交到 git 服 務器,在工作區有多個文件的時候可以將一個戒多個文件添加至暫存區,再提交到 git 服務器即可。
2、在服務器創建分支
# 例:把修改過的 index.html 文件更新主版本中
[root@harry63 test]# cd harry-web/
[root@harry63 harry-web]# echo "bbs.harry.cn" >> index.html
[root@harry63 harry-web]# git add index.html
[root@harry63 harry-web]# git commit -m "add bbs.harry.cn"
[root@harry63 harry-web]# git push -u origin master #上傳到 master 主干下 origin [ˈɒrɪdʒɪn] 起源,根
[root@harry63 harry-web]# rm -rf index.html #初除一些代碼 [root@harry63 harry-web]# git reset --hard HEAD #回滾到最新版本 [root@harry63 harry-web]# ls
查看 git 當前的版本:
[root@harry63 ~]# git --version
git version 1.8.3.1
[root@harry63 harry-web]# git reflog #獲取每次提交的 ID
9c1e21a HEAD@{0}: commit: aaa cd9d1d5 HEAD@{1}: commit: add bbs
b2866fd HEAD@{2}: clone: from http://192.168.1.63/harry/harry-web.git
# 工作區和暫存區及分支概述
# 1、工作區就是編輯文件的目錄區域,需要將工作區的修改好的文件 add 到暫存區才能提交到 git 服 務器,在工作區有多個文件的時候可以將一個或多個文件添加至暫存區,再提交到 git 服務器即可。
# 2、在服務器創建分支
[root@harry63 harry-web]# git branch bbs #創建一個分支 [root@harry63 harry-web]# git checkout bbs #切換到分支 bbs [root@harry63 harry-web]# git branch #查看當前所處的分支
[root@harry63 harry-web]# vim a.txt #隨意在里面寫一些內容
[root@harry63 harry-web]# git add a.txt
[root@harry63 harry-web]# git commit -m "add a.txt“ #提交到暫存區中
[root@harry63 harry-web]# git push -u origin bbs #上傳到分支 bbs 分支上
Jenkins
Jenkins
概述:是一個開源軟件項目,是基於Java開發的一種持續集成工具,用於監控持續重復的工作,旨在提供一個開放易用的軟件平台,使軟件的持續集成變成可能。
官網地址:https://jenkins.io/
rpm包下載地址:http://pkg.jenkins.io/redhat-stable/
中文幫助:https://jenkins.io/zh/doc/book/installing/
插件下載地址:http://mirror.xmission.com/jenkins/updates/update-center.json
部署Jenkins:推薦方式2
方式1:
# 安裝jenkins
rpm -ivh jenkins-2.93-1.1.noarch.rpm
# 修改配置文件,配置端口、用戶及jdk(jdk如果沒有則需要安裝)
vim /etc/sysconfig/jenkins
JENKINS_PORT=" 198 "
JENKINS_USER="root"
JENKINS_JAVA_CMD="/opt/cosmo/com/public/jdk_lin/1.8.0_171"
# 修改配置文件
vim /etc/sysconfig/jenkins
JENKINS_USER="root"
# 啟動
/etc/init.d/jenkins start
# 開機自啟動
chkconfig jenkins on
# 查看管理員登錄密碼
cat /var/lib/jenkins/secrets/initialAdminPassword
方式2:
# 下載jenkins的war包
https://www.jenkins.io/download/
# 上傳war包至服務器,並啟動
java -jar jenkins.war --httpPort=8888
# 后台啟動
nohup java -jar jenkins.war --httpPort=8888 > /dev/null 2>&1 &
# 瀏覽器訪問驗證
http://192.168.1.63:8888
# 查看管理員登錄密碼
cat /var/lib/jenkins/secrets/initialAdminPassword
Jenkins插件下載:http://updates.jenkins-ci.org/download/plugins/
安裝插件方式選擇:
方法一(推薦):如果服務器可以上網,那邊選擇在線安裝最好不過了,安裝流程為: 系統管理(ConfigureSystem)----插件管理(Manage Jenkins)---選擇需要的插件直接安裝即可
方法二:如果服務器不能上網,那么就只能離線安裝,首先去http://updates.jenkins-ci.org/download/plugins/ 下載需要的 plugin
,選擇匹配的版本號,下載到本 地,然后打開:系統管理()---插件管理—高級---找到”上傳插件”(瀏覽,找到擴展名為.hpi
的插件,上傳之 后默認直接就安裝了。重啟 jenkins
,安裝的插件就可以使用了。
Jenkins漢化
安裝這兩個漢化插件
重啟jenkins
配置Jenkins使用gitlib更新代碼
- 導出GitLab項目
- 安裝插件(Jenkins需要插件來支撐)
Credentials Plugin(默認已經安裝) #簽名證書管理插件
Gitlab Plugin #安裝后從 gitlab 獲取代碼
Git Plugin 和 Git Client Plugin #用於 jenkins 在 gitlab 中拉取源碼
GitLab Hook #gitlab 觸發 jenkins 構建項目 #hook [hʊk] 鈎子 ; plugin ['plʌgɪn] 插件
gitlab Authentication # gitlab 和 jenkins 認證相關的插件
SSH Plugin #進程執行 shell 腳本
Publish Over SSH #用於通過 ssh 部署應用
實現 gitlib 觸發 Jenkins 自動部署
在公司的測試環境當中,當開發人員向 gitlab
倉庫提交代碼后,gitlab
自動通知 jenkins
進行構建項目、代碼質量測試然后部署至測試環境,這里先暫時部署到測試環境。對於生產環境,后期使用手動部署代碼。
安裝 Gitlab Hook Plugin 插件:
系統管理-管理插件-可選插件,安裝這兩個插件:Gitlab Hook Plugin
和 Build Authorization Token Root
和 Build Token Trigger
增加 Build Pipeline 插件以流程圖的形式展示各個 Job 的順序