一、环境信息

Gitlab集成sonarQube,实现自动扫描代码(不包含代码覆盖率配置)_postgresql

服务 版本号
Docker 20.10
sonarQube 7.9.6
PostgreSQL 13
GitLab 13.5.7
GitLab-runner 13.2.4
注:

① 以上环境全部以docker安装在CentOS 7.9 系统上

② sonarQube 在 7.6 版本后不支持插件 `sonar-gitlab-plugin`,若使用 7.6 之后的版本,将无法实现 sonarQube 与 GitLab 协作(除非使用付费版)

③ sonarQube 7.9 版本之后不支持MySQL数据库

④ sonar-scanner是每次触发任务后,将自动拉起镜像运行,没有单独安装

最终效果:
开发人员提交代码到gitlab仓库后,触发master分支自动合并任务,并进行代码扫描(可改成其他测试分支),扫面结果返回到sonarqube平台。

二、安装服务

1、创建网桥

docker network create devops-tier

2、安装PostgreSQL

拉取镜像

docker pull postgres:13

创建映射目录

mkdir -p /dwz/docker-volume/postgresql
mkdir -p /dwz/docker-volume/postgres/data

创建容器被运行

docker run --name postgres13 -d -p 5432:5432 --net devops-tier \
-v /dwz/docker-volume/postgresql:/var/lib/postgresql \
-v /dwz/docker-volume/postgres/data:/var/lib/postgresql/data \
-v /etc/localtime:/etc/localtime:ro \
-e POSTGRES_USER=sonar \
-e POSTGRES_PASSWORD=sonar \
-e POSTGRES_DB=sonar \
-e TZ=Asia/Shanghai \
--restart always \
--privileged=true \
--network-alias postgres \
postgres:13
注:

 -v /etc/localtime:/etc/localtime:ro:设置容器与宿主机时间一致

-e POSTGRES_USER=sonar:设置数据库用户名

-e POSTGRES_PASSWORD=sonar:设置数据库密码

-e POSTGRES_DB=sonar:新建db

-e TZ=Asia/Shanghai:设置时区

--restart always:容器退出时总是重启

--privileged=true:挂载主机目录Docker访问出现Permission denied的解决办法

--net devops-tier:容器接入自定义网络

--network-alias mysql:给容器起个网络别名

3、安装sonarQube

拉取镜像

docker pull sonarqube:7.9-community

创建映射目录

mkdir -p /dwz/docker-volume/sonarqube

修改系统参数

echo "vm.max_map_count=262144" > /etc/sysctl.conf
sysctl -p

运行一个test容器

docker run -d --name sonartest sonarqube:7.9-community

将容器内重要文件复制到宿主机

docker cp sonartest:/opt/sonarqube/conf /dwz/docker-volume/sonarqube
docker cp sonartest:/opt/sonarqube/data /dwz/docker-volume/sonarqube
docker cp sonartest:/opt/sonarqube/logs /dwz/docker-volume/sonarqube
docker cp sonartest:/opt/sonarqube/extensions /dwz/docker-volume/sonarqube

然后删除此容器

docker rm  -f sonartest

修改文件夹权限

chmod -R 777 /dwz/docker-volume/sonarqube

创建容器并运行

docker run -d --name sonar -p 9000:9000 \
 -e ALLOW_EMPTY_PASSWORD=yes \
 -e SONARQUBE_DATABASE_USER=sonar \
 -e SONARQUBE_DATABASE_NAME=sonar \
 -e SONARQUBE_DATABASE_PASSWORD=sonar \
 -e SONARQUBE_JDBC_URL="jdbc:postgresql://postgres:5432/sonar" \
 --net devops-tier \
 --privileged=true \
 --restart always \
 -v /dwz/docker-volume/sonarqube/logs:/opt/sonarqube/logs \
 -v /dwz/docker-volume/sonarqube/conf:/opt/sonarqube/conf \
 -v /dwz/docker-volume/sonarqube/data:/opt/sonarqube/data \
 -v /dwz/docker-volume/sonarqube/extensions:/opt/sonarqube/extensions\
 sonarqube:7.9-community

若这种方式出现连不上数据库 postgres 的问题,可参照第二种方法

方法二

1)找到 /data/sonarqube/conf/ 路径下的文件 sonar.properties,修改如下并保存

# 找到如下配置去掉注释。并赋值 username,password
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar

# 去掉 sonar.jdbc.url 注释,配置url
#----- PostgreSQL 9.3 or greater
# By default the schema named "public" is used. It can be overridden with the parameter "currentSchema".
sonar.jdbc.url=jdbc:postgresql://postgres:5432/sonar

2)使用docker命令创建容器

docker run -d --name sonar -p 9000:9000 \
 --net devops-tier \
 --privileged=true \
 --restart always \
 -v /dwz/docker-volume/sonarqube/logs:/opt/sonarqube/logs \
 -v /dwz/docker-volume/sonarqube/conf:/opt/sonarqube/conf \
 -v /dwz/docker-volume/sonarqube/data:/opt/sonarqube/data \
 -v /dwz/docker-volume/sonarqube/extensions:/opt/sonarqube/extensions\
 sonarqube:7.9-community

浏览器输入:http://192.168.1.100:9000 ,用户名/密码:admin/admin

注:
192.168.1.100 是我的ip地址,以实际情况修改

4、安装GitLab

拉取镜像

docker pull gitlab/gitlab-ce:13.5.7-ce.0

创建映射目录

mkdir /dwz/docker-volume/gitlab/config -p
mkdir /dwz/docker-volume/gitlab/logs -p
mkdir /dwz/docker-volume/gitlab/data -p

创建容器并运行

docker run -d --name gitlab --net=devops-tier \
--hostname gitlab \
-p 443:443 -p 80:80 -p 2222:22 \
--restart always \
--volume /dwz/docker-volume/gitlab/config:/etc/gitlab \
--volume /dwz/docker-volume/gitlab/logs:/var/log/gitlab \
--volume /dwz/docker-volume/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:13.5.7-ce.0
注:出现502,稍等几分钟,再次刷新,将进入到设置root密码界面,不要点【Go back】

Gitlab集成sonarQube,实现自动扫描代码(不包含代码覆盖率配置)_docker_02

Gitlab集成sonarQube,实现自动扫描代码(不包含代码覆盖率配置)_java_03

5、安装gitlab-runner

gitlab-ci是gitlab的持续集成服务,gitlab-runner用于运行gitlab-ci的任务。

gitlab-runner支持很多种运行任务的方式(称为Executors),目前支持:SSH、Shell、Parallels、VirtualBox、Docker、Docker Machine(auto-scaling)、Kubernetes、Custom。本文选用Docker方式。

拉取镜像

docker pull gitlab/gitlab-runner:v13.2.4

创建容器映射目录

mkdir -p /dwz/docker-volume/gitlab-runner/config

创建容器并运行

docker run -d --name gitlab-runner --net=devops-tier \
--restart always \
-v /dwz/docker-volume/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:v13.2.4

三、配置服务

1、注册Gitlab-runner

登录gitlab查看runner信息

Gitlab集成sonarQube,实现自动扫描代码(不包含代码覆盖率配置)_java_04

记录runner的url和token添加到下面命令中

docker exec -it gitlab-runner gitlab-runner register -n \
--url http://192.168.1.100 \
--registration-token EemksZsiAn4Hr-Kyan_W \
--executor docker \
--description "Docker Runner" \
--docker-image "sonarsource/sonar-scanner-cli:latest" \
--docker-volumes /var/run/docker.sock:/var/run/docker.sock
Runtime platform                                    arch=amd64 os=linux pid=19 revision=264446b2 version=13.2.4
Running in system-mode.                            
                                                   
Registering runner... succeeded                     runner=EemksZsi
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded! 

返回这样即成功,再刷新gitlab页面查看多一个runner

Gitlab集成sonarQube,实现自动扫描代码(不包含代码覆盖率配置)_postgresql_05

2、修改gitlab url

vi /dwz/docker-volume/gitlab/config/gitlab.rb
顶部输入:
# 配置http协议所使用的访问地址,不加端口号默认为80
external_url 'http://192.168.1.100'

# 配置ssh协议所使用的访问地址和端口
gitlab_rails['gitlab_ssh_host'] = '192.168.1.100'

# 此端口是run时22端口映射的2222端口
gitlab_rails['gitlab_shell_ssh_port'] = 2222

3、创建gitlab项目

上一步重启完,需要重启服务

docker restart gitlab

创建项目,检查url修改是否正确

Gitlab集成sonarQube,实现自动扫描代码(不包含代码覆盖率配置)_java_06

4、创建sonar项目

登录sonar,创建项目

Gitlab集成sonarQube,实现自动扫描代码(不包含代码覆盖率配置)_postgresql_07

输入项目名字

Gitlab集成sonarQube,实现自动扫描代码(不包含代码覆盖率配置)_git_08

创建访问令牌

Gitlab集成sonarQube,实现自动扫描代码(不包含代码覆盖率配置)_docker_09

然后可以看到sonar给的扫描java代码的参数

Gitlab集成sonarQube,实现自动扫描代码(不包含代码覆盖率配置)_docker_10

5、配置gitlab项目代码

在刚才创建好的gitlab项目中,创建【.gitlab-ci.yml】文件,必须叫这个名字

Gitlab集成sonarQube,实现自动扫描代码(不包含代码覆盖率配置)_docker_11

image:
  name: sonarsource/sonar-scanner-cli:latest
  entrypoint: [""]
  
sonarqube-check:
  stage: test
  script:

    - sonar-scanner -X  -Dsonar.projectKey=gitlab-sanarqube -Dsonar.host.url=http://192.168.1.100:9000 -Dsonar.login=a3e7444d3ef866a6bfb002b9d9523d4c6e46b44f -Dsonar.login=admin -Dsonar.password=admin -Dsonar.language=java  -Dsonar.java.binaries=build/  -Dsonar.projectVersion=1.0 -Dsonar.sources=. 
  allow_failure: true
  only: # 仅检测master合并请求和master分支代码提交,sonarqube-ce版本只支持分析master分支
    - merge_requests
    - master
 # tags: #选择runner标签
 #   - docker 

注:
sonarsource/sonar-scanner-cli:latest  sonar-scanner是扫描插件镜像
-Dsonar.projectKey=gitlab-sanarqube   与sonnar项目名对应
-Dsonar.host.url=http://192.168.1.100:9000   sonar服务url
-Dsonar.login=a3e7444d3ef866a6bfb002b9d9523d4c6e46b44f   sonar服务创建的令牌
-Dsonar.language=java   扫描的开发语言
-Dsonar.java.binaries=build/    可以存放jar包的目录,不存在此参数将报错
-Dsonar.sources=.   扫描位置当面位置

创建一个目录:build,一个java代码文件

Gitlab集成sonarQube,实现自动扫描代码(不包含代码覆盖率配置)_maven_12

点击查看自动触发的任务

Gitlab集成sonarQube,实现自动扫描代码(不包含代码覆盖率配置)_git_13

查看sonar检查结果

Gitlab集成sonarQube,实现自动扫描代码(不包含代码覆盖率配置)_java_14

完成。



代码实例
Gitlab集成sonarQube,实现自动扫描代码(不包含代码覆盖率配置)_postgresql_15

pox.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.springframework</groupId>
    <artifactId>gs-maven</artifactId>
    <packaging>jar</packaging>
    <version>0.1.0</version>

    <!-- tag::joda[] -->
    <dependencies>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.2</version>
        </dependency>
    </dependencies>
    <!-- end::joda[] -->

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>hello.HelloWorld</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

		<plugin>
			<groupId>org.jacoco</groupId>
			<artifactId>jacoco-maven-plugin</artifactId>
			<version>0.7.8</version>
			<executions>
				<execution>
					<goals>
						<goal>prepare-agent</goal>
						<goal>report</goal>
					</goals>
				</execution>
			</executions>
		</plugin>

       <!-- <plugin>
        <groupId>com.google.cloud.tools</groupId>
        <artifactId>jib-maven-plugin</artifactId>
        <version>3.1.1</version>
        <configuration>
          <to>
            <image>myimage</image>
          </to>
        </configuration>
      </plugin> -->
        </plugins>
    </build>
</project>

Greeter.java

package hello;
public class Greeter {
public String sayHello() {
return "Hello world!";
}
}

HelloWorld.java

package hello;
public class HelloWorld {
public static void main(String[] args) {
Greeter greeter = new Greeter();


System.out.println(greeter.sayHello());
}
}

build是空目录

修改master分支即可触发CICD任务