JENKINS安裝和使用


目錄

一、Jenkins基礎知識和安裝部署

1.jenkins基本概述

jenkins是一個開源持續集成的工具(調度平台),是由JAVA開發而成,本身不處理任何事情,調用插件來完成所有的工作。主要功能是提供軟件開發的持續集成服務,主要特點是:配合實現軟件配置管理、持續集成功能、擁有成千上萬的插件

2.Jenkins安裝部署

# https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
sudo yum upgrade
sudo yum install epel-release java-11-openjdk-devel
sudo yum install jenkins
sudo systemctl daemon-reload
sudo systemctl start jenkins # 監聽在8080端口

瀏覽器訪問:
	http://192.168.1.102:8080
	輸入登錄密碼:
		密碼在Jenkins機器的 /var/lib/jenkins/secrets/initialAdminPassword 文件中

# 使用國內的清華源加速下載插件
在Jenkins web UI,選擇 “Plugin Manager>advanced” 下拉選擇“Update Site”,將URL換成清華源:
	https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

如果Jenkins選擇下載插件的速度還慢,可以將插件下載到本地,通過Jenkins>Plugins Manager>Advanced>Upload Plugin 上傳,如下圖;

/var/lib/jenkins/plugins/  # jenkins插件目錄
/etc/sysconfig/jenkins  # jenkins配置文件
	#JENKINS_USER="jenkins"
	JENKINS_USER="root"  # 運行Jenkins進程的屬主最好改成root身份,因為在使用Jenkins的shell腳本部署項目的時候,jenkins進程的屬主和屬組是jenkins身份可能沒有權限操作腳本文件

/var/log/jenkins/jenkins.log  # 日志文件
	

修改jenkins進程啟動的屬主后,下載subversion插件的屬主和屬組都是root身份了。。。。

漢化插件:Localization: Chinese (Simplified)
安裝后重新啟動jenkins: systemctl restart jenkins

如何切換中英文:
	Manage Jenkins>System Configure>Locale
	en_US # 切換成英文模式
	zh_CN # 切換成中文模式
	其下面的單選框也勾上,表示忽略瀏覽器強制的語言轉換
	

3.jenkins 常見插件安裝

Backup
Monitoring
jQuery 

Build-timeout Plugin:任務構建超時插件 #
Naginator Plugin:任務重試插件
Build User Vars Plugin:用戶變量獲取插件 #
Build Pipeline Plugin View :Pipeline 管道流圖表展示插件 #

Flow Plugin:工作流插件,支持DSL腳本定義工作流 # 
Pipeline Graph View # 
Build Graph View Plugin:build Flow插件視圖(安裝后需要重新才能生效)
Multijob Plugin:多任務插件 # 
Build-timeout Plugin:job構建超時插件 
Build Timestamp Plugin :任務log時間戳插件,使得job log的每次輸出前面都增加當時的時間 #
Parameterized Trigger Plugin:這是一個擴展型的插件,使各個job連接的時候可以傳遞一些job相關的信息
Join Plugin:這也是一個觸發job的插件,亮點在於它觸發job的條件是等待所有當前job的下游的job都完成才會發生。#
Files Found Trigger:檢測指定的目錄,如果發現指定模式的文件則啟動build。 # 
BuildResultTrigger Plugin:根據其他的job的成功或失敗來啟動此build。 #
Publish Over SSH Plugin:通過ssh發布文件 #
Rebuild Plugin:重新執行插件
ws-cleanup Plugin :workspace清理插件 #
Cron Column Plugin: 通過定時任務例行的運行一些job #
Job Configuration History Plugin:使用心得:使job具備版本管理的能力,diff和rollback功能更是非常贊
HTTP Request Plugin:使用心得:在構建前后可以通過該插件以http形式調用各種api接口實現和內部系統的聯動 #
Periodic Backup:使用心得:備份是運維一個系統必須要保障的事情,該插件的恢復功能可能不可用,需要手工進行,好處在於可以定時備份 #
Job Import Plugin:使用心得:可以快速導入其他jenkins集群的已有job,需要認證的jenkins系統導入需要提供憑證才可以 # 
Status Monitor Plugin:構建狀態插件 #
Build Monitor View :使用心得:基於該插件可以實現dashboard功能 #
Build Environment Plugin:構建環境插件,可以進行構建環境比較。#
FTP插件:

Git Parameter 這是一個參數構建擴展,可以在構建的時候選擇git的某一個分支或者一個tag來構建服務。#

GitLab	 This plugin allows GitLab to trigger Jenkins builds and display their results in the GitLab UI. #
Gitlab Hook Enables    Gitlab web hooks to be used to trigger SMC polling on Gitlab projects #
Generic Webhook Trigger	 Can receive any HTTP request, extract any values from JSON or XML and trigger a job with those values available as variables. Works with GitHub, GitLab, Bitbucket, Jira and many more. #

GitLab Authentication	This is the an authentication plugin using gitlab OAuth. # 

Gitlab API  This plugin provides GitLab API for other plugins. #

GitLab Branch Source	 
GitLab Logo	 
Gitlab Merge Request Builder
Pipeline Maven Integration  This plugin provides integration with Pipeline, configures maven environment to use within a pipeline job by calling sh mvn or bat mvn. The selected maven installation will be configured and prepended to the path. #

Jira This plugin integrates Jenkins to Atlassian Jira. #

Python Adds the ability to execute python scripts as build steps. #

SonarQube Scanner  This plugin allows an easy integration of SonarQube, the open source platform for Continuous Inspection of code quality #

Ansible  在構建任務中可以執行Ansible任務。#

Job Generator 定義一個參數化的模板,通過這個模板快速的在 Jenkins 上創建出任務。#

Job DSL Jenkins Job DSL Plugin 可以讓開發者通過 Groovy 腳本來定義和配置任務,隨后插件會通過執行這些腳本來維護 Jenkins 任務。與Job Generator相比,它需要了解Groovy。#

Performance  生成性能測試報告,需要在Jenkins機器上安裝Taurus(開源負載測試工具和功能測試工具自動化框架) #

Html Publisher 生成HTML報告文檔 #

Role-based Authorization Strategy  給Jenkins用戶權限管理添加了角色組。#

disk-usage 對Jenkins節點服務器磁盤的監控。 #

Locale  This plugin lets you control the language of Jenkins. #
jenkins插件大全:https://blog.csdn.net/pansaky/article/details/80755739




在安裝gitlab hook 插件時,依賴ruby-runtime包,在安裝時一直報錯:not surpported java 11 version,嘗試卸載 java-11-OpenJDK-devel,換成8版本的,重新啟動Jenkins,安裝gitlab hook 成功了,如下圖。

構建后的項目都會保存在/var/lib/jenkins/workspace目錄中。

4.Jenkins集成gitlab

jenkins如何集成gitlab?
由於Jenkins只是一個調度平台,所有需要安裝與gitlab相關的插件即可完成集成。

# jenkins與gitlab集成思路
1.開發提交代碼至gitlab
2.Jenkins安裝gitlab所需插件
3.Jenkins創建freestyle項目,然后配置gitlab倉庫項目對應地址。

Jenkins安裝與gitlab關聯的插件

二、jenkins 實現靜態站點的部署

#!/bin/bash

DATE=$(date +%Y-%m-%d-%H-%M-%S)
WebServer="10.0.0.7 10.0.0.8"
Sdir=/opt
Ddir=/code
NAME=${DATE}=${git_version}

#1.進入項目目錄,將內容進行打包
get_code(){
	#cd /var/lib/jenkins/workspace/freestyle-monitor && \
	#tar czf /opt/web-$(DATE).tar.gz ./*
	cd $WORKSPACE && \
	tar czf ${Sdir}/web-${NAME}.tar.gz ./*
}

#2.將內容通過scp拷貝至web集群組
scp_web_server(){
    for host in $web_server
    do
        scp ${Sdir}/web-${NAME}.tar.gz root@$host:${Sdir}
        ssh root@$host "mkdir -p ${Ddir}/web-${NAME}  && \
                          tar xf ${Sdir}/web-${NAME}.tar.gz -C ${Ddir}/web-${NAME}
                          rm -rf ${Ddir}/web && \
                          ln -s ${Ddir}/web-${NAME} ${Ddir}/web"
    done
}

deploy(){
	get_code
	scp_web_server
}
deploy


chmod +x html_deploy_tag.sh

jenkins中的常量:

http://192.168.1.102:8080/env-vars.html/

WORKSPACE:/var/lib/jenkins/workspace/freestyle_monitor # 當前項目所在目錄
WORKSPACE_TMP:/var/lib/jenkins/workspace/freestyle_monitor@tmp
JENKINS_HOME:/var/lib/jenkins
JENKINS_URL # 顯示Jenkins服務器的url地址
BUILD_URL  # 顯示當前構建的URL地址
NODE_NAME:master
NODE_LABELS:master
JOB_NAME:freestyle_monitor
BUILD_NUMBER:14 #顯示當前構建的編號
BUILD_ID:14  #當前項目構建的次數
BUILD_DISPLAY_NAME:#15
BRANCH_NAME

GIT_COMMIT # 如果是第一次提交,GIT_PREVIOUS_SUCCESSFUL_COMMIT的值為空,本次提交被記錄,如果再次重復提交,就會報錯; 如果GIT_COMMIT=GIT_PREVIOUS_SUCCESSFUL_COMMIT,說明當前版本已經部署過了
GIT_PREVIOUS_SUCCESSFUL_COMMIT

Jenkins實現版本發布

1.為什么要讓項目支持tag版本方式上線?
由於之前上線方式是直接獲取最新代碼,那么會造成后期回退變得困難。那如果采用tag方式,比如第一次上線v1.1、第二次v1.2,如果上線v1.2出現問題,那么我們可以快速回退至上一個版本v1.1。

2.實現tag版本上線方式思路
(1)開發如果需要發布新版本,必須將當前的版本打上一個標簽。
(2)Jenkins需要讓其腳本支持傳參,比如用戶傳遞v1.1則拉去項目的v1.1標簽

3.實戰Jenkins部署tag版本
(1)首先安裝git

jenkins參數化構建和git parameter 參數構建

支持靜態發布和回退的腳本:

vim html_deploy_rollback.sh

#!/bin/bash

DATE=$(date +%Y-%m-%d-%H-%M-%S)
WebServer="10.0.0.7 10.0.0.8"
Sdir=/opt
Ddir=/code
NAME=${DATE}=${git_version}

#1.進入項目目錄,將內容進行打包
get_code() {
	#cd /var/lib/jenkins/workspace/freestyle-monitor && \
	#tar czf /opt/web-$(DATE).tar.gz ./*
	cd $WORKSPACE && \
	tar czf ${Sdir}/web-${NAME}.tar.gz ./*
}

#2.將內容通過scp拷貝至web集群組
scp_web_server() {
    for host in $web_server
    do
        scp ${Sdir}/web-${NAME}.tar.gz root@$host:${Sdir}
        ssh root@$host "mkdir -p ${Ddir}/web-${NAME}  && \
                          tar xf ${Sdir}/web-${NAME}.tar.gz -C ${Ddir}/web-${NAME}
                          rm -rf ${Ddir}/web && \
                          ln -s ${Ddir}/web-${NAME} ${Ddir}/web"
    done
}

# 根據我們在web UI 傳入的git_version,使用find找出我們在WebServer中要回退到的版本,刪除之前創建的軟連接,根據我們要回退的版本創建新的軟連接
rollback() {
	for host in $WebServer
	do
		rollback_file=$(ssh root@${host} "find /code -maxdepth 1 -type d -name "web-*-${git_version}"")
		ssh root@${host} "rm -rf ${Ddir}/web && \
		                  ln -s ${rollback_file} ${Ddir}/web"
}

deploy() {
	get_code
	scp_web_server
}

if [ deploy_env == "deploy" ];then
	# 防止重復構建  判斷之前是否部署過該版本的commit,如果沒有則部署,如果有則提示然后退出;
	if [ ${GIT_COMMIT} == ${GIT_PREVIOUS_SUCCESSFUL_COMMIT} ];then
		echo "你已經部署過該${git_version}版本"
		exit 1
	else
		deploy
	fi
	
elif [ deploy_env == "rollback" ];then
	rollback
fi


chmod +x html_deploy_rollback.sh


vim file_path +27 # 打開指定文件光標停留在第27行

三、Jenkins實現Java項目部署

Java項目部署基本概述?

1.什么是Java項目?
簡單來說,就是使用Java編寫的代碼,我們將其稱為Java項目

2.為什么Java項目需要使用maven編譯?
由於java編寫的代碼是無法直接在服務器上運行,需要使用maven工具進行打包。
簡單理解:Java源代碼就像汽車的一堆散件,必須組裝才是一輛完整的汽車。
這里的組裝汽車可以理解是Maven編譯的過程。

3.手動實現Java項目構建?
為什么,首先大家對Java項目不熟悉,其次要想實現自動化發布代碼,必須先會手動。
所以我們會先拿到一個源碼->然后提交gitlab-> 使用mvn手動構建->最后推送war至tomcat發布。(一個完整的發布流程)

4.手動實現Java項目架構圖? # 如下圖


手動部署Java項目至wev集群?

1.搭建Nginx+Tomcat集群架構?
2.開發提交Java源代碼至gitlab倉庫?
3.手動獲取Java源代碼,然后使用maven進行編譯?
4.將編譯后的war包部署至tomcat集群?
5.最后通過瀏覽器訪問測試,檢測項目是否部署OK?

1.安裝Nginx+Tomcat集群

#1.在103,104主機上安裝TomcatA、TomcatB(兩台都需要安裝)
yum install java -y # 安裝openJDK
mkdir /soft && cd /soft
wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.24/bin/apache-tomcat-9.0.24.tar.gz
tar xf apache-tomcat-9.0.22.tar.gz
ln -s /soft/apache-tomcat-9.0.22 /soft/tomcat
/soft/tomacat/bin/startup.sh
為了nginx向后端代理到tomcat服務能看到區別,可以修改其中一台機器tomcat的index.jsp文件,/soft/tomcat/webapps/ROOT/index.jsp

# 2.在100主機上安裝Nginx實現反向代理負載均衡至Tomcat-A、Tomcat-B
cat proxy_tomcat.bgx.com.coof
upstream java {
	server 192.168.1.103:8080;
	server 192.168.1.104:8080;
}

# nginx監聽在80端口供用戶訪問,然后通過訪問80端口代理到后端的8080端口
server {
	listen 80;
	server_name java.clobotics.com
	location / {
		proxy_pass http://java;
		proxy_set_header Host $http_host;
	}
}

systemctl start nginx

瀏覽器訪問:192.168.1.100

2.開發提交Java源代碼至gitlab倉庫?

創建一個項目倉庫,將代碼提交到此遠程倉庫

3.手動獲取Java源代碼,然后使用maven進行編譯?

1.由於maven編譯工具需要依賴java,所以需要先安裝jdk
	yum install java -y

2.安裝maven編譯打包工具
	yum install maven -y

​```
如果需要使用高版本Maven,按如下操作
1.下載Maven
wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
2.安裝maven
tar xf apache-maven-3.6.3-bin.tar.gz
mv apache-maven-3.6.3-bin /usr/local/
ln -s /usr/local/apache-maven-3.6.3-bin/ /usr/local/maven
/usr/local/maven/bin/mvn -v
3.配置環境變量
export PATH=/usr/local/apache-maven-3.6.3-bin/:$PATH
mvn -v
​```

# 拉取gitlab代碼,然后手動編譯成war包
# 需要確保該主機有獲取代碼權限
git clone git@gitlab.clobotics.com:wind/java-hello-web.git  # 將代碼克隆到本地
cd /java-hello-web
mvn package -Dmaven.test.skip=true # 跳過測試用例  編譯的時候會根據項目根目錄的pom.xml文件下載很多jar包(依賴包)

PS:Java項目在編譯過程中,需要安裝很多依賴,依賴都會上Maven官方下載。如果項目依賴的jar包較多,網絡較差,那可能需要很久的時間。
PS:將以將下載的地址調整為阿里雲,具體操作步驟如下。
# 查看以下maven安裝位置下的/conf/settings.xml  yum安裝的conf位置:/usr/share/maven/conf/settings.xml
vim settings.xml
# 在159行上面添加如下內容
<mirror>
	<id>alimaven</id>
	<name>aliyun maven</name>
	<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
	<mirrorOf>central</mirorOf>
</mirror>

4.將編譯后的war包部署至tomcat集群?

# 先刪除103、104機器上 tomcat中的ROOT/ 目錄
cd /soft/tomcat/webapps
rm -rf ROOT


# 1.推送war包
for i in {103..104};do scp target/java-hello-web-war-1.0.0.war root@192.168.1.$i:/soft/tomcat/webapps/ROOT.war; done
# 重啟兩台Tomcat
for i in {131..132};do /soft/tomcat/bin/shutdown.sh && /soft/tomacat/bin/startup.sh; done

5.最后通過瀏覽器訪問測試,檢測項目是否部署OK?

瀏覽器訪問:192.168.1.100

自動部署Java項目至web集群

1.jenkins安裝Maven插件,使其支持Maven項目創建?
2.Jenkins配置JDK路徑以及Maven路徑。
3.Jenkins創建maven項目,然后進行創建。
4.編寫自動上線腳本推送至web集群,最后通過瀏覽器訪問?
5.優化部署腳本,使其支持上線與回滾功能
6.項目相同版本可以重復構建,如何處理該問題

1.Jenkins集成maven插件

安裝maven integration插件,這樣才能使用Jenkins構建一個maven的項目

2.Jenkins配置JDK路徑以及Maven路徑

先創建一個maven項目,在“the tool configuration”配置JDK

配置JDK:

配置Maven:

點擊保存,返回到hello-world-maven項目繼續配置。。。這個時候不會提示告訴Jenkins maven的路徑了。。。

3.配置Build-->maven構建項目,然后保存嘗試構建測試是否能產生war包。

4.編寫自動上線腳本,推送至tomcat集群

1.腳本主要是基於tag方式實現
vim java_deploy_tag.sh

#!/bin/bash

DATE=$(date +%Y-%m-%d-%H-%M-%S)
WebServer="192.168.1.103 192.168.1.104"
Sdir=/opt
Ddir=/soft/tomcat/webapps
NAME=${DATE}=${git_version}

#1.進入項目目錄,將內容進行打包
get_code() {
	cd $WORKSPACE
}

#2.將內容通過scp拷貝至web集群組
scp_web_server() {
    for host in $web_server
    do
        scp target/*.war root@$host:/opt/ROOT-${NAME}.war
        ssh root@$host "mkdir -p ${Ddir}/ROOT-${NAME}  && \
                        unzip /opt/ROOT-${NAME}.war -d ${Ddir}/ROOT-${NAME} && \
                        rm -rf ${Ddir}/ROOT && \
                        ln -s ${Ddir}/ROOT-${NAME} ${Ddir}/ROOT"
    done
}

deploy() {
	get_code
	scp_web_server
}

deploy

chmod +x java_deploy_tag.sh


vim file_path +27 # 打開指定文件光標停留在第27行

2.java項目回退

vim java_deploy_tag_rollback.sh

#!/bin/bash

DATE=$(date +%Y-%m-%d-%H-%M-%S)
WebServer="192.168.1.103 192.168.1.104"
Sdir=/opt
Ddir=/soft/tomcat/webapps
NAME=${DATE}=${git_version}

#1.進入項目目錄,將內容進行打包
get_code() {
	cd $WORKSPACE
}

#2.將內容通過scp拷貝至web集群組
scp_web_server() {
    for host in $web_server
    do
        scp target/*.war root@$host:/opt/ROOT-${NAME}.war
        ssh root@$host "mkdir -p ${Ddir}/ROOT-${NAME}  && \
                        unzip /opt/ROOT-${NAME}.war -d ${Ddir}/ROOT-${NAME} && \
                        rm -rf ${Ddir}/ROOT && \
                        ln -s ${Ddir}/ROOT-${NAME} ${Ddir}/ROOT && \
                        /soft/tomcat/bin/shutdown.sh  && /soft/tomcat/bin/startup.sh "
    done
}

deploy() {
	get_code
	scp_web_server
}

rollback() {
	for host in $WebServer
	do
		rollback_file=$(ssh root@${host} "find ${Ddir} -maxdepth 1 -type d -name "ROOT-*-${git_version}"")
		ssh root@${host} "rm -rf ${Ddir}/ROOT && \
		                  ln -s ${rollback_file} ${Ddir}/ROOT && \
		                   ln -s ${back_file} ${Ddir}/ROOT && \
		                   /soft/tomcat/bin/shutdown.sh  && /soft/tomcat/bin/startup.sh"		     
}

if [ deploy_env == "deploy" ];then
	# 防止重復構建  判斷之前是否部署過該版本的commit,如果沒有則部署,如果有則提示然后退出;
	if [ ${GIT_COMMIT} == ${GIT_PREVIOUS_SUCCESSFUL_COMMIT} ];then
		echo "你已經部署過該${git_version}版本"
		exit 1
	else
		deploy
	fi
	
elif [ deploy_env == "rollback" ];then
	rollback
fi


chmod +x java_deploy_tag.sh


vim file_path +27 # 打開指定文件光標停留在第27行

四、Jenkins 集成Sonar代碼質檢

1.SonarQube基本概述

1.什么是sonarqube?
sonarqube是一個開源的代碼質量管理系統,用於檢測代碼中的錯誤,漏洞和代碼規范。它可以和現有的gitlab、Jenkins集成,以便在項目拉取后進行連續的代碼檢查。
2.使用sonarqube前提
(1)sonarqube基於Java開發,所以需要安裝openJDK8版本。
(2)Sonarqube需要依賴MySQL數據庫,至少5.6版本以上。
(3)sonarqube的小型實例至少需要4GB內存,如果是大型實例需要16GB

2.SonarQube服務安裝

1.准備環境
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

2.安裝sonarqube依賴工具
yum install git java unzip wget -y # yum list all | grep java, yum install java-1.8.0-openjdk.x86_64
wget https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql56-community-el7/mysql-community-client-5.6.45-2.el7.x86_64.rpm
wget https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql56-community-el7/mysql-community-common-5.6.45-2.el7.x86_64.rpm
wget https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql56-community-el7/mysql-community-libs-5.6.45-2.el7.x86_64.rpm
wget https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql56-community-el7/mysql-community-server-5.6.45-2.el7.x86_64.rpm
yum localinstall ./mysql-community-* -y

3.啟動數據庫,然后為數據庫配置密碼,最后創建一個sonar庫
systemctl start mysqld
mysqladmin password admin123
mysql -uroot -padmin123 -e "CREATE DATABASE sonar DEFAULT CHARACTER SET utf8;"
mysql -uroot -padmin123 -e "show databases;"

4.下載sonarqube,並安裝解壓至/usr/local
wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.0.zip
unzip sonarqube-7.0.zip -d /usr/local/
useradd sonar
chown -R sonar.sonar /usr/local/sonarqube-7.0/
chown -R sonar.sonar /usr/local/sonarqube/
ln -s /usr/local/sonarqube-7.0/ /usr/local/sonarqube

5.修改sonarqube連接數據庫配置文件
sonar.jdbc.username=root
sonar.jdbc.password=admin123
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=tr
ue&useConfigs=maxPerformance&useSSL=false

6.啟動sonarqube服務(由於es必須普通用戶啟動,所以不能使用root用戶,否則啟動失敗)
su - sonar -c "/usr/local/sonarqube/bin/linux-x86-64/sonar.sh start"  # sonarqube監聽在9000端口

7.訪問sonarqube界面訪問,初始用戶名:admin  密碼:admin
http://192.168.1.199:9000/

在啟動sonarqube時,老是啟動不了。。。檢查日志報錯。。WrapperSimpleApp: Encountered an error running main: java.nio.file.AccessDeniedException: /usr/local/sonarqube-7.0/temp/conf/es/elasticsearch.yml,需要把刪除sonarqube temp目錄下的所有文件。

登陸后,初次需要配置token令牌,別人(Jenkins、gitlab等)可以通過這個令牌訪問sonarqube。。。。

maven項目代碼掃描:

PHP項目掃描:

html項目掃描:

但是sonar-scanner是一個代碼掃描的客戶端工具,需要安裝。。

3.SonarQube 插件管理

1.安裝中文漢化插件 # 我的7.0sonarqube無法在頁面上安裝
(1)頁面上找到Administration-->Marketplace-->搜索框chinese,出現一個Chinese Pack,然后點擊install
(2)界面會提示reset重啟sonarqube,重啟再次打開則為漢化。

2.安裝代碼檢查插件 # 如下圖1
默認已經安裝C/java/Python/PHP/JS等代碼的質量分析工具。可以根據項目自行安裝html css go。
PS:一個項目如果使用了java css js html,那么默認情況下僅會檢測java、js等的代碼漏洞和bug。
如果安裝了html、css等插件,那么則會檢查該項目代碼中java js html css等代碼的漏洞和bug。


中文漢化插件離線安裝:# 如下圖2
cd /usr/local/sonarqube/extensions/plugins/ 
wget https://github.com/xuhuisheng/sonar-l10n-zh/releases/download/sonar-l10n-zh-plugin-1.20/sonar-l10n-zh-plugin-1.20.jar
chown sonar.sonar sonar-l10n-zh-plugin-1.20.jar
su - sonar -c "/usr/local/sonarqube/bin/linux-x86-64/sonar.sh restart"

圖1:

image-20211016113240724

圖2:

3.離線安裝插件 # 離線插件下載地址:https://binaries.sonarsource.com/Distribution/
(1)sonarqube插件安裝可能需要很長時間,所以可以選擇之前已經安裝過的插件,直接導入plugins目錄。
mv /usr/local/sonarqube/extensions/plugins/ /usr/local/sonarqube/extensions/plugins_bak
tar xf sonar_plugins.tar.gz -C /usr/local/sonarqube/extensions/
chown -R sonar.sonar /usr/local/sonarqube/extensions/plugins/
su - sonar -c "/usr/local/sonarqube/bin/linux-x86-64/sonar.sh restart"

(2)導入插件重啟后,可以上應用中心查看已安裝過的插件。


PS:單獨下載soanrqube插件安裝示例:# 如下圖
	cd /usr/local/sonarqube/extensions/plugins
	wget https://binaries.sonarsource.com/Distribution/sonar-html-plugin/sonar-html-plugin-3.2.0.2082.jar  # 版本需要和sonarqube web 的marketplace給的版本一致。
	chown sonar.sonar sonar-html-plugin-3.2.0.2082.jar
	su - sonar -c "/usr/local/sonarqube/bin/linux-x86-64/sonar.sh restart"
	

css插件安裝:
	按照sonarqube應用市場指定的版本安裝之后,重啟報錯(如下圖1),版本不兼容,嘗試使用1.1.1.1010版本(如下圖2),重啟成功,所以在安裝插件包報如下圖1的錯誤,可嘗試其它版本的插件。。。

圖1:

圖2:

4.sonarqube項目分析 實戰

sonar-scanner客戶端工具https://binaries.sonarsource.com/Distribution/sonar-scanner-cli

前面已經將sonarqube安裝完成,所以接下來只需要對代碼進行分析測試即可。(要保證手動測試成功)

1.分析html、php、python等項目
(1)如上項目依賴於sonar-scanner命令,所以需要安裝sonar-scanner客戶端工具,並且是安裝在jenkins這台機器(192.168.1.102)
wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.0.0.1744-linux.zip
unzip sonar-scanner-cli-4.0.0.1744-linux.zip -d /usr/local/
cd /usr/local
ln -s sonar-scanner-4.0.0.1744-linux/ sonar-scanner

還需要告訴sonar-scanner客戶端我要操作的服務端(sonarqube)是誰,修改sonar-scanner的配置文件:
	vim /usr/local/sonar-scanner/conf/sonar-scanner.properties  # 如下圖1
	#----- Default SonarQube server
	#sonar.host.url=http://localhost:9000
	sonar.host.url=http://192.168.1.199:9000 # sonarqube遠程所在機器
	#----- Default source code encoding
	sonar.sourceEncoding=UTF-8
	sonar.login=8c89c79e381f72accac8379f372497e335f4071d # 如下圖2

在配置文件sonar-scanner.properties中配置sourceEncoding和login的好處就是,這樣在使用sonar-scanner連接sonarqube掃描代碼時,就不用加 sourceEncoding、令牌選項了。。。。

默認sonarqube是沒有開啟權限認證的,我們還需要在soanrqube界面  配置-->權限 中開啟認證。# 如下圖3

圖1:

圖2:

圖3:

使用sonar-scanner進行代碼掃描:

可以將sonar-scanner加入環境變量 export PATH=$PATH:/usr/local/sonar-scanner/bin/
cd /var/lib/jenkins/workspace
/usr/local/sonar-scanner/bin/sonar-scanner -Dsonar.projectKey=html -Dsonar.sources=. -X
    
    # 下面這兩項可以省略了,因為在/usr/local/sonar-scanner/conf/sonar-scanner.properties 文件中已經配置了
    # -Dsonar.host.url=...
    # -Dsonar.login= 

掃描完之后,會將代碼的分析報告發送到sonarqube上:

2.分析Java項目
方法1:使用maven
(1)java項目可以通過maven進行代碼質檢,無需使用sonar-scanner工具,安裝maven工具即可。
	yum install -y maven
(2)手動從gitlab倉庫獲取Java代碼,進入項目目錄,使用mvn進行代碼掃描。
	mvn sonar:sonar -Dsonar.host.url=http://192.168.1.199:9000 -Dsonar.login=... 

方法2:使用sonar-scanner  使用sonar-scanner檢測代碼的質量更好一些
	sonar-scanner -Dsonar.projectKey=java -Dsonar.sources=. -X

5.Jenkins集成Sonarqube

通常sonarqube需要配合持續集成工具一起使用,可以做到拉取新代碼則立即進行質量檢測。
1.插件安裝。系統管理-->插件管理-->SonarQube Scanner for Jenkins # 如圖1
2.需要在Jenkins上配置SonarQube服務端
	系統管理-->系統設置-->sonarQube(告訴Jenkins SonarQubeServers服務器地址)# 如圖2
	(1)Name可以隨意填寫
	(2)URL添加SonarQube的地址
	(3)token添加一個Secret text 填寫之前安裝SonarQube的Token
	PS:如果SonarQube沒有在配置->權限-->啟用Force user authentication則可忽略進行token驗證操作。
3.同時還需要再Jenkins上配置Sonar-Scanner工具路徑
系統管理-->全局工具配置(告訴Jenkins SonarScanner在本地哪個路徑下)
	(1)Name可以隨意填寫,但最好有規范
	(2)SONAR_RUNNER_HOME填寫sonar-scanner本地路徑
	PS:如果不配置sonar-scanner路徑,則無法進行代碼掃描

圖1:

圖2:

圖3:

6.配置FreeStyle集成Sonar

使用jenkins在拉取代碼之后,上傳遠程服務器部署之前,可以使用SonarQube Scanner工具進行代碼檢測。
1.找到此前的freestyle項目,然后修改配置,新增如下操作。 # 如下圖1

2.使用的參數如下
sonar.projectName=${JOB_NAME}  # 項目在sonarqube上的顯示名稱
sonar.projectKey=html  # 項目的唯一標識,不能重復
sonar.sources=.  # 掃描哪個項目的源碼

3.檢查SonarQube質檢結果 # 如下圖2

圖1:

圖2:

7.配置Maven項目集成Sonar

maven項目可以使用Sonar-Scanner工具,也可以使用maven的方式進行檢測,兩種方式任選其一即可。

第一種方式,通過Sonar-Scanner發給你是進行代碼質檢:# 如圖1
	sonar.projectName=${JOB_NAME}
	sonar.projectKey=java
	sonar.sources=.
	sonar.java.binaries=target/sonar

第二種方式,通過調用maven方式進行代碼質檢:
	clean
	vertify
	sonar:sonar
	-Dsonar.host.url=http://sonar.bgx.com:9000
	-Dsonar.login=8c89c79e381f72accac8379f372497e335f4071d


查看SonarQube質檢結果。。。。。。

圖1:

五、持續集成實施流程

1.第一步,提交代碼
開發者向代碼倉庫提交代碼。所有后面的步驟都始於本地代碼的一次提交(commit).
2.第二步,測試(第一輪)
代碼倉庫對commit操作配置了鈎子(hook),只要提交代碼或者合並進主干,就會跑自動化測試。測試有分為如下幾種:PS:第一輪跑單元測試
	單元測試:針對函數或模塊的測試
	集成測試:針對整體產品的某個功能的測試,又稱為功能測試
	端對端測試:從用戶界面直達數據庫的全鏈路測試

3.第三步,構建
編譯也稱為構建,指的是將源碼轉換為可以運行的實際代碼,比如安裝依賴,配置各種資源(樣式表、JS腳本、圖片)等等。

4.第四步,測試(第二輪)
構建完成,就要進行第二輪全面測試,單元測試和集成測試都會跑,有條件的話,也要做端對端測試。所有測試以自動化為主,少數無法自動化的測試用例,就要人工跑。
PS:需要強調的是,新版本的每一個更新點都必須測試到。如果測試的覆蓋率不高,進入后面的部署階段后,很可能會出現嚴重的問題。

5.第五步,部署
通過了第二輪測試,當前代碼就是一個可以直接部署的版本。將這個版本的所有文件打包存檔,發到生產服務器。生產服務器將打包文件解包成本地的一目錄部署。

代碼直到第⑤步完成之后,要通知運維,那就可以使用Jenkins集成釘釘通知。。。

六、Jenkins集成釘釘通知

1.Jenkins集成釘釘概述

1.jenkins為什么要有通知機制?
Jenkins 進行自動化部署代碼后,項目發布的成功或失敗,都沒有相應通知,運維人員無法即使發現項目的部署情況,需要人為查看,比較麻煩。所以考慮到項目部署后通過釘釘的方式將結果發送到釘釘的群聊中。

2.Jenkins使用釘釘通知優勢?
(1)實現簡單
(2)實時提醒
(3)便於查看

3.為什么不使用郵件通知而使用釘釘通知?
(1)郵件配置復雜
(2)郵件容易被拒收
http://cdn.xuliangwei.com/15649039648828.jpg

2.釘釘配置發消息機器人

1.打開釘釘群組,點擊群機器人。(如果你不是群主,且群主開啟了僅群主可管理,那么將無法創建機器人。)
2.添加一個自定義機器人
3.可以修改機器人的名稱,以及機器人的名字。(這塊自行修改)
4.機器人修改成功后,會給出一個webhook地址。(此處的webhook后續Jenkins需要使用)

3.Jenkins集成釘釘消息

1.Jenkins配置釘釘通知插件 # 如下圖1
2.Jenkins項目關聯釘釘通知 # 如下圖2
https://oapi.dingtalk.com/robot/send?access_token=e4f4a4881ebf9f17581388469d4bb64da05cbce8bcd037f8ceecfd860bae94e7

3.測試項目構建,測試釘釘是否會通知

圖1:

圖2:

先在“系統配置”中配置釘釘的webhook及關鍵字:

再在具體的一個項目中添加使用釘釘通知:

構建添加釘釘機器人的一個項目,構建成功后的群組通知:

構建添加釘釘機器人的一個項目,構建失敗后的群組通知:

七、Jenkins pipeline流水線

1.Jenkins pipeline基本概述

1.什么是pipeline?
可以理解將我們開發部署環境生態鏈的每一步都通過pipeline流水線串聯起來,並代碼化,使得我們開發人員一鍵就能將本地的代碼發布到測試環境進行測試發布,最終實現持續集成持續發布。

2.為什么要使用Pipeline?
之前傳統的開發部署流程,每一步都需要人為干預,遷移到pipeline能夠實現每一步自動化,不需要人為干預,所所有流程都可以通過代碼自動化。

3.遷移pipeline有什么好處?
可以實現持續集成持續部署,節省產品發布時間,優化部署策略,節省人力成本,自動化腳本復用等等。

2.Jenkins pipeline語法示例

pipeline基礎語法如下:

pipeline Jobs編寫規范:

pipeline是一種固定格式,必須遵守。。。。。

3.Jenkins pipeline初次體驗

1.通過jenkins創建一個流水線項目
pipeline {
	agent any
	//任務集合,一個大的任務
	stages {
		stage('代碼獲取'){
			steps{
				echo 'get code is ok'
			}
		}
		stage('代碼質檢'){
			steps {
				echo "check code is ok"
			}
		}
		stage('代碼構建'){
			steps {
				echo "build is ok"
			}
		}
		stage('代碼部署'){
			steps {
				echo "deploy is ok"
			}
		}
	}
}

4.Jenkins pipeline構建html

代碼拉取->代碼檢測->代碼構建->代碼部署->消息通知

1.配置pipeline基本信息,選擇參數化構建


VSTest MSBuild RobFramework nuget

5.Jenkins pipeline構建Java

6.Jenkins BlueOcam可視化


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM