1 2 3 24-12-11 初始记录 24-12-12 完成SonarQube与插件的安装 24-12-16 maven 与 多模块项目
准备工作
SonarQube :选择适合项目的 SonarQube 版本。~Java8 适配的 SonarQube 版本最高为 7.8 ~。这里部署的是: docker 方式的 9.9 LTS 版本官方长期支持版本 。
GitLab:14.9.1 版本
1 2 # 可以通过以下命令查看 cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
docker:Docker version 20.10.17, build 100c701。官方推荐版本 20.10 以上。
Gitlab CI
SonarScanner/Maven + Java 11
SonarQube 安装
docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 version: "3" services: sonarqube: image: sonarqube:9.9-community 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 - sonarqube_conf:/opt/sonarqube/conf ports: - "9000:9000" db: image: postgres:15.3 environment: POSTGRES_USER: sonar POSTGRES_PASSWORD: sonar volumes: - postgresql:/var/lib/postgresql - postgresql_data:/var/lib/postgresql/data volumes: sonarqube_data: external: true sonarqube_extensions: external: true sonarqube_logs: external: true sonarqube_conf: external: true postgresql: postgresql_data:
docker-compose 命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # 前台启动, 启动项目中的所有服务。 docker-compose up # 后台启动, 启动所有服务并在后台运行。 docker-compose up -d # -f 指定使用的Compose模板文件,默认为docker-compose.yml,可以多次指定 docker-compose -f docker-compose.yml up -d # 列出项目中目前的所有容器 docker-compose ps # 停止所有服务。 docker-compose stop # 停止和删除容器、网络、卷、镜像。 docker-compose down # 删除已经在compose文件中定义的和匿名的附在容器上的数据卷 docker-compose down -v
SonarQube 插件安装
SonarQube 有两个插件:
下载 sonar-gitlab-plugin 对应 5.4 版本的 jar 包
下载 sonarqube-community-branch-plugin 对应 1.14.0 的 jar 包
上传 jar 包到挂载的 sonarqube_extensions
目录里面的 plugins
目录里面。上传到 JumpServer 可以在目录下输入:rz
;下载为 sz
修改挂载的 sonarqube_conf
目录路径下面的 sonar.properties
配置文件,添加如下配置
1 2 sonar.web.javaAdditionalOpts =-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.14.0.jar=web sonar.ce.javaAdditionalOpts =-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.14.0.jar=ce
重启 SonarQube
Gitlab CI 安装与注册
版本确认
安装与 Gitlab 一致的 Gitlab-Runner 版本。
1 2 3 4 5 6 wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-runner/yum/el7/gitlab-runner-14.9.0-1.x86_64.rpm --no-check-certificate sudo rpm -ivh gitlab-runner-14.9.0-1.x86_64.rpm # 查看是否安装成功 gitlab-runner -v
指定 gitlab-runner 用户为 root 用户
1 2 3 sudo gitlab-runner uninstall sudo gitlab-runner install --working-directory /home/zwadmin --user zwadmin
启动 gitlab 服务
1 2 3 4 5 6 7 systemctl daemon-reload /bin/systemctl start gitlab-runner /bin/systemctl enable gitlab-runner /bin/systemctl restart gitlab-runner
设置权限
1 chown -R zwadmin.zwadmin /home/gitlab-runner
注册服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 gitlab-runner register # 输入公司的gitlab公网地址 Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/): https://gitlab.wuidm.com/ # 输入gitlab的token Please enter the gitlab-ci token for this runner: # 输入描述这个runner名称 Please enter the gitlab-ci description for this runner: [k8s-node02]: test # 输入runner的标签 Please enter the gitlab-ci tags for this runner (comma separated): my-tag,another-tag Registering runner... succeeded runner=8sjydnrs # 输入runner执行器的环境 Please enter the executor: custom, docker-ssh, parallels, kubernetes, docker-ssh+machine, docker, shell, ssh, virtualbox, docker+machine: shell
SonarScanner 安装
多模块项目建议用 Maven,这部分可以不看
官网下载
上传服务器后,解压
配置环境变量
1 2 3 4 5 6 7 8 9 10 sudo vim /etc/profile # 添加以下语句 export SONARRUNNER_HOME=/home/zwadmin/soft/sonar-scanner/sonar-scanner-6.2.1.4610-linux-x64 export PATH=$SONARRUNNER_HOME/bin:$PATH sudo source /etc/profile # 查看是否安装成功 sonar-scanner -v
Maven 安装
Maven 更适配多模块项目
官网下载
上传服务器后,解压
配置环境变量
1 2 3 4 5 6 7 8 9 10 sudo vim /etc/profile # 添加以下语句 export M2_HOME=/opt/maven export PATH=$M2_HOME/bin:$PATH source /etc/profile # 查看是否安装成功 mvn -v
与 Gitlab 集成
登录 gitlab.com ,创建一个测试仓库,并在用户设置里面,创建一个个人访问令牌。
登录 SonarQube,在 project 管理里面即可通过这个个人访问令牌来导入 gitlab 上面的项目
导入后,选择以 gitlab ci 的方式来执行 ci 流程前提 gitlab ci 开启
根据提示,完成所有步骤。
在项目中创建 sonar-project.properties
, 并粘贴提示内的内容。多分支指定分支需要下载 sonarqube-community-branch-plugin 插件。额外添加 sonar.branch.name=XXX
在 gitlab 的设置, CI/CD 设置里面,添加环境变量
在项目里面创建一个 .gitlab-ci.yml
文件,并按照提示贴入最小化配置内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 sonarqube-check: tags: - test variables: SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" GIT_DEPTH: "0" cache: key: "${CI_JOB_NAME}" paths: - .sonar/cache script: - sonar-scanner allow_failure: true only: - master
在 SonarQube 的通用配置里面,配置好 base URL, 以方便在 gitlab 的评论里面能够正确连接到 SonarQube 平台。
使用 Maven 与 Gitlab 集成
Maven 更适配多模块项目,1、2、3、5 步骤相同,4 配置如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <properties > <sonar.qualitygate.wait > true</sonar.qualitygate.wait > </properties > <build > <pluginManagement > <plugins > <plugin > <groupId > org.sonarsource.scanner.maven</groupId > <artifactId > sonar-maven-plugin</artifactId > <version > 3.11.0.3922</version > </plugin > </plugins > </pluginManagement > </build >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 sonarqube-check: tags: - sonar variables: SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" GIT_DEPTH: "0" cache: key: "${CI_JOB_NAME}" paths: - .sonar/cache script: - JAVA_HOME=/home/zwadmin/data/jdk-11/ && export JAVA_HOME - mvn verify sonar:sonar -Dsonar.projectKey=com.ydm:zw-ydm -Dsonar.branch.name=feature/sonar-1216 allow_failure: true only: - feature/sonar-1216
整合 IDEA 插件
用于同步服务器上的规则、质量配置文件和文件排除设置。
创建 token 类型为用户
IDEA Plugins Marketplace 下载 SonarQube for IDE。
连接到 SonarQube。
配置项目
完整版 .gitlab-ci.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 stages: - sonarqube - notify - noop sonarqube-check: stage: sonarqube tags: - sonar variables: SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" GIT_DEPTH: "0" cache: key: "${CI_COMMIT_REF_NAME}" - .sonar/cache script: - JAVA_HOME=*** && export JAVA_HOME - export SONAR_JAVA_OPTS="-Xmx2G -Xms1G" - mvn verify sonar:sonar -T 10 -Dsonar.projectKey= -Dsonar.branch.name=master -Dmaven.test.skip=true -Dsonar.qualitygate.wait=false -Dsonar.ce.parallel=1 -Dmaven.repo.local=*** allow_failure: false rules: - if: '$SKIP_SONAR == "true"' when: never - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' sonar_to_feishu: stage: notify tags: - sonar script: - | response=$(curl -u admin:123456Aa -s "***/api/qualitygates/project_status?projectKey=com.ydm%3Azw-ydm&branch=master") echo "$response" quality_gate_status=$(echo "$response" | grep -o '"status":"[^"]*"' | head -n 1 | sed 's/"status":"\([^"]*\)"/\1/') echo "$quality_gate_status" if [ "$quality_gate_status" == "OK" ]; then status="通过 (OK)" else status="未通过 (ERROR)" fi echo "请求飞书" curl -X POST -H "Content-Type: application/json" \ -d "{ \"msg_type\": \"post\", \"content\": { \"post\": { \"zh_cn\": { \"title\": \"SonarQube 分析完成\", \"content\": [ [{ \"tag\": \"text\", \"text\": \"项目:zw-ydm\n分支:master\n状态:$status\n仪表盘:\" }, { \"tag\": \"a\", \"text\": \"点击查看\", \"href\": \"***/dashboard?id=com.ydm%3Azw-ydm&branch=master\" }] ] } } } }" \ https://open.feishu.cn/open-apis/bot/v2/hook/*** needs: - sonarqube-check rules: - if: '$SKIP_SONAR == "true"' when: never - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' noop: tags: - sonar stage: noop script: - echo "Pipeline skipped all main jobs." rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
BUG 记录
内链:[[Docker拉取失败 (Client.Timeout exceeded while awaiting headers)]]
外链:Docker拉取失败 (Client.Timeout exceeded while awaiting headers)
docker-compose 加载挂载卷,只加载默认
未完全解决。有一个较麻烦的方法。
手动挂载卷
1 2 3 4 sudo docker volume create --driver local --opt type=none --opt device=/home/zwadmin/data/docker/sonarqube/data --opt o=bind sonarqube_data sudo docker volume create --driver local --opt type=none --opt device=/home/zwadmin/data/docker/sonarqube/extensions --opt o=bind sonarqube_extensions sudo docker volume create --driver local --opt type=none --opt device=/home/zwadmin/data/docker/sonarqube/logs --opt o=bind sonarqube_logs sudo docker volume create --driver local --opt type=none --opt device=/home/zwadmin/data/docker/sonarqube/conf --opt o=bind sonarqube_conf
在 docker-compose.yml
中从外部加载卷
1 2 3 volumes: sonarqube_data: external: true