sonarscanner扫描指定日期至当前时间的svn版本文件的代码

本地下载源码

  • 本地要先下载好源码,如下载到:D:\CI\sourcecode\01_SIT\autoclaim 此路径我们暂且叫源码根目录

源码根目录配置文件

  • 在源码根目录下,新增一个配置文件,名为"config.property",文件内容如下:
######注意:注释中可以用逗号分隔项中,逗号都应为英文状态下的逗号######
####系统配置信息####
[sysconf]
#此系统名称
system.name=autoclaim
#项目发布环境
deploy.environment=autoclaim_test
#清单目录,默认为工作目录,建议不要修改
list.path=D:\CI\sourcecode\01_SIT\autoclaim
#sonarscanner扫描的文件清单
scan.listpath=D:\CI\sourcecode\01_SIT\autoclaim
#本地代码文件路径
src.dir=D:\CI\sourcecode\01_SIT\autoclaim
#需要截掉的路径(svn上的清单前面的一段长的路径要截掉)
list.rep=/01-development/01-src/autoclaim/branche/autoclaim_TB_TEST_20171122/
####配置管理等相关信息####
[scminfo]
#软件配置管理工具
scmtype=svn
#scm登陆账户
scm.user=zhuchun
#scm登陆密码
scm.password=zhuchun
#检测日志的天数
pre.days=365
#扫描日志的起始日期(yyyy-mm-dd)
scan.days=2019-08-26
######代码部分######
#任务分支是否固定不变,True为固定不变,需要配置trunk.url。False为有变动,jenkins job需要配置turnk_url传参入口
invarianturl=True
#获取代码任务码线url(分支固定不变)
trunk.url=

源码根目录,可执行文件

  • 在python包的路径下D:\CI\install\Python27\Lib\site-packages\com\sinosoft\ci添加名为scan.py的文件,文件内容如下:
#coding:gbk
'''
Created on 2019年8月27日
Add by ZhuChun
'''
import ConfigParser
import os
import datetime
import time
import shutil
import code
import sys
import xml.dom.minidom as xmldom

reload (sys)
sys.setdefaultencoding('gbk')

class SconarScan(object):
    '''
    classdocs
    '''
    def __init__(self, conf):
        '''
        Constructor
        '''
        self.config=conf

        conf = ConfigParser.ConfigParser()
        conf.read(self.config)

        if conf.has_option("sysconf","scan.listpath"):
            self.listpath=conf.get("sysconf","scan.listpath")
        else:
            self.listpath="."
        if conf.has_option("scminfo","scmtype"):
            self.scmtype=conf.get("scminfo","scmtype")
        else:
            self.scmtype="svn"
        if conf.has_option("scminfo","scm.user"):
            self.scmuser=conf.get("scminfo","scm.user")
        else:
            print "未配置 scm.user"
            os.system()
        if conf.has_option("scminfo","scm.password"):
            self.scmpassword=conf.get("scminfo","scm.password")
        else:
            print "未配置 scm.password"
            os.system()
        if conf.has_option("scminfo","scan.days"):
            self.scandays=conf.get("scminfo","scan.days")
            print self.scandays
        else:
            print "未配置 scan.days"
            os.system()
        ###代码部分相关配置
        if conf.has_option("sysconf","src.dir"):
            self.srcdir=conf.get("sysconf","src.dir")
        else:
            print "未配置 src.dir"
            os.system()
        if conf.has_option("scminfo","invarianttrunkurl"):
            self.invarianttrunkurl=conf.get("scminfo","invarianttrunkurl")
        else:
            self.invarianttrunkurl='True'
        if self.invarianttrunkurl == 'True':
            if conf.has_option("scminfo","trunk.url"):
                self.trunkurl=conf.get("scminfo","trunk.url")
            else:
                print "未配置 trunk.url"
                os.system()
        else:
            self.trunkurl=os.getenv('trunk_url')
        if conf.has_option("sysconf","list.rep"):
            self.listrep=conf.get("sysconf","list.rep")
        else:
            print "未配置 list.rep"

    def sonarscan(self):
        temp_dir=os.path.join(self.listpath,'scantemp')
        scmlog=os.path.join(temp_dir,'scmlog.xml')

        #清理更新文件
        if os.path.exists(temp_dir):
            shutil.rmtree(temp_dir)
            time.sleep(1)
            os.mkdir(temp_dir)
        elif not os.path.exists(temp_dir):
            os.mkdir(temp_dir)
        if self.scmtype == 'svn':
            #svnlog输出
            timeFomat='%Y-%m-%dT23:59:00'
            #n天前的svn日志
            d=datetime.datetime.strptime(self.scandays,"%Y-%m-%d").strftime(timeFomat)
            now=datetime.datetime.now().strftime(timeFomat)
            os.chdir(self.srcdir)
            #获取代码日志文件
            os.system('svn --username '+self.scmuser+' --password '+self.scmpassword+' log --xml -v -r{'+d+'}:{'+now+'} \"'+self.trunkurl+'\" > '+scmlog)
            #将文件清单写入sonar-project.properities
            domobj=xmldom.parse(scmlog)
            elemobj=domobj.documentElement
            subelemobjs=elemobj.getElementsByTagName("path")
            scanlist=""
            for sub in subelemobjs:
                str=sub.childNodes[0].data
                scanlist=str+","+scanlist
            scanlist=scanlist.replace(self.listrep,"")
            scanlist="sonar.inclusions="+scanlist[:-1]
            print "scanlist:"+scanlist
            f=open(os.path.join(temp_dir,"sonar-project.properties"),"w")
            f.write(scanlist)
            f.close()
  • 在源码根目录下添加Scan.py文件,文件内容如下:
#coding:gbk
'''
Created on 2019年8月27日
'''
import os
from com.sinosoft.ci.scan import SconarScan

#组件存放目录work_dir=""
work_dir=os.getenv('WORKSPACE')

#配置文件地址
conffile=os.path.join(work_dir,'config.property')

SconarScan=SconarScan(conffile)
SconarScan.sonarscan()

jenkins配置

  • 新建一个Item;

  • 在配置中,配置如下:

    • 1.配置jdk
    • 2.配置工作空间:D:\CI\sourcecode\01_SIT\autoclaim
    • 3.配置源码管理Subversion,本地要同步svn代码所用
    • 4.在构建步骤中,新增一个Excute Windows batch command,内容如下:Scan.py
    • 5.在上面的构建步骤下,增加一个构建步骤Excute SonarQube Scanner ,配置如下:
      • Task to run:scan
      • JDK:选择你项目对应的就行
      • Path to project properities:${WORKSPACE}/scantemp/sonar-project.properties
      • Anaylysis properities :内容如下
        sonar.projectKey=autoclaim_test
        sonar.projectName=autoclaim_test
        sonar.projectVersion=1.1-SNAPSHOT
        sonar.language=java
        sonar.java.source=1.6
        sonar.java.binaries=D:/CI/sourcecode/01_SIT/autoclaim/WebRoot/WEB-INF/classes
        sonar.java.libraries=D:/CI/sourcecode/01_SIT/autoclaim/WebRoot/WEB-INF/lib
        sources=src
        sonar.sourceEncoding=UTF-8
        sonar.jdbc.username=sonar
        sonar.jdbc.password=sonar
        sonar.jdbc.url=jdbc:postgresql://localhost/sonardb?currentSchema=my_schema
        sonar.login=cjbx-lipei
        sonar.password=112233
  • 保存后,点击立即构建即可。