gitea + drone + sonarqube 实现代码自动编译打包自动化代码质量检测

使用前提
  1. 安装好gitea、drone、sonarqube
  2. docker镜像下载 sonarsource/sonar-scanner-cli:11 版本根据需要(用来执行代码分析)
配置gitea 和 drone 通信
sonarqube客户端中创建你的第一个项目
  1. 创建项目,注意项目标识为唯一标识,后面编写drone时需要用到。

    在这里插入图片描述

  2. 创建完项目后,创建令牌

在这里插入图片描述

  • 你可以选择你使用的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的部署配置如有需要我会做出单独一期文章。
参考

sonarqube官方文档
sonarqube社区

Logo

一站式 AI 云服务平台

更多推荐