使用 GitLab + Jenkins 實現持續整合(CI)環境
本文為轉載文章+自己新添的內容;
轉載連結:https://blog.csdn.net/weixin_46902396/article/details/118337250
一、持續整合簡介
持續整合:Continuous Integration
- 簡單來說就是指,程式設計師在開發程式碼的過程中,可以頻繁的將程式碼部署到主幹上,並進行自動化測試。
持續交付:Continuous Delivery
- 簡單來說就是指在持續整合的基礎上,將程式碼部署到預生產環境。
持續部署:Continuous Deoloyment
- 簡單來說就是指在持續交付的基礎上,將要部署的程式碼實現自動部署,包括持續互動,持續部署。
1.GitLab 簡介
GitLab 是一個用於倉庫管理系統的開源專案。使用 Git 作為程式碼管理工具,可以通過 Web 介面來管理 Git 倉庫。
2.Jenkins 簡介
Jenkins 是一個獨立的開源軟體專案,是基於 Java 開發的一種持續整合工具,用於監控持續重複的工作,旨在提供一個開放易用的軟體平臺,使軟體的持續整合變成可能。
作用:
- 保證團隊開發人員提交程式碼的質量,還能夠減輕軟體釋出時的壓力;
- 持續整合中的任何一個環節都是自動完成的,無需太多人工干預,有利於減少重複過程以節省時間、費用和工作量。
Jenkins 特點:
- 開源免費;
- 跨平臺,支援所有的平臺。
- Master/Slave 支援分散式的 build(構建)
3.GitLab 和 GitHub 的區別
相同點:
- 二者都是基於 Web 的 Git 倉庫,在很大程度上 GitLab 是仿照 GitHub 來做的,它們都提供了分享開源專案的平臺。
不同點:
- GitHub 如果要使用私有倉庫,超過 4 個是需要付費的。GitLab 可以在上面建立私人的免費倉庫。
- GitLab 讓開發團隊對他們的程式碼倉庫擁有更多的控制。
4.持續整合系統的工作流程
- 開發者將新版本程式碼 push 到 GitLab 遠端倉庫上;
- 隨後 GitLab 會觸發 Jenkins 來進行拉取到本地(通過 Web Hook 或定時檢測)
- 最後 Jenkins 會根據事先配置好的指令碼進行 Build。
二、使用 GitLab + Jenkins 實現持續整合(CI)環境
準備工作
主機名 | 軟體版本 | 作業系統 | 聯網狀態 | IP地址(轉載---實驗) |
GitLab | gitlab-ce-12.0.2 | Centos7.9 | 雙網絡卡(內+外) | 192.168.1.1---192.168.24.134 |
Jenkins | jenkins-2.322.war | Centos7.9 | 雙網絡卡(內+外) | 192.168.1.2---192.168.24.132 |
Apache | Centos7.9 | 雙網絡卡(內+外) | 192.168.1.3---192.168.24.135 |
關閉防火牆和selinux
1.安裝GitLab
安裝 Gitlab 所需元件
[root@GitLab ~]# yum install -y curl policycoreutils openssh-server openssh-clients postfix policycoreutils-python
開啟Postfix郵件服務
[root@GitLab ~]# systemctl start postfix
[root@GitLab ~]# systemctl enable postfix
安裝GitLab
[root@GitLab ~]# wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.0.2-ce.0.el7.x86_64.rpm [root@GitLab ~]# ls anaconda-ks.cfg gitlab-ce-12.0.2-ce.0.el7.x86_64.rpm [root@GitLab ~]# yum -y localinstall gitlab-ce-12.0.2-ce.0.el7.x86_64.rpm
配置GitLab訪問地址
[root@GitLab ~]# vim /etc/gitlab/gitlab.rb
external_url 'http://gitlab.example.com' 替換為 external_url 'http://192.168.24.135'
注意:
1.可以將IP地址替換為域名
2.該機器上最好不要配置關於其他服務,gitlab啟用會自帶許多服務,其中自帶nginx佔用80,也有服務佔用8080等埠。
3.只修改如上配置的話,啟動後,預設80埠可訪問gitlab。
重置gitlab(時間較長)
[root@GitLab ~]# gitlab-ctl reconfigure [root@GitLab ~]# netstat -anpt | grep nginx
2.Gitlab頁面操作:
1)登入Gitlab,訪問http://192.168.24.135
可以將英文轉換為中文
- 注意:在 GitLab 中配置的中文並不是全部都是中文,可以安裝中文外掛。
2)配置郵件報警
[root@GitLab ~]# vim /etc/gitlab/gitlab.rb # 在第 57 行後新增以下內容 gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = 'smtp.qq.com' # SMTP 伺服器 gitlab_rails['smtp_port'] = 465 # SMTP 伺服器埠號 gitlab_rails['smtp_user_name'] = '[email protected]' # 郵件賬號 gitlab_rails['smtp_password'] = '' # 郵件授權碼(不是登入密碼,是開啟POP/SMTP時給與的授權碼) gitlab_rails['smtp_authentication'] = 'login' gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['smtp_tls'] = true gitlab_rails['gitlab_email_from'] = '[email protected]'
重置 Gitlab
[root@GitLab ~]# gitlab-ctl reconfigure
登入控制檯傳送測試郵件
[root@GitLab ~]# gitlab-rails console irb(main):001:0> Notify.test_email('wangyi_yx001@163.com','Test','Hello ZhangSan').deliver_now
然後檢視傳送結果,併到接收人郵箱中檢視郵件是否可以正常接收到。
修改GitLab中root使用者的郵件地址,方便接收報警。
3)建立群組
點選建立群組
填寫群組資訊
建立一個賬號
填寫使用者資訊
給河北彭于晏配置密碼
把新使用者新增到群組
GitLab 使用者在組中有五種許可權:
- Guest:可以建立問題、發表評論、不能讀寫版本庫(訪客)
- Reporter:可以克隆程式碼,不能提交(測試人員)
- Deveoper:可以克隆程式碼、開發、提交、上傳(開發人員)
- Master:可以建立專案、新增 tag、保護分支、新增專案成員、編輯專案(運維)
- Owner:所有事情都可以做,包括設定專案的訪問許可權(老闆,但老闆一般都在辦公室)
4)建立專案
使用河北彭于晏使用者登入建立
建立專案
在剛才建立的專案中建立檔案
5)配置免密克隆
[root@GitLab ~]# ssh-keygen -t rsa # 配置金鑰對 (三連回車即可) [root@GitLab ~]# cat .ssh/id_rsa.pub # 檢視公鑰
將公鑰上傳到 GitLab 中
驗證(克隆過程中不需要輸入密碼即可)
即在本機,可以通過git命令,將gitlab中的專案,克隆到本地。
[root@GitLab ~]# git clone git@192.168.1.1:ZhangSan/test.git [root@GitLab ~]# ls anaconda-ks.cfg gitlab-ce-12.0.2-ce.0.el7.x86_64.rpm test [root@GitLab ~]# cd test/ [root@GitLab test]# ls 1.html
3.安裝Jenkins
安裝 JDK(因為 Jenkins 是使用 Java 編寫的,所以需要先安裝 JDK)
[root@Jenkins ~]# tar xf jdk-8u181-linux-x64.tar.gz [root@Jenkins ~]# ls anaconda-ks.cfg jdk1.8.0_181 jdk-8u181-linux-x64.tar.gz [root@Jenkins ~]# mv jdk1.8.0_181/ /usr/local/java
[root@Jenkins ~]# cat <<END >> /etc/profile
JAVA_HOME=/usr/local/java/
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH
END
[root@Jenkins ~]# source /etc/profile
[root@Jenkins ~]# java -version # 檢視 Java 版本
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
安裝Jenkins
[root@Jenkins opt]# rz [root@Jenkins opt]# ls jenkins-2.322.war [root@Jenkins opt]# mv jenkins-2.322.war jenkins.war [root@Jenkins opt]#nohup java -jar jenkins.war >/tmp/jenkins.out 2>&1 &
注意:
1.JenKins啟動,預設是8080埠。
2.war包啟動後,Jenkins預設的工作目錄為:~/.jenkins/
3.Jenkins存放Item任務的預設目錄為:~/.jeninks/workspace/
檢查,如圖
3.1)登入Jenkins,並安裝相關外掛
訪問:http://192.168.1.2:8080
點選繼續後,會出現推薦安裝和自定義安裝,我這裡選擇的是推薦安裝(這裡可能用到加速,可觀看連結)
Jenkins外掛加速安裝連結:Jenkins(一):Java環境+Jenkins環境安裝 - 浮~生 - 部落格園 (cnblogs.com)
3.2)配置Jenkins實現GitLab更新程式碼
安裝Jenkins外掛,位置:系統管理----》外掛管理
相關外掛如下:
Credentials # 簽名證書管理外掛
Gitlab # 安裝後從 GitLab 獲取程式碼
Git 和 Git Client # 用於 Jenkins 在 GitLab 中拉取原始碼
GitLab Hook # GitLab 觸發 Jenkins 構建專案
Gitlab Authentication # GitLab 和 Jenkins 認證外掛
SSH Plugin # 程序執行 Shell 指令碼
Publish Over SSH # 用於通過 SSH 部署應用
- 注意:當安裝好 Jenkins 外掛後,外掛可能會跟 Jenkins 出現版本差異,不用管,後面我會對 Jenkins 進行升級操作。
配置 Jenkins 免密拉取 GitLab 程式碼
[root@Jenkins ~]# ssh-keygen -t rsa [root@Jenkins ~]# cat .ssh/id_rsa.pub
將公鑰上傳到 GitLab 上
將私鑰上傳到 Jenkins 上
- Jenkins 的
root
使用者公鑰在 GitLab 上,私鑰在 Jenkins 上,目的就是為了方便 Jenkins 可以直接拉去 GitLab 上的程式碼。
3.3)在 Jenkins 上建立專案
下載一下程式碼
3.4)將程式碼釋出到Web伺服器
這邊簡單說一下大致的流程:
- 通過我們這一系列的操作也可以看出來,首先需要在 GitLab 上建立(上傳)專案,然後 Jenkins 會將程式碼下載到本地;
- 最後可以使用 Jenkins 將程式碼傳送給指定伺服器。
在192.168.1.3
伺服器上操作,下載httpd服務
[root@Apache ~]# yum -y install httpd [root@Apache ~]# systemctl start httpd
在Jenkins上配置SSH免密登入
[root@Jenkins ~]# ssh-copy-id root@192.168.1.3
建立自動上傳 Web 程式碼的指令碼
[root@Jenkins ~]# cat <<END > /root/1.sh #!/bin/bash scp /root/.jenkins/workspace/web/* [email protected]:/var/www/html/ END [root@Jenkins ~]# chmod +x 1.sh
將指令碼新增到 Jenkins 中
釋出專案
3.5)驗證:
4.實現Jenkins自動部署
4.1)安裝外掛
Gitlab Hook Plugin
Build Authorization Token Root
Build Token Trigger
4.2)配置身份驗證令牌
[root@Jenkins ~]# openssl rand -hex 12 038ef13e10ef686193784383
這個令牌不是唯一,只是需要要確保Jenkins和Gitlab上的配置一致。
- 注意:
-hex
輸出結果為 16 進位制資料,數字 12 是指定生成的隨機字元為 12 位元組,即 24 個 16 進位制個數。
4.3)在Jenkins上配置觸發器
4.4)在GitLab專案部署介面設定連結和Token(即身份驗證令牌值)。
網址格式:http://jenkins地址/buildByToken/build?job=jenkins專案名&token=token值
其中,web為Jenkins的專案名,後面的Token值為上面的身份驗證令牌值。
- 注意:當建立鉤子時出現
Urlis blocked: Requests to the local network are not allowed
- 原因是因為 GitLab 10.6 版本以後為了安全,不允許向本地網路傳送 WebHook 請求。
開啟請求,需要管理員賬號開啟。
- 當開啟請求後,再使用該專案的使用者重新設定連結和Token 值即可。
4.5)驗證
5.Jenkins版本升級
下載後之後,我們只需要將 Jenkins 原有的包替換即可
[root@Jenkins ~]# rpm -ql jenkins # 檢視 Jenkins 包安裝路徑 [root@Jenkins ~]# systemctl stop jenkins [root@Jenkins ~]# cd /usr/lib/jenkins/ [root@Jenkins jenkins]# mv jenkins.war jenkins-2.222.4.war.bak [root@Jenkins jenkins]# ls jenkins-2.222.4.war.bak jenkins.war [root@Jenkins jenkins]# systemctl start jenkins
檢視