持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括:
1、持续的软件版本发布/测试项目。
2、监控外部调用执行的工作。
目前微服务架构大行其道,需要部署的项目越来越多,如果每次都由运维人员手工部署,那么程序部署的成本极高。
Jenkins使用极低的代价能部署一个软件,自动化进行项目构建,项目测试,静态扫描,上传构建,远程备份,发布。很多时候,你只需要点击立即构建,就进行了项目的部署操作。
当然它不仅仅提供这些功能。权限管理,可以让不同的人员负责各自的项目建构。多项目构建,可以一次性完成多个项目的构建。
官方地址:https://jenkins.io/
程序静态分析(ProgramStatic Analysis)是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。目前静态分析技术向模拟执行的技术发展以能够发现更多传统意义上动态测试才能发现的缺陷,例如符号执行、抽象解释、值依赖分析等等并采用数学约束求解工具进行路径约减或者可达性分析以减少误报增加效率。目前的静态分析工具,无论从科研角度还是实用性角度还有很大的提高余地,国际最好分析工具误报率在5-10%之间,能够报出的缺陷种类也仅有几百种。我国较好静态分析工具较少,一些高校正在致力于在此方面的研究和开发(成果较突出的如北京大学等)。
Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量,可以从七个维度检测代码质量
通过插件形式,可以支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十几种编程语言的代码质量管理与检测
我想说的是,SonarQube能够很好地与持续集成工具Jenkins集成起来,能够在程序自动化部署的时候生成结果报告。并且还可以和idea插件sonarlint配合起来,在开发过程中就进行代码静态分析。
官网地址:https://www.sonarqube.org/downloads/
Ps:sonarQube插件安装非常慢。
说明:案例采用的项目是基于SpringBoot开发的项目,版本控制使用Git,依赖管理使用Maven
暂时略过
http://10.89.0.130:8080
暂时略过
http://10.89.0.130:8083
Multijob plugin
用于多项目构建。如可创建Job1构建项目A,Job2构建项目B,JOB3同时构建项目A、B
Publish Over SSH
用于项目构建成功后,上传项目到指定服务器的指定目录,并执行相应的shell脚本
SonarQubeScanner for Jenkins
用于在项目构建阶段,执行程序静态分析,并将相应的结果反馈到SonarQube,进行可视化查看
Chinese Pack
汉化插件
IDEA开发工具集成SonarQube,那么即可在开发阶段就进行程序静态分析。并且与Jenkins使用相同的分析规则。
IDEA安装插件SonarLint
File->Settings->Plugins->Browse Repositories
安装插件后重启IDEA,再次进入Settings
配置本地程序与SonarQube关联
本地进行程序静态扫描
SonarQube
右上角点击用户名->我的账号->安全->GenerateTokens
Jenkins
安装插件SonarQube Scanner for Jenkins
主页面->系统管理->系统设置->SonarQube Servers
Server authentication token使用SonarQube中生成的Token
涉及文件pom.xml,application.properties,sonar-project.properties
在根目录(pom.xml同级)下面创建sonar-project.properties
# requiredmetadata
sonar.projectKey=dbeye:alarm --项目key
sonar.projectName=dbeye-alarm --项目名称
sonar.projectVersion=1.0 --项目版本号
#源代码路径
sonar.sources=src
打开pom.xml配置如下
dev
dev
true
test
test
prod
prod
src/main/resources
true
application-dev.properties
application-test.properties
application-prod.properties
src/main/resources
true
application-${build.profile.id}.properties
org.springframework.boot
spring-boot-maven-plugin
true
application.properties配置
# 启用的环境
登录服务器,创建程序的目录结构
cd /usr/local/
mkdir dataassistant-alarm
cd dataassistant-alarm
mkdir backup –程序备份目录
mkdir bin – 程序相关脚本目录
mkdir boot – 程序目录
mkdir logs – 日志目录
mkdir upload –jenkins上传的目录
主页面->系统管理->系统设置->Publish over SSH
在主页面点击新建Job
输入ItemName,选择自由风格,点击左下角的OK按钮
输入项目名称和描述
选择Git,输入Git仓库地址,用户验证信息,分支(可选择Credentials->Add添加用户验证信息)
构建->增加构建步骤->ExecuteShell
构建->增加构建步骤->ExecuteSonarQube Scanner
构建后操作->增加构建后操作步骤->Sendbuild artifacts Over SSH
选择3.9配置的服务器,配置Transfers
Sourcefiles:jenkins构建完成后程序构件的路径(相对路径/绝对路径均可)
Removeprefix:去掉Source files中的父路径
Remotedirectory:上传到远程服务器的哪个路径
Execcommand:上传成功后触发服务器的脚本
/usr/local/dataassistant-alarm/bin/publish.shdataassistant-alarm
执行publish.sh脚本,以dataassistant-alarm作为参数
如果publish.sh没有执行权限,可使用如下命令添加权限
chmod +xpublish.sh
支持一个参数,项目名称
#!/bin/bash
#defined
PUBLISH_HOME=$(cd"$(dirname "$0")"; cd ..;pwd)
SOURCE_PROJECT=$1
SERVICE_DIR="/etc/init.d/"
echo"$SOURCE_PROJECT pubshing"
echo"publish home is $PUBLISH_HOME"
#definedrelation dir
BAK_DIR="$PUBLISH_HOME"/backup/`date+%Y%m%d`
UPLOAD_DIR="$PUBLISH_HOME"/upload
BOOT_DIR="$PUBLISH_HOME"/boot
#check uploadfile exists
cd $UPLOAD_DIR
if [ ! -f"$SOURCE_PROJECT"*.jar ]
then
echo "upload files not exists"
exit 1
fi
#createbackup_dir
mkdir -p"$BAK_DIR"
#stop
if [ -f"$BOOT_DIR"/"$SOURCE_PROJECT".jar ]
then
#backup
cp"$BOOT_DIR"/"$SOURCE_PROJECT".jar"$BAK_DIR"/"$SOURCE_PROJECT"_`date +%H%M%S`.jar
if [ -f"$SERVICE_DIR"/"$SOURCE_PROJECT" ]
then
#stop server
sudo service"$SOURCE_PROJECT" stop
if [[ $? != 0]]
then
echo "$SOURCE_PROJECT stoped error"
exit1
fi
echo"$SOURCE_PROJECT stoped"
fi
#clean boot
rm -f"$BOOT_DIR"/"$SOURCE_PROJECT".jar
fi
#install boot
cp"$UPLOAD_DIR"/"$SOURCE_PROJECT"*.jar"$BOOT_DIR"/"$SOURCE_PROJECT".jar
if [ ! -x"$BOOT_DIR"/"$PROJECT_NAME".jar ]
then chmod +x"$BOOT_DIR"/"$SOURCE_PROJECT".jar
fi
if [ ! -f"$SERVICE_DIR"/"$SOURCE_PROJECT" ]
then
sudo ln -s"$BOOT_DIR"/"$SOURCE_PROJECT".jar"$SERVICE_DIR"/"$SOURCE_PROJECT"
fi
#clean upload
rm -f"$UPLOAD_DIR"/"$SOURCE_PROJECT"*.jar
#start server
sudo service"$SOURCE_PROJECT" start
if [[ $? != 0 ]]
then
echo "$SOURCE_PROJECTstarted error"
exit1
fi
echo"$SOURCE_PROJECT is starting,please try to access $SOURCE_PROJECT"
主页面->点击指定的JOB
点击立即构建
查看构建过程,点击进度条
查看构建结果
http://10.89.0.130:8083
通过上述程序的演示,我们发现程序的部署是可以做到一键发布的。
在我们进行开发联调阶段,我们很有可能会频繁部署程序。
而且如果可以通过程序去检查程序,必然可以更加高效(虽然只能检查一些语法及通用错误)。
有了Jenkins+SonarQube,我们即可做到一切。