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

发布于 更新于
本文目录
  1. 何为DevOps和测试左移?
  2. 代码评审
  3. SonarQube
  4. 环境搭建
  5. 1. 安装Docker
  6. 配置Docker国内镜像源
  7. 创建Docker网络
  8. 2. 部署SonarQube
  9. SonarQube汉化
  10. 创建SonarQube项目并生成token
  11. 3. 部署Gitlab
  12. 创建新用户并新建仓库
  13. 4. 部署Jenkins
  14. 下载SonarQube插件
  15. 配置SonarQube server
  16. 配置SonarQube Scanner
  17. 配置maven
  18. sonar-scanner扫描配置
  19. Jenkins任务配置

技术文章持续集成与运维

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

何为DevOps和测试左移?

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

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

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

代码评审

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

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

SonarQube

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

  • 多语言支持:支持Java、C#、JavaScript、Python等多种编程语言。

  • 静态代码分析:自动检测代码中的错误、警告和不符合最佳实践的部分。

  • 集成与自动化:可以与CI/CD工具(如Jenkins、GitLab等)无缝集成,实现自动化代码分析。

  • 用户友好的界面:提供直观的Web界面,方便查看代码质量报告和趋势。

环境搭建

环境说明:

  • Linux系统:CentOS 7.9

  • 内存:建议8GB或以上

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.pngimage.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

  • clean 用于清除上一次构建的信息

  • dependency:copy-dependencies 用于将项目的第三方依赖拷贝到target目录下,对于Java项目SonarQube需要该信息以保证分析代码时结果更精准

  • verify 阶段是 Maven 中用于质量检查的阶段,确保项目符合预设的质量标准,在此阶段会生成覆盖率报告

image20241009115518705.png

Jenkins构建任务完之后

image20241009133141766.pngimage20241009133242015.png

来源:testingpai

继续阅读