Linux下使用SonarScanner扫描代码
前置条件
- 安装好sonarqube
- 安装好sonarqube
- 使用sonarqube并生成token(默认账号密码是admin/admin)
安装SonarScaner
-
下载安装包
wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.7.0.2747-linux.zip -
解压安装包
unzip sonar-scanner-cli-4.7.0.2747-linux.zip
mv sonar-scanner-4.7.0.2747-linux/ /usr/local/src/
移动到/usr/local/src目录 -
配置环境变量
编辑全局配置文件profile:vim /etc/profile
#配置sonar-scanner
export SONARRUNNER_HOME=/usr/local/src/sonar-scanner-4.7.0.2747-linux
export PATH=$SONARRUNNER_HOME/bin:$PATH保存并退出
使配置生效 source /etc/profile
-
编辑配置文件,添加配置信息
vim /usr/local/src/sonar-scanner-4.7.0.2747-linux/conf/sonar-scanner.properties
具体内容为sonar.host.url=http://47.97.161.134:9000 sonar.login=251691181f005452825220a64ba4dcd07df66ebc sonar.sourceEncoding=UTF-8
上面的 sonar.login获取方法为, 在sonarqube登陆后, 会自动弹出一个工程框, 输入一个名字后, 可以自动生成一个token
- 测试是否安装成功
sonar-scanner -h
拉取测试代码
-
创建工作空间
mkdir sonar-scanning-workspace
cd sonar-scanning-workspace/[root@iZbp1eq14sxovxncihmbb1Z sonar-scanning-workspace]# pwd
/root/sonar-scanning-workspace -
使用git拉取代码
git clone https://github.com/SonarSource/sonar-scanning-examples.git
使用sonar-scanner扫描代码
-
进入代码根目录下创建sonar-project.properties配置文件,并编辑
vim sonar-project.properties具体内容为
在项目根目录下创建sonar-project.properties配置文件 # must be unique in a given SonarQube instance sonar.projectKey=fjc_first_sonarscanner_job0130_key # this is the name displayed in the SonarQube UI sonar.projectName=fjc_first_sonarscanner_job sonar.projectVersion=1.0 sonar.java.binaries=/root/sonar-scanning-workspace/sonar-scanning-examples sonar.sources=/root/sonar-scanning-workspace/sonar-scanning-examples
然后在工程的根目录直接执行sonar-scanner就可以开始扫描,扫描完成后会将结果存入sonarqube平台
参考博客:https://blog.youkuaiyun.com/qq_19695883/article/details/116237431
致谢: 非常感谢博主的细致可用的博客,给了我很大帮助
注:sonar.java.binaries这个参数对应的文件夹只有编译后,才会生成,默认无此目录,也可以将此目录替换为扫描的路径即可!
扫描时候的相关日志,供参考,整个扫描时间较长.一共10min37秒,建议慢慢等待,并且在过程中,有时候日志打的很慢[root@iZbp1eq14sxovxncihmbb1Z sonar-scanning-examples]# sonar-scanner INFO: Scanner configuration file: /usr/local/src/sonar-scanner-4.7.0.2747-linux/conf/sonar-scanner.properties INFO: Project root configuration file: /root/sonar-scanning-workspace/sonar-scanning-examples/sonar-project.properties INFO: SonarScanner 4.7.0.2747 INFO: Java 11.0.14.1 Eclipse Adoptium (64-bit) INFO: Linux 3.10.0-1160.80.1.el7.x86_64 amd64 INFO: User cache: /root/.sonar/cache INFO: Scanner configuration file: /usr/local/src/sonar-scanner-4.7.0.2747-linux/conf/sonar-scanner.properties INFO: Project root configuration file: /root/sonar-scanning-workspace/sonar-scanning-examples/sonar-project.properties INFO: Analyzing on SonarQube server 7.4.0 INFO: Default locale: "en_US", source code encoding: "UTF-8" INFO: Publish mode INFO: Load global settings WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by com.google.protobuf.UnsafeUtil (file:/root/.sonar/cache/ca892554e2a573da03bc25145df14ef9/sonar-scanner-engine-shaded-7.4-all.jar) to field java.nio.Buffer.address WARNING: Please consider reporting this to the maintainers of com.google.protobuf.UnsafeUtil WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release INFO: Load global settings (done) | time=95ms INFO: Server id: BF41A1F2-AYYAva_8d7QxnXEV4dy9 INFO: User cache: /root/.sonar/cache INFO: Load/download plugins INFO: Load plugins index INFO: Load plugins index (done) | time=63ms INFO: Plugin [l10nzh] defines 'l10nen' as base plugin. This metadata can be removed from manifest of l10n plugins since version 5.2. INFO: Load/download plugins (done) | time=482934ms INFO: Loaded core extensions: INFO: Process project properties INFO: Load project repositories INFO: Load project repositories (done) | time=17ms INFO: Load quality profiles INFO: Load quality profiles (done) | time=34ms INFO: Load active rules INFO: Load active rules (done) | time=2359ms INFO: Load metrics repository INFO: Load metrics repository (done) | time=62ms INFO: Project key: fjc_first_sonarscanner_job0130_key INFO: Project base dir: /root/sonar-scanning-workspace/sonar-scanning-examples INFO: ------------- Scan fjc_first_sonarscanner_job INFO: Base dir: /root/sonar-scanning-workspace/sonar-scanning-examples INFO: Working dir: /root/sonar-scanning-workspace/sonar-scanning-examples/.scannerwork INFO: Source paths: . INFO: Source encoding: UTF-8, default locale: en_US INFO: Load server rules INFO: Load server rules (done) | time=2871ms INFO: Index files INFO: 140 files indexed INFO: Quality profile for cs: Sonar way INFO: Quality profile for flex: Sonar way INFO: Quality profile for java: Sonar way INFO: Quality profile for js: Sonar way INFO: Quality profile for kotlin: Sonar way INFO: Quality profile for php: Sonar way INFO: Quality profile for py: Sonar way INFO: Quality profile for xml: Sonar way INFO: Sensor JavaSquidSensor [java] INFO: Configured Java source version (sonar.java.source): none INFO: JavaClasspath initialization WARN: Bytecode of dependencies was not provided for analysis of source files, you might end up with less precise results. Bytecode can be provided using sonar.java.libraries property INFO: JavaClasspath initialization (done) | time=11ms INFO: JavaTestClasspath initialization INFO: JavaTestClasspath initialization (done) | time=0ms INFO: Java Main Files AST scan INFO: 32 source files to be analyzed INFO: Java Main Files AST scan (done) | time=2259ms INFO: Java Test Files AST scan INFO: 0 source files to be analyzed INFO: Java Test Files AST scan (done) | time=3ms INFO: Sensor JavaSquidSensor [java] (done) | time=2813ms INFO: Sensor Python Squid Sensor [python] INFO: 32/32 source files have been analyzed INFO: 0/0 source files have been analyzed WARN: Metric 'comment_lines_data' is deprecated. Provided value is ignored. INFO: Sensor Python Squid Sensor [python] (done) | time=388ms INFO: Sensor PythonXUnitSensor [python] INFO: Sensor PythonXUnitSensor [python] (done) | time=4ms INFO: Sensor JaCoCo XML Report Importer [jacoco] INFO: Sensor JaCoCo XML Report Importer [jacoco] (done) | time=5ms INFO: Sensor Kotlin Sensor [kotlin] INFO: 3 source files to be analyzed INFO: Sensor Kotlin Sensor [kotlin] (done) | time=595ms INFO: Sensor SonarJS [javascript] INFO: 3/3 source files have been analyzed INFO: 1 source files to be analyzed INFO: Sensor SonarJS [javascript] (done) | time=194ms INFO: Sensor ESLint-based SonarJS [javascript] INFO: 1/1 source files have been analyzed INFO: Using default Node.js executable: 'node'. ERROR: Failure during analysis, Node.js command to start eslint-bridge server was not built yet. org.sonarsource.nodejs.NodeCommandException: Error when starting the process: node -v at org.sonarsource.nodejs.NodeCommand.start(NodeCommand.java:75) at org.sonarsource.nodejs.NodeCommandBuilderImpl.getVersion(NodeCommandBuilderImpl.java:172) at org.sonarsource.nodejs.NodeCommandBuilderImpl.checkNodeCompatibility(NodeCommandBuilderImpl.java:145) at org.sonarsource.nodejs.NodeCommandBuilderImpl.build(NodeCommandBuilderImpl.java:121) at org.sonar.plugins.javascript.eslint.EslintBridgeServerImpl.startServer(EslintBridgeServerImpl.java:114) at org.sonar.plugins.javascript.eslint.EslintBasedRulesSensor.execute(EslintBasedRulesSensor.java:81) at org.sonar.scanner.sensor.SensorWrapper.analyse(SensorWrapper.java:45) at org.sonar.scanner.phases.SensorsExecutor.execute(SensorsExecutor.java:88) at org.sonar.scanner.phases.SensorsExecutor.execute(SensorsExecutor.java:62) at org.sonar.scanner.phases.AbstractPhaseExecutor.execute(AbstractPhaseExecutor.java:74) at org.sonar.scanner.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:164) at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:136) at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:122) at org.sonar.scanner.scan.ProjectScanContainer.scan(ProjectScanContainer.java:319) at org.sonar.scanner.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:314) at org.sonar.scanner.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:288) at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:136) at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:122) at org.sonar.scanner.task.ScanTask.execute(ScanTask.java:48) at org.sonar.scanner.task.TaskContainer.doAfterStart(TaskContainer.java:82) at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:136) at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:122) at org.sonar.scanner.bootstrap.GlobalContainer.executeTask(GlobalContainer.java:131) at org.sonar.batch.bootstrapper.Batch.doExecuteTask(Batch.java:116) at org.sonar.batch.bootstrapper.Batch.execute(Batch.java:71) at org.sonarsource.scanner.api.internal.batch.BatchIsolatedLauncher.execute(BatchIsolatedLauncher.java:46) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) at org.sonarsource.scanner.api.internal.IsolatedLauncherProxy.invoke(IsolatedLauncherProxy.java:60) at com.sun.proxy.$Proxy0.execute(Unknown Source) at org.sonarsource.scanner.api.EmbeddedScanner.doExecute(EmbeddedScanner.java:189) at org.sonarsource.scanner.api.EmbeddedScanner.execute(EmbeddedScanner.java:138) at org.sonarsource.scanner.cli.Main.execute(Main.java:112) at org.sonarsource.scanner.cli.Main.execute(Main.java:75) at org.sonarsource.scanner.cli.Main.main(Main.java:61) Caused by: java.io.IOException: Cannot run program "node": error=2, No such file or directory at java.base/java.lang.ProcessBuilder.start(Unknown Source) at java.base/java.lang.ProcessBuilder.start(Unknown Source) at org.sonarsource.nodejs.NodeCommand$ProcessWrapperImpl.start(NodeCommand.java:144) at org.sonarsource.nodejs.NodeCommand.start(NodeCommand.java:71) ... 36 common frames omitted Caused by: java.io.IOException: error=2, No such file or directory at java.base/java.lang.ProcessImpl.forkAndExec(Native Method) at java.base/java.lang.ProcessImpl.<init>(Unknown Source) at java.base/java.lang.ProcessImpl.start(Unknown Source) ... 40 common frames omitted INFO: Sensor ESLint-based SonarJS [javascript] (done) | time=1060ms INFO: Sensor C# Properties [csharp] WARN: Property missing: 'sonar.cs.analyzer.projectOutPaths'. No protobuf files will be loaded for this project. WARN: No roslyn issues report not found for this project. INFO: Sensor C# Properties [csharp] (done) | time=0ms INFO: Sensor SurefireSensor [java] INFO: parsing [/root/sonar-scanning-workspace/sonar-scanning-examples/target/surefire-reports] INFO: Sensor SurefireSensor [java] (done) | time=1ms INFO: Sensor JaCoCoSensor [java] INFO: Sensor JaCoCoSensor [java] (done) | time=1ms INFO: Sensor SonarJavaXmlFileSensor [java] INFO: 10 source files to be analyzed INFO: Sensor SonarJavaXmlFileSensor [java] (done) | time=798ms INFO: Sensor Flex [flex] INFO: 10/10 source files have been analyzed INFO: 2 source files to be analyzed INFO: Sensor Flex [flex] (done) | time=106ms INFO: Sensor Flex Cobertura [flex] INFO: No Cobertura report provided (see 'sonar.flex.cobertura.reportPath' property) INFO: Sensor Flex Cobertura [flex] (done) | time=0ms INFO: Sensor XML Sensor [xml] INFO: 2/2 source files have been analyzed INFO: Sensor XML Sensor [xml] (done) | time=284ms INFO: Sensor PHP sensor [php] INFO: 1 source files to be analyzed INFO: No PHPUnit test report provided (see 'sonar.php.tests.reportPath' property) INFO: 1/1 source files have been analyzed INFO: No PHPUnit coverage reports provided (see 'sonar.php.coverage.reportPaths' property) INFO: Sensor PHP sensor [php] (done) | time=554ms INFO: Sensor Analyzer for "php.ini" files [php] INFO: Sensor Analyzer for "php.ini" files [php] (done) | time=2ms INFO: Sensor C# [csharp] INFO: Sensor C# [csharp] (done) | time=0ms INFO: Sensor Zero Coverage Sensor INFO: Sensor Zero Coverage Sensor (done) | time=68ms INFO: Sensor Java CPD Block Indexer INFO: Sensor Java CPD Block Indexer (done) | time=40ms INFO: SCM provider for this project is: git INFO: 59 files to be analyzed INFO: 59/59 files analyzed INFO: 36 files had no CPD blocks INFO: Calculating CPD for 12 files INFO: CPD calculation finished INFO: Analysis report generated in 174ms, dir size=225 KB INFO: Analysis reports compressed in 126ms, zip size=149 KB INFO: Analysis report uploaded in 477ms INFO: ANALYSIS SUCCESSFUL, you can browse http://47.97.161.134:9000/dashboard?id=fjc_first_sonarscanner_job0130_key INFO: Note that you will be able to access the updated dashboard once the server has processed the submitted analysis report INFO: More about the report processing at http://47.97.161.134:9000/api/ce/task?id=AYYCFaPl0tw4jLTvaRuM INFO: Task total time: 16.198 s INFO: ------------------------------------------------------------------------ INFO: EXECUTION SUCCESS INFO: ------------------------------------------------------------------------ INFO: Total time: 10:37.190s INFO: Final Memory: 18M/64M INFO: ------------------------------------------------------------------------