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的用户配置文件中创建登录令牌
创建此令牌后,必须调整三个文件: 项目 其次,应该在app 重要的是要知道该块是由具有多种口味的Kotlin编写的应用程序使用的。要使用此代码,必须调整 此外,还必须将另外两行插入到app 1。将Sonarqube软件包添加到依赖项: 2。应用Sonarqube插件: 3。最后一步是将令牌,URL和项目名称添加到 执行先验解释的步骤后,可以在终端(或Android Studio)内进行分析: 在Sonarqube网站的项目概述上,命令执行完成后应有一个项目概述: 什么是 detekt是Kotlin编程语言的静态代码分析工具。它在Kotlin编译器提供的抽象语法树上运行。 detekt 可以在任何基于Kotlin的Android应用中实现。它可以与自定义的一组规则一起使用以检查应用程序。启用 1。将 detekt 添加到项目 2。创建一个具有定义的规则集的detekt.yml。下载示例文件here并将其存储在 3。将 detekt 插件应用于app 4。添加 detekt 块到app 现在可以通过执行: 启用这两个工具后,都可以将它们组合起来。为了实现这一目标,唯一要做的就是将以下代码行添加到Sonarqube块中: 现在可以通过执行: 完成两个命令后,该项目摘要可以在https://sq.knulst.de/projects上访问,并将显示所有发现的问题! 此图显示了一个不良代码库的示例,如果与其他概述进行了比较,则显示了更多的代码气味,这些气味是由于Detekt报告而添加的。 我希望您喜欢阅读本文,现在将使用这些工具来提高代码质量。请记住,具有高质量的软件可以更轻松地维护和增强! 对于本地开发,您可以使用this docker-compose和these notes知道您必须更改什么。 本文最初发表在我的博客上的https://www.knulst.de/improving-code-quality-of-android-apps-with-sonarqube-and-gradle-detekt/ 随时可以在my personal blog,Medium,LinkedIn,Twitter和GitHub上与我联系。 您是否觉得这篇文章很有价值?想支持作者吗? (...并支持当前和未来教程的开发!)。您可以在Buy Me a Coffee或Ko-Fi上赞助我。此外,您可以成为signing up to my website的免费或付费成员。请参阅contribute page,以获取所有(免费或付费)表示谢谢!
的管理菜单中生成用户令牌
build.gradle
(项目)build.gradle
(app)gradle.properties
build.gradle
中需要第一个添加。在根级别上添加很重要:
plugins {
id "org.sonarqube" version "2.8"
}
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"
}
}
activeFlavor
和sonar.sources
。build.gradle
:
implementation "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.3"
apply plugin: 'org.sonarqube'
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分析代码质量
gradle sonarqube
之后,导致Sonarqube项目概述概述
3. Gradle Detekt
detekt
?
detekt
非常简单,可以分四个步骤完成:build.gradle
dependencies {
[...]
classpath("io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.17.0")
}
project_folder/detekt/detekt.yml
build.gradle
apply plugin: "io.gitlab.arturbosch.detekt"
**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 {
properties {
[...]
property "sonar.kotlin.detekt.reportPaths", "build/reports/detekt.xml"
}
}
在Sonarqube网站上创建信息性项目条目
gradle detekt
gradle sonarqube
之后的扩展结果
5.关闭笔记
Brett Jordan / Unsplash < / p>照片