一、什么是SonarQube
SonarQube® 是一种自动代码审查工具,用于检测代码中的错误、漏洞和代码异味。 它可以与您现有的工作流程集成,以实现跨项目分支和拉取请求的持续代码检查。 SonarQube 是一个用于代码质量管理的开源平台,用于管理源代码的质量。
二、使用背景
为什么使用它?那必须是因为搬砖工作需要。因有一些代码需要审计,那自动化必须走起。
三、踩坑与问题解决
考虑快速试用,我在官网上下载了它的社区版,并在我的电脑(Windows)平台上跑,它的软件包相当简洁。
“很好,我现在就想炸死驾驶运行它!”
虽然……但是……
Unrecognized option: --add-exports=java.base/jdk.internal.ref=ALL-UNNAMED
出错了,jdk版本错误,经查,我的JAVA_HOME
给了Java 8,这不够高大上啊……
那就让17
上吧。
正当我满怀希望的时候,突然发现……还是出错。
于是,我狠狠地查看sonarqube.log
日志记录,然而仅仅时提示ElasticSearch
出错,它不干了,于是我又查看了es.log
,找到了它罢工的原因:
org.elasticsearch.http.BindHttpException: Failed to bind to 127.0.0.1:9001
at org.elasticsearch.http.AbstractHttpServerTransport.bindAddress(AbstractHttpServerTransport.java:227) ~[elasticsearch-8.16.3.jar:?]
at org.elasticsearch.http.AbstractHttpServerTransport.bindServer(AbstractHttpServerTransport.java:194) ~[elasticsearch-8.16.3.jar:?]
at org.elasticsearch.http.netty4.Netty4HttpServerTransport.doStart(Netty4HttpServerTransport.java:231) ~[?:?]
at org.elasticsearch.common.component.AbstractLifecycleComponent.start(AbstractLifecycleComponent.java:51) ~[elasticsearch-8.16.3.jar:?]
at org.elasticsearch.node.Node.start(Node.java:426) ~[elasticsearch-8.16.3.jar:?]
at org.elasticsearch.bootstrap.Elasticsearch.start(Elasticsearch.java:445) ~[elasticsearch-8.16.3.jar:?]
at org.elasticsearch.bootstrap.Elasticsearch.initPhase3(Elasticsearch.java:255) ~[elasticsearch-8.16.3.jar:?]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:75) ~[elasticsearch-8.16.3.jar:?]
Caused by: java.net.BindException: Address already in use: bind
at sun.nio.ch.Net.bind0(Native Method) ~[?:?]
at sun.nio.ch.Net.bind(Net.java:555) ~[?:?]
at sun.nio.ch.ServerSocketChannelImpl.netBind(ServerSocketChannelImpl.java:337) ~[?:?]
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:294) ~[?:?]
at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:141) ~[?:?]
at io.netty.channel.AbstractChannel A b s t r a c t U n s a f e . b i n d ( A b s t r a c t C h a n n e l . j a v a : 561 ) [ ? : ? ] a t i o . n e t t y . c h a n n e l . D e f a u l t C h a n n e l P i p e l i n e AbstractUnsafe.bind(AbstractChannel.java:561) ~[?:?] at io.netty.channel.DefaultChannelPipeline AbstractUnsafe.bind(AbstractChannel.java:561) [?:?]atio.netty.channel.DefaultChannelPipelineHeadContext.bind(DefaultChannelPipeline.java:1281) ~[?:?]
at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:600) ~[?:?]
at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:579) ~[?:?]
at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:922) ~[?:?]
at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:259) ~[?:?]
at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:380) ~[?:?]
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:173) ~[?:?]
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:166) ~[?:?]
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472) ~[?:?]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569) ~[?:?]
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) ~[?:?]
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[?:?]
at java.lang.Thread.run(Thread.java:833) ~[?:?]
9001端口被绑了?于是我默念输入了如下咒语命令:
netstat -ano | findstr :9001
9001端口被15572号进程占用了……马上查查究竟是谁,是谁啊?
tasklist | findstr 15572
原来是Python,那么我有两个选择,一是关掉这个Python
(我正在打开Jupyter notebook
,它侦听了端口9000),二是给es
改个端口。
其中,es
端口可以通过SonarQube
conf文件夹sonar.properties
属性文件修改,如下图:
然而,我选择了先退出Python
O(∩_∩)O,然后起来了。
运行起来了,默认用户名admin,默认密码admin,登录后需要重置密码。
嗯,今天就先写到这里了,后续再慢慢体验。