史上最全gitea + drone + sonarqube 实现代码自动编译打包自动化代码质量检测
gitea + drone + sonarqube 实现代码自动编译打包自动化代码质量检测
gitea + drone + sonarqube 实现代码自动编译打包自动化代码质量检测
使用前提
- 安装好gitea、drone、sonarqube
- docker镜像下载 sonarsource/sonar-scanner-cli:11 版本根据需要(用来执行代码分析)
配置gitea 和 drone 通信
sonarqube客户端中创建你的第一个项目
-
创建项目,注意项目标识为唯一标识,后面编写drone时需要用到。

-
创建完项目后,创建令牌

-
你可以选择你使用的cicd工具继续完成下一步骤,我这里使用的是drone,官方没有给出,所以选择本地或者其他ci都可以生成令牌。

-
令牌创建完后要保存起来,退出后就无法显示(可以重新生成)在下一步编写drone中会用到
编写drone代码分析部分
- name: sonarqube 代码分析
image: sonarsource/sonar-scanner-cli:11
environment:
SONAR_HOST_URL: http://ip:9000
SONAR_TOKEN: sqp_e23e3aebf7bc0eb415f092eccb04dbe3849de3a5
commands:
- mkdir -p /tmp/.scannerwork
- chmod -R 777 /tmp/.scannerwork
- sonar-scanner -Dsonar.projectKey=lyg-test
-Dsonar.java.binaries=target
-Dsonar.working.directory=/tmp/.scannerwork
-Dsonar.scm.provider=git
-
解释
-
确保你的doker里有 sonarsource/sonar-scanner-cli 镜像
-
SONAR_HOST_URL 为你的sonarqube客户端地址
-
SONAR_TOKEN为你在客户端创建的项目的令牌
-
这里有些敏感信息可以配置到drone的密钥中,然后这里可以隐性的配置。

-
然后更改为
- name: sonarqube 代码分析 image: sonarsource/sonar-scanner-cli:11 environment: SONAR_HOST_URL: from_secret: sonar_host SONAR_TOKEN: from_secret: sonar_token
-
-
commands
-
默认 sonar-scanner-cli 的工作目录好像是在 /drone/src/.scannerwork 下,如果没有什么配置没有,大概率drone流水线日志里面会报没有该目录的错误。

- 我尝试了在命令里面加入创建该目录的命令,但是显示没有权限,加上sudo显示没有这个命令。后面放弃针扎,直接更改sonar-scanner-cli 的工作目录
- -Dsonar.working.directory=/tmp/.scannerwork 加上这行即能解决这个问题
-
sonar-scanner
-
该命令是代码能够检测并提交到sonarqube客户端的关键
-
-Dsonar.projectKey=lyg-test 即为上面sonarqube客户端创建项目你的项目的唯一标识
-
-Dsonar.java.binaries=target 表示你要扫描的路径
-
这里有个值得注意的点,就是sonarqube执行代码检测时,是根据编译后的文件进行扫描的。所以在执行代码扫描之前,你的drone流水线里面应该有代码编译的步骤。
-
否则会出现下面的问题

-
-
-Dsonar.scm.provider=git
-
这个很重要,这个配置是为了开启自动分配问题
-
或者可以在客户端的项目配置中配置

-
当然这是当你使用git时候才能生效,如果你使用的是svn需要下载插件,官网文档里面有对应的用法。
-
并且sonar.scm.disabled 该选项不能勾选,或者配置
-
scm的作用按我的理解就是 根据你代码里面提交的用户和scm用户进行匹配,匹配成功,sonarqube会自动分配该代码问题的作者。所以要向实现问题自动分配,你不光要开启该配置,而且在代码扫描之前,要在sonarqube里面创建和git用户相匹配的用户名或者邮箱。


-
如果不添加scm账号,那么该用户默认的scm账号即为用户的登录账号以及邮箱

-
这里的git用户不是指的gitea用户,而是本地git账号以及邮箱

-
提交之后也可以在sonarqube客户端查看该段代码的提交用户

-
确保sonarqube客户端能查看到代码的作者信息,并且保证这个邮箱或者用户在你创建的用户的scm账号中存在
-
理论上一个用户支持配置多个scm账号,即你可以配置多个git账号和你的sonarqube账号进行关联。比如说有个人有多个git账号,但是你想把扫描出来的问题给一个人处理,那么就可以给他sonarqube的账号配置多个scm用户。
- 但是相同的scm账号不能出现在不同的sonarqube账号中
-
-
-
-
提交drone文件并触发流水线
-
完成上面配置后,你就可以提交drone文件了,静静等待drone的触发以及流水线的执行。
-
如果没有问题那么就扫描完成了

-
打开sonarqube客户端即能看到扫描情况以及问题分配情况


-
那么恭喜你,实现了sonarqube的部署以及基本应用。
补充
-
完整drone.yml
kind: pipeline type: docker name: default steps: - name: 拉取所有tags image: alpine/git:1.0.0 commands: - git fetch --tags - git tag -d ${DRONE_TAG} - echo $(git describe --abbrev=0 --tags) > tag - git tag ${DRONE_TAG} when: event: tag - name: 生成更新日志 pull: if-not-exists image: tomasbjerre/git-changelog-command-line:2.0.0 commands: - V=$(cat tag) && echo $V && git-changelog-command-line -fre $V -std -of CHANGELOG.md -t template.mustache -tz GMT+8 when: event: tag - name: 恢复缓存 pull: if-not-exists image: drillster/drone-volume-cache:1.0.0 volumes: - name: cache path: /cache settings: restore: true mount: - ./src/.m2 - name: 编译正式版 image: drone-java8-maven-plugin:v1.0.0 pull: if-not-exists settings: goals: - clean - -DskipTests=true -Dmaven.repo.local=./src/.m2/repository -B -V package -P prod maven_mirror_url: http://xxxx:8081/repository/maven-public/ when: event: push - name: 重建缓存 pull: if-not-exists image: drillster/drone-volume-cache:1.0.0 volumes: - name: cache path: /cache settings: rebuild: true mount: - ./src/.m2 - name: sonarqube 代码分析 image: sonarsource/sonar-scanner-cli:11 environment: SONAR_HOST_URL: http://xxxx:9000 SONAR_TOKEN: sqp_e23e3aebf7bc0eb415f092eccb04dbe3849de3a5 commands: - mkdir -p /tmp/.scannerwork - chmod -R 777 /tmp/.scannerwork - sonar-scanner -Dsonar.projectKey=lyg-test -Dsonar.java.binaries=target -Dsonar.working.directory=/tmp/.scannerwork -Dsonar.scm.provider=git when: event: push # - name: 更新chart版本 # pull: if-not-exists # image: node:18-alpine # settings: # mirror: https://docker.mirrors.ustc.edu.cn # commands: # - node chart/update_version.js ${DRONE_TAG} # - cd chart && tar -czvf lyg-health-api.tgz lyg-health-api - name: 生成正式版docker镜像 pull: if-not-exists image: docker:dind volumes: - name: docker-sock path: /var/run/docker.sock commands: - ls - docker build -t "lyg-health-api:${DRONE_TAG}" . - docker save -o lyg-health-api-${DRONE_TAG}.tar "lyg-health-api:${DRONE_TAG}" when: event: tag - name: 发布release包和改动日志 image: plugins/gitea-release:1.0.0 settings: api_key: ba7582554ca70c26663e82a60150177928c631b5 base_url: http://xxx:3000 files: - target/*.jar - lyg-health-api-${DRONE_TAG}.tar - CHANGELOG.md note: CHANGELOG.md title: ${DRONE_TAG##v} when: event: tag trigger: event: - tag - push volumes: - name: docker-sock host: path: /var/run/docker.sock - name: cache host: path: /tmp/cache- 仅供参考,具体根据你自己部署的流程来写
后续
- 在完成部署后,你可以进一步实现更多功能,例如:
- 配置用户权限,创建用户组
- 配置代码质量规则、质量门禁等
- 结合sonarqube代码质量情况,来实现gitea的代码合并是否通过等
- sonarqube开放了很多 api,我们可以直接通过api来做到很多事情,后续的功能我也在继续探索。
- 欢迎指出不对的地方。gitea+drone的部署配置如有需要我会做出单独一期文章。
参考
更多推荐




所有评论(0)