美文网首页iOS工程化
iOS+Jenkins持续构建-Sonarqube

iOS+Jenkins持续构建-Sonarqube

作者: 圣艾修 | 来源:发表于2019-09-29 15:28 被阅读0次

    一、环境介绍

    iOS的sonar扫描对环境要求很多,以下是我的环境。
    系统:macOS Mojave 10.14.4
    Xcode:10.3
    Jenkins:2.190
    JDK:jdk1.8.0_191.jdk
    sonar-runner:2.4(可以不用)
    sonar-scanner:4.0.0.1744
    oclint:0.13
    SonarQube:7.3
    Python:3.7
    mysql:5.7.27

    二、环境安装

    基本环境见前面几篇文章,以下是新搭建环境。

    1. Sonarqube安装
      下载地址
      包解压后放置路径:/usr/local/sonarqube-7.3

    2. mysql安装
      下载地址

    3. 下载sonar-runner sonar-scanner
      下载后放置:
      /usr/local/sonar-runner-2.4
      /usr/local/sonar-scanner-4.0.0.1744-macosx

    1. 创建用户及数据库
      mysql修改密码自行操作,我的修改为了:12345678
    mysql -u root -p
    mysql> CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
    mysql> CREATE USER 'sonar' IDENTIFIED BY 'sonar';
    mysql> GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';
    mysql> GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
    mysql> FLUSH PRIVILEGES;
    
    1. sonar-runner sonar-scanner配置
      目录:/usr/local/sonar-runner-2.4/conf/sonar-runner.properties
      增加以下内容:
    #--------------- -------------------- 手动修改内容 ------   -----------
    sonar.host.url=http://localhost:9000/sonarqube
    sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
    sonar.jdbc.username=root
    sonar.jdbc.password=12345678
    sonar.login=admin  
    sonar.password=admin
    #--------------- --------------------  ------   -----------
    

    目录:/usr/local/sonar-scanner-4.0.0.1744-macosx/conf/sonar-scanner.properties
    增加以下内容:

    sonar.login=admin 
    sonar.password=admin
    
    1. sonarqube配置
      目录:/usr/local/sonarqube-7.3/conf/wrapper.conf
      增加以下内容:
    wrapper.java.command=/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java
    

    目录:/usr/local/sonarqube-7.3/conf/sonar.properties

    #----- ----- ----- ----- ----- ----- 
    sonar.host.url=http://localhost:9000/sonarqube
    # mysql 用户名
    sonar.jdbc.username=root
    # mysql 密码
    sonar.jdbc.password=12345678
    #----- ----- ----- ----- ----- ----- 
    
    1. 启动sonarqube,并安装中文插件
      命令:

    cd /usr/local/sonarqube-7.3/bin/macosx-universal-64
    sh sonar.sh start

    查看日志

    tail -f /usr/local/sonarqube-7.3/logs/sonar.log

    也可以直接去目录看: /usr/local/sonarqube-7.3/logs /usr/local/sonarqube-7.3/logs

    启动后安装中文插件(我已安装,市场-输入Chinese,再重启):

    sh sonar.sh restart

    1.png
    1. sonarqube的oc,swift插件需要收费,去github上找到个开源的插件
      地址
      我下载的目前最新:0.4.5版本,该插件支持oc和swift
      将backelite-sonar-swift-plugin-0.4.5.jar拷贝至/usr/local/sonarqube-7.3/extensions/plugins
      重启sonarqube

    2. 新建项目


    1. 项目配置
      项目根目录下配置两个文件
      sonar-project.properties
      内容
    sonar.projectKey=第七步中的标识
    sonar.projectName=项目名
    sonar.projectVersion=1.0//版本号
    sonar.language=objc // 语言,swift 就写swift
    
    sonar.objectivec.project=项目.xcodeproj
    sonar.objectivec.workspace=项目.xcodeproj/project.xcworkspace
    
    sonar.objectivec.appScheme=项目Scheme
    sonar.objectivec.testScheme=项目testScheme
    sonar.objectivec.simulator=platform=iOS Simulator,name=iPhone 8,OS=latest
    
    //  扫描的路径可以是. 或者项目下的某个文件夹,如:A/class
    sonar.sources=
    ## 排除的路径,使用正则匹配
    sonar.objectivec.excludedPathsFromCoverage=*Resources
    
    sonar.objectivec.oclint.report=oclint.xml
    
    sonar.host.url=http://172.26.6.247:9000
    sonar.login=admin
    sonar.password=admin
    
    # 这是我自定义的,用来排除sonar.sources里面的我不想扫描的文件
    sonar.objectivec.excludePath=-e Common -e 3rdPartys 
    
    

    run-sonar.sh

    从下面拿就好:
    https://github.com/Backelite/sonar-swift/blob/develop/objclang/src/main/shell/run-sonar.sh

    如果要用我自定义的sonar.objectivec.excludePath
    run-sonar.sh 修改如下:
    增加内容

    # Read coverage type
    coverageType=''; readParameter coverageType 'sonar.objectivec.coverageType'
    
    // 增加的是下面这句
    excludePath=''; readParameter excludePath 'sonar.objectivec.excludePath'
    

    第二处把excludePath加到runCommand no oclint-json-compilation-database -v $includedCommandLineFlags后面

    1. 安装圈复杂度扫描插件(如果不用这个指标可不装)
      mac系统自带python,但我要用pip命令需要升级,所以重新下载python
      下载地址

    2. 统一搞下环境变量
      配置如下:

    打开终端

    open -e ./.bash_profile

    export JAVA_HOME=/Library/Java/JavaVirtualMachines/⁨jdk1.8.0_191.jdk/Contents/Home
    PATH=$JAVA_HOME/bin:$PATH
    
    export MYSQL=/usr/local/mysql
    PATH=$MYSQL/bin:$PATH
    
    export SONAR_HOME=/usr/local/sonarqube-7.3
    PATH=$SONAR_HOME/bin:$PATH
    
    export SONAR_SCANNER_HOME=/usr/local/sonar-scanner-4.0.0.1744-macosx
    PATH=$SONAR_SCANNER_HOME/bin:$PATH
    
    export SONAR_RUNNER_HOME=/usr/local/sonar-runner-2.4
    PATH=$SONAR_RUNNER_HOME/bin:$PATH
    
    export OCLINT=/usr/local/Cellar/oclint/0.13
    PATH=$OCLINT/bin:$PATH
    
    export PYTHON=/Library/Frameworks/Python.framework/Versions/3.7
    PATH=$PYTHON/bin:$PATH
    
    
    alias python="/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7"
    
    export PATH
    

    alias python这句是为了设置新python为默认

    1. 安装lizard
      https://github.com/terryyin/lizard

    2. 配置jenkins
      配好git或svn后
      增加shell,内容如下

    #!/bin/bash -il
    # cd ...... 找到run-sonar.sh 文件目录
    sh run-sonar.sh
    
    1. 执行构建

    三、问题说明

    • 部分字符串不认
      shell增加:export LC_ALL="en_US.UTF-8"

    • xcpretty 或者 oclint commond not fund
      ERROR - oclint is not installed or not in your PATH
      xcpretty: command not found

    这是jenkins环境不同导致
    修改shell如下:

    #!/bin/bash -il
       
    # 加载环境变量
    source /Users/xxx/.bash_profile
    export LC_ALL="en_US.UTF-8"
    cd OneETripiOS
    sh run-sonar.sh
    

    如果还有没找到的,说明你的环境变量还没配全:找到对应的插件目录
    如:/usr/local

    open -e ./.bash_profile

    增加环境变量配置:

    export USRLOCAL=/usr/local
    PATH=$USRLOCAL/bin:$PATH
    

    使用以下命令生效

    source ~/.bash_profile

    • ERROR: The rule 'OCLint:compiler warning' does not exist.

    找到run-sonar.sh 增加如下配置-extra-arg=-Wno-everything
    配置后如下

     runCommand no oclint-json-compilation-database -v $includedCommandLineFlags $excludePath -- -extra-arg=-Wno-everything -rc LONG_LINE=$longLineThreshold -max-priority-1 $maxPriority -max-priority-2 $maxPriority -max-priority-3 $maxPriority  -report-type pmd -o sonar-reports/$(echo $word | sed 's/\//_/g')-oclint.xml
    
    • ERROR: Caused by: Can not add the same measure twice on
      查看sonar-project.properties中的source配置是否写对

    • you must install a plugin that supports the language 'objectivec'
      这是sonar-project.properties语言写错了,不是objectivec是objc

    • UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 0: ordinal not in range(128)
      export LC_ALL="en_US.UTF-8"

    查看效果:


    4C795AA587D853A32530FF7BFDE3A70E.png

    最后做了个sonarqube的自启动脚本

    sonar.sh

    #!/bin/bash
    
    cd /usr/local/sonarqube-7.3/bin/macosx-universal-64
    
    sh sonar.sh start
    

    右键文件修改为终端打开,并修改权限读写


    26ACCE7FA88ACE90028B10EC63E48141.png

    然后加入执行


    9219E79F34B9E700E1C0B1C268B00888.png

    打完收工!

    相关文章

      网友评论

        本文标题:iOS+Jenkins持续构建-Sonarqube

        本文链接:https://www.haomeiwen.com/subject/qdpgyctx.html