Linux安装sonarQube

服务器系统:CentOS 7

服务器/home/azrlnx04/下创建三个文件夹,/java 、/mysql、 /sonar

安装sonarQube之前,需要先安装JDK和mysql

整体的步骤是:

  1. 安装JDK支持

  2. 安装mySQL数据库

  3. 安装SonarQube

 


一:安装JDK

(1)打开http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html      选择Linux x64 159.97 MB   jdk-8u112-linux-x64.rpm,下载至windows系统的下载目录

(2)将rpm文件通过WinSCP(远程复制文件工具)复制至/java文件夹

(3)使用命令为rpm文件加入权限

cd /home/azrlnx04/java/chmod 777 jdk-8u111-linux-x64.rpm

 

(4)使用命令安装rpm文件

sudo rpm -ivh jdk-8u111-linux-x64.rpm

 

(5)使用命令检查jdk

java -version

如果出现了版本号,则是成功的

[azrlnx04@azrlnx04 ~]$ java -version
java version "1.8.0_111"Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
[azrlnx04@azrlnx04 ~]$

 

(6)加入至环境变量中,虽然能够正常的使用命令,则还需要加入用户的环境变量中,参考文章http://www.cnblogs.com/samcn/archive/2011/03/16/1986248.html

因权限的问题,当前用户只有部分权限,所以使用第二种方法(操作和修改.bash_profile文件)这样可以将权限加入控制在用户级别

在用户的主目录,使用命令 vi .bash_profile可以打开文件,按下Insert键可以进行操作

修改前

export PATH

修改后

export PATH
export JAVA_HOME=/usr/bin/java
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=./$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

关于怎么得到jdk的地址,我们可以使用命令 whereis java即可以得到地址,修改文件后,按Esc键,加入命令:wq再回车,即可保存当前修改

 

(7)测试文件,用文本编辑器在windows下新建一个Test.java文件,输入以下代码并保存再复制至当前系统中

public class test { 
    public static void main(String args[]) { 
        System.out.println("A new jdk test !"); 
    } 
}

使用命令,如果系统能够打印出“A new jdk test !”这个文本则是成功的

javac test.java
java test

 


二:安装mysql

参考mysql官方文档 http://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html

(1)http://dev.mysql.com/downloads/repo/yum/ 下载 Red
Hat Enterprise Linux 7 / Oracle Linux 7 (Architecture Independent), RPM
Package(mysql57-community-release-el7-9.noarch.rpm) ,
rpm文档很小,也是下载至Windows系统本地目录

(2)将下载的mysql57-community-release-el7-9.noarch.rpm复制至/mysql中

(3)运行命令为文件加入权限

chmod 777 mysql57-community-release-el7-9.noarch.rpm

 

(4)运行安装文件

sudo yum localinstall mysql57-community-release-el7-9.noarch.rpm

服务器回应

View Code

 

(5)使用yum命令查看mysql,应该可以查看至很多关于mysql的包可供安装

yum repolist all | grep mysql

服务器回应

View Code

 

(6)安装mysql,我们这里安装的是mysql 5.7.16

sudo yum install mysql-community-server

服务器回应

View Code

 

(7)启动服务

sudo service mysqld start

服务器回应

[azrlnx04@azrlnx04 mysql]$ sudo service mysqld start
Redirecting to /bin/systemctl start  mysqld.service

 

(8)查看服务

sudo service mysqld status

服务器回应

View Code

 

(9)查看mysql默认口令

sudo grep 'temporary password' /var/log/mysqld.log

服务器回应,查看默认的口令就是 p2<yx2dd;jhO

[azrlnx04@azrlnx04 etc]$ sudo grep 'temporary password' /var/log/mysqld.log
[sudo] password for azrlnx04:2016-11-02T04:00:28.749910Z 1 [Note] A temporary password is generated for root@localhost: p2<yx2dd;jhO
[azrlnx04@azrlnx04 etc]$

 

(10)使用root尝试登陆mysql,使用默认的口令

mysql -u root -p

服务器回应

View Code

 

(11)修改口令

ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';

服务器回应,口令不符合需要,第二次修改成功

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Pro@#13';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql>
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';
Query OK, 0 rows affected (0.00 sec)

 

(12)使用命令查看所有DB

复制代码

mysql> show databases;+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+4 rows in set (0.00 sec)

复制代码

 

(13)其他可用的包

sudo yum --disablerepo=\* --enablerepo='mysql*-community*' list available

  服务器回应

View Code

 

(14)关于其他包的安装,需要等后续使用后才能确定

 


三:安装sonarQube

(0)登陆mysql运行脚本

[azrlnx04@azrlnx04 etc]$ mysql -uroot -p
Enter password:
mysql> CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci; 
mysql> CREATE USER 'sonar' IDENTIFIED BY 'sonar';
mysql> GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';
mysql> GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
mysql> FLUSH PRIVILEGES;

运行创建用户,一定要记得尝试使用新创建的用户登陆至mysql

服务器回应

View Code

 

至此,mysql会新建一个数据库sonar,以上的脚本会创建一个数据库及用户名sonar,并将用户sonar应用至sonar数据库

复制代码

mysql> show databases;+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sonar              |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

复制代码

 

(1)将下载好的sonarqube-6.1.zip和sonar-scanner-2.8.zip通过WinSCP复制至服务器/sonar/中,或者使用命令下载文件

wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-6.1.zipwget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-2.8.zip

 

(2)分别进入两个文件夹,对文件增加权限

chmod 777 sonarqube-6.1.zipchmod 777 sonar-scanner-2.8.zip

 服务器回应

View Code

 

(3)解压zip文件

(3.1)进入/sonar中,使用命令解压sonarqube-6.1.zip

unzip sonarqube-6.1.zip

 服务器回应太长,这里不给出了

 

(3.2)进入/sonar中,解压sonar-scanner-2.8.zip

unzip sonar-scanner-2.8.zip

服务器回应是很少的,因为压缩文件比较小

 

(4)进入至/sonar/sonarqube-6.1/conf中,使用vi命令打开sonar.properties

vi sonar.properties

并修改其中的三个节点,修改的方式只需要将行内容最前的#号删除即可

在这里特别提醒一下,原本在Windows系统中,是可以建立口令为sonar的sonar用户的,但在Linux中,其实,当在mysql中创建口令为sonar的用户时,会发生错误,但我并未在意,一直以为系统需要其他的配置

建议是,创建用户后, 使用用户登陆一下mysql看一下是否能够正常登陆,不然在运行sonar时,肯定不会成功,且你很难反应是mysql口令的原因。

sonar.jdbc.username=sonar.jdbc.password=sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance

 

(5)打开文件夹

[azrlnx04@azrlnx04 sonar]$ cd sonarqube-6.1/bin/linux-x86-64/[azrlnx04@azrlnx04 linux-x86-64]$ ls -l

服务器回应

复制代码

[azrlnx04@azrlnx04 sonar]$ cd sonarqube-6.1/bin/linux-x86-64/[azrlnx04@azrlnx04 linux-x86-64]$ ls -l
total 128drwxr-xr-x. 2 azrlnx04 azrlnx04     26 Dec  9  2010 lib-rwxr-xr-x. 1 azrlnx04 azrlnx04  15521 Oct 11 09:02 sonar.sh-rwxr-xr-x. 1 azrlnx04 azrlnx04 111027 Dec  9  2010 wrapper

复制代码

 

(6)运行命令,我们这里是使用启动服务,使用 sonar.sh start

sonar.sh start 启动服务
sonar.sh stop 停止服务
sonar.sh restart 重启服务

[azrlnx04@azrlnx04 linux-x86-64]$ sonar.sh start-bash: sonar.sh: command not found

当出现了命令无法找到的情况,需要将sonar的目录加入至环境变量

 

查看环境变量,并加入新的地址,参考地址:http://unix.stackexchange.com/questions/26047/how-to-correctly-add-a-path-to-path

[azrlnx04@azrlnx04 ~]$ $PATH-bash: /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/azrlnx04/.local/bin:/home/azrlnx04/bin: No such file or directory
[azrlnx04@azrlnx04 ~]$ PATH=$PATH:~/sonar/sonarqube-6.1/bin/linux-x86-64/

 

加入SONAR_HOME和SONAR_RUNNER_HOME两个变量,和处理jdk的路径一样,并将新加的变量都加入至变量PATH中(PATH变量是整个系统用户都可以用到),在当前用户的目录打开.bash_profile文件,将变量内容加入至文件中

复制代码

# .bash_profile

# Get the aliases and functionsif [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH
export JAVA_HOME=/usr/bin/java
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=./$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

复制代码

修改后,加入颜色部分即加入的内容

复制代码

# .bash_profile

# Get the aliases and functionsif [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH
export JAVA_HOME=/usr/bin/javaexport SONAR_HOME=~/sonar/sonarqube-6.1/bin/linux-x86-64/export SONAR_RUNNER_HOME=~/sonar/sonar-scanner-2.8/bin/export PATH=$JAVA_HOME/bin:$SONAR_HOME:$SONAR_RUNNER_HOME:$PATH
export CLASSPATH=./$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

复制代码

再次运行命令 sonar.sh start

服务器回应是非常简单的,告诉你SonarQube已经启动了

[azrlnx04@azrlnx04 ~]$ sonar.sh start
Starting SonarQube...
Started SonarQube.

 

与Windows不同,Windows命令窗口中会出现所有的信息,但Linux会将运行的信息都存放至sonar文件夹中的logs子文件夹,可以在其中查看sonar.log文件(有时文件太大,则会分成几个文件,文件名与日期对应),开始我一直以为不成功,其实后台有一部分的信息已经保存下来了

复制代码

2016.11.07 09:10:07 INFO  app[][o.s.a.AppFileSystem] Cleaning or creating temp directory /home/azrlnx04/sonar/sonarqube-6.1/temp2016.11.07 09:10:07 INFO  app[][o.s.p.m.JavaProcessLauncher] Launch process[es]: /usr/java/jdk1.8.0_111/jre/bin/java -Djava.awt.headless=true -Xmx1G -Xms256m -Xss256k -Djna.nosys=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -Djava.io.tmpdir=/home/azrlnx04/sonar/sonarqube-6.1/temp -javaagent:/usr/java/jdk1.8.0_111/jre/lib/management-agent.jar -cp ./lib/common/*:./lib/search/* org.sonar.search.SearchServer /home/azrlnx04/sonar/sonarqube-6.1/temp/sq-process4628608208409917744properties
2016.11.07 09:10:08 INFO   es[][o.s.p.ProcessEntryPoint]  Starting es
2016.11.07 09:10:08 INFO   es[][o.s.s.EsSettings]  Elasticsearch listening on /127.0.0.1:9001
2016.11.07 09:10:09 INFO   es[][o.elasticsearch.node]  [sonarqube] version[2.3.3], pid[30725], build[218bdf1/2016-05-17T15:40:04Z]
2016.11.07 09:10:09 INFO   es[][o.elasticsearch.node]  [sonarqube] initializing ...
2016.11.07 09:10:09 INFO   es[][o.e.plugins]  [sonarqube] modules [], plugins [], sites []
2016.11.07 09:10:09 INFO   es[][o.elasticsearch.env]  [sonarqube] using [1] data paths, mounts [[/ (rootfs)]], net usable_space [25.8gb], net total_space [29.9gb], spins? [unknown], types [rootfs]
2016.11.07 09:10:09 INFO   es[][o.elasticsearch.env]  [sonarqube] heap size [1007.3mb], compressed ordinary object pointers [true]
2016.11.07 09:10:09 WARN   es[][o.elasticsearch.env]  [sonarqube] max file descriptors [4096] for elasticsearch process likely too low, consider increasing to at least [65536]
2016.11.07 09:10:13 INFO   es[][o.elasticsearch.node]  [sonarqube] initialized
2016.11.07 09:10:13 INFO   es[][o.elasticsearch.node]  [sonarqube] starting ...
2016.11.07 09:10:13 INFO   es[][o.e.transport]  [sonarqube] publish_address {127.0.0.1:9001}, bound_addresses {127.0.0.1:9001}
2016.11.07 09:10:13 INFO   es[][o.e.discovery]  [sonarqube] sonarqube/VxJMhq7YTSe99uUNYRL81w
2016.11.07 09:10:16 INFO   es[][o.e.cluster.service]  [sonarqube] new_master {sonarqube}{VxJMhq7YTSe99uUNYRL81w}{127.0.0.1}{127.0.0.1:9001}{rack_id=sonarqube, master=true}, reason: zen-disco-join(elected_as_master, [0] joins received)
2016.11.07 09:10:16 INFO   es[][o.elasticsearch.node]  [sonarqube] started
2016.11.07 09:10:16 INFO   es[][o.e.gateway]  [sonarqube] recovered [5] indices into cluster_state
2016.11.07 09:10:19 INFO   es[][o.e.c.r.allocation]  [sonarqube] Cluster health status changed from [RED] to [GREEN] (reason: [shards started [[tests][0], [tests][0]] ...]).
2016.11.07 09:10:19 INFO  app[][o.s.p.m.Monitor] Process[es] is up
2016.11.07 09:10:19 INFO  app[][o.s.p.m.JavaProcessLauncher] Launch process[web]: /usr/java/jdk1.8.0_111/jre/bin/java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djruby.management.enabled=false -Djruby.compile.invokedynamic=false -Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError -Djava.io.tmpdir=/home/azrlnx04/sonar/sonarqube-6.1/temp -javaagent:/usr/java/jdk1.8.0_111/jre/lib/management-agent.jar -cp ./lib/common/*:./lib/server/*:/home/azrlnx04/sonar/sonarqube-6.1/lib/jdbc/mysql/mysql-connector-java-5.1.39.jar org.sonar.server.app.WebServer /home/azrlnx04/sonar/sonarqube-6.1/temp/sq-process8650920502670994045properties
2016.11.07 09:10:20 INFO  web[][o.s.p.ProcessEntryPoint] Starting web
2016.11.07 09:10:21 INFO  web[][o.s.s.a.TomcatContexts] Webapp directory: /home/azrlnx04/sonar/sonarqube-6.1/web
2016.11.07 09:10:21 INFO  web[][o.a.c.h.Http11NioProtocol] Initializing ProtocolHandler ["http-nio-127.0.0.1-9000"]
2016.11.07 09:10:21 INFO  web[][o.a.t.u.n.NioSelectorPool] Using a shared selector for servlet write/read
2016.11.07 09:10:22 INFO  web[][o.e.plugins] [Jennifer Kale] modules [], plugins [], sites []
2016.11.07 09:10:24 INFO  web[][o.s.s.e.EsClientProvider] Connected to local Elasticsearch: [127.0.0.1:9001]
2016.11.07 09:10:24 INFO  web[][o.s.s.p.LogServerVersion] SonarQube Server / 6.1 / dc148a71a1c184ccad588b66251980c994879dff
2016.11.07 09:10:24 INFO  web[][o.sonar.db.Database] Create JDBC data source for jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&autoReconnect=true&useSSL=false

复制代码

使用命令可以在本机打开网站

curl http://localhost:9000

只要能够看到网页的HTML代码,则是成功的,如果有查看我之前的文章,在Windows中安装sonar的话,此刻应该可以通过浏览器打开http://localhost:9000了,但Linux不同,即使内部能够访问,但还需要将防火墙中打开某个端口才可以在服务器外部进行访问

 

(7)配置firewalld

先使用root用户

View Code

先查看firewalld状态,使用系统查看,或是直接firewall-cmd 命令查看

[root@azrlnx04 ~]# systemctl status firewalld

[root@azrlnx04 ~]# firewall-cmd –state

FirewallD is not running

 

如未运行,则需要先让它运行,关于如何开始firewalld,参考:https://www.liquidweb.com/kb/how-to-start-and-enable-firewalld-on-centos-7/

关于详细的firewalld信息,参考:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html

[root@azrlnx04 ~]# systemctl start firewalld
[root@azrlnx04 ~]# firewall-cmd --state
running

 

另外关于增加端口的文章,参考:http://stackoverflow.com/questions/24729024/centos-7-open-firewall-port

[root@azrlnx04 ~]# firewall-cmd --zone=public --add-port=9000/tcp --permanent
success
[root@azrlnx04 ~]# firewall-cmd --zone=dmz --add-port=9000/tcp --permanent
success
[root@azrlnx04 ~]# firewall-cmd --reload
success

以上都没步骤(7)都有运行,但没有效果,运行步骤(8)才最终可用,现在还不能确定步骤(7)是否是多余的。

 

(8)如果配置的时候,查看现有的配置,当时sonarQube中设置的肯定只是监听到127.0.0.1的9000端口,而我们需要让它开放出来就可以

[root@azrlnx04 ~]# netstat -tpln | grep 9000tcp6       0      0 :::9000                 :::*                    LISTEN      38927/java

在sonarQube的配置文件(sonarQube6.1/conf/sonar.properties)中,节点

# Binding IP address. For servers with more than one IP address, this property specifies which
# address will be used for listening on the specified ports.
# By default, ports will be used on all IP addresses associated with the server.
sonar.web.host=127.0.0.1

修改为,意思为,之前监听的是127.0.0.1的端口,现在可以监听所有的

# Binding IP address. For servers with more than one IP address, this property specifies which
# address will be used for listening on the specified ports.
# By default, ports will be used on all IP addresses associated with the server.
sonar.web.host=*

最终才可用

 写在最后,至此,Linux服务器上的sonarQube Server端已经完整安装了,但关于Scan代码的问题上,有一个很关键的问题就是,无法在Linux服务器中Scan C#的源代码。

https://groups.google.com/forum/#!topic/sonarqube/Ep_BgEF2pR0

————————————————————————————————————————————————————————————————————

2017-01-19更新

今天看到关于C#/Java/JavaScript的插件有新版本可以更新,所以就想将最新的插件安装至sonarQube系统中,但却发现更新插件后重启服务器时等了很久都不见完成,并且在等待了20分钟后再次刷新,发现sonarQube的站点无法访问了,这可点方了,因为这个是正式环境的服务器,如果不能使用将带来很大的影响,方是方,但还得解决问题不是?

下图是我打开插件中心发现的更新插件,解决问题后我只更新了C#插件,另外两个都没有进行更新。出现问题的就是Java插件(4.4)

 

下图就是使用Chrome浏览器刷新后无法访问的图片

 我首先想到的是sonarQube出现了问题,其次是Linux防火墙出现了问题,

1.我先查看了sonarQube的日志

/sonarqube6.1/logs/sonar.log,出现问题时一般先查看该日志文件

尝试重启sonarQube服务器

复制代码

[azrlnx04@azrlnx04 linux-x86-64]$ sonar.sh start
Starting SonarQube...
Started SonarQube.
[azrlnx04@azrlnx04 linux-x86-64]$ sonar.sh stop
Stopping SonarQube...
SonarQube was not running.
[azrlnx04@azrlnx04 linux-x86-64]$ sonar.sh start
Starting SonarQube...
Started SonarQube.
[azrlnx04@azrlnx04 linux-x86-64]$ sonar.sh status
SonarQube is not running.
[azrlnx04@azrlnx04 linux-x86-64]$ sonar.sh start -uroot -p
Starting SonarQube...
Started SonarQube.
[azrlnx04@azrlnx04 linux-x86-64]$ curl http://localhost:9000curl: (7) Failed connect to localhost:9000; Connection refused

复制代码

看起来似乎服务可以起来,但是在Linux服务器上访问却不成功,这个时候我却以为sonarQube是没有问题的,继续想着查看是否是防火墙出现了问题

2.其次查看了Linux防火墙

[azrlnx04@azrlnx04 linux-x86-64]$ curl http://localhost:9000curl: (7) Failed connect to localhost:9000; Connection refused
[azrlnx04@azrlnx04 linux-x86-64]$ curl http://localhost:9000curl: (7) Failed connect to localhost:9000; Connection refused
[root@azrlnx04 ~]# netstat -tpln | grep 9000tcp6       0      0 :::9000                 :::*                    LISTEN      50177/java
[root@azrlnx04 ~]# curl http://localhost:9000

 在重启了sonarQube服务一会儿是在正常监听9000端口的,但过一会儿又不行了,这应该问题还是出现在sonarQube,查看日志

View Code

 问题出在其中的Java插件,原因可能是没有下载完成Java插件,导致解压失败,从而导致整个sonarQube启动失败。

尝试办法1:将Java插件先改名,再重新启动sonarQube

结果1:sonarQube还是认到原有下载未完成的Java插件,无法解决该问题

尝试办法2:将Java插件完全删除,再重新启动sonarQube

结果2:sonarQube没有插件还是无法启动sonarQube,启动几秒后服务还是会死掉

尝试办法3:从windows系统下载Java插件最新版本,并复制至Linux机器上,再重新启动sonarQube

未知结果3:因为在复制插件文件的过程中,老是会中断,导致文件复制老是失败,就放弃了该方法

尝试办法4:将原sonarQube文件改名,并将原sonarQube压缩包重新解压缩生成sonarQube文件夹,只是将原有的配置文件替换新的配置文件

结果4:因为新的sonarQube是使用原来的文件夹名称,原来已经进行过相应的配置,确实能够解决该问题,但不是最好的方法,个人认为比较好的方法就是使用办法3

结论:当插件更新时发生了错误,应该与Linux机器没有太大关系,需要的是及时查看日志文件,查看错误

Posted in 介绍及安装说明.