DevOps 测试左移实践:Docker+Jenkins+SonarQube+GitLab 构建代码质量防线

何为DevOps和测试左移?

DevOps是一种将开发(Development)和运维(Operations)紧密结合的文化和实践方法。其核心理念是通过流程自动化、协作和持续反馈,提升软件的开发效率和质量,使得软件交付变得更加快速、可靠和高效。

测试左移(Shift Left Testing)是一种将测试活动尽早引入开发流程的方法。传统的测试通常在开发完成后才开始进行,而测试左移主张在需求分析、设计和编码阶段就积极参与测试,尽早发现并解决缺陷,从而降低修复成本,提高软件质量。

DevOps的核心在于提高开发与运维之间的协作,而测试左移则强调在开发早期阶段尽早引入测试,二者共同致力于提高软件的质量和交付速度。

代码评审

让测试人员参与代码评审是一种测试左移的有效方式。通过充分利用测试人员的专业知识,团队可以在早期阶段发现并解决问题,从而减少后期的维护成本,提升产品的整体质量。

目前很多公司都在推行DevOps和测试前移,以便让测试人员更早地参与研发过程。尽管许多团队开始让测试人员参与代码评审,但结果往往不如预期。这通常是因为测试人员的编码能力有限,对业务代码逻辑不够熟悉,导致他们难以准确识别问题。这使得测试团队的代码评审变得形式化。那么,有什么方法可以改善这种情况呢?如果测试人员在进行代码评审时能利用一些代码扫描工具,并对扫描结果进行深入分析,就能更轻松地发现真正的代码问题。

SonarQube

SonarQube 是一个开源的代码质量管理平台,用于持续检查代码质量和安全性。它支持多种编程语言,提供详细的代码质量指标,如代码覆盖率、技术债务、代码复杂度和潜在安全漏洞。通过静态代码分析,SonarQube帮助开发团队发现并修复代码中的问题,从而提升软件的可维护性和可靠性。

环境搭建

环境说明:

1. 安装Docker

# yum更新
yum -y update
# 移除旧版本的Docker(如果有)
yum remove docker \
            docker-client \
            docker-client-latest \
            docker-common \
            docker-latest \
            docker-latest-logrotate \
            docker-logrotate \
            docker-engine
# 安装Docker的依赖包
yum install -y yum-utils
# 设置Docker的稳定仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装Docker(社区版
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 启动Docker服务
systemctl start docker
# 查看Docker服务状态
systemctl status docker

状态running说明运行正常:

image.png

配置Docker国内镜像源

使用Docker镜像库时,由于网络原因,直接访问Docker Hub可能会较慢。为了提高拉取镜像的速度,你可以使用国内的Docker镜像库服务,比如阿里云、腾讯云、网易云等。

vi /etc/docker/daemon.json

添加以下镜像配置:

{
    "registry-mirrors": [
        "https://registry.docker-cn.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://hub-mirror.c.163.com",
        "https://mirror.baidubce.com",
        "https://ccr.ccs.tencentyun.com"
    ]
}
# 重启Docker服务
systemctl daemon-reload
systemctl restart docker

创建Docker网络

由于是将所有的服务都部署在同一台主机上面,并且使用Docker的方式,为了方便Jenkins、Gitlab、SonarQube服务之间的相互访问,使用以下命令创建Docker网络,这样访问服务的时候可以通过容器名直接访问:

docker network create devops-network

2. 部署SonarQube

在SonarQube 8版本之后提供了非常好用的功能,其中包括多分支代码扫描,所以这里我们使用 SonarQube V9.9 LTS版本

需要注意的是自 SonarQube 7.9 LTS 版本起,MySQL 不再受 SonarQube 官方支持,其所支持的数据库包括H2(内嵌数据库,主要用于开发和测试环境)、PostgreSQL,这里我们使用PostgreSQL数据库。选择如下:SonarQube V9.9 + PostgreSQL V12

使用docker compose方式部署,对应docker-compose.yaml配置如下:

networks:
  devops-network:
    external: true  # 表示这个网络是外部创建的
  
services:
  sonarqube:
    image: sonarqube:9.9-community
    container_name: sonarqube
    depends_on:
      - db
    ports:
      - "9000:9000"  # SonarQube 的默认端口
    environment:
      SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonarqube
      SONAR_JDBC_USERNAME: sonarqube
      SONAR_JDBC_PASSWORD: sonarqube
    volumes:
      - sonarqube_conf:/opt/sonarqube/conf
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_logs:/opt/sonarqube/logs
      - sonarqube_extensions:/opt/sonarqube/extensions
    networks:
      - devops-network

  db:
    image: postgres:12
    container_name: sonarqube_db
    environment:
      POSTGRES_USER: sonarqube
      POSTGRES_PASSWORD: sonarqube
      POSTGRES_DB: sonarqube
    volumes:
      - postgresql:/var/lib/postgresql
      - postgresql_data:/var/lib/postgresql/data
    networks:
      - devops-network

volumes:
  sonarqube_conf:
  sonarqube_data:
  sonarqube_logs:
  sonarqube_extensions:
  postgresql:
  postgresql_data:

使用docker compose启动

docker compose -f docker-compose.yaml up -d

image.png

访问http://你的主机IP:9000即可看到SonarQube登录页面,默认账号密码为admin/admin

image.png

SonarQube汉化

默认SonarQube使用英文页面,不支持中文,我们需要额外安装支持中文的插件:https://github.com/xuhuisheng/sonar-l10n-zh

寻找匹配的版本:

image.png

image.png

将下载好的插件存放到/var/lib/docker/volumes/opt_sonarqube_extensions/_data/plugins目录下

重启服务:

docker compose down
docker compose -f docker-compose.yaml up -d

创建SonarQube项目并生成token

image20241009114543831.png

为了让后续Jenkins能够联动SonarQube,在个人账户中创建token,记住token值(该token只会显示一次)

image20241009114720575.png

3. 部署Gitlab

使用以下Docker命令部署Gitlab并运行容器

docker run --name gitlab \
    --hostname gitlab.test.com \
    -p 443:443 -p 80:80 -p 222:22 \
    --restart always \
    -v /srv/gitlab/config:/etc/gitlab \
    -v /srv/gitlab/logs:/var/log/gitlab \
    -v /srv/gitlab/data:/var/opt/gitlab \
    --net=devops-network \
    -d gitlab/gitlab-ce:latest

获取Gitlab root用户初始化密码:

docker exec -it gitlab grep "Password:" /etc/gitlab/initial_root_password

访问http://你的主机IP即可看到Gitlab登录页面,以root用户登录:

image20241009102845413.png

创建新用户并新建仓库

添加新用户:

image20241009103132384.png

以新用户账号重新登录Gitlab,并且将本地Git密钥添加到该账号中(Git密钥需要在本地使用命令生成,不会的自行百度搜索)

image20241009103545023.png

新建仓库,并且将需要进行扫描的代码推送到新仓库中

image20241009105029020.png

4. 部署Jenkins

docker run --name jenkins \
    -p 8080:8080 -p 50000:50000 \
    -v jenkins_home:/var/jenkins_home \
    --net=devops-network \
    -d jenkins/jenkins:2.462.2-jdk11

拉取Jenkins镜像时需要注意,镜像内置的JDK版本最好是11,如果是17后面使用Sonar进行代码扫描时JDK版本会不匹配

访问http://你的主机IP:8080即可看到Jenkins页面,按照页面提示进行初始化

下载SonarQube插件

在系统管理->插件管理页面搜索下载:SonarQube Scanner for Jenkins

image20241009110113146.png

配置SonarQube server

系统管理->找到SonarQube servers,设置名称和SonarQube服务的地址,这里可以直接用sonarqube作为主机名去连接(之前有使用Docker 网络)

image20241009110234967.png

添加凭据,这里的Secret是上述SonarQube中生成的token

image20241009113758295.png

配置SonarQube Scanner

系统管理->全局工具配置->找到SonarQube Scanner,这里选择在线安装Sonar Scanner方式

image20241009114239040.png

配置maven

系统管理->全局工具配置->找到Maven,这里同样选择在线安装方式

image.png

sonar-scanner扫描配置

在被扫描项目中添加sonar-project.properties文件,配置如下(以Java项目为例):

# 项目标识
sonar.projectKey=scan_backend_springboot
# 默认和项目标识保持一致
sonar.projectName=scan_backend_springboot
# 项目版本号
sonar.projectVersion=1.0
# 项目扫描路径,默认.代表当前目录下所有的代码文件
sonar.sources=.
# 指定java项目JDK版本
sonar.java.source=1.8
sonar.java.target=1.8
# 指向包含与源文件对应的已编译字节码文件的目录
sonar.java.binaries=target/classes
# 源码编码格式
sonar.sourceEncoding=UTF-8

Jenkins任务配置

添加被扫描项目Git仓库地址、凭据信息

image20241009115356065.png

构建Java项目,填写如下构建选项:

clean dependency:copy-dependencies verify

image20241009115518705.png

Jenkins构建任务完之后

image20241009133141766.png

image20241009133242015.png

6 操作
shakebabe 在 2024-10-10 09:40:59 更新了该帖
shakebabe 在 2024-10-10 09:34:48 更新了该帖
shakebabe 在 2024-10-09 17:02:04 更新了该帖
shakebabe 在 2024-10-09 17:01:27 更新了该帖 shakebabe 在 2024-10-09 16:27:12 更新了该帖 shakebabe 在 2024-10-09 16:25:32 更新了该帖
回帖
请输入回帖内容 ...