58.DevOps进阶

文章目录

DevOps进阶

代码审计

SonarQube 是一个开源的代码质量管理平台,用于自动化检测代码中的质量问题和安全漏洞,帮助团队 持续提升代码质量。

官方地址: https://www.sonarsource.com/products/sonarqube/downloads/

核心功能

  1. 静态代码分析

    • 自动识别代码缺陷(如空指针异常)、安全漏洞(如SQL注入)和代码异味(不良设计),支 持30+编程语言(Java、C#、Python等)。
    • 集成PMD、FindBugs、Checkstyle等插件增强检测能力,提供深度规则定制。
  2. 多维质量指标

    • 分析代码重复率、复杂度(圈复杂度)、注释覆盖率及单元测试覆盖率(需集成JaCoCo等工 具)。
    • 量化技术债务,生成修复优先级建议。
  3. 开发流程集成

    • 无缝对接CI/CD工具(Jenkins、GitLab CI、GitHub Actions),提交代码后自动触发扫描。
    • 通过IDE插件(SonarLint)实时反馈问题,支持开发阶段即时修复。
  4. 质量门禁(Quality Gate)

    • 定义质量阈值(如漏洞数量上限),未达标代码自动阻断合并或部署。

部署

在Jenkins服务器上,拉取postgres数据库和代码审计sonarqube镜像

bash 复制代码
[root@jenkins ~]# docker pull postgres:12.6
[root@jenkins ~]# docker pull sonarqube:8.9.6-community

创建代码审计容器创建脚本

bash 复制代码
[root@jenkins ~]# cd /usr/local/docker/
[root@jenkins docker]# mkdir sonarqube_docker
[root@jenkins docker]# ls
jenkins_docker  sonarqube_docker
[root@jenkins docker]# cd sonarqube_docker/

[root@jenkins sonarqube_docker]# vim docker-compose.yml
[root@jenkins sonarqube_docker]# cat docker-compose.yml
version: '3.1'
services:
  db:
    image: postgres:12.6
    container_name: db
    ports:
      - 5432:5432
    networks:
      - sonarnet
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
      POSTGRES_DB: sonar
  sonarqube:
    image: sonarqube:8.9.6-community
    container_name: sonarqube
    depends_on:
      - db
    ports:
      - 9000:9000
    environment:
      SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
      SONAR_JDBC_USERNAME: sonar
      SONAR_JDBC_PASSWORD: sonar
    networks:
      - sonarnet
networks:
  sonarnet:
    driver: bridge

启动脚本

bash 复制代码
[root@jenkins sonarqube_docker]# docker-compose up -d
Creating network "sonarqube_docker_sonarnet" with driver "bridge"   #出现错误没有启动成功
Creating db ... done
Creating sonarqube ... done

查看日志

bash 复制代码
[root@jenkins sonarqube_docker]# docker logs sonarqube
。。。。
bootstrap check failure [1] of [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
。。。。#最大虚拟内存空间太低了,至少需要262144

解决问题:虚拟内存太小,max virtual memory areas vm.max_map_count 65530 is too low, increase to at least 262144,需要扩容

bash 复制代码
[root@jenkins sonarqube_docker]# vim /etc/sysctl.conf
[root@jenkins sonarqube_docker]# tail -n 1 /etc/sysctl.conf
vm.max_map_count=262144
#激活
[root@jenkins sonarqube_docker]# sysctl -p

重新创建

bash 复制代码
[root@jenkins sonarqube_docker]# docker-compose up -d 
db is up-to-date
Starting sonarqube ... done

访问地址: http://192.168.18.154:9000/

更新密码

登录到sonarqube首页界面

下载并安装中文插件

下载并安装

出现报错

v

问题解决:

修正docker-compose.yml文件:

bash 复制代码
[root@jenkins sonarqube_docker]# vim docker-compose.yml 
[root@jenkins sonarqube_docker]# cat docker-compose.yml
version: '3.1'
services:
  db:
    image: postgres:12.6
    container_name: db
    ports:
      - 5432:5432
    networks:
      - sonarnet
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
      POSTGRES_DB: sonar
  sonarqube:
    image: sonarqube:8.9.6-community
    container_name: sonarqube
    depends_on:
      - db
    ports:
      - 9000:9000
    volumes:
      - ./plugins/:/opt/sonarqube/extensions/plugins  #添加创建仓库数据卷
    environment:
      SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
      SONAR_JDBC_USERNAME: sonar
      SONAR_JDBC_PASSWORD: sonar
    networks:
      - sonarnet
networks:
  sonarnet:
    driver: bridge

本地中文插件sonar-l10n-zh-plugin-8.9.jar放入,并服务重启

bash 复制代码
[root@jenkins sonarqube_docker]# docker-compose stop
Stopping sonarqube ... done
Stopping db        ... done
[root@jenkins sonarqube_docker]# docker-compose up -d
Starting db ... done
Recreating sonarqube ... done
[root@jenkins sonarqube_docker]# ls
docker-compose.yml  plugins

#本地上传sonar-l10n-zh-plugin-8.9.jar
[root@jenkins sonarqube_docker]# cd plugins/
[root@jenkins plugins]# ls 
sonar-l10n-zh-plugin-8.9.jar
[root@jenkins plugins]# docker-compose restart
Restarting sonarqube ... done
Restarting db        ... done
#注意:如果出现sonar无法正常启动,需要把原来启动的sonarqube和postgre容器删除掉,再重新使用docker-compose拉起来

首页显示为中文

代码测试

回到Windows系统的idea上

sonarqube会支持两种方式测试代码:

maven方式

1:maven方式,sonarqube对maven有支持,可以使用maven命令对代码测试。

修改maven目录下的settings.xml文件

指定位置插入如下内容:sonarqube的用户名、密码和Jenkins主机节点

bash 复制代码
#代码
<profile>
  <id>sonar</id>
  <activation>
             <activeByDefault>true</activeByDefault>
  </activation>
  <properties>
            <sonar.login>admin</sonar.login>
            <sonar.password>dcr@1111</sonar.password>                 <sonar.host.url>http://192.168.18.154:9000</sonar.host.url>
  </properties>
</profile>

设置maven环境变量

在idea当前终端命令行进行输入:

执行

bash 复制代码
mvn sonar:sonar

报错

版本报错

原因:sonar-maven-plugin:4.0.0.4121默认支持jdk11,而项目中使用的是jdk8,导致版本出错

解决问题:

可以采用下载对应的sonar-maven-plugin:3.11.0.3922版本来解决

在pom.xml中插入以下内容:

bash 复制代码
<plugin>
    <groupId>org.sonarsource.scanner.maven</groupId>
    <artifactId>sonar-maven-plugin</artifactId>
    <version>3.11.0.3922</version>
</plugin>

重新执行mvn sonar:sonar,进行加载

打开sonarqube网页,完成项目代码审计

查看检测结果

sonar-scanner方式

官方插件下载地址: https://docs.sonarsource.com/sonarqube-server/latest/analyzing-source-code/scanners/sonarscanner/

在Jenkins服务器上操作,把压缩包sonar-scanner-cli-4.6.0.2311-linux.zip解压到Jenkins的data目录中

bash 复制代码
#本地上传sonar-scanner-cli-4.6.0.2311-linux.zip
[root@jenkins ~]# unzip sonar-scanner-cli-4.6.0.2311-linux.zip
[root@jenkins ~]# mv sonar-scanner-4.6.0.2311-linux/ sonar-scanner
[root@jenkins ~]# mv sonar-scanner /usr/local/docker/jenkins_docker/data/

修改配置

bash 复制代码
[root@jenkins ~]# cd /usr/local/docker/jenkins_docker/data/sonar-scanner/
[root@jenkins sonar-scanner]# ls
bin  conf  jre  lib
[root@jenkins sonar-scanner]# cd conf
[root@jenkins conf]# ls
sonar-scanner.properties
[root@jenkins conf]# vim sonar-scanner.properties 
[root@jenkins conf]# cat sonar-scanner.properties
#Configure here general information about the environment, such as SonarQube server connection details for example
#No information about specific project should appear here

#----- Default SonarQube server
sonar.host.url=http://192.168.18.154:9000   #去掉注释,修改为Jenkins的地址

#----- Default source code encoding
sonar.sourceEncoding=UTF-8  #去注释

进行项目代码测试

bash 复制代码
[root@jenkins conf]# cd /usr/local/docker/jenkins_docker/data/workspace/mytest
[root@jenkins mytest]# /usr/local/docker/jenkins_docker/data/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=linux-test
。。。。
ERROR: Error during SonarScanner execution
ERROR: Not authorized. Analyzing this project requires authentication. Please provide a user token in sonar.login or other credentials in sonar.login and sonar.password.
ERROR: 
ERROR: Re-run SonarScanner using the -X switch to enable full debug logging.
#需要使用token进行身份认证

需要使用token令牌进行身份验证

点击右上角,用户-我的账号

添加参数,再次执行,需要添加编译过后内容的位置

bash 复制代码
[root@jenkins mytest]# /usr/local/docker/jenkins_docker/data/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=linux-test -Dsonar.login=e253a0b8e35b9527885207c3508479c8843073ea -Dsonar.projectKey=linux-test
.....
ERROR: Error during SonarScanner execution
org.sonar.java.AnalysisException: Your project contains .java files, please provide compiled classes with sonar.java.binaries property, or exclude them from the analysis with sonar.exclusions property.
....#没有java

继续添加参数,则测试成功(注意:这个密钥后面整合Jenkins要用到

bash 复制代码
[root@jenkins mytest]# /usr/local/docker/jenkins_docker/data/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=linux-test -Dsonar.login=e253a0b8e35b9527885207c3508479c8843073ea -Dsonar.projectKey=linux-test -Dsonar.java.binaries=./target/

回到sonarqube网页中查看

代码审计整合Jenkins

使用插件导入sonar.hpi

搜索已安装插件

注意:先应用再保存后,再回到系统配置中

应用凭据

Jenkins中调用sonar-scanner工具

系统管理-全局工具配置

添加名称和容器内部路径

在项目中进行配置

bash 复制代码
sonar.projectname=${JOB_NAME}
sonar.projectKey=${JOB_NAME}
sonar.source=./
sonar.java.binaries=target

进行构建

构建报错:

解决问题:因为之前在Jenkins服务器上使用命令进行了构建,产生过隐藏文件.scannerwork夹需要删除

bash 复制代码
[root@jenkins mytest]# ls -a 
.   demo_web.iml  .git            .gitignore  .idea    .scannerwork  target
..  docker        .gitattributes  HELP.md     pom.xml  src
[root@jenkins mytest]# rm -rf .scannerwork/
[root@jenkins mytest]# ls -a 
.  ..  demo_web.iml  docker  .git  .gitattributes  .gitignore  HELP.md  .idea  pom.xml  src  target

再次构建

过程中调用了sonarqube

查看sonarqube网页,观察到代码测试结果

harbor镜像仓库

部署

在Jenkins服务器上把harbor压缩包进行解压缩,进行设置后,启动安装

bash 复制代码
[root@jenkins ~]# tar -xzvf harbor-offline-installer-v2.8.2.tgz -C /usr/local/


[root@jenkins ~]# cd /usr//local/harbor/
[root@jenkins harbor]# ls
common.sh  harbor.v2.8.2.tar.gz  harbor.yml.tmpl  install.sh  LICENSE  prepare
[root@jenkins harbor]# cp -p harbor.yml.tmpl harbor.yml
[root@jenkins harbor]# vim harbor.yml
hostname: 192.168.18.154
# https related config
#https:
  # https port for harbor, default is 443
 # port: 443
  # The path of cert and key files for nginx
  #certificate: /your/certificate/path
  #private_key: /your/private/key/path
  
harbor_admin_password: harbor123

[root@jenkins harbor]# ./install.sh

打开harbor镜像仓库地址网页,默认端口80

http://192.168.18.154:80

输入用户名:admin

密码:harbor123

登录成功进入页面

创建项目

修改docker配置文件,添加仓库地址

bash 复制代码
[root@jenkins docker]# vim /etc/docker/daemon.json
[root@jenkins docker]# cat /etc/docker/daemon.json
{
"insecure-registries": ["192.168.18.154:80"],#添加harbor仓库地址
   "registry-mirrors": [
         "https://3aa741e7c6bf42ae924a3c0143f0e841.mirror.swr.myhuaweicloud.com",
         "https://do.nark.eu.org",
         "https://dc.j8.work",
         "https://docker.m.daocloud.io",
         "https://dockerproxy.com",
         "https://docker.mirrors.ustc.edu.cn",
         "https://docker.nju.edu.cn",
         "https://registry.docker-cn.com",
         "https://hub-mirror.c.163.com",
         "https://hub.uuuadc.top",
         "https://docker.anyhub.us.kg",
         "https://dockerhub.jobcher.com",
         "https://dockerhub.icu",
         "https://docker.ckyl.me",
         "https://docker.awsl9527.cn",
         "https://mirror.baidubce.com",
         "https://docker.1panel.live"
         ]
}
bash 复制代码
[root@jenkins docker]# systemctl restart docker

#重启docker后需要重启harbor,jenkins,sonarqube容器
#重启harbor
[root@jenkins docker]# cd /usr/local/harbor/
[root@jenkins harbor]# docker-compose restart
Restarting nginx             ... done
Restarting harbor-jobservice ... done
Restarting harbor-core       ... done
Restarting harbor-portal     ... done
Restarting registryctl       ... done
Restarting redis             ... done
Restarting harbor-db         ... done
Restarting registry          ... done
Restarting harbor-log        ... done
#重启jenkins
[root@jenkins harbor]# cd /usr/local/docker/jenkins_docker/data/
[root@jenkins data]# docker-compose restart
Restarting jenkins ... done
#重启sonarqube
[root@jenkins data]# cd /usr/local/docker/sonarqube_docker/
[root@jenkins sonarqube_docker]# docker-compose restart
Restarting sonarqube ... done
Restarting db        ... done

推送镜像

Jenkins服务器本地登录harbor

bash 复制代码
[root@jenkins sonarqube_docker]# docker login -u admin -p harbor123 192.168.18.154:80
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

下载测试镜像nginx

bash 复制代码
[root@jenkins sonarqube_docker]# docker pull nginx

推送镜像到harbor

bash 复制代码
#修改标签
[root@jenkins sonarqube_docker]# docker tag nginx:latest 192.168.18.154:80/repo/nginx/test
[root@jenkins sonarqube_docker]# docker push 192.168.18.154:80/repo/nginx/test

查看harbor的repo中已经有了nginx:test镜像

拉取镜像

在本地Jenkins服务器中测试拉取,在拉取前先删除原有镜像

bash 复制代码
#先将本地有的镜像删除
[root@jenkins sonarqube_docker]# docker rmi 192.168.18.154:80/repo/nginx/test

[root@jenkins sonarqube_docker]# docker pull 192.168.18.154:80/repo/nginx/test

[root@jenkins sonarqube_docker]# docker images | grep 192.168.18.154:80
192.168.18.154:80/repo/nginx/test   latest             4af177a024eb   2 weeks ago   161MB

Jenkins服务中使用docker

Jenkins需要把镜像制作并推送到harbor中,就需要具备docker环境

让Jenkins容器使用宿主机中docker环镜

修改docker.sock的权限

bash 复制代码
[root@jenkins run]# cd /var/run/
[root@jenkins run]# ll docker.sock 
srw-rw---- 1 root docker 0 Jan 30 09:18 docker.sock
[root@jenkins run]# chown root.root docker.sock 
[root@jenkins run]# chmod o+rw docker.sock 
[root@jenkins run]# ll docker.sock
srw-rw-rw- 1 root root 0 Jan 30 09:18 docker.sock

修改Jenkins脚本配置文件

bash 复制代码
[root@jenkins run]# cd /usr/local/docker/jenkins_docker/
[root@jenkins jenkins_docker]# vim docker-compose.yml 
[root@jenkins jenkins_docker]# cat docker-compose.yml 
version: "3.1"
services:
  jenkins:
    image: jenkins/jenkins:2.346.3-lts-jdk8
    container_name: jenkins
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      - ./data/:/var/jenkins_home/
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/usr/bin/docker
      - /etc/docker/daemon.json:/etc/docker/daemon.json

启动Jenkins服务

bash 复制代码
[root@jenkins jenkins_docker]# docker-compose up -d
Recreating jenkins ... done

验证:进入Jenkins容器内部执行docker命令

bash 复制代码
[root@jenkins jenkins_docker]# docker exec -it jenkins bash
jenkins@488e9af58c84:/$ docker version
Client: Docker Engine - Community
 Version:           26.1.4
 API version:       1.45
 Go version:        go1.21.11
 Git commit:        5650f9b
 Built:             Wed Jun  5 11:32:04 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          26.1.4
  API version:      1.45 (minimum version 1.24)
  Go version:       go1.21.11
  Git commit:       de5c9cf
  Built:            Wed Jun  5 11:31:02 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.33
  GitCommit:        d2d58213f83a351ca8f528a95fbd145f5654e957
 runc:
  Version:          1.1.12
  GitCommit:        v1.1.12-0-g51d5e94
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

Jenkins服务中构建镜像推送到harbor仓库

到Windows系统的idea中,删除docker-compose文件

修改一下内容3.0重新提交

添加3.0标签

项目-配置-构建后操作

bash 复制代码
mv target/*.jar docker/
docker build -t mytest:$tag docker/

选择对应的标签进行构建

在Jenkins服务器中查看镜像

bash 复制代码
[root@jenkins jenkins_docker]# docker images | grep mytest
mytest                              v3.0               c514ecef480c   About a minute ago   543MB

推送到harbor配置

项目-配置-构建后操作

编辑内容如下:(登录harbor-定义镜像标签-推送harbor)

bash 复制代码
docker login -u admin -p harbor123 192.168.18.154:80
docker tag mytest:$tag 192.168.18.154:80/repo/mytest:$tag
docker push 192.168.18.154:80/repo/mytest:$tag

再次进行构建3.0项目

去harbor上查看

完善

bash 复制代码
[root@jenkins jenkins_docker]# docker images | grep none
<none>                              <none>             c514ecef480c   6 minutes ago        543MB

[root@jenkins jenkins_docker]# docker image prune -f
[root@jenkins jenkins_docker]# docker images | grep none

再次构建

检验

bash 复制代码
[root@jenkins jenkins_docker]# docker images | grep none

镜像部署目标web服务器

1:告知目标服务器拉取哪个镜像。告知内容(harbor地址;harbor仓库名;镜像名;镜像版本;容器 运行端口号)

2:判断当前服务器是否正在运行该容器,如果正在运行则需要删除。

3:如果目标服务器已经存在当前镜像,则需要删除该镜像。

4:目标服务器拉取harbor上的镜像。

5:将拉取的镜像运行为容器

在Jenkins服务器中,编写脚本

bash 复制代码
[root@jenkins ~]# vim deploy.sh
[root@jenkins ~]# mv deploy.sh /usr/local/docker/jenkins_docker/data/workspace/mytest
[root@jenkins mytest]# cat deploy.sh 
#! /bin/bash
harbor_ip=$1
harbor_repo=$2
project=$3
version=$4
container_port=$5
host_port=$6

imageName=$harbor_ip/$harbor_repo/$project:$version

echo $imageName

#如果当前容器正在运行,则删除
container_id=`docker ps -a | grep ${project} | awk '{print $1}'`
echo $container_id

if [ "$container_id" != "" ]
then
  docker stop $container_id
  docker rm $container_id
fi

#如果当前镜像已存在,则删除
tag=`docker images | grep ${project} | awk '{print $2}'`

echo $tag

if [[ "$tag" =~ "$version" ]]
then  
  docker rmi $imageName
fi
#非本地登录镜像仓库
cp /lib/systemd/system/docker.service /lib/systemd/system/docker.service.bak
sed -i 's|ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock|ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.18.154 --containerd=/run/containerd/containerd.sock|g'  /lib/systemd/system/docker.service
systemctl daemon-reload && systemctl restart docker && docker login -u admin -pharbor123 $harbor_ip
#拉取镜像
docker pull $imageName
#运行容器
docker run -d -p $host_port:$container_port --name $project $imageName
echo "SUCCESS"

打开项目-配置-General

添加字符参数,容器启动时,主机端口

bash 复制代码
mv /usr/local/test/deploy.sh /usr/bin/
chmod +x /usr/bin/deploy.sh
deploy.sh 192.168.18.154 repo ${JOB_NAME} $tag $container_port $host_port

进行构建

查看构建结果

在目标web服务器中查看镜像

bash 复制代码
[root@web docker]# docker images
REPOSITORY                   TAG       IMAGE ID       CREATED              SIZE
192.168.18.154/repo/mytest   v3.0      2e3c52668c1b   About a minute ago   543MB
mytest                       v2.0      3cb3fcdea642   5 hours ago          543MB
mytest                       v1.0      223b4d285ff2   26 hours ago         543MB
openjdk                      8         b273004037cc   3 years ago          526MB

查看容器

bash 复制代码
[root@web docker]# docker ps -a
CONTAINER ID   IMAGE                             COMMAND                  CREATED              STATUS              PORTS                                       NAMES
59c225799342   192.168.18.154/repo/mytest:v3.0   "/bin/sh -c 'java -j..."   About a minute ago   Up About a minute   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   mytest

查看网页

http://192.168.18.155:8080/test

相关推荐
Avan_菜菜8 小时前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB1 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode3 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
大树886 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质6 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工6 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智6 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_6 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化