一、环境信息
服务 | 版本号 |
---|---|
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】
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信息
记录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
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修改是否正确
4、创建sonar项目
登录sonar,创建项目
输入项目名字
创建访问令牌
然后可以看到sonar给的扫描java代码的参数
5、配置gitlab项目代码
在刚才创建好的gitlab项目中,创建【.gitlab-ci.yml】文件,必须叫这个名字
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代码文件
点击查看自动触发的任务
查看sonar检查结果
完成。
代码实例
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任务