1、SonarQube与GitLab账号打通
1.1、Gitlab 配置
使用管理员用户登录gitlab,生成一个api token, 记录该值

使用管理员用户配置gitlab 应用,添加一个sonarqube应用,回调 URL 输入 {sonarqub address}/oauth2/callback/gitlab

保存生成的应用程序ID和密码

1.2、gitlab-runner配置


也可以采用已经注册好的Runners,点击Enable即可。多个项目使用同一个Runner会出现任务排队的现象,建议每个项目申请一个自己的Runner。后端项目注册Runners时选择执行器shell,前端项目扫描使用docker容器,注册Runners时选择执行器docker。stage:merge_check 步骤的tags选择shell类型的Runners标签,其他步骤的tags根据实际注册选择Runners标签。

2、Sonarqube 配置(使用admin用户登录)
2.1、配置ALM集成Gitlab
打开,在配置 >> ALM集成 >> gitlab >> 创建配置

把刚才gitlab拿到的应用ID和密钥,以及gitlab地址填上即可

点击检查配置,验证是否成功

2.2、配置认证信息集成Gitlab,允许Gitlab用户登录

2.3、使用Gitlab用户测试登录Sonarqube

2.4、授权

Application ID:b0b97bd46bf44f4a248d981844cd9bedd7c652e41d1ecfb4416862b712a6908c
Secret:40bfd420b0265f698259ee4520cebe7bab7e2c0e8c0956101016db2d29c18e16
3、SonarQube导入gitlab项目
3.1、打开sonar页面,点击项目-->新增项目-->更多-->来自gitlab




前台js、CSS、html代码使用sonar-sccan执行的配置方法(Maven项目也可以)SONAR_TOKEN:sqa_5bdd610c97859dbeb098c844c7aec71efbb05a03

4、在gitlab上配置CI
4.1、在gitlab项目的根目录下创建sonar-project.properties、.gitlab-ci.yml文件

sonar-project.properties
sonar.projectKey=tchq_weshyper_weshyper_dev_back_end_weshyper-business-cloud_weshyper-business-cloud_AZX0eaS-JMfUzGIAM3Cb
sonar.qualitygate.wait=true
sonar.projectName=WeShyper_Business_Cloud_Sonar
sonar.projectKey是项目标识,sonar.projectName是项目名称(名称可以自己定义)
.gitlab-ci.yml
stages:
- sonarqube-check
- merge_check
variables:
GIT_DEPTH: "0"
sonarqube-check:
stage: sonarqube-check
image:
name: sonarsource/sonar-scanner-cli:latest
entrypoint: [""]
variables:
SONAR_PROJECT_FILE: "sonar-project.properties"
SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" # Defines the location of the analysis task cache
GIT_DEPTH: "0" # Tells git to fetch all the branches of the project, required by the analysis task
cache:
key: "${CI_JOB_NAME}"
paths:
- .sonar/cache
script:
- export CI_PROJECT_KEY=$(grep -E '^sonar.projectKey=' $SONAR_PROJECT_FILE | cut -d'=' -f2)
- sonar-scanner -Dsonar.java.binaries=. -Dsonar.sourceEncoding=UTF-8 -Dsonar.sources=. -Dsonar.qualitygate.wait=true -Dsonar.exclusions=**/config/**,**/Dockerfile,**/start.sh
# - |
# STATUS=$(curl -s -u "$SONAR_TOKEN:" "$SONAR_HOST_URL/api/qualitygates/project_status?projectKey=$CI_PROJECT_KEY" | grep -o '"status":"[^"]*' | cut -d'"' -f4 |head -n 1)
# echo "SonarQube 分析状态: $STATUS"
# if [ "$STATUS" != "OK" ]; then
# exit 1
# fi
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
tags:
- sonar-test-project-code-check
merge_check:
stage: merge_check
script:
- |
if [ "$CI_JOB_STATUS" = "failed" ]; then
curl --request PUT --header "PRIVATE-TOKEN: $CI_JOB_TOKEN" \
"http://192.168.10.21:8080/api/v4/projects/$CI_PROJECT_ID/merge_requests/$CI_MERGE_REQUEST_IID?state_event=close"
fi
only:
- merge_requests
when: on_failure
dependencies:
- sonarqube-check
tags:
- sonar-test-project-code-check
注释:其中only:生效的分支,script:执行的命令,sonar-scanner 后面可以填写自己所需要的参数,上述ci文件是只是一个模版,tags 为gitlab-runners的标签,文件中的每个tags都需要在Runners配置为Enable for this project,否则stage会因为找不到Runners一直pending。

这个按钮可检查pipeline语法

4.2、打开gitlab页面,在项目-->设置-->CICD-->General project settings选择启用Auto DevOps(非必选)

配置Variables环境变量



SONAR_TOKEN可以在sonar自己创建,也可以使用已创建的token。

4.3、在项目-->设置-->CICD-->General project settings设置.gitlab-ci.yml路径。如果放在库的根目录则默认(非必选)

4.4、打开pipeline成功才允许合并请求

4.5、提交代码测试
sonar上显示扫描通过

git上 Pipelines显示绿色passed

只有绿色的passed表示流水线执行成功,否则新提交的代码禁止合并到其他分支



前端node镜像制作Dockerfile(跳过,已配置)
FROM node:14.18.0-alpine
LABEL maintainer="qiaonannan <qnn9527@163.com>"
RUN npm config set registry=http://192.168.0.9:8081/repository/npm-group/ && \
apk add curl unzip openjdk11 dos2unix
# 复制 sonar-scanner-cli 和 JDK 到 /opt
COPY sonar-scanner-cli-4.8.0.2856-linux.zip /opt/
#COPY jdk-8u202-linux-x64.tar.gz /opt/
# 解压 sonar-scanner-cli
WORKDIR /opt/
RUN unzip sonar-scanner-cli-4.8.0.2856-linux.zip && \
mv sonar-scanner-4.8.0.2856-linux sonar-scanner && \
#rm -rf /opt/sonar-scanner/jre && \
rm -rf sonar-scanner-cli-4.8.0.2856-linux.zip
# 设置 Java 环境变量
#ENV JAVA_HOME=/opt/jdk1.8.0_202
#ENV PATH=$JAVA_HOME/bin:$PATH
#ENV SONAR_SCANNER_OPTS="-Djava.home=$JAVA_HOME"
RUN ln -s /opt/sonar-scanner/bin/sonar-scanner /usr/local/bin/sonar-scanner
前端eslint项目扫描配置文件.gitlab-ci.yml
stages:
- eslint_check
- sonarqube-check
- merge_check
variables:
GIT_DEPTH: "0"
# 运行 ESLint 并生成报告
eslint_lint:
stage: eslint_check
image: node-sonar-scanner:14.18-4.7.0
script:
- npm install && npm run lint:report || false # 生成 ESLint JSON 报告失败后导致后续流水线失败
artifacts:
paths:
- report.json # 生成的 ESLint 结果文件
tags:
- eslint-docker-runner
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
sonarqube-check:
stage: sonarqube-check
image:
name: node-sonar-scanner:14.18-4.7.0
entrypoint: [""]
variables:
SONAR_PROJECT_FILE: "sonar-project.properties"
SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar"
cache:
key: "${CI_JOB_NAME}"
paths:
- .sonar/cache
dependencies:
- eslint_lint
script:
- export CI_PROJECT_KEY=$(grep -E '^sonar.projectKey=' $SONAR_PROJECT_FILE | cut -d'=' -f2)
- sonar-scanner -Dsonar.java.binaries=. -Dsonar.sourceEncoding=UTF-8 -Dsonar.sources=. -Dsonar.qualitygate.wait=true -Dsonar.exclusions=**/public/**,**/build/**,**/src/framework/utils/** -Dsonar.eslint.reportPaths=report.json
# - |
# STATUS=$(curl -s -u "$SONAR_TOKEN:" "$SONAR_HOST_URL/api/qualitygates/project_status?projectKey=$CI_PROJECT_KEY" | grep -o '"status":"[^"]*' | cut -d'"' -f4 |head -n 1)
# echo "SonarQube 分析状态: $STATUS"
# if [ "$STATUS" != "OK" ]; then
# exit 1
# fi
allow_failure: false
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
tags:
- eslint-docker-runner
merge_check:
stage: merge_check
script:
- |
if [ "$CI_JOB_STATUS" = "failed" ]; then
curl --request PUT --header "PRIVATE-TOKEN: $CI_JOB_TOKEN" \
"http://192.168.10.21:8080/api/v4/projects/$CI_PROJECT_ID/merge_requests/$CI_MERGE_REQUEST_IID?state_event=close"
fi
only:
- merge_requests
when: on_failure
dependencies:
- sonarqube-check
tags:
- sonar-test-project-code-check
5、
目录
2.2、配置认证信息集成Gitlab,允许Gitlab用户登录
3.1、打开sonar页面,点击项目-->新增项目-->更多-->来自gitlab
4.1、在gitlab项目的根目录下创建sonar-project.properties、.gitlab-ci.yml文件
4.2、打开gitlab页面,在项目-->设置-->CICD-->General project settings选择启用Auto DevOps(非必选)
4.3、在项目-->设置-->CICD-->General project settings设置.gitlab-ci.yml路径。如果放在库的根目录则默认(非必选)
5、常见问题总结
1、前端vue项目扫描,分为Vue2和Vue3项目,编译时依赖node14版本选择镜像node-sonar-scanner:14.18-4.7.0,编译时依赖node20版本选择镜像node-sonar-scanner:20.14-4.7.0
2、前端vue项目扫描会因为代码格式问题报错导致流水线失败,需要先将代码格式化后再次扫描(参考:http://192.168.10.21:8000/tchq/weshyper/weshyper_dev/front_end/weshyper_cloud_vue/dqbasic_cloud_vue3/-/jobs/8423)
3、初次配置完成流水线是代码仓库全量扫描,会展示所有的异味及漏洞等问题,不需要处理或者误报的问题可以去sonar上手动修改状态,然后再次Merge
4、任务一直等待中,pending状态(没有合适的可执行Runners,检查Runners配置是否正确,状态是active,绿色表示正常)
5、提交Merge Requests后,任务一直是Checking pipeline status.状态(源分支和目前分支代码有冲突)
参考:http://192.168.10.21:8000/tchq/weshyper/weshyper-data/govern_cloud/-/merge_requests/440
2330

被折叠的 条评论
为什么被折叠?



