0819Sonar预习贴

Sonar实战

sonarqube部署

临时性部署

docker run -d --name sonarqube \
-p 9000:9000 -p 9092:9092 \
sonarqube

8.x以上的版本部署

docker run -d \
    --privileged=true \
    --name sonarqube_postgres \
    -e POSTGRES_USER=sonarqube \
    -e POSTGRES_PASSWORD=sonarqube \
    -e PGDATA=/var/lib/postgresql/data/pgdata \
    -v $PWD/postgresql:/var/lib/postgresql/data \
    postgres

mkdir sonarqube_data sonarqube_extensions sonarqube_logs

#mac无需执行以下命令,linux需执行
chown -R 999:999 sonarqube_data sonarqube_extensions sonarqube_logs

#docker启动sonarqube
docker run -d  --name sonarqube_hogwarts -p 9000:9000 -p 9092:9092 --link sonarqube_postgres:db \
     -e SONARQUBE_JDBC_USERNAME=sonarqube -e SONARQUBE_JDBC_PASSWORD=sonarqube \
    -e SONARQUBE_JDBC_URL="jdbc:postgresql://db/sonarqube" \
    -v $PWD/sonarqube_data:/opt/sonarqube/data \
    -v $PWD/sonarqube_extensions:/opt/sonarqube/extensions \
    -v $PWD/sonarqube_logs:/opt/sonarqube/logs \
sonarqube

访问 http://127.0.0.1:9000
用户名:admin 密码:admin

演练项目

git clone https://github.com/SonarSource/sonar-scanning-examples.git
cd sonar-scanning-examples

sonar-scanner

#login为生成的token

#js项目
sonar-scanner  \
  -Dsonar.host.url=http://127.0.0.1:9000 \
  -Dsonar.login=你sonar生成的token值

#maven项目
mvn clean verify sonar:sonar  \
  -Dsonar.host.url=http://127.0.0.1:9000 \
  -Dsonar.login=你sonar生成的token值

小坑

使用sonar-scanner的时候,会因为以下插件导致扫描失败
AEM Rules for SonarQube插件不支持jdk1.8

我启动容器的时候 本地端口5432被占用我改成了6432

docker run \
-d \
--name sonarqube_postgres \
-p 6432:5432 \
-e POSTGRES_USER=sonarqube \
-e POSTGRES_PASSWORD=sonarqube \
-e PGDATA=/var/lib/postgresql/data/pgdata \
-v $PWD/postgresql:/var/lib/postgresql/data \
postgres:12

启动sonarqube

docker run -d --name sonarqube_boe -p 9000:9000 -p 9092:9092 --link sonarqube_postgres:db \
-e SONARQUBE_JDBC_USERNAME=sonarqube \
-e SONARQUBE_JDBC_PASSWORD=sonarqube \
-e SONARQUBE_JDBC_URL="jdbc:postgresql://db:6432/sonarqube" \
-v $PWD/sonarqube_data:/opt/sonarqube/data \
-v $PWD/sonarqube_extensions:/opt/sonarqube/extensions \
-v $PWD/sonarqube_logs:/opt/sonarqube/logs \
sonarqube:latest

但是检查sonarqube_boe 容器的日志里 数据库起来失败了,不清楚是为什么,信助能帮我分析下吗 错误如下

2020.08.18 03:51:31 INFO  web[][o.a.t.u.n.NioSelectorPool] Using a shared selector for servlet write/read
2020.08.18 03:51:32 INFO  web[][o.e.p.PluginsService] no modules loaded
2020.08.18 03:51:32 INFO  web[][o.e.p.PluginsService] loaded plugin [org.elasticsearch.join.ParentJoinPlugin]
2020.08.18 03:51:32 INFO  web[][o.e.p.PluginsService] loaded plugin [org.elasticsearch.percolator.PercolatorPlugin]
2020.08.18 03:51:32 INFO  web[][o.e.p.PluginsService] loaded plugin [org.elasticsearch.transport.Netty4Plugin]
2020.08.18 03:51:33 INFO  web[][o.s.s.e.EsClientProvider] Connected to local Elasticsearch: [127.0.0.1:9001]
2020.08.18 03:51:33 INFO  web[][o.s.s.p.LogServerVersion] SonarQube Server / 8.4.1.35646 / 7267e37dda923d9336125657aa6d0878af14af53
2020.08.18 03:51:33 INFO  web[][o.sonar.db.Database] Create JDBC data source for jdbc:postgresql://db:6432/sonarqube
2020.08.18 03:51:33 ERROR web[][o.s.s.p.PlatformImpl] Web server startup failed
java.lang.IllegalStateException: Fail to connect to database
	at org.sonar.db.DefaultDatabase.start(DefaultDatabase.java:86)
	at org.sonar.core.platform.StartableCloseableSafeLifecyleStrategy.start(StartableCloseableSafeLifecyleStrategy.java:40)
	at org.picocontainer.injectors.AbstractInjectionFactory$LifecycleAdapter.start(AbstractInjectionFactory.java:84)
	at org.picocontainer.behaviors.AbstractBehavior.start(AbstractBehavior.java:169)
	at org.picocontainer.behaviors.Stored$RealComponentLifecycle.start(Stored.java:132)
	at org.picocontainer.behaviors.Stored.start(Stored.java:110)
	at org.picocontainer.DefaultPicoContainer.potentiallyStartAdapter(DefaultPicoContainer.java:1016)
	at org.picocontainer.DefaultPicoContainer.startAdapters(DefaultPicoContainer.java:1009)
	at org.picocontainer.DefaultPicoContainer.start(DefaultPicoContainer.java:767)
	at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:136)
	at org.sonar.server.platform.platformlevel.PlatformLevel.start(PlatformLevel.java:90)
	at org.sonar.server.platform.platformlevel.PlatformLevel1.start(PlatformLevel1.java:166)
	at org.sonar.server.platform.PlatformImpl.start(PlatformImpl.java:213)
	at org.sonar.server.platform.PlatformImpl.startLevel1Container(PlatformImpl.java:172)
	at org.sonar.server.platform.PlatformImpl.init(PlatformImpl.java:86)
	at org.sonar.server.platform.web.PlatformServletContextListener.contextInitialized(PlatformServletContextListener.java:43)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4689)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5155)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1412)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1402)
	at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalStateException: Can not connect to database. Please check connectivity and settings (see the properties prefixed by 'sonar.jdbc.').
	at org.sonar.db.DefaultDatabase.checkConnection(DefaultDatabase.java:118)
	at org.sonar.db.DefaultDatabase.start(DefaultDatabase.java:83)
	... 24 common frames omitted
Caused by: java.sql.SQLException: Cannot create PoolableConnectionFactory (Connection to db:6432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.)
	at org.apache.commons.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:669)
	at org.apache.commons.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:544)
	at org.apache.commons.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:753)
	at org.sonar.db.profiling.NullConnectionInterceptor.getConnection(NullConnectionInterceptor.java:31)
	at org.sonar.db.profiling.ProfiledDataSource.getConnection(ProfiledDataSource.java:317)
	at org.sonar.db.DefaultDatabase.checkConnection(DefaultDatabase.java:115)

你首先看下你的sonarqube_postgres的日志

谢谢 看了postgres的日志发现没有新写日志,改用下面的命令重新起就起来了

-e S ONARQUBE_JDBC_URL="jdbc:postgresql://db/sonarqube"

想了想是自己理解有问题,想当然的加上了6432,这里还是应该用jdbc:postgresql://db/sonarqube,容器之间的连接,通信用的应该是容器内部的端口5432,是这么理解吧

这个SONARQUBE_JDBC_URL="jdbc:postgresql://db/sonarqube"是固定的一个写法。