Devops持續化集成

Author: Devon

-Email: [email protected]

jenkins+Sonarqube+Gitlab+pipeline

一、什麼是Devops?

DevOps 是開發和運維的縮寫

DevOps 是一組最佳實踐操作(研發,運維,測試)在應用和服務生命週期中的協作和溝通,強調整個組織的合作,以及交付和基礎設施變更的自動化,從而實現持續集成,持續部署和持續交付

二、Jenkins安裝

[root@devlop ~]# cat /etc/redhat-release <!--我的Centos環境-->

CentOS Linux release 7.6.1810 (Core)

[root@devlop ~]# uname -r

3.10.0-957.21.3.el7.x86_64

[root@devlop ~]# systemctl status firewalld

● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

安裝Jenkins的源碼包和java所需的環境

http://pkg.jenkins.io/redhat-stable/ 官網,我這裏使用的是yum的方式這是快速安裝方法,也可以使用官網war包放入tomcat或者docker安裝都可以。

[root@devlop ~]# yum -y install java-1.8.0 java-devel

[root@devlop ~]# sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo

[root@devlop ~]# sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

[root@devlop ~]# yum -y install jenkins

[root@devlop ~]# systemctl start jenkins <!--啓動Jenkins-->
[root@devlop ~]# yum -y install git sv<!--jenkins默認會在環境變量中找這些工具,所以要有-->

[root@devlop ~]# netstat -lntup|grep 8080 <!--默認8080端口-->

tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      4137/java

[root@devlop ~]# rpm -ql jenkins

/etc/init.d/jenkins         # 啓動文件
/etc/logrotate.d/jenkins    # 日誌分割配置文件
/etc/sysconfig/jenkins      # jenkins主配置文件
/usr/lib/jenkins            # 存放war包目錄
/usr/lib/jenkins/jenkins.war   # war 包 
/usr/sbin/rcjenkins         # 命令
/var/cache/jenkins          # war包解壓目錄 jenkins網頁代碼目錄
/var/lib/jenkins            # jenkins 工作目錄
/var/log/jenkins            # 日誌

[root@devlop ~]# grep "^[a-Z]" /etc/sysconfig/jenkins

JENKINS_HOME="/var/lib/jenkins"    #jenkins工作目錄
JENKINS_JAVA_CMD=""
JENKINS_USER="jenkins"       # jenkinx啓動用戶
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"
JENKINS_PORT="8080"          # 端口
JENKINS_LISTEN_ADDRESS=""
JENKINS_HTTPS_PORT=""
JENKINS_HTTPS_KEYSTORE=""
JENKINS_HTTPS_KEYSTORE_PASSWORD=""
JENKINS_HTTPS_LISTEN_ADDRESS=""
JENKINS_DEBUG_LEVEL="5"
JENKINS_ENABLE_ACCESS_LOG="no"
JENKINS_HANDLER_MAX="100"     # 最大連接
JENKINS_HANDLER_IDLE="20"
JENKINS_ARGS=""

進入Web頁面安裝Jenkins

瀏覽器訪問IP+端口(8080)

Devops持續化集成

複製Web頁面提示的路徑,並在服務器上展現出來,然後把展現出來的密碼複製到頁面的對話框

[root@devlop ~]# cat /var/lib/jenkins/secrets/initialAdminPassword

3c9cb6a2b37b457baac6370af43cd15a

輸入後點擊繼續進入到安裝插件頁面。一般推薦的就OK啦。就算推薦的不可以或者安裝失敗我們可以進入jenkin後再進行安裝。

Devops持續化集成

安裝的時間稍微長一點,先喝杯茶,休息下哈。
Devops持續化集成

創建管理員用戶

Devops持續化集成

如果有插件安裝失敗可以去這裏選擇安裝對的的依賴

Devops持續化集成

全局工具配置

系統管理>>全局工具設置

這裏面設置的是系統工具的路徑等,比如jdk,maven,git等,如果你不設置,jenkins會自動去環境變量中找這些工具,所以要確保這些工具已經安裝並存在環境變量中,如果是手動安裝jdk等方式,則需要指定jdk的安裝路徑,或者這是環境變量等都是可以的

Devops持續化集成
Devops持續化集成

Jenkins的初始化配置

配置jenkins併發執行數量,提高執行效率
Devops持續化集成

Devops持續化集成
設置管理員郵箱 我是爲了方便使用了QQ郵箱
Devops持續化集成
在QQ郵箱中開啓POP3
Devops持續化集成
Devops持續化集成

測試成功後,點擊 “ 保存 ”。

安裝gitlab,Blue ocean插件(相當於jenkins的一個新主題界面)
Devops持續化集成
Devops持續化集成

然後等待安裝重啓。
Devops持續化集成
Devops持續化集成

Jenkins基於角色的權限管理RBAC

安裝插件Role-based Authorization Strategy

Devops持續化集成

安裝重啓後生效。後設置全局安全配置

Devops持續化集成

保存退出!

創建用戶devlops,打開系統管理—管理用戶

Devops持續化集成

Devops持續化集成

返回系統管理

Devops持續化集成

管理角色

Devops持續化集成

Devops持續化集成

添加對devlop角色的權限控制

Devops持續化集成

點擊Sava保存!!!

分配角色

Devops持續化集成
Devops持續化集成

點擊Save,註銷admin賬戶,測試devlop賬戶是否登錄成功。

Devops持續化集成

登錄成功,好了。我們就切回初始的管理員賬戶,讓我們繼續往下面操作吧!!!

Jenkins Pipeline實戰

我們就先來構建一個自由風格的軟件項目

Devops持續化集成
Devops持續化集成

Devops持續化集成

Devops持續化集成

Devops持續化集成

Devops持續化集成

Devops持續化集成

Devops持續化集成

輸出成功

什麼是Pipeline?

Jenkins Pipeline是一套插件,支持將連續輸送Pipeline實施和整合到Jenkins。Pipeline提供了一組可擴展的工具,用於通過PipelineDSL爲代碼創建簡單到複雜的傳送Pipeline。

通常,此“Pipeline代碼”將被寫入 Jenkinsfile項目的源代碼控制存儲庫,例如:

Devops持續化集成

 agent 表示Jenkins應該爲Pipeline的這一部分分配一個執行者和工作區。
 stage 描述了這條Pipeline的一個階段。
 steps 描述了要在其中運行的步驟 stage
 sh 執行給定的shell命令
 junit是由JUnit插件提供的 用於聚合測試報告的Pipeline步驟。

爲什麼是Pipeline?

Jenkins從根本上講是一種支持多種自動化模式的自動化引擎。Pipeline在Jenkins上添加了一套強大的自動化工具,支持從簡單的連續集成到全面的連續輸送Pipeline的用例。通過建模一系列相關任務,用戶可以利用Pipeline 的許多功能:

· 代碼:Pipeline以代碼的形式實現,通常被檢入源代碼控制,使團隊能夠編輯,審查和迭代其傳送流程。

· 耐用:Pipeline可以在計劃和計劃外重新啓動Jenkins管理時同時存在。

· Pausable:Pipeline可以選擇停止並等待人工輸入或批准,然後再繼續Pipeline運行。

· 多功能:Pipeline支持複雜的現實世界連續交付要求,包括並行分叉/連接,循環和執行工作的能力。

· 可擴展:Pipeline插件支持其DSL的自定義擴展 以及與其他插件集成的多個選項。

雖然Jenkins一直允許基本形式的自由式工作聯合起來執行順序任務,Pipeline使這個概念成爲Jenkins的最好的一個部分。

基於Jenkins的核心可擴展性,Pipeline也可以由Pipeline共享庫用戶和插件開發人員擴展。

下面的流程圖是在Jenkins Pipeline中容易建模的一個連續發貨方案的示例:

Devops持續化集成

Pipeline 條件

Step

單一任務,從基礎中告訴了Jenkins應該怎麼做。例如,要執行shell命令,請make使用以下sh步驟:sh 'make'。當插件擴展Pipeline DSL時,通常意味着插件已經實現了一個新的步驟

Node

Pipeline執行中的大部分工作都是在一個或多個聲明node步驟的上下文中完成的。將工作限制在Node步驟中有兩件事情:

1.通過將項目添加到Jenkins隊列來調度要運行的塊中包含的步驟。一旦執行器在節點上空閒,步驟就會運行。

2.創建工作區(特定於該特定Pipeline的目錄),可以從源代碼控制中檢出的文件完成工作。

根據您的Jenkins配置,某些工作空間在一段時間不活動後可能無法自動清除。

Stage

stage是定義整個Pipeline的概念上不同子集的一個步驟,例如:“Build”,“Test”和“Deploy”,許多插件用於可視化或呈現Jenkins Pipeline狀態/進度。

Devops持續化集成

測試pipeline,點擊保存

Devops持續化集成

立即構建

Devops持續化集成

鼠標放在上面可以查看構建日誌

Devops持續化集成

Jenkins Pipeline測試

創建測試代碼項目組

Devops持續化集成

Devops持續化集成

新建項目

Devops持續化集成
Devops持續化集成

添加Readme文件,裏面隨便寫點內容,模仿代碼

Devops持續化集成

Devops持續化集成

Devops持續化集成

Jenkins生成證書拉取gitlab代碼

[root@devlop ~]# ssh-keygen <!--連續回車-->

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:GyU/XcAADlievbP0alHbDuAAZ6D6/Tvcse2SOtLlrWk root@devlop
The key's randomart image is:
+---[RSA 2048]----+
|    .+o ...o.    |
|   .o.o=    ..   |
|  .  +o + .   .  |
| .    . .=.. .   |
|.      oSooo.    |
| . .   .=*o..    |
|  . .o +oB.o     |
|    ..= Eoo .    |
|     .+B++.      |
+----[SHA256]-----+

Gitlab放置公鑰

Devops持續化集成

Devops持續化集成

複製jenkins公鑰用來拉代碼

[root@devlop ~]# cat .ssh/id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJP+CagFYsc51nMU+JnXgcOBmAhee5GndsJqQ1Ay4Yyibg2gQd/3q8/BhRFw3kiHkL0jIIpmqos+e9Wx8CKSPMVeOn6Qel/qJcqElyBNPQlCu59DmKTxtmOzpWR1si+GC2+stgNEjcP/c0AmUjuhhZtHduMYo0pjSaEh2UT3nWiE8POhkWuLyT/nLEpePQx3Vt2zlwq+XA2bYSJEgYE5NlDT5GCUy5WmV/n73/3Ioc3AI0WqD5aPzneWyPeCD1CqjCwonu68NYPl/B+pRQiQQ9s/fAeRRl2KQZvYtD+6n/tr6rjUlLRrIaotVjmcKiS827EK1eEVmCD7cOq+ZSDDat root@devlop

Devops持續化集成

Devops持續化集成

Devops持續化集成

Devops持續化集成

Devops持續化集成

[root@devlop ~]# cat /root/.ssh/id_rsa <!--私鑰位置信息,要全部複製-->

將gitlab的公鑰加入到demo項目當中

Devops持續化集成

Devops持續化集成

再來看下就沒有報錯信息了

Devops持續化集成

Hostname解析錯誤

[root@devlop ~]# vim /etc/hosts <!--設置一下git的解析就可以了-->

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.16   gitlab.example.com

Devops持續化集成

複製生成的腳本到項目中

Devops持續化集成

測試構建已經成功拉取代碼

Devops持續化集成

查看拉取到的代碼

[root@devlop pipeline-demo]# pwd

/var/lib/jenkins/workspace/pipeline-demo

[root@devlop pipeline-demo]# ll

total 4
-rw-r--r--. 1 jenkins jenkins 4 Oct 31 17:25 README.md

如果要執行腳本等命令如下加sh後面可接任何命令

Devops持續化集成

可以看到成功執行了剛剛的cat命令

Devops持續化集成

交互

比如說單元測試完畢,要部署到測試環境,jenkins會有一個交互,讓你確認是否部署到測試環境

Devops持續化集成

構建(確認就往下部署,中斷就不會執行)

Devops持續化集成

查看日誌部署成功

Devops持續化集成

Jenkins分佈式構建

節點管理

Slave統一目錄和安裝好jdk

系統設置>節點管理

Slave節點組好統一目錄

$ mkdir /data/jenkins-slave -p          這是slave的數據目錄 
$ yum install -y java-1.8.0             必須安裝jdk否則slave節點的jenkins起不來

新建節點

Devops持續化集成

Devops持續化集成

Devops持續化集成

Devops持續化集成

Devops持續化集成

時間同步 ntpdate

需要注意兩臺機器的時間是否一致

Devops持續化集成

大規模使用時,master是不進行構建工作的,都是由slave節點進行工作,執行者置爲0

系統管理>節點管理>master

Devops持續化集成

如果現在執行構建的話就會在slave節點上面進行構建了

可以在節點目錄/data/jenkins-slave/workspace/pipeline-demo下查看是否有拉取的代碼

Devops持續化集成

如果有多個節點都會顯示在構建執行狀態下面,我們現在只有一臺slave

Devops持續化集成

如果沒有公網的情況下安裝Jenkins

如何在沒有外網的環境下安裝jenkins

1.事先在有網的地方將jenkins安裝好,將所有插件安裝好,將/var/lib/jenkins打一個包

2.在新機器上設置環境變量/etc/profile中添加JAVA_HOME=/var/lib/jenkins即可

3.tomcat放入jenkins的war包啓動即可

質量掃描SonarQube

代碼質量七宗罪

https://www.sonarqube.org/ 官方網站

  1. 編碼規範:是否遵守了編碼規範,遵循了最佳實踐。

  2. 潛在的BUG:可能在最壞情況下出現問題的代碼,以及存在安全漏洞的代 碼。

  3. 文檔和註釋:過少(缺少必要信息)、過多(沒有信息量)、過時的文檔 或註釋。

  4. 重複代碼:違反了Don’tRepeat Yourself原則。

  5. 複雜度:代碼結構太複雜(如圈複雜度高),難以理解、測試和維護。

  6. 測試覆蓋率:編寫單元測試,特別是針對複雜代碼的測試覆蓋是否足夠。

  7. 設計與架構:是否高內聚、低耦合,依賴最少。

Devops持續化集成

安裝SonarQube

所在機器必須要安裝有Jdk

下載長期支持版 <!--可以安裝到別的服務器上面-->

[root@devlop ~]# mkdir /server/tools -p

[root@devlop ~]# cd /server/tools

[root@devlop tools]# wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-6.7.5.zip

[root@devlop tools]# unzip sonarqube-6.7.5.zip

[root@devlop tools]# mv sonarqube-6.7.5 /usr/local

[root@devlop tools]# ln -s /usr/local/sonarqube-6.7.5/ /usr/local/sonarqube

快速安裝MySQL

你可以使用源碼安裝,或者yum,我是之前的編譯安裝的腳本,跑下腳本,喝杯茶休息下哈!

#!/bin/bash
yum -y update
#Definition originally
pass='Admin@123'
#install download
yum -y install ncurses ncurses-devel openssl-devel bison gcc gcc-c++ make cmake

#官網下載
wget_boost=http://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz
wget_mysql=https://downloads.mysql.com/archives/get/file/mysql-5.7.19.tar.gz

#下載地方
wget $wget_boost
wget $wget_mysql

#install MySQL
groupadd mysql
useradd -r -g mysql -s /bin/flase mysql
tar xf mysql-5.7.19.tar.gz

#install boost
mv boost_1_59_0.tar.gz mysql-5.7.19
cd mysql-5.7.19/
tar xf boost_1_59_0.tar.gz

#To configure (配置)
cmake . \
-DWITH_BOOST=boost_1_59_0/ \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DSYSCONFDIR=/etc \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DINSTALL_MANDIR=/usr/share/man \
-DMYSQL_TCP_PORT=3306 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1
EOF
#compile(編譯)
make

#install
make install

#-DCMAKE_INSTALL_PREFIX:安裝路徑
#-DMYSQL_DATADIR:數據存放目錄
#-DWITH_BOOST:boost源碼路徑
#-DSYSCONFDIR:my.cnf配置文件目錄
#-DEFAULT_CHARSET:數據庫默認字符編碼
#-DDEFAULT_COLLATION:默認排序規則
#-DENABLED_LOCAL_INFILE:允許從本文件導入數據
#-DEXTRA_CHARSETS:安裝所有字符集

#Initialization(初始化)
cd /usr/local/mysql/
mkdir mysql-files
chown -R mysql.mysql  /usr/local/mysql
#注意目錄名稱,此處爲自己自建的目錄

#將獲得的臨時密碼追加到passwd.txt中(出錯)
bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
read -p "請輸入你的初始密碼: " passwd
echo "$passwd" >>/root/startpass.txt
bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data

#備份原配置文件
mv /etc/my.cnf /etc/cpmy.cnf
cat >/etc/my.cnf <<-EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
EOF

#啓動mysql
cp support-files/mysql.server /etc/init.d/mysqld
#添加mysql服務
chkconfig --add mysqld
#開機自啓動服務
chkconfig mysqld on
#service mysqld start
systemctl start mysqld
systemctl enable mysqld

#將mysql命令加入profile文件
echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
source /etc/profile

mysqladmin -uroot -p''`cat /root/startpass.txt`'' password ''$pass'' >>/dev/null
if [ $? -eq 0 ]
then
echo "------------------------------------------"
echo -e "\033[34m 新的密碼爲: $pass \033[0m "
echo -e "\033[35m 數據庫創建成功!! \033[0m"
else
echo -e "\033[36m 修改密碼失敗 \033[0m"
fi

[root@devlop ~]# /usr/local/mysql/bin/mysql -uroot -p'Admin@123'

mysql> CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;

mysql> GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';

mysql> GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';

mysql> FLUSH PRIVILEGES;

SonarQube配置

配置連接數據庫

root@devlop ~]# cd /usr/local/sonarqube/conf/

[root@devlop conf]# ls

sonar.properties  wrapper.conf

[root@devlop conf]# vim sonar.properties

sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:mysql://192.168.0.16:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatc
hedStatements=true&useConfigs=maxPerformance

配置日誌蒐集的初始化內存(我這裏是虛擬機設置成500M,默認是2個g)

[root@devlop ~]# cd /usr/local/sonarqube/elasticsearch/config/

[root@devlop config]# vim jvm.options

-Xms500m
-Xmx500m

使用普通用戶啓動,不能使用root啓動,要不然會報錯

[root@devlop sonarqube]# useradd sonar

[root@devlop sonarqube]# id sonar

uid=1000(sonar) gid=1001(sonar) groups=1001(sonar)

[root@devlop sonarqube]# chown -R sonar:sonar /usr/local/sonarqube

[root@devlop sonarqube]# chown -R sonar:sonar /usr/local/sonarqube-6.7.5/

啓動完可以檢查logs下的日誌是否有報錯(啓動可能有點慢,因爲正在數據庫創建表)

[root@devlop ~]# su - sonar

Last login: Sat Nov 10 00:27:05 CST 2018 on pts/0

[sonar@devlop ~]$ /usr/local/sonarqube/bin/linux-x86-64/sonar.sh start

瀏覽器訪問192.168.0.16:9000 <!--IP+9000(端口)-->

登陸賬號:admin 密碼:admin

Devops持續化集成

Devops持續化集成

Devops持續化集成

SonarQube掃描器

下載掃描器

https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner

Linux直接下載: wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.2.0.1227-linux.zip

Devops持續化集成

解壓掃描器

[root@devlop tools]# unzip sonar-scanner-cli-3.2.0.1227-linux.zip

[root@devloptools]# mv sonar-scanner-3.2.0.1227-linux/ /usr/local/

[root@devloptools]# ln -s /usr/local/sonar-scanner-3.2.0.1227-linux/ /usr/local/sonar-scanner

配置

[root@devlop ~]# cd /usr/local/sonar-scanner/conf

[root@devlop conf]# vim sonar-scanner.properties

sonar.host.url=http://10.0.0.11:9000
sonar.sourceEncoding=UTF-8

測試代碼分析,下載測試代碼

https://github.com/SonarSource

Devops持續化集成

上傳解壓配置

[root@devlop local]# unzip sonar-scanning-examples-master.zip

[root@devlop local]# cd sonar-scanning-examples-master/sonarqube-scanner-maven

[root@devlop sonarqube-scanner-maven]# vim sonar-project.properties

sonar.projectKey=devops-demo
sonar.projectName=devops-demo
sonar.projectVersion=1.0  
sonar.sources=. 
sonar.java.binaries=.
sonar.sourceEncoding=UTF-8

執行掃描(是在代碼目錄進行執行掃描)

[root@devlop sonarqube-scanner-maven]# /usr/local/sonar-scanner/bin/sonar-scanner

掃描完畢就可以在瀏覽器查看了

Devops持續化集成

Devops持續化集成

SonarQube設置中文

Devops持續化集成

如果web界面安裝失敗就手動下載安裝

這是對應我6.7.5的中文語言包

https://github.com/SonarQubeCommunity/sonar-l10n-zh/releases/tag/sonar-l10n-zh-plugin-1.19

/usr/local/sonarqube/extensions/plugins #可以手動下載下來jar包放入到這個目錄即可

#版本不一樣的要對照一下相應的中文包,要不然服務啓動會報錯,注意看日誌

安裝完重啓服務,可以看到已經是中文語言了

Devops持續化集成

SonarQube和jenkins集成

安裝sonar插件

Devops持續化集成

Devops持續化集成

設置SonarQube-server

Devops持續化集成

Devops持續化集成

SonarQube生成token

Devops持續化集成

複製到jenkins 的token選項中

Pipeline集成SonarQube

點擊項目的配置添加掃描,如果slave進行掃描也要安裝掃描器纔可以

Devops持續化集成

本地將代碼克隆下來

$ git clone http://gitlab.example.com/devops/demo.git

Cloning into 'demo'...
Username for 'http://gitlab.example.com': root   #gitlab用戶名
Password for 'http://[email protected]':   #密碼
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.

$ cd demo

$ cp -a /usr/local/sonar-scanning-examples-master/sonarqube-scanner-maven/* ./ <!--將測試代碼拷貝到項目中進行提交-->

$ git add *

$ git commit –m "first commit"

$ git config --global user.name "Yang Shi Yi"

$ git config --global user.email [email protected]

$ git push

<!--輸入用戶名和密碼即可push到gitlab成功-->

網頁查看已經成功提交

Devops持續化集成

Devops持續化集成

Jenkins執行構建測試查看是否進行質量掃描

Devops持續化集成

結果掃描成功,但是沒有看到sonarqube的小圖標呢,下一步添加sonarqube的圖標

Devops持續化集成

Devops持續化集成

Sonarcanner掃描報錯

INFO: Analysis report generated in 9263ms, dir size=11 MB
INFO: Analysis reports compressed in 5699ms, zip size=4 MB
INFO: ------------------------------------------------------------------------
INFO: EXECUTION FAILURE
INFO: ------------------------------------------------------------------------
INFO: Total time: 6:28.455s
INFO: Final Memory: 29M/1274M
INFO: ------------------------------------------------------------------------
ERROR: Error during SonarQube Scanner execution
ERROR: Failed to upload report - 500: An error has occurred. Please contact your administrator
ERROR:
ERROR: Re-run SonarQube Scanner using the -X switch to enable full debug logging.

結果是“EXECUTION FAILURE” 失敗了。

失敗原因是啥呢? 注意我加粗的文字。 分析的報告大小是 11MB,壓縮之後4MB。還是很大的。上傳失敗的原因是 MYSQL配置問題。

在mysql的終端窗口輸入如下命令:

mysql> show VARIABLES like '%max_allowed_packet

修改/etc/my.cnf文件:

max_allowed_packet = 50M

重啓數據庫即可,有時候還需要重啓下Sonarqube.

Gitlab和jenkins集成

設置gitlab token

Devops持續化集成

Devops持續化集成

系統管理>系統設置>gitlab #需要安裝gitlab查看纔有看到,如沒有看到請安裝gitlab插件

Devops持續化集成

Devops持續化集成

Devops持續化集成

Devops持續化集成

設置觸發器(開發push就觸發構建)

Devops持續化集成

Devops持續化集成

Devops持續化集成

設置鉤子webhook

Gitlab設置jenkins生成的token(要先進入項目)

Devops持續化集成

Devops持續化集成

需要注意我這裏修改了默認端口,我的是8081,所以填在gitlab的時候要改成8081

Devops持續化集成

如果添加鉤子失敗報錯請看下面解決方法

Devops持續化集成

產生原因,因爲jenkins和gitlab在同一臺機器上面,默認不允許

解決方法

Devops持續化集成

測試鉤子是否成功

Devops持續化集成
Devops持續化集成

Jenkins已經自動觸發構建,因爲我test push了兩次
Devops持續化集成

DevOps之部署流水線

軟件交付(部署)流水線

軟件交付流水線是指軟件變更從提交到版本控制庫,到發佈給用戶 的整個過程

軟件的每次變更都會經歷一個複雜的流程才能發佈

這個流程包括構建軟件、一系列不同階段的測試與部署等,需要多 團隊協作完成 • 交付流水線對交付流程進行了建模,並支持查看、控制整個交付流程

部署流水線的環境

Devops持續化集成

部署流水線的階段和環境

Devops持續化集成

流水線反饋過程

Devops持續化集成

加快代碼反饋結果,能都讓代碼快速部署在生產環境

部署流水線分階段實施

Devops持續化集成

部署流水線設計和規劃

流水線案例

可靠可重複的流水線

通過流水線階段晉級,平衡測試反饋速度與覆蓋度

通過流水線分析瓶頸,識別自動化改造點和協作點

Devops持續化集成

部署流水線實踐

只生成一次二進制包(代碼只打一次包,不需要多次打包)

對不同環境採用同一部署方式

對部署進行冒煙測試

向生產環境的副本中部署(PAT)

每次變更都要立即在流水線中傳遞

只有有環節失敗,就停止整個流水線

部署流水線Git分支設計

Devops持續化集成

創建開發分支

Devops持續化集成

Devops持續化集成

Devops持續化集成

創建gitlab用戶

創建gitlab用戶張三開發者和開發經理李四來模仿普通開發和開發經理合並分支並觸發流水線

Devops持續化集成

Devops持續化集成

Devops持續化集成

Devops持續化集成

創建lisi用戶同上面一樣,請自行創建

將用戶加入項目組

進入項目

Devops持續化集成

Devops持續化集成

Devops持續化集成

Devops持續化集成

Devops持續化集成

Devops持續化集成

開發拉取項目

Devops持續化集成

Linux客戶端操作

Devops持續化集成

Devops持續化集成

張三用戶往develop分支提交代碼就觸發提交階段的流水線

提交階段流水線設計與實現

持續集成-提交階段

持續集成是一種軟件開發實踐,即團隊開發成員經常集成他們的工作,通常每個成員每天至少集成一次, 也就意味着每天可能會發生多次集成。每次集成都通過自動化的構建(包括編譯,發佈,自動化測試) 來驗證,從而儘早地發現集成錯誤。

統一的代碼庫

每個人每天都要向代碼庫主幹提交代碼

每次代碼遞交後都會在持續集成服務器上觸發構建

自動構建,快速構建,每次構建都要100%通過

模擬生產環境的自動測試

每個人都可以很容易的獲取最新可執行的應用程序

每個人都清楚正在發生的狀況

修復失敗的構建是優先級最高的事情

提交階段要做的事情

創建流水線

1.拉取代碼 >> 2.代碼 >> 3.單元測試 >> 4.構建打包 >> 5.質量掃描 >> 6.郵件通知

Devops持續化集成

Devops持續化集成

我這裏是已經創建過了

配置觸發器

Devops持續化集成

設置鉤子腳本

Devops持續化集成

模仿開發提交代碼到develop分支觸發提交階段流水線

Devops持續化集成

發現jenkins已經觸發流水線操作

Devops持續化集成

安裝maven

在jenkins所在服務器安裝maven

打開官網: http://maven.apache.org/

或者直接wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.0/binaries/apache-maven-3.6.0-bin.tar.gz

Devops持續化集成

Devops持續化集成

Jenkins服務器操作

[root@devlop wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.0/binaries/apache-maven-3.6.0-bin.tar.gz

[root@devlop tools]# tar xf apache-maven-3.6.0-bin.tar.gz

[root@devlop tools]# mv apache-maven-3.6.0/ /usr/local/maven

測試mvn

Devops持續化集成

這是代碼:

node {
   stage('拉取代碼'){
       echo "Code pull"
       git credentialsId: 'a3b87131-a21b-4042-a537-06bb088a0ca4', url: '[email protected]:devops/java-demo.git'
   }
   stage('代碼編譯'){
       echo "Code Build"
       sh "/usr/local/maven/bin/mvn clean compile"
   }
   stage('單元測試'){
       echo "uniunit test"
       sh "/usr/local/maven/bin/mvn test"
   }
   stage('質量掃描 '){
       withSonarQubeEnv('Sonarqube'){
       sh '/usr/local/sonar-scanner/bin/sonar-scanner'
   }
  }
   stage('郵件通知'){
       echo "Mail"
       emailext body: '', subject: 'jenkins郵件通知:提交階段自動化驗證通過', to: '[email protected]'
   }
}
#郵件我這裏已經寫好了,郵箱配置請參考jenkins安裝時的初始化即可,下面會介紹怎麼生成語法

構建(第一次構建可能比較慢,會下載很多maven插件)

Devops持續化集成

mvn編譯報錯

No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

#yum -y install java-devel即可解決

郵箱語法生成

Devops持續化集成

Devops持續化集成

直接粘貼過來,保存構建

Devops持續化集成

這是系統發送給我的郵箱

Devops持續化集成

Gitlab實現對jenkins的構建狀態查看

添加gitlabCommitStatus字段

node {
    gitlabCommitStatus(name:"Commit BUild"){
   stage('拉取代碼'){
       echo "Code pull"
       git credentialsId: 'a3b87131-a21b-4042-a537-06bb088a0ca4', url: '[email protected]:devops/java-demo.git'
   }
   stage('代碼編譯'){
       echo "Code Build"
       sh "/usr/local/maven/bin/mvn clean compile"
   }
   stage('單元測試'){
       echo "uniunit test"
       sh "/usr/local/maven/bin/mvn test"
   }
    }
   stage('質量掃描 '){
       withSonarQubeEnv('Sonarqube'){
       sh '/usr/local/sonar-scanner/bin/sonar-scanner'
   }
  }
   stage('郵件通知'){
       echo "Mail"
       emailext body: '', subject: 'jenkins郵件通知:提交階段自動化驗證通過', to: '[email protected]'
   }
}

這裏可以修改一下代碼提交到develop分支觸發構建,然後使用張三用戶登錄gitlab

Devops持續化集成

Devops持續化集成

最下面就可以看到這個代碼是否測試通過,通過就可以安心的創建合併請求到master了

Devops持續化集成

點擊還可以進入到BlueOcean(這個就是剛開始安裝的插件)

Devops持續化集成

Devops持續化集成

集成測試階段實現

開發經理合並develop分支到master觸發集成測試階段

使用zhangsan用戶修改代碼然後push

Devops持續化集成

使用張三用戶登錄gitlab

第一次登錄會讓你修改密碼,我這裏已經修改好了

Devops持續化集成

Devops持續化集成

Devops持續化集成

退出gitlab使用lisi登錄

Devops持續化集成

開發經理合並分支

Devops持續化集成

Devops持續化集成

創建集成測試項目

Devops持續化集成

Devops持續化集成

Devops持續化集成

設置webhook

打開gitlab,打開項目,上面有教程,這裏不過多演示

Devops持續化集成

在gitlab就可以測試是否成功

點擊push events

Devops持續化集成

Devops持續化集成

查看是否200 OK

Devops持續化集成

再查看jenkins任務已經觸發

Devops持續化集成

應該由測試人員手動創建環境所以這裏要有一個交互

添加在郵件通知的後面

      stage('是否部署測試環境 '){
      input "是否部署" 
   }
    stage('部署測試環鏡'){
      echo "部署SIT" 
   }
    stage('自動化測試'){
      echo "auto test" 
   }
    stage('郵件通知'){
      echo "Email" 
   }

Devops持續化集成

點擊構建就可以實現交互,需要點擊確定纔會繼續往下走

Devops持續化集成

異常檢測發送郵件

如果這流水線中途現了什麼問題,就暫停了,就收不到郵件了,所以要有一個異常捕捉併發送郵件

Devops持續化集成

將所有的階段包在裏面,定義函數,捕捉錯誤信息,下面是捕捉到之後發送郵件

測試將代碼修改錯誤

Devops持續化集成

構建報錯

Devops持續化集成

Devops持續化集成

好了,千辛萬苦終於可以休息下了。這邊文章本屬我們公司Alex所貢獻,本人感覺挺優秀就給大家分享下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章