概述

系统环境与软件版本

  • docker 19.03.6
  • docker image: postgres:12
  • docker image: sonarqube:8.1-community
  • docker image: gitlab/gitlab-ce:latest 实际版本(12.8.1)
  • docker image: gitlab/gitlab-runner:latest 实际版本(12.8.0)
  • docker image: sonarsource/sonar-scanner-cli:latest

不涉及具体理论,关于各个组件详细理论可以查看官方文档。

实现目标:gitlab中项目的master分支每次合并和提交都会自动运行sonar-scanner检测代码。

实现原理:通过安装启用gitlab-runner,配置项目ci/cd触发指定操作,使sonar-scanner扫描代码到sonarqube server完成代码检测分析操作。

以下所有组件通过docker进行安装:

  • postgres
  • sonarqube
  • gitlab
  • gitlab-runner

准备工作

默认bridge网络内的容器无法解析对方容器的host,通过新建一个docker网络,可以简单解决此问题。在创建目录时,有些容器可能内部需要普通用户运行,注意目录权限问题。

  1. # 创建docker network
  2. docker network create project1_net
  3. # 创建各容器所需目录
  4. mkdir -p /data/docker-volume
  5. cd /data/docker-volume
  6. mkdir postgres
  7. mkdir -p sonarqube/{data,extensions,logs}
  8. mkdir -p gitlab/{config,logs,data}
  9. mkdir -p gitlab-runner/config
  10. # sonarqube内部用户uid/gid,否则启动会出现权限问题。容器镜像版本不同可能有差异,具体可看官方文档或docker run --rm -it sonarqube:[TAG] bash进入容器查看所使用目录的属主属组
  11. chown -R 999.999 sonarqube

postgres

启动postgres,并为sonarqube创建一个数据库。sonarqube数据库需要使用字符编码为UTF8,postgres默认创建的则为UTF8,如果你的版本不是,那在创建时需要特别指定。

Note:postgres在本地进行访问时,不需要密码验证,从远端主机访问则是需要的。

  1. # 启动postgres容器
  2. docker run -d --name postgres --net=project1_net \
  3. -e POSTGRES_PASSWORD=pgpasswd \
  4. -v /data/docker-volume/postgres:/var/lib/postgresql/data \
  5. postgres:12
  6. # 创建sonarqube数据库
  7. docker exec -it postgres psql -U postgres
  8. > create database sonarqube;
  9. > \l # 列出所有数据库
  10. > \q # 退出

sonarqube

创建sonarqube容器,指定使用postgresql数据库,且指定连接至postgres的账号和密码。

sonarqube容器启动时,若出现无法连接数据库问题,则很大程度上是连接到数据库的网络或账号问题,先确认sonarqube容器所在的网络能否连接到postgres这个名称的主机,再确认postgres中是否有sonarqube数据库。

若出现文件权限问题,则按照准备工作章节中的操作确认一遍。

  1. # 启动sonarqube容器
  2. docker run -d --name sonarqube --net=project1_net \
  3. -p 9000:9000 \
  4. -e SONAR_JDBC_URL=jdbc:postgresql://postgres/sonarqube \
  5. -e SONAR_JDBC_USERNAME=postgres \
  6. -e SONAR_JDBC_PASSWORD=pgpasswd \
  7. -v /data/docker-volume/sonarqube/data:/opt/sonarqube/data \
  8. -v /data/docker-volume/sonarqube/extensions:/opt/sonarqube/extensions \
  9. -v /data/docker-volume/sonarqube/logs:/opt/sonarqube/logs \
  10. sonarqube:8.1-community

gitlab

gitlab镜像比较大,其中包含了postgres,redis,nginx,gitlab等多个组件,启动、初始化配置等时间也比较长,具体根据机器配置,耐心等待观察日志启动完成即可访问。

  1. docker run -d --name gitlab --net=project1_net \
  2. --hostname gitlab \
  3. -p 443:443 -p 80:80 -p 2222:22 \
  4. --restart always \
  5. --volume /data/docker-volume/gitlab/config:/etc/gitlab \
  6. --volume /data/docker-volume/gitlab/logs:/var/log/gitlab \
  7. --volume /data/docker-volume/gitlab/data:/var/opt/gitlab \
  8. gitlab/gitlab-ce:latest

gitlab-runner

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

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

参考链接-Gitlab持续集成的各种方式选择参考

参考链接-在Gitlab使用Docker持续集成的方式

Gitlab-runner容器

现在开始创建gitlab-runner容器。

  1. # 启动gitlab-runner容器
  2. docker run -d --name gitlab-runner --net=project1_net \
  3. --restart always \
  4. -v /data/docker-volume/gitlab-runner/config:/etc/gitlab-runner \
  5. -v /var/run/docker.sock:/var/run/docker.sock \
  6. gitlab/gitlab-runner:latest

注册Gitlab-runner

注册gitlab-runner。Admin Area -> Overview -> Runners

  1. docker exec -it gitlab-runner gitlab-runner register -n \
  2. --url GITLAB-REGISTER-URL \
  3. --registration-token GITLAB-REGISTER-TOKEN \
  4. --executor docker \
  5. --description "Docker Runner" \
  6. --docker-image "sonarsource/sonar-scanner-cli:latest" \
  7. --docker-volumes /var/run/docker.sock:/var/run/docker.sock

Sonarqube gitlab integration

使用gitlab进行认证

配置gitlab OAuth

登录Gitlab,地址为Docker宿主机80端口。默认账号为root,密码为初次打开页面时设置的密码。

登录后,如果没有需求,建议先将Continuous Integration and Deployment Auto DevOps关闭。

Admin Area -> Settings -> CI/CD -> Expand -> Default to Auto DevOps pipeline for all projects选项去掉并记得保存

中文语言设置点击个人头像下拉框、Settings、Preferences、Localization。

下面开始设置Gitlab OAuth:

Admin Area -> Applications -> New Application

Name:字面意思

Redirect URI:回调地址。HTTP://SONAR_ADDRES + /oauth2/callback/gitlab;如果版本不同或许可能存在差异,具体可以看官方文档。

Scopes:仅启用委托认证勾选read_user,需要组同步则同时勾选api。

其他选项根据需求勾选。

提交后保存Application IDSecret

配置sonarqube ALM Integrations

sonarqube地址为docker宿主机地址+9000端口,默认账号密码为admin。

首先在通用设置中配置好Server base URL,此地址必须和Gitlab Redirect URI(回调地址)的协议+主机域名(或IP)是一致的,或者先在这里配置好之后再去配置或修改Gitlab Redirect URI。

配置 -> 通用配置 -> 通用

Server base URL:sonarqube的公共访问地址。

配置ALM Integrations

配置 -> 通用配置 -> ALM Integrations -> Gitlab

Enabled:启用。

GitLab URL:Gitlab地址。

Application ID:在Gitlab applications中创建的application id。

Secret:在Gitlab applications中创建的application Secret。

其他选项根据需求勾选。

确认无误后退出账号,点击登录后则会看到使用gitlab登录。

创建sonarqube project

语言包和语言分析规则

安装本地化语言包如以下同样步骤,在应用市场中搜索chinese

分析语言首先需要安装一个分析语言规则插件。

配置 -> 应用市场(marketplace)-> 搜索项目用到的主要语言并安装

基于网络原因,可能会需要一定时间。安装完如果无法启动,可能是下载的插件包不完整,可以手动下载将插件包放到/data/docker-volume/sonarqube/extensions/plugins目录下重启docker容器即可。

手动下载地址:sonarplugins

创建分析项目

在sonarqube web界面中点击新建项目,输入项目标识(例如:myproject)和显示名称(例如:myproject),创建一个TOKEN、输入TOKEN名称(例如:myproject)后点击创建会生成TOKEN串、保存TOKEN串。

然后配置gitlab-ci。

Gitlab-ci

通过以上配置之后则在Gitlab中能够看到已经有一个注册的Runner。

现在新创建一个项目,创建完成后在Project overview、Details页面中,可以看到有一个CI/CD configuretion选项,点击按钮添加.gitlab-ci.yml文件配置内容:

  1. image:
  2. name: sonarsource/sonar-scanner-cli:latest
  3. entrypoint: [""]
  4. variables:
  5. SONAR_TOKEN: "6d119e3e0798302753b652e06d52d2356ee9001d" # 在sonarqube中创建项目时生成的TOKEN
  6. SONAR_HOST_URL: "http://172.16.0.12:9000"
  7. GIT_DEPTH: 0
  8. sonarqube-check:
  9. stage: test
  10. script:
  11. - sonar-scanner -X -Dsonar.qualitygate.wait=true -Dsonar.projectKey=myproject # sonarqube中项目的标识
  12. allow_failure: true
  13. only: # 仅检测master合并请求和master分支代码提交,sonarqube-ce版本只支持分析master分支
  14. - merge_requests
  15. - master

之后提交代码至master,在gitlab的项目详情界面、CI/CD选项、Jobs中可以看到以前和现在的任务。

点击任务的Status列中任务状态的passedfailed可以看到任务运行情况以及输出的信息或错误,从而进行调整。

任务运行详情:

任务运行完成之后,则可以在sonarqube中看到代码检测情况:

如果代码有问题,则可以点击项目进行详细查看,进而改正不规范的地方或修复错误。

可能出现的问题

gitlab-ci任务运行详情中出现错误

  1. ERROR: Error during SonarQube Scanner execution
  2. QUALITY GATE STATUS: FAILED - View details on http://xxxx/dashboard?id=myproject

正常错误。代表检测的代码有问题,具体查看sonarqube中的分析报告,然后修改代码,如果代码修改的符合了检测规范、则提交之后会显示检测通过(Passed)。

sonar-scanner-cli无法连接到sonarqube

  • 出现类似Caused by: java.net.SocketTimeoutException: connect timed out错误

sonar-scanner-cli无法连接到sonarqube主机或服务,检查服务是否正常、是否有防火墙、等。

  • 出现类似Caused by: java.net.UnknownHostException: sonar.ioops.net: Name or service not known错误

sonar-scanner-cli无法无法解析配置的sonarqube的域名地址。可以在gitlab-runner中注册runner时指定--dokcer-dns,此dns需要能够解析sonarqube域名。

  1. docker exec -it gitlab-runner gitlab-runner register -n \
  2. --url GITLAB-REGISTER-URL \
  3. --registration-token GITLAB-REGISTER-TOKEN \
  4. --executor docker \
  5. --description "Docker Runner" \
  6. --docker-image "sonarsource/sonar-scanner-cli:latest" \
  7. --dokcer-dns 172.16.0.253 \
  8. --docker-volumes /var/run/docker.sock:/var/run/docker.sock
  • 出现类似No route to host(Host unreachable)问题

参考链接页面中搜索跳转至#Networking标题,其中有关于Network的相关说明。

参考链接-Docker Executor

如果以上帮助不能解决你的问题:

  1. 尝试在gitlab项目中修改.gitlab-ci.yml文件中sonarqube服务的连接地址为sonarqube容器地址(默认为自动分配的容器地址),即可测试出网络问题。

  2. 尝试在gitlab-runen注册时使用--docker-network-mode等参数指定网络。

  3. 尝试将gitlab-runner部署到其他Docker主机然后注册(配置sonar-scanner-cli),连接当前主机通过nginx代理暴露或通过docker -p参数暴露的sonarqube服务。

缺少语言分析插件

  • 出现类似Caused by: java.lang.ClassNotFoundException: org.sonarsource.analyzer.commons.RuleMetadataLoader错误

下载的语言分析插件包不完整,删除重新下载或前往sonarplugins手动下载。

/data/docker-volume/sonarqube/extensions/plugins为插件目录,删除目录内对应的插件重启docker容器即可。

  • 缺少语言分析插件
  1. Unable to load component class org.sonar.scanner.report.MetadataPublisher

该段错误最后已经告知了原因:No quality profiles have been found, you probably don't have any language plugin installed.

安装你要分析的语言插件即可。

由于编码引起的问题

  1. ERROR: Caused by: File [...] can't be indexed twice. Please check that inclusion/exclusion patterns produce disjoint sets for main and test files

此问题可能是由于编码引起。

参数sonar.sourceEncoding:

Encoding of the source files. Ex: UTF-8, MacRoman, Shift_JIS. This property can be replaced by the standard property project.build.sourceEncoding in Maven projects. The list of available encodings depends on your JVM.

默认使用系统编码。

可以在gitlab-ci配置文件中sonar-scanner选项处添加-Dsonar.sourceEncoding=UTF-8,使检测时使用指定编码。

如果指定编码无效,那需要编译sonar-scanner-cli镜像,制作新的容器镜像:

  1. FROM sonarsource/sonar-scanner-cli:latest
  2. ENV LANG C.UTF-8

编译Dockerfile。

  1. docker build -t ioops/sonar-scanner-cli .

接着在gitlab-runner容器中取消之前注册的runner。鉴于我们只注册了一个runner,直接--all-runners参数取消所有注册的runner。

然后重新注册runners注册Gitlab-runner注意注册的时候记得把image改为刚才编译的镜像(ioops/sonar-scanner-cli)

  1. docker exec -it gitlab-runner \
  2. gitlab-runner unregister \
  3. --all-runners

然后在gitlab项目中.gitlab-ci.yml配置文件中指定使用刚才编译的镜像

最后保存提交.gitlab-ci.yml则会解决此问题。

参考链接-参数配置

不想检测某些类型的文件

直接在sonarqube web页面 配置->通用配置->排除 中进行设置。

Gitlab与Sonarqube整合-代码提交自动检测的更多相关文章

  1. 自动检测GD库支持的图像类型

    以下代码通过自动检测GD库支持的图像类型 来写出移直性更好的PHP代码 <?php if(function_exists("imagegif")){ header(" ...

  2. Gitlab集成Sonarqube自动检测代码并发送报告给提交者

    使用gitlab-ci.sonarqube.sonar-scanner 实现如下功能 1.一旦提交代码就进行代码质量检测 2. 发送检测报告邮件给提交者 先来看下最终结果,邮件中有检测报告,具体bug ...

  3. 自动代码质量分析(GitLab+JenKins+SonarQube)

    自动代码质量分析(GitLab+JenKins+SonarQube) 1.需求场景 开发提交代码自动执行代码质量分析. 2.所需应用 GitLab,JenKins,SonarQube 3.架构图 4. ...

  4. 代码质量检测(SonarQube)整合中文版+阿里P3C

    代码质量检测(SonarQube)整合中文版+阿里P3C 简介 SonarQube是一种自动代码审查工具,用于检测代码中的错误,漏洞和代码异味.它可以与您现有的工作流程集成,以便在项目分支和拉取请求之 ...

  5. Gitlab源码库里代码提交后,如何触发jenkins自动构建?

    版本库里代码提交后,如何触发jenkins自动构建?这是一个面试题,感觉自己回答的并不好,因为并没有用过这个功能,之前公司实际项目用的是svn版本管理,一般都用立刻构建,和定时任务构建(不管代码是否有 ...

  6. 再见Jenkins,从Gitlab代码提交到k8s服务持续交付只需七毛三(走过路过不要错过)

    Gitlab runner 快速搭建CICD pipeline 背景 日常开发中,相信大家已经做了很多的自动化运维环境,用的最多的想必就是利用Jenkins实现代码提交到自动化测试再到自动化打包,部署 ...

  7. devops持续集成,Centos7.6下gitlab+jenkins(pipeline)实现代码自动上线

    持续集成 gitlab+jenkins(pipeline)实现代码自动上线 环境准备:Centos7.6版本ip:192.168.0.13 主机名:gitip:192.168.0.23 主机名:jen ...

  8. 试试使用 eolinker 扫描 GitLab 代码注释自动生成 API 文档?

    前言: 一般写完代码之后,还要将各类参数注解写入API文档,方便后续进行对接和测试,这个过程通常都很麻烦,如果有工具可以读取代码注释直接生成API文档的话,那会十分方便. 此前一直都是在使用eolin ...

  9. [ci] 构建触发器,实现当gitlab有push动作时候,jenkins自动拉代码.

    构建触发器,实现当gitlab有push动作时候,jenkins自动拉代码. 拉取gitlab代码库: jenkins安装git插件 配置gitlab服务器和jenkins服务器身份互信 jenkin ...

随机推荐

  1. spark提交命令 spark-submit 的参数 executor-memory、executor-cores、num-executors、spark.default.parallelism分析

    转载:https://blog.csdn.net/zimiao552147572/article/details/96482120 nohup spark-submit --master yarn - ...

  2. Workflow任务流发布不了

    依赖的工作流要发布

  3. c语言实现n!算法

    最近一面学习数据结构,一面在做些c语言的题目.这个题目前些天碰到,和同学讨论了下.于是就用c语言实现n!(n=10000) 1 #include<stdio.h> 2 #define MA ...

  4. java随机数的产生

    两种产生随机数的方法: 1.通过import java.util.Random来实现 2.Math.random() 一.第一种的话就是导入Random之后,先生成一个Random对象r,之后再利用r ...

  5. R - 0 or 1(最短路)

    Given a n*n matrix C ij (1<=i,j<=n),We want to find a n*n matrix X ij (1<=i,j<=n),which ...

  6. Leetcode(3)-无重复字符的最长子串

    给定一个字符串,找出不含有重复字符的最长子串的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. 给定 &q ...

  7. 018-019 NET5_内置容器支持依赖注入+IServiceCollection的生命周期

    概念: DI依赖注入: IServiceCollection仅支持构造函数注入 什么是依赖注入? 如果对象A依赖对象B,对象B依赖对象C,就可以先构造对象C,然后传递给对象B,再把对象B传递给A.得到 ...

  8. DNS & HTTPS bug

    DNS & HTTPS bug SSL protocol version bug https://typescript-4.x-tutorials.xgqfrms.xyz/ errors Th ...

  9. Prettier All In One

    Prettier All In One .prettierrc.js / .prettierrc / .prettierrc.json module.exports = { singleQuote: ...

  10. html5 & iOS

    html5 & iOS Apple App Store审核指南 https://developer.apple.com/app-store/review/guidelines/ Apple审核 ...