gitlab触发+gitlab_CICD+Sonar检查

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、

目录

1、SonarQube与GitLab账号打通

1.1、Gitlab 配置

1.2、gitlab-runner配置

2、Sonarqube 配置(使用admin用户登录)

2.1、配置ALM集成Gitlab

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

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

2.4、授权

3、SonarQube导入gitlab项目

3.1、打开sonar页面,点击项目-->新增项目-->更多-->来自gitlab

4、在gitlab上配置CI

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路径。如果放在库的根目录则默认(非必选)

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

4.5、提交代码测试


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值