SpringBoot项目持续集成+静态扫描

1      持续集成是什么?

持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

1.2  Jenkins

         Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括:

1、持续的软件版本发布/测试项目。

2、监控外部调用执行的工作。

        

         目前微服务架构大行其道,需要部署的项目越来越多,如果每次都由运维人员手工部署,那么程序部署的成本极高。

Jenkins使用极低的代价能部署一个软件,自动化进行项目构建,项目测试,静态扫描,上传构建,远程备份,发布。很多时候,你只需要点击立即构建,就进行了项目的部署操作。

当然它不仅仅提供这些功能。权限管理,可以让不同的人员负责各自的项目建构。多项目构建,可以一次性完成多个项目的构建。

 

官方地址:https://jenkins.io/

2      程序静态分析是什么?

2.1  定义

程序静态分析(ProgramStatic Analysis)是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。目前静态分析技术向模拟执行的技术发展以能够发现更多传统意义上动态测试才能发现的缺陷,例如符号执行、抽象解释、值依赖分析等等并采用数学约束求解工具进行路径约减或者可达性分析以减少误报增加效率。目前的静态分析工具,无论从科研角度还是实用性角度还有很大的提高余地,国际最好分析工具误报率在5-10%之间,能够报出的缺陷种类也仅有几百种。我国较好静态分析工具较少,一些高校正在致力于在此方面的研究和开发(成果较突出的如北京大学等)。

2.2  SonarQube

Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量,可以从七个维度检测代码质量

通过插件形式,可以支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十几种编程语言的代码质量管理与检测

 

我想说的是,SonarQube能够很好地与持续集成工具Jenkins集成起来,能够在程序自动化部署的时候生成结果报告。并且还可以和idea插件sonarlint配合起来,在开发过程中就进行代码静态分析。

 

官网地址:https://www.sonarqube.org/downloads/

 

Ps:sonarQube插件安装非常慢。

 

3      怎样做?

说明:案例采用的项目是基于SpringBoot开发的项目,版本控制使用Git,依赖管理使用Maven

3.1  Jenkins安装

暂时略过

http://10.89.0.130:8080

3.2  SonarQube安装

暂时略过

http://10.89.0.130:8083

3.3  Jenkins插件安装

Multijob plugin

         用于多项目构建。如可创建Job1构建项目A,Job2构建项目B,JOB3同时构建项目A、B

Publish Over SSH

         用于项目构建成功后,上传项目到指定服务器的指定目录,并执行相应的shell脚本

SonarQubeScanner for Jenkins

         用于在项目构建阶段,执行程序静态分析,并将相应的结果反馈到SonarQube,进行可视化查看

 

3.4  SonarQube插件安装

Chinese Pack

汉化插件

3.5  IDEA集成SonarQube

IDEA开发工具集成SonarQube,那么即可在开发阶段就进行程序静态分析。并且与Jenkins使用相同的分析规则。

 

IDEA安装插件SonarLint

File->Settings->Plugins->Browse Repositories

 SpringBoot项目持续集成+静态扫描_第1张图片

安装插件后重启IDEA,再次进入Settings

SpringBoot项目持续集成+静态扫描_第2张图片

配置本地程序与SonarQube关联

SpringBoot项目持续集成+静态扫描_第3张图片

本地进行程序静态扫描

SpringBoot项目持续集成+静态扫描_第4张图片

 

3.6  Jenkins集成SonarQube

SonarQube

         右上角点击用户名->我的账号->安全->GenerateTokens

SpringBoot项目持续集成+静态扫描_第5张图片

 

Jenkins

安装插件SonarQube Scanner for Jenkins

主页面->系统管理->系统设置->SonarQube Servers

SpringBoot项目持续集成+静态扫描_第6张图片

Server authentication token使用SonarQube中生成的Token

3.7  程序配置

涉及文件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配置

# 启用的环境

[email protected]@

 

3.8  服务器配置

登录服务器,创建程序的目录结构

cd /usr/local/

mkdir dataassistant-alarm

cd dataassistant-alarm

mkdir backup –程序备份目录

mkdir bin – 程序相关脚本目录

mkdir boot – 程序目录

mkdir logs – 日志目录

mkdir upload –jenkins上传的目录

 

3.9  Jenkins配置服务器信息

主页面->系统管理->系统设置->Publish over SSH

SpringBoot项目持续集成+静态扫描_第7张图片

3.10    Jenkins配置程序

在主页面点击新建Job

输入ItemName,选择自由风格,点击左下角的OK按钮

SpringBoot项目持续集成+静态扫描_第8张图片

输入项目名称和描述

SpringBoot项目持续集成+静态扫描_第9张图片

选择Git,输入Git仓库地址,用户验证信息,分支(可选择Credentials->Add添加用户验证信息)

 SpringBoot项目持续集成+静态扫描_第10张图片

构建->增加构建步骤->ExecuteShell

SpringBoot项目持续集成+静态扫描_第11张图片

构建->增加构建步骤->ExecuteSonarQube Scanner

SpringBoot项目持续集成+静态扫描_第12张图片

构建后操作->增加构建后操作步骤->Sendbuild artifacts Over SSH

SpringBoot项目持续集成+静态扫描_第13张图片

选择3.9配置的服务器,配置Transfers

Sourcefilesjenkins构建完成后程序构件的路径(相对路径/绝对路径均可)

Removeprefix:去掉Source files中的父路径

Remotedirectory:上传到远程服务器的哪个路径

Execcommand:上传成功后触发服务器的脚本

       /usr/local/dataassistant-alarm/bin/publish.shdataassistant-alarm

       执行publish.sh脚本,以dataassistant-alarm作为参数

3.11    publish.sh

如果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"


 

3.12    部署程序

主页面->点击指定的JOB

SpringBoot项目持续集成+静态扫描_第14张图片

点击立即构建

SpringBoot项目持续集成+静态扫描_第15张图片

查看构建过程,点击进度条

SpringBoot项目持续集成+静态扫描_第16张图片

查看构建结果

SpringBoot项目持续集成+静态扫描_第17张图片

3.13    访问程序

SpringBoot项目持续集成+静态扫描_第18张图片

3.14    访问SonarQube

http://10.89.0.130:8083

SpringBoot项目持续集成+静态扫描_第19张图片SpringBoot项目持续集成+静态扫描_第20张图片SpringBoot项目持续集成+静态扫描_第21张图片

 

 

4      为什么这样做?

通过上述程序的演示,我们发现程序的部署是可以做到一键发布的。

在我们进行开发联调阶段,我们很有可能会频繁部署程序。

而且如果可以通过程序去检查程序,必然可以更加高效(虽然只能检查一些语法及通用错误)。

有了Jenkins+SonarQube,我们即可做到一切。

你可能感兴趣的:(部署)