Jenkins持续集成入门到精通(入门篇)
1. 什么是持续集成
持续集成(Continuous integration,简称CI)指的是频繁将代码集成到主干。它的目的,就是让产品可以快速迭代,同时保持高质量。核心措施,代码集成到主干之前,必须通过自动化测试,只要有一个测试用例失败,就不能集成
持续集成的设计,从提交到生产,整个过程有以下步骤:
提交
测试(第一次)
代码仓库对commit操作配置钩子(hook),只要提交代码或者合并进主干,就会跑自动化测试构建
测试(第二次)
部署
回滚
jenkins就是一个配置简单和使用方便的持续集成服务器(中文官网:https://www.jenkins.io/zh)
(1)持续集成流程说明
首先,开发人员进行代码提交,提交到git仓库;然后jenkins作为持续集成工具,将仓库代码集成到服务器,再配合JDK、Maven等软件完成代码编译、测试和打包;最后jenkins将生成的jar或war包分发到测试服务器或生产服务器,测试人员或用户就可以访问应用。
2.gitLab使用
2.1gitlab安装
1、安装相关依赖
yum -y install policycoreutils openssh-server openssh-clients postfix
2、启动ssh服务和设置为开机启动
systemctl enable sshd && sudo systemctl start sshd
3、设置postfix开机自启,并启动,postfix支持gitlab发信功能
systemctl enable postfix && systemctl start postfix
4、开放ssh以及http服务,然后重新加载防火墙
firewall-cmd --add-service=ssh --permanent
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
如果关闭防火墙不需要以上设置
5、下载gitlab包,并安装
在线下载安装包
安装:
rpm -i gitlab-ce-12.4.2-ce.el6.x86_64.rpm
6、修改gitlab配置
vi /etc/gitlab/gitlab.rb
修改gitlab访问地址和端口,默认为80,这里改为了82
external_url'http://192.168.66.100:82'
nginx['listen_port']= 82
7、重载配置及启动gitlab
gitlab-ctl reconfigure
gitlab-ctl restart
8、把端口添加到防火墙
firewall-cmd --zone=pubilc --add-port=82/tcp --permanent
firewall-cmd --reload
启动成功后,访问http://192.168.66.100:82
3.JenKins的使用
3.1 jenkins安装
(1)安装jdk
yum install java-1.8.0-openjdk* -y
安装目录为/usr/lib/jvm
(2)获取jenkins安装包
下载地址
(3)找到centos下载里面的rpm文件
rpm -ivh jenkins-2.190.3-1.1.noarch.rmp
(4)修改jenkins配置
vi /etc/sysconfig/jenkins
修改内容如下
JENKINS_USER="root"
JENKINS_PORT="8888"
(5)启动jenkins
systemctl start jenkins
(6)打开浏览器访问
http://192.168.66.101:8888
注意:如果开启防火墙,需要再防火墙添加端口
(7)跳过插件安装
jenkins连接默认官网下载,速度很慢,跳过插件安装
3.2jenkins安装插件
(1)修改jenkins插件下载地址
jenkins -> Manage Jenkins -> Manage Plugins 点击Available
等一会,这样做是为了把jenkins光放的插件列表下载到本地,接着修改地址文件,替换国内插件地址
cd /var/lib/jenkins/updates
sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
最后,Manage Plugins点击Advanced,把Update Site改为国内插件下载地址:
https://mirrors.tuna,tsinghua.edu.cn/jenkins/updates/update-center.json
提交后,在浏览器输入:http://192.168.66.101:8888/restart 重启jenkins
下载汉化插件
3.3 Jenkins用户权限管理
我们可以利用Role-based Authorization Strategy 插件来管理Jenkins用户权限
(1)开启全局安全配置
授权策略切换为"Role-Based Strategy",保存
(2)创建角色
在系统管理页面进入 Manage and Assign Roles
点击"Manage Roles"
- Global roles(全局角色):管理员等高级用户可以创建基于全局的角色 - - Project roles(项目角色):针对某个或者某些项目的角色
- Slave roles(奴隶角色):节点相关的权限
我们添加以下三个角色:
baseRole:该角色为全局角色。这个角色需要绑定Overall下面的Read权限,是为了给所有用户绑定最基本的Jenkins访问权限。注意:如果不给后续用户绑定这个角色,会报错误:用户名 is missing the Overall/Read permission
role1:该角色为项目角色。使用正则表达式绑定"itcast.",意思是只能操作itcast开头的项目。
role2:该角色也为项目角色。绑定"itheima.",意思是只能操作itheima开头的项目。
保存
(3)创建用户
在系统管理页面进入 Manage Users
分别创建两个用户:jack和eric
3.4给用户分配角色
系统管理页面进入Manage and Assign Roles,点击Assign Roles
绑定规则如下:
- eric用户分别绑定baseRole和role1角色
- jack用户分别绑定baseRole和role2角色
3.5 创建项目测试权限
以itcast管理员账户创建两个项目,分别为itcast01和itheima01
结果为:
eric用户登录,只能看到itcast01项目
jack用户登录,只能看到itheima01项目
3.6 Jenkins凭证管理
凭据可以用来存储需要密文保护的数据库密码、Gitlab密码信息、Docker私有仓库密码等,以便Jenkins可以和这些第三方的应用进行交互。
Username with password:用户名和密码
SSH Username with private key: 使用SSH用户和密钥
Secret file:需要保密的文本文件,使用时Jenkins会将文件复制到一个临时目录中,再将文件路径设置到一个变量中,等构建结束后,所复制的Secret file就会被删除。
Secret text:需要保存的一个加密的文本串,如钉钉机器人或Github的api token
Certificate:通过上传证书文件的方式
3.7 安装git插件和git工具
(1)为了让jenkins支持从gitlab拉取代码,需要安装git插件和在centos7上安装git工具
centos上安装git工具
yum install git -y
查看版本
git --version
(2)jenkins添加git地址
(2.1)创建凭证
Jenkins->凭证->系统->全局凭证->添加凭证
选择"Username with password",输入Gitlab的用户名和密码,点击"确定"
(2.2)测试凭证是否可用
在gitlab中找到"源码管理"->“Git”,在Repository URL复制Gitlab中的项目URL
然后再jenkins中创建一个FreeStyle项目:新建Item->FreeStyle Project->确定
保存配置后,点击构建”Build Now“ 开始构建项目
查看/var/lib/jenkins/workspace/目录,发现已经从Gitlab成功拉取了代码到Jenkins中。
3.8 maven安装和配置
在jenkins集成服务器上,需要安装maven来编译和打包项目
(1)安装
先上传maven软件到192.168.66.101
tar -vxzf apache-maven-3.6.2-bin.tar.gz
mkdir -p /opt/maven
mv apache-maven-3.6.2/* /opt/maven
(2)配置环境变量
vi /etc/profile
设置环境变量
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export MAVEN_HOME=/opt/maven
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
使配置生效
source /etc/profile
查看maven版本
mvn -v
创建本地仓库目录
mkdir /root/repo
修改maven配置文件
vi /opt/maven/conf/settings.xml
修改为/root/repo
修改为
点击查看代码
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
(3)jenkins配置jdk和maven
Jenkins->Global Tool Configuration->JDK->新增JDK,配置如下:
可以参考(https://www.yuque.com/spiderman-dquv0/kgifc9/zk83s7#pRd9l)
Jenkins->Global Tool Configuration->Maven->新增Maven,配置如下:
(4)添加Jenkins全局变量
Manage Jenkins->Configure System->Global Properties ,添加三个全局变量
JAVA_HOME、M2_HOME、PATH+EXTRA
(5)测试maven是否成功
使用之前的gitlab密码测试项目,修改配置
构建->增加构建步骤->Execute Shell
再次构建,如果可以把项目打成包,代表maven环境配置成功啦!
3.9 tomcat安装和配置
(1)安装
把Tomcat压缩包上传到192.168.66.102服务器(如果springboot项目不用安装tomcat)
yum install java-1.8.0-openjdk* -y 安装JDK(已完成)
tar -xzf apache-tomcat-8.5.47.tar.gz 解压
mkdir -p /opt/tomcat 创建目录
mv /root/apache-tomcat-8.5.47/* /opt/tomcat 移动文件
/opt/tomcat/bin/startup.sh 启动tomcat
注意:服务器已经关闭了防火墙,所以可以直接访问Tomcat啦
地址为:http://192.168.66.102/8080
(2)配置Tomcat用户角色权限
默认情况下Tomcat是没有配置用户角色权限的
但是,后续Jenkins部署项目到Tomcat服务器,需要用到Tomcat的用户,所以修改tomcat以下配置,添加用户及权限
vi /opt/tomcat/conf/tomcat-users.xml
内容如下
<tomcat-users>
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-status"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="tomcat" password="tomcat" roles="manager-gui,manager- script,tomcat,admin-gui,admin-script"/>
</tomcat-users>
用户和密码都是:tomcat
注意:为了能够刚才配置的用户登录到Tomcat,还需要修改以下配置
vi /opt/tomcat/webapps/manager/META-INF/context.xml
注释掉如下内容
<!--
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->
(3)重启测试
/opt/tomcat/bin/shutdown.sh 停止
/opt/tomcat/bin/startup.sh 启动
访问: http://192.168.66.102:8080/manager/html ,输入tomcat和tomcat,看到以下页面代表成功啦
4.Jenkins构建Maven项目
(1)jenkins构建的项目类型介绍
主要有三种:
- 自由风格软件项目(freestyle project)
- maven项目
- 流水线项目
推荐使用流水线,灵活度高
4.1 自由风格项目构建
集成过程:拉取代码->编译->打包->部署
(1)创建项目
(2)配置源码管理,在gitlab拉取代码
(3)构建->添加构建步骤->Executor Shell
echo "开始编译和打包"
mvn clean package
echo "编译和打包结束"
(4)部署
把项目部署到远程的Tomcat里面
安装tomcat插件,Jenkins本身无法实现远程部署到Tomcat的功能,需要安装Deploy to container插件实现
添加Tomcat用户凭证
添加构建后操作
点击"Build Now",开始构建过程
4.2 maven项目构建
(1)安装Maven Integration插件
(2)创建Maven项目
(3)配置项目
拉取代码和远程部署的过程和自由风格项目一样,只是构建部分不同
4.3 pipeline流水线
pipeline就是将原来独立运行于单个或多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排和可视化工作
- 如何创建pipeline支持两种语法Declarative(声明式)和Scripted PipeLine(脚本式)
- 也有两种创建方法:直接在jenkins的web Ui页面中输入脚本,也可以通过创建一个jenkinsfile脚本文件放入项目源码库中(一般选中放在源码中)
(1)安装pipeline插件
Manage Jenkins->Manage Plugins->可选插件
安装插件后,创建项目的时候多了“流水线”类型
流水线->选择HelloWorld模板
生成的内容:
pipeline {
agent any
stages {
stage('Hello') {
steps {
echo 'Hello World'
}
}
}
}
stages:代表整个流水线的所有执行阶段。通常stages只有1个,里面包含多个stage
stage:代表流水线中的某个阶段,可能出现n个。一般分为拉取代码,编译构建,部署等阶段。
steps:代表一个阶段内需要执行的逻辑。steps里面是shell脚本,git拉取代码,ssh远程发布等任意内容。
编写一个简单的脚本式Pipeline
node {
def mvnHome
stage('拉取代码') {
// for display purposes
echo '拉取代码'
}
stage('编译构建') {
echo '编译构建'
}
stage('项目部署') {
echo '项目部署'
}
}
构建结果和声明式一样!
pipeline {
agent any
stages {
stage('拉取代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/master']],
doGenerateSubmoduleConfigurations: false, extensions: [],
submoduleCfg: [], userRemoteConfigs: [[credentialsId: '68f2087f-a034-4d39-a9ff-1f776dd3dfa8', url: 'git@192.168.66.100:itheima_group/web_demo.git']]])
}
}
}
}
编译打包
pipeline {
agent any
stages {
stage('拉取代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/master']],
doGenerateSubmoduleConfigurations: false, extensions: [],
submoduleCfg: [], userRemoteConfigs: [[credentialsId: '68f2087f-a034-4d39-a9ff-1f776dd3dfa8', url: 'git@192.168.66.100:itheima_group/web_demo.git']]])
}
}
stage('编译构建') {
steps {
sh label: '', script: 'mvn clean package'
}
}
}
}
部署
pipeline {
agent any
stages {
stage('拉取代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/master']],
doGenerateSubmoduleConfigurations: false, extensions: [],
submoduleCfg: [], userRemoteConfigs: [[credentialsId: '68f2087f-a034-4d39-a9ff-1f776dd3dfa8', url: 'git@192.168.66.100:itheima_group/web_demo.git']]])
}
}
stage('编译构建') {
steps {
sh label: '', script: 'mvn clean package'
}
}
stage('项目部署') {
steps {
deploy adapters: [tomcat8(credentialsId: 'afc43e5e-4a4e-4de6-984f- b1d5a254e434', path: '', url: 'http://192.168.66.102:8080')], contextPath: null, war: 'target/*.war'
}
}
}
}
刚才我们都是直接在Jenkins的UI界面编写Pipeline代码,这样不方便脚本维护,建议把Pipeline脚本放在项目中(一起进行版本控制)
- 在项目根目录建立Jenkinsfile文件,把内容复制到该文件中
把Jenkinsfile上传到Gitlab - 在项目中引用该文件
4.4 jenkins项目构建细节
jenkins内置4中构建触发器
- 触发远程构建
- 其他工程构建后触发(Build after other projects are build)
- 定时构建(build periodically)
- 轮询SCM(poll SCM)
- 当gitlab改变时触发
(1)触发远程构建
http://192.168.66.101:8888/job/web_demo_pipeline/build?token=6666
(2)其他工程构建后触发
创建pre_job流水线工程
(3)定时构建
(4)轮询SCM
轮询SCM,是指定时扫描本地代码仓库的代码是否有变更,如果代码有变更就触发项目构建。
(5)Git hook自动触发构建(*)
轮询SCM可以实现Gitlab代码更新,项目自动构建,但是该方案的性能不佳
利用Gitlab的webhook实现代码push到仓库,立即触发项目自动构建。
区别:
需要安装两个插件:
Gitlab Hook和GitLab
Jenkins设置自动构建
等会需要把生成的webhook URL配置到Gitlab中
(5.1)Gitlab配置webhook
开启webhook功能
使用root账户登录到后台,点击Admin Area -> Settings -> Network
勾选"Allow requests to the local network from web hooks and services"
在项目添加webhook
点击项目->Settings->Integrations
注意:以下设置必须完成,否则会报错!
Manage Jenkins->Configure System
4.5jenkins参数化构建
有时在项目构建的过程中,我们需要根据用户的输入动态传入一些参数,从而影响整个构建结果,这时我们可以使用参数化构建。
Jenkins支持非常丰富的参数类型
项目创建分支,并推送到Gitlab上,新建分支:v1,代码稍微改动下,然后提交到gitlab上。
这时看到gitlab上有一个两个分支:master和v1
在Jenkins添加字符串类型参数
改动pipeline流水线代码
点击Build with Parameters
入分支名称,构建即可!构建完成后访问Tomcat查看结果
5 配置邮箱服务器发送构建结果
安装Email Extension插件
(1)Jenkins设置邮箱相关参数
Manage Jenkins->Configure System
设置邮件参数
设置Jenkins默认邮箱信息
(2)准备邮件内容
在项目根目录编写email.html,并把文件推送到Gitlab,内容如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>
${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志
</title>
</head>
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0">
<table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans- serif">
<tr>
<td>
(本邮件是程序自动下发的,请勿回复!)
</td>
</tr>
<tr>
<td>
<h2>
<font color="#0000FF">
构建结果 - ${BUILD_STATUS}
</font>
</h2>
</td>
</tr>
<tr>
<td>
<br />
<b>
<font color="#0B610B">
构建信息
</font>
</b>
<hr size="2" width="100%" align="center" />
</td>
</tr>
<tr>
<td>
<ul>
<li>
项目名称 : ${PROJECT_NAME}
</li>
<li>
构建编号 : 第${BUILD_NUMBER}次构建
</li>
<li>
触发原因: ${CAUSE}
</li>
<li>
构建日志:
<a href="${BUILD_URL}console">
${BUILD_URL}console
</a>
</li>
<li>
构建 Url :
<a href="${BUILD_URL}">
${BUILD_URL}
</a>
</li>
<li>
工作目录 :
<a href="${PROJECT_URL}ws">
${PROJECT_URL}ws
</a>
</li>
<li>
项目 Url :
<a href="${PROJECT_URL}">
${PROJECT_URL}
</a>
</li>
</ul>
</td>
</tr>
<tr>
<td>
<b>
<font color="#0B610B">
Changes Since Last Successful Build:
</font>
</b>
<hr size="2" width="100%" align="center" />
</td>
</tr>
<tr>
<td>
<ul>
<li>
历史变更记录 :
<a href="${PROJECT_URL}changes">
${PROJECT_URL}changes
</a>
</li>
</ul>
${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="Changes for Build #%n:
<br />
%c
<br />
",showPaths=true,changesFormat="
<pre>
[%a]
<br />
%m
</pre>
",pathFormat=" %p"}
</td>
</tr>
<tr>
<td>
<b>
Failed Test Results
</b>
<hr size="2" width="100%" align="center" />
</td>
</tr>
<tr>
<td>
<prestyle="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
$FAILED_TESTS
</pre>
<br />
</td>
</tr>
<tr>
<td>
<b>
<font color="#0B610B">
构建日志 (最后 100行):
</font>
</b>
<hr size="2" width="100%" align="center" />
</td>
</tr>
<tr>
<td>
<textarea cols="80" rows="30" readonly="readonly" style="font-family: Courier New">
${BUILD_LOG, maxLines=100}
</textarea>
</td>
</tr>
</table>
</body>
</html>
编写Jenkinsfile添加构建后发送邮件
pipeline {
agent any stages {
stage('拉取代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '68f2087f-a034-4d39-a9ff-1f776dd3dfa8', url: 'git@192.168.66.100:itheima_group/web_demo.git']]])
}
}
stage('编译构建') {
steps {
sh label: '',
script: 'mvn clean package'
}
}
stage('项目部署') {
steps {
deploy adapters: [tomcat8(credentialsId: 'afc43e5e-4a4e-4de6-984f- b1d5a254e434', path: '', url: 'http://192.168.66.102:8080')],
contextPath: null,
war: 'target/*.war'
}
}
}
post {
always {
emailext(subject: '构建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!', body: '${FILE,path="email.html"}', to: 'xxx@qq.com')
}
}
}
测试
备注:
邮件相关全局参数参考列表
系统设置->Extended E-mail Notification->Content Token Reference,点击旁边的?号
6 Jenkins+SonarQube代码审查
(1)安装SonarQube
SonarQube是一个用于管理代码质量的开放平台,可以快速的定位代码中潜在的或者明显的错误
环境要求
安装MySQL(已完成),安装SonarQube,在MySQL创建sonar数据库
下载sonar压缩包:
https://www.sonarqube.org/downloads/
解压sonar,并设置权限
yum install unzip
unzip sonarqube-6.7.4.zip 解压
mkdir /opt/sonar 创建目录
mv sonarqube-6.7.4/* /opt/sonar 移动文件
useradd sonar 创建sonar用户,必须sonar用于启动,否则报错
chown -R sonar. /opt/sonar 更改sonar目录及文件权限
修改sonar配置文件
vi /opt/sonarqube-6.7.4/conf/sonar.properties
内容如下:
sonar.jdbc.username=root
sonar.jdbc.password=Root@123
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
注意:sonar默认监听9000端口,如果9000端口被占用,需要更改。
启动sonar
cd /opt/sonarqube-6.7.4
su sonar ./bin/linux-x86-64/sonar.sh start 启动
su sonar ./bin/linux-x86-64/sonar.sh status 查看状态
su sonar ./bin/linux-x86-64/sonar.sh stop 停止
tail -f logs/sonar.logs 查看日志
访问sonar
http://192.168.66.101:9000
默认账户:admin/admin
创建token
token要记下来后面要使用
bb8b6c53d9d921e101343cef0395243e6c1dc8a3
(2)实现代码审查
SonarQube Scanner插件
添加SonarQube凭证
Jenkins进行SonarQube配置
Manage Jenkins->Configure System->SonarQube servers
Manage Jenkins->Global Tool Configuration
SonaQube关闭审查结果上传到SCM功能
在项目添加SonaQube代码审查(非流水线项目)
添加构建步骤:
# must be unique in a given SonarQube instance
sonar.projectKey=web_demo
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=web_demo
sonar.projectVersion=1.0
# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# This property is optional if sonar.modules is set.
sonar.sources=.
sonar.exclusions=**/test/**,**/target/**
sonar.java.source=1.8
sonar.java.target=1.8
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8
在项目添加SonaQube代码审查(流水线项目)
1))项目根目录下,创建sonar-project.properties文件
# must be unique in a given SonarQube instance
sonar.projectKey=web_demo
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=web_demo
sonar.projectVersion=1.0
# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# This property is optional if sonar.modules is set.
sonar.sources=.
sonar.exclusions=**/test/**,**/target/**
sonar.java.source=1.8
sonar.java.target=1.8
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8
2)修改Jenkinsfile,加入SonarQube代码审查阶段
pipeline {
agent any stages {
stage('拉取代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '68f2087f-a034-4d39-a9ff-1f776dd3dfa8', url: 'git@192.168.66.100:itheima_group/web_demo.git']]])
}
}
stage('编译构建') {
steps {
sh label: '',
script: 'mvn clean package'
}
}
stage('SonarQube代码审查') {
steps {
script {
scannerHome = tool 'sonarqube-scanner'
}
withSonarQubeEnv('sonarqube6.7.4') {
sh "${scannerHome}/bin/sonar-scanner"
}
}
}
stage('项目部署') {
steps {
deploy adapters: [tomcat8(credentialsId: 'afc43e5e-4a4e-4de6-984f- b1d5a254e434', path: '', url: 'http://192.168.66.102:8080')],
contextPath: null,
war: 'target/*.war'
}
}
}
post {
always {
emailext(subject: '构建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!', body: '${FILE,path="email.html"}', to: '1014671449@qq.com')
}
}
}
到SonarQube的UI界面查看审查结果
Jenkins持续集成入门到精通(入门篇)的更多相关文章
- 【Jenkins持续集成(一)】SonarQube 入门安装使用教程
一.前言 持续集成管理平台不只是CI服务器,是一系列软件开发管理工具的组合. 源码版本管理:svn.git 项目构建工具:Maven.Ant 代码质量管理:Sonar(Checkstyle.PMD.F ...
- Jenkins 从小白入门到企业实践打怪放弃之路系列笔记 【持续集成与交付快速入门必备】
Jenkins 从小白入门到企业实践打怪放弃之路系列笔记 [持续集成与交付快速入门必备]
- Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步
Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步 一.概述 PV操作是对信号量进行的操作. 进程同步是指在并发进程之间存在一种制约关系,一个进程的执行依赖另一个进程的消 ...
- .NET持续集成与自动化部署之路第一篇——半天搭建你的Jenkins持续集成与自动化部署系统
.NET持续集成与自动化部署之路第一篇(半天搭建你的Jenkins持续集成与自动化部署系统) 前言 相信每一位程序员都经历过深夜加班上线的痛苦!而作为一个加班上线如家常便饭的码农,更是深感其痛 ...
- SaltStack 入门到精通第二篇:Salt-master配置文件详解
SaltStack 入门到精通第二篇:Salt-master配置文件详解 转自(coocla):http://blog.coocla.org/301.html 原本想要重新翻译salt-mas ...
- SaltStack入门到精通第一篇:安装SaltStack
SaltStack入门到精通第一篇:安装SaltStack 作者:纳米龙 发布日期:2014-06-09 17:50:36 实际环境的设定: 系统环境: centos6 或centos5 实验机 ...
- Promise入门到精通(初级篇)-附代码详细讲解
Promise入门到精通(初级篇)-附代码详细讲解 Promise,中文翻译为承诺,约定,契约,从字面意思来看,这应该是类似某种协议,规定了什么事件发生的条件和触发方法. Pr ...
- Jmeter(三十九) - 从入门到精通进阶篇 - Jmeter配置文件的刨根问底 - 上篇(详解教程)
------------------------------------------------------------------- 转载自:北京-宏哥 https://www.cnblogs.co ...
- Jenkins持续集成(上)-Windows下安装Jenkins
环境:Windows 2008 R2.Jenkins2.235.1: 概要 前面写过一篇文章,<自动发布-asp.net自动发布.IIS站点自动发布(集成SLB.配置管理.Jenkins)> ...
- Jenkins持续集成学习-搭建jenkins问题汇总
目录 Jenkins持续集成学习5-搭建jenkins问题汇总 目录 前言 问题列表 nuget还原包问题 编译问题 SVN更新问题 参考文档 Jenkins持续集成学习5-搭建jenkins问题汇总 ...
随机推荐
- Kafka在Linux下的安装和使用
Kafka简介 Tips:本文主要介绍在Linux系统中安装和使用Lafka的操作步骤. 安装Kafka 访问Kafka官网,下载安装包版本(https://kafka.apache.org/down ...
- 曲线艺术编程 coding curves 第二章 三角函数曲线(TRIG CURVES)
第二章 三角函数曲线(TRIG CURVES) 原作:Keith Peters 原文:https://www.bit-101.com/blog/2022/11/coding-curves/ 译者:池中 ...
- Python 列表、字典、元组的一些小技巧
1. 字典排序 我们知道 Python 的内置 dictionary 数据类型是无序的,通过 key 来获取对应的 value.可是有时我们需要对 dictionary 中的 item 进行排序输出, ...
- 移动App测试概述:移动App特性
移动App测试概述:移动App特性 移动App在现代人的日常生活中扮演着越来越重要的角色,因而对于它们的质量和稳定性的要求也越来越高.为了确保App的质量,开发商需要进行充分的测试和检验.本文将讨论移 ...
- K8S | 核心原理分析
目录 一.背景 二.持续集成 三.K8S架构 1.核心组件 2.分层结构 3.核心能力 3.1 发现与负载 3.2 调度 3.3 自动伸缩 四.应用案例 1.服务部署 2.交互流程 五.参考源码 整体 ...
- 【C++ Primer】2.1 基本内置类型
1. 基本内置类型 基本算数类型: 类型 含义 最小尺寸 bool 布尔类型 8bits char 字符 8bits wchar_t 宽字符 16bits char16_t Unicode字符 16b ...
- 生成式预训练Transformer在机器翻译中的应用与挑战
目录 1. 引言 2. 技术原理及概念 3. 实现步骤与流程 4. 应用示例与代码实现讲解 5. 优化与改进 6. 结论与展望 机器翻译是人工智能领域的重要应用之一,而生成式预训练Transforme ...
- vue2父传子,子传父
首先看父传子 自定义一个子组件 <template> <div> 子组件: <span>{{inputName}}</span> </div> ...
- 对敏感操作的二次认证 —— 详解 Sa-Token 二级认证
一.需求分析 在某些敏感操作下,我们需要对已登录的会话进行二次验证. 比如代码托管平台的仓库删除操作,尽管我们已经登录了账号,当我们点击 [删除] 按钮时,还是需要再次输入一遍密码,这么做主要为了两点 ...
- Centos 7安装dotnet 3.1
# 注册 Microsoft 密钥和源 sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft- ...