使用Sonarqube和Gradle Detekt提高Android应用的代码质量
#编程 #android #codequality #mobile

iabaoqian0 in Programming°°2,2021年11月23日 - ¢5读


代码质量非常重要,您应该始终尝试优化实现。本文展示了可以合并的两种工具以实现更好的质量,尤其是在Android应用中。

1.简介

几周前,我找到了一个关于Sonarqube的不错的教程。因为我是提高代码质量或正在从事的项目质量的忠实拥护者,所以我自己创建了Sonarqube实例,并用它来检查和提高多个Android应用程序的代码质量。

下面的文章显示了一个方法,如果运行的Docker群存在(learn how to create one here)

,任何人都可以执行该方法。

我还为最终提供了用于本地开发的Dockerfile。

2.即将成为

什么是Sonarqube?

Sonarqube是Sonarsource开发的一个开源平台,用于连续检查代码质量,以通过对代码进行静态分析进行自动评论,以检测到20多种编程语言的错误,代码气味和安全漏洞。

2.1。安装

以下docker-compose.sq.yml可用于在Docker swarm中创建Sonarqube实例

version: "3.7"
services:
  sonarqube:
    image: sonarqube:latest
    depends_on:
      - db
    networks:
      - default
      - traefik-public
    environment:
      SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonarqube
      SONAR_JDBC_USERNAME: sonar
      SONAR_JDBC_PASSWORD: sonar
    volumes:
      - data:/opt/sonarqube/data
      - extensions:/opt/sonarqube/extensions
      - logs:/opt/sonarqube/logs
      - temp:/opt/sonarqube/temp
    restart: on-failure
    container_name: sonarqube
    deploy:
      placement:
        constraints:
          - node.labels.sonarqube == true
      labels:
        - traefik.enable=true
        - traefik.docker.network=traefik-public
        - traefik.constraint-label=traefik-public
        - traefik.http.routers.sonarqube-http.rule=Host(`sq.${PRIMARY_DOMAIN?Variable not set}`)
        - traefik.http.routers.sonarqube-http.entrypoints=http
        - traefik.http.routers.sonarqube-http.middlewares=https-redirect
        - traefik.http.routers.sonarqube-https.rule=Host(`sq.${PRIMARY_DOMAIN?Variable not set}`)
        - traefik.http.routers.sonarqube-https.entrypoints=https
        - traefik.http.routers.sonarqube-https.tls=true
        - traefik.http.routers.sonarqube-https.tls.certresolver=le
        - traefik.http.services.sonarqube.loadbalancer.server.port=9000
        - traefik.http.routers.sonarqube-https.middlewares=security-headers
  db:
    image: postgres
    networks:
      - default
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
      POSTGRES_DB: sonarqube
    volumes:
      - psql:/var/lib/postgresql
      - psql_data:/var/lib/postgresql/data
    restart: on-failure
    container_name: postgresql
    deploy:
      placement:
        constraints:
          - node.labels.sonarqube.db == true
networks:
  traefik-public:
    external: true
  default:
    external: false

volumes:
  data:
  extensions:
  logs:
  temp:
  psql:
  psql_data:

要启动sonarqube docker-compose中的二手环境变量。sq.yml必须出口:

export PRIMARY_DOMAIN=knulst.de

之后,可以部署堆栈

docker stack deploy -c docker-compose.sq.yml sonarqube

可以在https://sq.knulst.de中访问。

要运行Sonarqube,您需要使用以下命令增加内存限制。

sysctl -w vm.max_map_count=262144

(在Windows中,您必须启动WSL Shell: wsl.exe -d docker-desktop

2.2。配置

现在,您可以登录Web仪表板(默认用户/Pass = admin/admin )并开始配置过程。要在任何Android应用中使用此Sonarqube实例,都必须在https://sq.knulst.de的用户配置文件中创建登录令牌

的管理菜单中生成用户令牌
Generate a user token within the admin menu of SonarQube
在Sonarqube

创建此令牌后,必须调整三个文件:

  1. build.gradle(项目)
  2. build.gradle(app)
  3. gradle.properties

项目build.gradle中需要第一个添加。在根级别上添加很重要:

plugins {
    id "org.sonarqube" version "2.8"
}

其次,应该在app build.gradle中创建一个新块:

sonarqube {
    properties {
        def activeFlavor = "testFlavor1"
        def libraries = project.android.sdkDirectory.getPath() + "/platforms/android-28/android.jar"

        property "sonar.language", "kotlin"
        property "sonar.sources", "src/main/java, src/$activeFlavor/java"
        property "sonar.binaries", "build/intermediates/classes/$activeFlavor/debug"
        property "sonar.libraries", libraries
        property "sonar.java.libraries", libraries
        property "sonar.tests", "src/test/java, src/androidTest/java"
        property "sonar.log.level ", "DEBUG"
        property "sonar.java.test.binaries", "build/intermediates/classes/$activeFlavor/debug"
        property "sonar.java.test.libraries", libraries
        property "sonar.junit.reportsPath", "build/test-results/Debug"
        property "sonar.android.lint.report", "build/outputs/lint-results.xml"
    }
}

重要的是要知道该块是由具有多种口味的Kotlin编写的应用程序使用的。要使用此代码,必须调整activeFlavorsonar.sources

此外,还必须将另外两行插入到app build.gradle

1。将Sonarqube软件包添加到依赖项:

implementation "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.3"

2。应用Sonarqube插件:

apply plugin: 'org.sonarqube'

3。最后一步是将令牌,URL和项目名称添加到 gradle.properties 中:

# Sonarqube Login Token
systemProp.sonar.host.url=https://sq.knulst.de
systemProp.sonar.login=YOUR_TOKEN_HERE
systemProp.sonar.projectName=Android Test App
systemProp.sonar.projectKey=Android-Test-App

2.3。使用Sonarqube分析代码质量

执行先验解释的步骤后,可以在终端(或Android Studio)内进行分析:

gradle sonarqube

在Sonarqube网站的项目概述上,命令执行完成后应有一个项目概述:

之后,导致Sonarqube项目概述概述
Test results in SonarQube project overview after activating running gradle SonarQube function
测试在激活运行Gradle Sonarqube函数

3. Gradle Detekt

什么是detekt

detekt是Kotlin编程语言的静态代码分析工具。它在Kotlin编译器提供的抽象语法树上运行。

detekt 可以在任何基于Kotlin的Android应用中实现。它可以与自定义的一组规则一起使用以检查应用程序。启用detekt非常简单,可以分四个步骤完成:

1。将 detekt 添加到项目build.gradle

dependencies { 
    [...]
    classpath("io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.17.0")
}

2。创建一个具有定义的规则集的detekt.yml。下载示例文件here并将其存储在project_folder/detekt/detekt.yml

3。将 detekt 插件应用于app build.gradle

apply plugin: "io.gitlab.arturbosch.detekt"

4。添加 detekt 块到app **build.gradle**

detekt {
    toolVersion = "1.17.0"
    buildUponDefaultConfig = false
    allRules = false
    config = files("../detekt/detekt.yml")
    baseline = file("../detekt/baseline.xml")
    input = files("src/main/java/com")
    debug = false
    reports {
        html {
            enabled = true
            destination = file("build/reports/detekt.html")
        }
        xml {
            enabled = true
            destination = file("build/reports/detekt.xml")
        }
        txt.enabled = false
        sarif.enabled = false
    }

现在可以通过执行:
来生成detekt报告

gradle detekt

4.结合两个工具

启用这两个工具后,都可以将它们组合起来。为了实现这一目标,唯一要做的就是将以下代码行添加到Sonarqube块中:

sonarqube {
    properties {
            [...]
            property "sonar.kotlin.detekt.reportPaths", "build/reports/detekt.xml"
            }
}

现在可以通过执行:
在Sonarqube网站上创建信息性项目条目

gradle detekt
gradle sonarqube

完成两个命令后,该项目摘要可以在https://sq.knulst.de/projects上访问,并将显示所有发现的问题!

之后的扩展结果
Extended results after gradle detekt has been added to sonarqube function
将Gradle detekt添加到Sonarqube函数

此图显示了一个不良代码库的示例,如果与其他概述进行了比较,则显示了更多的代码气味,这些气味是由于Detekt报告而添加的。

5.关闭笔记

我希望您喜欢阅读本文,现在将使用这些工具来提高代码质量。请记住,具有高质量的软件可以更轻松地维护和增强!

对于本地开发,您可以使用this docker-composethese notes知道您必须更改什么。

本文最初发表在我的博客上的https://www.knulst.de/improving-code-quality-of-android-apps-with-sonarqube-and-gradle-detekt/

随时可以在my personal blogMediumLinkedInTwitterGitHub上与我联系。


您是否觉得这篇文章很有价值?想支持作者吗? (...并支持当前和未来教程的开发!)。您可以在Buy Me a CoffeeKo-Fi上赞助我。此外,您可以成为signing up to my website的免费或付费成员。请参阅contribute page,以获取所有(免费或付费)表示谢谢!

的方式!


Brett Jordan / Unsplash < / p>照片