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

相关推荐
猫头虎3 小时前
如何使用Docker部署OpenClaw汉化中文版?
运维·人工智能·docker·容器·langchain·开源·aigc
XiaoMu_0013 小时前
自动化漏洞扫描与预警平台
运维·网络·自动化
醉风塘3 小时前
Linux进程管理:深度解析ps -ef命令及其高级应用
linux·运维·服务器
会周易的程序员3 小时前
openplc runtimev4 Docker 部署
运维·c++·物联网·docker·容器·软件工程·iot
一战成名9964 小时前
AI 模型持续集成流水线:CANN 支持的 DevOps 最佳实践
人工智能·ci/cd·devops
陈桴浮海4 小时前
【Linux&Ansible】学习笔记合集三
linux·运维·云原生·ansible
小Pawn爷4 小时前
1.Docker基础
运维·docker·容器
chinesegf4 小时前
清理docker残留镜像images
运维·docker·容器
江湖有缘4 小时前
基于华为openEuler系统部署Gitblit服务器
运维·服务器·华为