阅读 512

Gitlab+Jenkins+SonarQube实现代码质量扫描自动化

背景

按照安全基线的要求,需要对上线前的代码进行扫描。

此前,测试已经搭建过一个扫描服务,sonarqube

image.png

流程定义

大致的流程如下:

  1. 开发提交代码
  2. Gitlab 上提交MR
  3. Jenkins 接收到创建MR的通知,检查是否符合规则
  4. 若符合规则,则执行扫描
  5. 扫描结束后,执行 Python 脚本,获取扫描状态
  6. 根据扫描结果,设置临时环境变量
  7. 评论MR

image.png

基础环境

  • GitLab
  • Jenkins
  • Sonarqube

Sonarqube配置

安装多分支扩展(开发版路过)

传送门

生成访问令牌

配置路径:我的账号 → 安全 → 令牌

TIPS:生成的令牌要记下来,划走就再也找不到了。

image.png

Jenkins配置

安装 SonarQube Scanner for Jenkins 扩展

路径:Manage Jenkins → Manage Plugins → Available(Tab)

image.png

配置 SonarQube Scanner for Jenkins 扩展

路径:Manage Jenkins → Global Tool Configuration → SonarQube Scanner → Add SonarQube Scanner → Apply

image.png

路径:Manage Jenkins → Configure System → SonarQube servers → Add SonarQube → Apply

image.png

凭据选项配置

路径:Manage Jenkins → 凭据配置 → Restrictions → Add → 包括 → Apply

image.png

配置凭据

配置 Gitlab 用户,用于拉取代码

路径:Manage Jenkins → Manage Credentials → Add Credentials → OK

image.png

配置 SonarQube token

路径:Manage Jenkins → Manage Credentials → Add Credentials → OK

image.png

创建新项目

路径:New Item → Freestyle project

image.png

配置项目

路径:项目 → Configure → Apply

1、配置 Git 仓库,指定哪个分支被扫描

image.png

2、配置触发器,指定什么时候触发构建

同时,指定需要过滤的分支

生成 Token,后续在 Gitlab Webhook 会用

image.png

3、指定 SonarQube 的 token

image.png

4、指定构建时需要做的事情

image.png

① Execute SonarQube Scanner — 配置扫描器做的事

sonar.projectKey=sonarcrmweb
sonar.projectName=sonarcrmweb
sonar.projectVersion=1.0
sonar.language=php
sonar.sourceEncoding=UTF-8
sonar.branch.name=${GIT_BRANCH}
复制代码

② Execute Python script — 调用 SonarQube 的 API 获取执行结果

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import requests
import json
import sys
import os
import base64

try:
    token = str(base64.b64encode('60c7dfb44f5e0f08c539e16a58421979f975606a:'.encode('utf-8')))
    r = requests.get('<http://192.168.35.124:9000/api/qualitygates/project_status?projectKey=sonarcrmweb&branch=>' + os.environ['GIT_BRANCH'], headers={'Authorization': 'Basic ' + token})
    print r.text
    sonarStatus = json.loads(r.text.decode('utf-8'))['projectStatus']['status']
    sonarResult = 'Sonar analysis status is ' + sonarStatus
except Exception as e:
    print e
    sonarResult = str(e)
    pass

print sonarResult
with open('pyresult.txt', 'w') as f:
    f.write('ANALYSIS_RESULT=' + sonarResult)
复制代码

③ Conditional step (single) — 用于设置 Python 脚本获取的执行结果到临时环境变量

5、配置构建完成时的动作,给 MR 写备注

image.png

Gitlab配置

配置 Access Tokens

路径:setting → Access Tokens

image.png

记住这里的 token,需要回到 Jenkins 配置 Gitlab相关。

image.png

配置 WebHook

image.png

Jenkins 配置 Gitlab

配置凭据

配置 Gitlab API Token,用于提交评论

路径:Manage Jenkins → Manage Credentials → Add Credentials → OK

image.png

添加 Gitlab 配置

路径:Manage Jenkins → Configure System → Gitlab → Add → Apply

image.png

最后

折腾...

文章分类
后端