代码质量审查工具之SonarQube8.9(LTS)与gitlab CI集成使用
官网地址: https://docs.sonarqube.org/8.9/analysis/scan/sonarscanner/
目标:在push时自动触发GitLab CI/CD pipeline job, 自动扫描所提交的代码, 并将结果上报到sonarqube
SonarQube? - 是一个检测bug, 漏洞及代码异味的自动化工具. 它可以整合到现有的工作流中去启用持续的代码审查在项目的多分支及PR中.
为了方便,这里使用docker进行服务的安装
添加docker-compose.yml文件
version: "3" services: sonarqube: image: sonarqube:lts-community #8.9.2社区长期支持版 depends_on: - db environment: SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar SONAR_JDBC_USERNAME: sonar SONAR_JDBC_PASSWORD: sonar volumes: - sonarqube_data:/opt/sonarqube/data - sonarqube_extensions:/opt/sonarqube/extensions - sonarqube_logs:/opt/sonarqube/logs ports: - "9000:9000" #暴露端口9000 db: image: postgres:12 environment: POSTGRES_USER: sonar POSTGRES_PASSWORD: sonar volumes: - postgresql:/var/lib/postgresql - postgresql_data:/var/lib/postgresql/data volumes: sonarqube_data: sonarqube_extensions: sonarqube_logs: postgresql: postgresql_data:
安装完成之后,默认是9000端口, 当然有可能和现有的端口冲突,例如php-fpm, 解决方法就是修复docker-compose.yml中暴露在宿主机的端口, 然后如果使用域名的话, 使用nginx进行负载即可
登录时候, 默认的用户名和密码都是 admin
1.语言汉化
配置 > 应用市场 > 插件 中搜索Chinese
然后重启服务即可生效
2.修改管理员默认密码
我的账号 > 安全 > 修改密码
3.质量配置
这里可以自定义代码质量检查使用的规则有哪些
例如: 在这里创建一个前端代码检测, 前端js
语言选择JavaScript, 上级可以选无, 添加完成之后, 还可以点击"齿轮设置" 设为 默认
4.添加新项目
点击"项目" 点击"新增项目"
注意,项目标识是项目的唯一标识,也就是在我们项目代码扫描分析后数据上报时使用的key,显示名是在项目列表中显示出来的名称,仅做展示,一般两个保持一致即可。也可以在项目配置中修改标识。
输入完成点击“设置”后,将进入下一步,创建令牌。可以输入名称即可创建,也可以使用已有令牌,令牌可以多个项目用同一个,令牌就是身份认证信息,主要是用于代码扫描分析后树上报时使用认证。
[安装扫描器]
sonarScanner
在上一步中创建完令牌后, 及你如第二步, 分析项目, 根据提示下载对应平台的软件包, 对于js只能使用通用的scanner
选择对应版本
1)解压缩包
2) 修改配置文件
$install_directory/conf/sonar-scanner.properities 修改 根据实际情况进行修改 sonnar.host.url = http://localhost:9000 sonar.sourceEncoding=UTF-8
3)将sonar-scanner命令添加到全局变量中 $install_directory/bin
4) 验证命令是否可用 sonar-scanner -h
usage: sonar-scanner [options] Options: -D,--defineDefine property -h,--help Display help information -v,--version Display version information -X,--debug Produce execution debug output
接下来就可以进行代码扫描了
sonar-scanner -D"sonar.projectKey=docker-vue" -D"sonar.sources=." -D"sonar.host.url=http://sonar.xxx.com" -D"sonar.login=xxxxxxxxxxxxxxxxxxxxxx"
与gitlab进行集成, 在项目根目录下修改.gitlab-ci.yml文件
stages: - code-check # 添加代码检测job - install - build - deploy sonarqube-check: # 定义sonar代码检测 stage: code-check variables: # 定义变量 SONAR_PROJECT_KEY: "docker-vue" # 定义缓存key SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" # 声明分析任务缓存文件夹 GIT_DEPTH: "0" # 扫描所有代码 tags: - docker-vue - vue only: - master cache: key: "${CI_JOB_NAME}" paths: - .sonar/cache script: - sonar-scanner -D"sonar.projectKey=${SONAR_PROJECT_KEY}" -D"sonar.sources=." -D"sonar.host.url=${SONAR_HOST}" -D"sonar.login=${SONAR_LOGIN_TOKEN}" # 这里将隐秘信息 定义到项目变量或者项目变量中 allow_failure: true # 允许失败, 不影响整体部署流程 install: stage: install tags: - docker-vue - vue only: - test - master cache: paths: - node_modules/ script: - npm install build: stage: build tags: - docker-vue - vue only: - test - master cache: paths: - node_modules/ policy: pull script: - npm run lint - npm run build artifacts: name: 'bundle' paths: - dist/ delopy-test: stage: deploy tags: - docker-vue - vue only: - test script: - rm -rf /data/www/docker-vue-test/* - cp -rf dist/* /data/www/docker-vue-test delopy-prod: stage: deploy tags: - vue only: - master script: - rm -rf /data/www/docker-vue-prod/* - cp -rf dist/* /data/www/docker-vue-prod # when: manual
我这边使用的社区版本, 存在一个问题, 就是扫描的话只支持主分支, 其他分支不支持, 这里有其他提供的第三方支持,
因社区版是免费开源的,所以不提供扫描项目切换分支的功能,但适合真正生产环境的项目会具有多个分支,只能扫描主分支的SonarQube社区版显然很不满足你的需求,而开发者版和企业版支持但是需要大量的欧元。别担心,插件市场提供了一款可以切换分支的插件,sonarqube-community-branch-plugin,Let’s go!
中文插件地址https://github.com/mc1arke/sonarqube-community-branch-plugin 。
1.选择对应的版本下载
SonarQube:8.9.2对应的jar包:sonarqube-community-branch-plugin-1.8.1.jar。
2.下载完成放在目录 extensions/plugins 下
3. 需要同官网描述修改SonarQube的配置文件:sonar.properties。
进入conf文件夹,使用vim命令修改sonar.properties,在文件末尾加入两行:
sonar.web.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.8.1.jar=web sonar.ce.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.8.1.jar=ce
保存退出。
***若你的容器里没用vim命令,先尝试apt-get update + apt-get install vim两句命令,若还是不行可以看看有没有yum -y install vim命令,若都没有可以尝试先将容器内部文件拷出来,修改完再拷回去,参考命令如下:
docker cp sonarqube:/opt/sonarqube/conf/sonar.properties /opt/sonar.properties
docker cp /opt/sonar.properties sonarqube:/opt/sonarqube/conf/sonar.properties
重启SonarQube
常见问题:
1,启动docker容器的时候, 发现失败 查看报错日志发现
sonarqube、elasticsearch报virtual memory areas vm.max_map_count [65530] is too low
解决:
修改/etc/sysctl.conf文件
添加一下内容
vm.max_map_count=655360
执行命令生效:
sysctl -p
然后重启容器即可
2.我在gitlab-ci文件中使用到了群组变量和项目变量
出现群组变量取不到, 导致代码扫描失败的问题
这里的变量区分是否受保护
如果你的指定的分支或标签中 并不是受保护的, 就获取不到该变量 , 一定注意!!!
变量可以参考https://docs.sonarqube.org/8.9/analysis/analysis-parameters/
3.代码扫描失败, 是有文件中的git-depth定义为0 , 要保持一致
参考:
- https://www.panyanbin.com/article/f651276b.html
- https://www.jianshu.com/p/6f5c653489bc