sonar 插件和 gradle 引入

2021-09-26  本文已影响0人  Ad大成

在项目的gradle 中

buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.2'
        classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.1" //sonar插件
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
plugins {
    id "org.sonarqube" version "3.1"
}
apply from: "sonar.gradle"
// 引入公共配置
apply from: "config.gradle"

config 文件

ext {
    sdkVersion = [
            compileSdk: 28,
            buildTools: "28.0.0",
            minSdk    : 25,
            targetSdk : 28
    ]

    supportLib = [
            "appcompat"       : "androidx.appcompat:appcompat:1.2.0",
            "constraint"      : "androidx.constraintlayout:constraintlayout:2.0.4",
            "asynclayout"     : "androidx.asynclayoutinflater:asynclayoutinflater:1.0.0"
    ]

    wtLib = [
            "wt-widget"     : "com.autopai.support:widget:R30-1.0.0.zn", // 公共控件
            "wt-statistic"  : "com.openos.sdk:statistic:1.0.0.+", // 埋点
            "wt-virtual-car": "com.openos.sdk:virtualcar-sdk:0.0.2-SNAPSHOT" ,// 虚拟车,末尾加-SNAPSHOT,每次都拉取最新版本
            "wt-theme"      : "com.autopai.support:skin:2.0.1.+" // 主题切换
    ]

    testLib = [
            "junit": "junit:junit:4.13.1"
    ]

    androidTestLib = [
            "test-core"    : 'androidx.test:core:1.3.0',
            "test-runner"  : 'androidx.test.ext:junit:1.1.2',
            "test-rules"   : 'androidx.test:rules:1.3.0',
            "espresso-core": 'androidx.test.espresso:espresso-core:3.3.0'
    ]
}

在app的 gradle 中 可以引入config文件的数组

dependencies {
    implementation 'com.openos.sdk:virtualcar-sdk:0.0.2-SNAPSHOT'
    testImplementation testLib["junit"]
    androidTestImplementation androidTestLib["test-runner"]
    androidTestImplementation androidTestLib["espresso-core"]
}

sonar.gradle

import groovy.json.JsonSlurper

/**
 * 更新日期 2021-03-16-18-20-26
 * 请注意todo注释的地方
 */
ext {
    sonar = [
            //sonarqube 服务器地址
            host       : "http://10.1.120.7:9001",
            // todo 这里写上sonar后台自己生成的token
            username   : "e2f2ed6dec45d7a985072f4502857a1bb8da7a61",
            // 密码请保持为空即可,不可删除
            passwd     : "",
            projectkey : APK_PACKAGE_NAME + "_${getBranch()}",
            projectName: APK_PACKAGE_NAME + "_${getBranch()}(${getGitName()})"
    ]
}
//启动远程服务器一个sonar任务
sonarqube {
    properties {
        property "sonar.host.url", sonar.host
        property "sonar.verbose", "true"
        property "sonar.login", sonar.username
//        property "sonar.password", sonar.passwd
        property "sonar.sourceEncoding", "UTF-8"
        property "sonar.projectKey", sonar.projectkey
        property "sonar.projectName", sonar.projectName
        property "sonar.exclusions", "**/*Test.java"
        property "sonar.core.codeCoveragePlugin","jacoco"
        //覆盖报告绝对路径 需要保证路径下有生成的报告report.html
        property "sonar.coverage.jacoco.xmlReportPaths","${project.projectDir}/core/build/reports/coverage/debug/report.xml"
    }
}

subprojects {
    sonarqube {
        //todo 如果项目有渠道,请手动指定打开下面注释,设置对应的渠道(注意:如果渠道是s311ica,则下面需要写上s311icaDebug),如果没有渠道则不用做任何操作
//         androidVariant 'dev_Debug'
        println("flavor=" + name)
        properties {
            //这里sources,binaries默认会去找对应渠道,不需去指定,否则会出现多渠道分析干扰的情况
        }
    }
}

//查询sonar分析工程是否通过
task queryStatus() {
    try {
        //先创建出了一个URL对象,urlPath:是我们访问接口地址
        String urlPath = sonar.host + "/api/qualitygates/project_status?projectKey=" + sonar.projectkey
        URL url = new URL(urlPath);
        //URL链接对象,通过URL对象打开一个connection链接对像
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        //设置urlConnection对象链接超时
        urlConnection.setConnectTimeout(5000);
        //设置urlConnection对象获取数据超时
        urlConnection.setReadTimeout(5000);
        //设置本次urlConnection请求方式
        urlConnection.setRequestMethod("GET");
        // 认证登陆
        String base64Credentials = new String(Base64.encoder.encode((sonar.username + ":" + sonar.passwd).getBytes("UTF-8")));
        urlConnection.setRequestProperty("Authorization", "Basic " + base64Credentials);
        //调用urlConnection的链接方法,线程等待,等待的是服务器所给我们返回的结果集
        urlConnection.connect();
        //获取本次网络请求的状态码
        int code = urlConnection.getResponseCode();
        //如果本次返回的状态吗是200(成功)
        println("http code:" + code)
        if (code == 200) {
            //调用urlConnection.getInputStream得到本次请求所返回的结果流
            InputStream inputStream = urlConnection.getInputStream();
            //创建一个BufferedReader,去读取结果流
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            String readLine;
            StringBuffer buffer = new StringBuffer();
            while ((readLine = reader.readLine()) != null) {
                buffer.append(readLine);
            }
            //读取完结果流之后所得到的结果
            String result = buffer.toString();
            inputStream.close();
            def parsedJson = new JsonSlurper().parseText(result)
            println(sonar.projectkey + " ---> status:" + parsedJson.projectStatus.status)
        }
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

//需要有git环境
def static getBranch() {
    String cmd = "git rev-parse --abbrev-ref HEAD"
    return cmd.execute().text.trim().toString()
}
//需要有git环境
def static getGitName() {
    String cmd = "git config user.email"
    return cmd.execute().text.trim().toString()
}
上一篇 下一篇

猜你喜欢

热点阅读