1. 程式人生 > 其它 >使用 GitLab + Jenkins 實現持續整合(CI)環境

使用 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 

檢視