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)
複製Web頁面提示的路徑,並在服務器上展現出來,然後把展現出來的密碼複製到頁面的對話框
[root@devlop ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
3c9cb6a2b37b457baac6370af43cd15a
輸入後點擊繼續進入到安裝插件頁面。一般推薦的就OK啦。就算推薦的不可以或者安裝失敗我們可以進入jenkin後再進行安裝。
安裝的時間稍微長一點,先喝杯茶,休息下哈。
創建管理員用戶
如果有插件安裝失敗可以去這裏選擇安裝對的的依賴
全局工具配置
系統管理>>全局工具設置
這裏面設置的是系統工具的路徑等,比如jdk,maven,git等,如果你不設置,jenkins會自動去環境變量中找這些工具,所以要確保這些工具已經安裝並存在環境變量中,如果是手動安裝jdk等方式,則需要指定jdk的安裝路徑,或者這是環境變量等都是可以的
Jenkins的初始化配置
配置jenkins併發執行數量,提高執行效率
設置管理員郵箱 我是爲了方便使用了QQ郵箱
在QQ郵箱中開啓POP3
測試成功後,點擊 “ 保存 ”。
安裝gitlab,Blue ocean插件(相當於jenkins的一個新主題界面)
然後等待安裝重啓。
Jenkins基於角色的權限管理RBAC
安裝插件Role-based Authorization Strategy
安裝重啓後生效。後設置全局安全配置
保存退出!
創建用戶devlops,打開系統管理—管理用戶
返回系統管理
管理角色
添加對devlop角色的權限控制
點擊Sava保存!!!
分配角色
點擊Save,註銷admin賬戶,測試devlop賬戶是否登錄成功。
登錄成功,好了。我們就切回初始的管理員賬戶,讓我們繼續往下面操作吧!!!
Jenkins Pipeline實戰
我們就先來構建一個自由風格的軟件項目
輸出成功
什麼是Pipeline?
Jenkins Pipeline是一套插件,支持將連續輸送Pipeline實施和整合到Jenkins。Pipeline提供了一組可擴展的工具,用於通過PipelineDSL爲代碼創建簡單到複雜的傳送Pipeline。
通常,此“Pipeline代碼”將被寫入 Jenkinsfile項目的源代碼控制存儲庫,例如:
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中容易建模的一個連續發貨方案的示例:
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狀態/進度。
測試pipeline,點擊保存
立即構建
鼠標放在上面可以查看構建日誌
Jenkins Pipeline測試
創建測試代碼項目組
新建項目
添加Readme文件,裏面隨便寫點內容,模仿代碼
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放置公鑰
複製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
[root@devlop ~]# cat /root/.ssh/id_rsa <!--私鑰位置信息,要全部複製-->
將gitlab的公鑰加入到demo項目當中
再來看下就沒有報錯信息了
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
複製生成的腳本到項目中
測試構建已經成功拉取代碼
查看拉取到的代碼
[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後面可接任何命令
可以看到成功執行了剛剛的cat命令
交互
比如說單元測試完畢,要部署到測試環境,jenkins會有一個交互,讓你確認是否部署到測試環境
構建(確認就往下部署,中斷就不會執行)
查看日誌部署成功
Jenkins分佈式構建
節點管理
Slave統一目錄和安裝好jdk
系統設置>節點管理
Slave節點組好統一目錄
$ mkdir /data/jenkins-slave -p 這是slave的數據目錄
$ yum install -y java-1.8.0 必須安裝jdk否則slave節點的jenkins起不來
新建節點
時間同步 ntpdate
需要注意兩臺機器的時間是否一致
大規模使用時,master是不進行構建工作的,都是由slave節點進行工作,執行者置爲0
系統管理>節點管理>master
如果現在執行構建的話就會在slave節點上面進行構建了
可以在節點目錄/data/jenkins-slave/workspace/pipeline-demo下查看是否有拉取的代碼
如果有多個節點都會顯示在構建執行狀態下面,我們現在只有一臺slave
如果沒有公網的情況下安裝Jenkins
如何在沒有外網的環境下安裝jenkins
1.事先在有網的地方將jenkins安裝好,將所有插件安裝好,將/var/lib/jenkins打一個包
2.在新機器上設置環境變量/etc/profile中添加JAVA_HOME=/var/lib/jenkins即可
3.tomcat放入jenkins的war包啓動即可
質量掃描SonarQube
代碼質量七宗罪
https://www.sonarqube.org/ 官方網站
-
編碼規範:是否遵守了編碼規範,遵循了最佳實踐。
-
潛在的BUG:可能在最壞情況下出現問題的代碼,以及存在安全漏洞的代 碼。
-
文檔和註釋:過少(缺少必要信息)、過多(沒有信息量)、過時的文檔 或註釋。
-
重複代碼:違反了Don’tRepeat Yourself原則。
-
複雜度:代碼結構太複雜(如圈複雜度高),難以理解、測試和維護。
-
測試覆蓋率:編寫單元測試,特別是針對複雜代碼的測試覆蓋是否足夠。
- 設計與架構:是否高內聚、低耦合,依賴最少。
安裝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
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
解壓掃描器
[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
上傳解壓配置
[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
掃描完畢就可以在瀏覽器查看了
SonarQube設置中文
如果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包放入到這個目錄即可
#版本不一樣的要對照一下相應的中文包,要不然服務啓動會報錯,注意看日誌
安裝完重啓服務,可以看到已經是中文語言了
SonarQube和jenkins集成
安裝sonar插件
設置SonarQube-server
SonarQube生成token
複製到jenkins 的token選項中
Pipeline集成SonarQube
點擊項目的配置添加掃描,如果slave進行掃描也要安裝掃描器纔可以
本地將代碼克隆下來
$ 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成功-->
網頁查看已經成功提交
Jenkins執行構建測試查看是否進行質量掃描
結果掃描成功,但是沒有看到sonarqube的小圖標呢,下一步添加sonarqube的圖標
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
系統管理>系統設置>gitlab #需要安裝gitlab查看纔有看到,如沒有看到請安裝gitlab插件
設置觸發器(開發push就觸發構建)
設置鉤子webhook
Gitlab設置jenkins生成的token(要先進入項目)
需要注意我這裏修改了默認端口,我的是8081,所以填在gitlab的時候要改成8081
如果添加鉤子失敗報錯請看下面解決方法
產生原因,因爲jenkins和gitlab在同一臺機器上面,默認不允許
解決方法
測試鉤子是否成功
Jenkins已經自動觸發構建,因爲我test push了兩次
DevOps之部署流水線
軟件交付(部署)流水線
軟件交付流水線是指軟件變更從提交到版本控制庫,到發佈給用戶 的整個過程
軟件的每次變更都會經歷一個複雜的流程才能發佈
這個流程包括構建軟件、一系列不同階段的測試與部署等,需要多 團隊協作完成 • 交付流水線對交付流程進行了建模,並支持查看、控制整個交付流程
部署流水線的環境
部署流水線的階段和環境
流水線反饋過程
加快代碼反饋結果,能都讓代碼快速部署在生產環境
部署流水線分階段實施
部署流水線設計和規劃
流水線案例
可靠可重複的流水線
通過流水線階段晉級,平衡測試反饋速度與覆蓋度
通過流水線分析瓶頸,識別自動化改造點和協作點
部署流水線實踐
只生成一次二進制包(代碼只打一次包,不需要多次打包)
對不同環境採用同一部署方式
對部署進行冒煙測試
向生產環境的副本中部署(PAT)
每次變更都要立即在流水線中傳遞
只有有環節失敗,就停止整個流水線
部署流水線Git分支設計
創建開發分支
創建gitlab用戶
創建gitlab用戶張三開發者和開發經理李四來模仿普通開發和開發經理合並分支並觸發流水線
創建lisi用戶同上面一樣,請自行創建
將用戶加入項目組
進入項目
開發拉取項目
Linux客戶端操作
張三用戶往develop分支提交代碼就觸發提交階段的流水線
提交階段流水線設計與實現
持續集成-提交階段
持續集成是一種軟件開發實踐,即團隊開發成員經常集成他們的工作,通常每個成員每天至少集成一次, 也就意味着每天可能會發生多次集成。每次集成都通過自動化的構建(包括編譯,發佈,自動化測試) 來驗證,從而儘早地發現集成錯誤。
統一的代碼庫
每個人每天都要向代碼庫主幹提交代碼
每次代碼遞交後都會在持續集成服務器上觸發構建
自動構建,快速構建,每次構建都要100%通過
模擬生產環境的自動測試
每個人都可以很容易的獲取最新可執行的應用程序
每個人都清楚正在發生的狀況
修復失敗的構建是優先級最高的事情
提交階段要做的事情
創建流水線
1.拉取代碼 >> 2.代碼 >> 3.單元測試 >> 4.構建打包 >> 5.質量掃描 >> 6.郵件通知
我這裏是已經創建過了
配置觸發器
設置鉤子腳本
模仿開發提交代碼到develop分支觸發提交階段流水線
發現jenkins已經觸發流水線操作
安裝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
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
這是代碼:
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插件)
mvn編譯報錯
No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
#yum -y install java-devel即可解決
郵箱語法生成
直接粘貼過來,保存構建
這是系統發送給我的郵箱
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
最下面就可以看到這個代碼是否測試通過,通過就可以安心的創建合併請求到master了
點擊還可以進入到BlueOcean(這個就是剛開始安裝的插件)
集成測試階段實現
開發經理合並develop分支到master觸發集成測試階段
使用zhangsan用戶修改代碼然後push
使用張三用戶登錄gitlab
第一次登錄會讓你修改密碼,我這裏已經修改好了
退出gitlab使用lisi登錄
開發經理合並分支
創建集成測試項目
設置webhook
打開gitlab,打開項目,上面有教程,這裏不過多演示
在gitlab就可以測試是否成功
點擊push events
查看是否200 OK
再查看jenkins任務已經觸發
應該由測試人員手動創建環境所以這裏要有一個交互
添加在郵件通知的後面
stage('是否部署測試環境 '){
input "是否部署"
}
stage('部署測試環鏡'){
echo "部署SIT"
}
stage('自動化測試'){
echo "auto test"
}
stage('郵件通知'){
echo "Email"
}
點擊構建就可以實現交互,需要點擊確定纔會繼續往下走
異常檢測發送郵件
如果這流水線中途現了什麼問題,就暫停了,就收不到郵件了,所以要有一個異常捕捉併發送郵件
將所有的階段包在裏面,定義函數,捕捉錯誤信息,下面是捕捉到之後發送郵件
測試將代碼修改錯誤
構建報錯
好了,千辛萬苦終於可以休息下了。這邊文章本屬我們公司Alex所貢獻,本人感覺挺優秀就給大家分享下。