当前位置: 首页 > news >正文

CI/CD——CI持续集成实验

目录

一. 安装Docker

二. 部署Jenkins

三. 配置邮箱

四. Harbor部署

五. Nexus Repository部署

五. sonarqube安装

六. 配置Docker

七. jenkins系统配置sonarqube

八. 配置pipeline

九. 构建并集成


一. 安装Docker

docker-ce镜像_docker-ce下载地址_docker-ce安装教程-阿里巴巴开源镜像站

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

配置加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://docker.rainbond.cc" ,"https://do.nark.eu.org","https://dc.j8.work","https://pilvpemn.mirror.aliyuncs.com","https://docker.m.daocloud.io","https://dockerproxy.com","https://docker.mirrors.ustc.edu.cn","https://docker.nju.edu.cn"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

拉取所需要镜像

[root@jenkins ~]# docker pull sonarqube:9.9.3-community
[root@jenkins ~]# docker pull maven:3.8.8-sapmachine-11
[root@jenkins ~]# docker pull node:18.20.3-alpine3.20
[root@jenkins ~]# docker pull sonarsource/sonar-scanner-cli

二. 部署Jenkins

官方文档:Redhat Jenkins Packages

下面使用yum安装方式,手动安装可参考:Jenkins安装部署与配置_jenkins部署-CSDN博客

[root@jenkins ~]# sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
[root@jenkins ~]# sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
[root@jenkins ~]# yum install -y fontconfig java-17-openjdk
[root@jenkins ~]# yum install -y jenkins
[root@jenkins ~]# systemctl enable --now jenkins

访问本机IP+端口,例如我这里访问:http://192.168.226.29:8080/ 

见下图就已经成功部署,但是先不着急登录。

  

停止jenkins,将打包好的插件全部导入jenkins存放插件的目录/var/lib/jenkins/plugins/

链接:https://pan.baidu.com/s/1e1qjYX8K2TLIMg4fcalFVQ?pwd=zl2q 
提取码:zl2q 
--来自百度网盘超级会员V2的分享

所需插件已经打包好:

[root@jenkins ~]# systemctl stop jenkins# 将jenkins加入到docker组
[root@jenkins ~]# gpasswd -a jenkins docker#上传插件压缩包plugins-2.452.3.tgz
[root@jenkins ~]# ll
total 333680
-rw-------. 1 root root       815 Jun  6 14:00 anaconda-ks.cfg
-rw-r--r--  1 root root 341684112 Aug  6  2024 plugins-2.452.3.tgz[root@jenkins ~]# tar -xf plugins-2.452.3.tgz[root@jenkins ~]# ll
total 333696
-rw-------.   1 root    root          815 Jun  6 14:00 anaconda-ks.cfg
drwxr-xr-x  127 jenkins jenkins     12288 Aug  6  2024 plugins
-rw-r--r--    1 root    root    341684112 Aug  6  2024 plugins-2.452.3.tgz[root@jenkins ~]# cd plugins[root@jenkins plugins]# cp ./* /var/lib/jenkins/plugins/[root@jenkins plugins]# systemctl start jenkins[root@jenkins plugins]# ss -tnlp
State           Recv-Q          Send-Q                   Local Address:Port                   Peer Address:Port         Process                                  
LISTEN          0               128                            0.0.0.0:22                          0.0.0.0:*             users:(("sshd",pid=3708,fd=3))          
LISTEN          0               128                               [::]:22                             [::]:*             users:(("sshd",pid=3708,fd=4))          
LISTEN          0               50                                   *:8080                              *:*             users:(("java",pid=5318,fd=8)) 
# 查看初始化密码
[root@jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
c7cdf3cd065f465ca2cd1f4f5cc29f69

 

 

 

输入账户密码登录后页面见下图即完成  

三. 配置邮箱

添加邮箱凭据

邮箱全局凭据类型:Username with password
用户名 : 对应你的真实邮箱名
密码 : 你邮箱的授权码
ID(这个用固定的) :jenkins_mail

系统配置 

  

四. Harbor部署

下载地址:https://github.com/goharbor/harbor/releases/tag/v2.10.3

 上传虚拟机,这里我已经改好了

[root@jenkins ~]# ll
total 548856
-rw-------. 1 root root       815 Jun  6 14:00 anaconda-ks.cfg
-rw-r--r--  1 root root 562018170 Aug  1 00:15 harbor-offline-installer-v2.10.3.tgz[root@jenkins ~]# tar -xf harbor-offline-installer-v2.10.3.tgz
[root@jenkins ~]# cd harbor[root@jenkins harbor]# cp harbor.yml.tmpl harbor.yml[root@jenkins harbor]# vim harbor.yml    # 全部替换该文件内容为如下配置,第一行IP需要修改你的IP
hostname: 192.168.226.29
http:port: 80
harbor_admin_password: Harbor12345
database:password: root123max_idle_conns: 100max_open_conns: 900conn_max_lifetime: 5mconn_max_idle_time: 0
data_volume: /data
trivy:ignore_unfixed: falseskip_update: falseskip_java_db_update: falseoffline_scan: falsesecurity_check: vulninsecure: false
jobservice:max_job_workers: 10job_loggers:- STD_OUTPUT- FILElogger_sweeper_duration: 1 #days
notification:webhook_job_max_retry: 3webhook_job_http_client_timeout: 3 #seconds
log:level: infolocal:rotate_count: 50rotate_size: 200Mlocation: /var/log/harbor
_version: 2.10.0
proxy:http_proxy:https_proxy:no_proxy:components:- core- jobservice- trivy
upload_purging:enabled: trueage: 168hinterval: 24hdryrun: false
cache:enabled: falseexpire_hours: 24
# 执行安装
[root@jenkins harbor]# ./install.sh

浏览器访问IP即可,例如我这里就访问http://192.168.226.29/

如果配置文件中自己没有修改,默认用户名:admin   默认密码:Harbor12345  

 

在jenkins中添加全局凭据

全局凭据类型: Username with password
用户名(默认就用初始化的admin):admin
密码(这里就是admin用户密码) : Harbor12345
ID(这里就固定用和我一样的 :jenkins-docker

五. Nexus Repository部署

[root@jenkins ~]# mkdir /opt/nexus/
[root@jenkins ~]# cd /opt/nexus
[root@jenkins nexus]# mkdir data && chmod 777 /opt/nexus/data
[root@jenkins nexus]# vim docker-compose.yml
version: '3.2'
services:nexus3:image: sonatype/nexus3container_name: nexus3restart: alwaysports:- "8081:8081"volumes:- ./data:/nexus-data
# 启动
[root@jenkins nexus]# docker compose up -d

浏览器访问IP+8081端口 。例如我这里访问:http://192.168.226.29:8081/

# 在容器查看初始密码
[root@jenkins ~]# docker exec -it nexus3 cat /nexus-data/admin.password
33551d8e-36c6-4b35-a87e-9f7518d48b90

创建后端仓库

 

创建前端仓库

 

 

 

在jenkins全局配置中添加Nexus的凭据

全局凭据类型: Username with password
用户名(默认就用初始化的admin):admin
密码(这里就是admin用户密码) : lzz2578+
ID(这里就固定用和我一样的 :jenkins_nexus

五. sonarqube安装

[root@jenkins ~]# mkdir /opt/sonarqube
[root@jenkins ~]# cd /opt/sonarqube
[root@jenkins sonarqube]# vim docker-compose.yml
version: "3.1"
services:db:image: postgrescontainer_name: dbports:- 15432:5432networks:- sonarnetenvironment:POSTGRES_USER: sonarPOSTGRES_PASSWORD: sonar_123volumes:- /opt/sonarqube/sonar-qube/data:/var/lib/postgresql/datasonarqube:image: sonarqube:9.9.3-communitycontainer_name: sonarqubedepends_on:- dbports:- "19000:9000"networks:- sonarnetenvironment:SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonarSONAR_JDBC_USERNAME: sonarSONAR_JDBC_PASSWORD: sonar_123volumes:- ./sonar-l10n-zh-plugin-9.9.jar:/opt/sonarqube/extensions/plugins/sonar-l10n-zh-plugin-9.9.jar
networks:sonarnet:driver: bridge

上传sonarqube中文汉化包

链接:https://pan.baidu.com/s/1QWuovwWRKrD6YT3TcA8gFQ?pwd=3rtu 
提取码:3rtu 
--来自百度网盘超级会员V2的分享

[root@jenkins sonarqube]# ls
docker-compose.yml  sonar-l10n-zh-plugin-9.9.jar
[root@jenkins sonarqube]# vim /etc/security/limits.conf   #文件最后加入下述配置
* soft nofile 131072
* hard nofile 131072
* soft nproc 10240
* hard nproc 10240

[root@jenkins sonarqube]# vim /etc/sysctl.conf   # 在文件最后加入下述配置
vm.max_map_count=524288
fs.file-max=131072

 

[root@jenkins sonarqube]# sysctl -p
[root@jenkins sonarqube]# mkdir -p /opt/sonarqube/sonar-qube/data && chmod 777 /opt/sonarqube
[root@jenkins sonarqube]# docker compose up -d
[root@jenkins sonarqube]# docker ps
CONTAINER ID   IMAGE                       COMMAND                  CREATED         STATUS         PORTS                                         NAMES
702508e30e89   sonarqube:9.9.3-community   "/opt/sonarqube/dock…"   2 minutes ago   Up 2 minutes   0.0.0.0:19000->9000/tcp, :::19000->9000/tcp   sonarqube
9c7cce2141f1   postgres                    "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes   0.0.0.0:15432->5432/tcp, :::15432->5432/tcp   db
[root@jenkins sonarqube]# ss -tnlp
State          Recv-Q         Send-Q                 Local Address:Port                  Peer Address:Port        Process                                        
LISTEN         0              128                          0.0.0.0:22                         0.0.0.0:*            users:(("sshd",pid=3708,fd=3))                
LISTEN         0              4096                         0.0.0.0:19000                      0.0.0.0:*            users:(("docker-proxy",pid=7415,fd=4))        
LISTEN         0              4096                         0.0.0.0:15432                      0.0.0.0:*            users:(("docker-proxy",pid=7304,fd=4))        
LISTEN         0              128                             [::]:22                            [::]:*            users:(("sshd",pid=3708,fd=4))                
LISTEN         0              4096                            [::]:19000                         [::]:*            users:(("docker-proxy",pid=7423,fd=4))        
LISTEN         0              4096                            [::]:15432                         [::]:*            users:(("docker-proxy",pid=7315,fd=4))        
LISTEN         0              50                                 *:8080                             *:*            users:(("java",pid=6186,fd=8))  

浏览器访问IP+端口,例如我这里访问:http://192.168.226.29:19000/

默认用户名:admin    默认密码:admin

生成令牌

在jenkins页面中配置sonarqube的凭据

全局凭据类型选择 :Secret text
Secret(在sonarqube生成的令牌):sqa_c7943cdcc1631859eb1b21ed7bdfa6508b699f3e
ID  : sonarqube-token-id
描述:随便写,标识作用  

配置sonarqube-webhook凭据

来到jenkins的全局凭据配置里添加上

这里我用一个自己的gitee仓库获取ruoyi-vue的项目练习

六. 配置Docker

设置harbor仓库添加入不安全的设置中

[root@jenkins ~]# vim /etc/docker/daemon.json
{"insecure-registries": ["192.168.226.29"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"storage-driver": "overlay2"
}

让docker在不重启服务的情况下重新加载配置

[root@jenkins ~]# systemctl reload docker
[root@jenkins ~]# kill -SIGHUP $(pidof dockerd)

七. jenkins系统配置sonarqube

八. 配置pipeline

先下载git工具

[root@jenkins ~]# yum install -y git

修改代码,来到gitee

修改代码中的IP为你的IP

将代码中的接收邮箱改为你的邮箱进行实验 

提交更改 

九. 构建并集成

 第一次点构建一般会失败

等失败后排查问题,然后再点击构建时,如果推送到制品库了就需要修改一下版本号和项目唯一标识符,默认从3.80开始,每构建一次,修改一次版本号,避免推送冲突。

 

可看构建状态

遇到报错,请仔细检查前面的步骤是否不经意间搞错和漏掉。 

遇下图则是完成了整个CI/CD中的CI(持续集成)流程。

现在去制品库查看打包好的文件是否储存了

去Harbor镜像仓库查看是否正确存储

查看邮箱邮件

查看代码检查服务

会存在一定的代码BUG,但是都是不影响整体和可以承受的范围内的,如果想让代码检查严格,可以通过 SonarQube 质量阀进行详细设置。

相关文章:

CI/CD——CI持续集成实验

目录 一. 安装Docker 二. 部署Jenkins 三. 配置邮箱 四. Harbor部署 五. Nexus Repository部署 五. sonarqube安装 六. 配置Docker 七. jenkins系统配置sonarqube 八. 配置pipeline 九. 构建并集成 一. 安装Docker docker-ce镜像_docker-ce下载地址_docker-ce安装教程…...

2.4 大模型数据基础:预训练阶段数据详解 ——《带你自学大语言模型》系列

​本系列目录 《带你自学大语言模型》系列部分目录及计划&#xff0c;完整版目录见&#xff1a;带你自学大语言模型系列 —— 前言 第一部分 走进大语言模型&#xff08;科普向&#xff09; 第一章 走进大语言模型 1.1 从图灵机到GPT&#xff0c;人工智能经历了什么&#xf…...

Kali Linux——网络安全的瑞士军刀

一、引言 在网络安全的领域中&#xff0c;Kali Linux 宛如一把强大而全能的瑞士军刀&#xff0c;为安全研究人员和专业人士提供了丰富的工具和资源。本文将深入探讨 Kali Linux 的特点、优势、常用工具以及实际应用场景&#xff0c;带您领略这一强大操作系统的魅力。 二、Kal…...

UML建模-测试用例

用例可用于测试系统的正确性和有效性。 正确性表明系统的实现符合规格说明。有效性保证开发的系统是用户真正需要的系统。有效性检查一般在 系统开发之前进行。当用例模型构造完成后&#xff0c;开发者将模型交给用户讨论&#xff0c;由用户检查模型能否满足他们对系统的需求。…...

Python知识点:如何使用Socket模块进行网络编程

Python 的 socket 模块提供了一个底层网络接口&#xff0c;允许你通过编程进行网络通信。使用 socket 模块可以编写客户端和服务器端程序&#xff0c;从而实现数据在网络上的传输。以下是如何使用 socket 模块进行网络编程的详细说明。 1. 创建一个 Socket 首先&#xff0c;你…...

培训第二十一天(mysql用户创建与授权、角色创建)

上午 1、环境准备 [rootmysql ~]# rm -rf /etc/my.cnf //清空/etc目录下的my.cnf[rootmysql ~]# yum -y remove mariadb //移除mariadb[rootmysql ~]# find / -name "*mysql*" -exec rm -rf {} \; //删除mysql所有遗留文件 2、安装mysql绿包 [rootmysql ~]…...

makefile基本语法

在编写复杂的程序项目时&#xff0c;Makefile 是一个非常有用的工具&#xff0c;它能自动化构建过程。以下是一些基本的 Makefile 语法介绍&#xff1a; 基本结构&#xff1a; target: dependenciescommandtarget&#xff1a;构建目标&#xff0c;通常是一个文件&#xff0c;如…...

白骑士的PyCharm教学实战项目篇 4.4 大数据处理与分析

系列目录 上一篇&#xff1a;白骑士的PyCharm教学实战项目篇 4.3 自动化测试与持续集成​​​​​​​ 随着数据量的爆炸性增长&#xff0c;大数据处理与分析成为现代数据科学的重要课题。PyCharm提供了强大的功能&#xff0c;可以帮助开发者高效地进行大数据环境的配置与连接…...

无人机之民用无人机用途分类篇

一、航拍无人机 用于航拍摄影和电影制作&#xff0c;提供空中视角的拍摄服务。可用于电影制作、广告拍摄、房地产销售等。 二、物流无人机 用于快递和货物运输&#xff0c;提高物流效率&#xff0c;可以到达传统配送方式难以覆盖的地区&#xff0c;在突发事件如自然灾害、疫…...

Android10 修改设备名称

A10和A12的设备名称修改是不同的&#xff0c;A10设备名称修改分好几个位置 修改wifi默认名称 在framework/base模块下 diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 9041a7c3a14..7a1e63688c4 100644 --- a/core/res/res/values/…...

go testing 包

Go语言的testing包提供了一套丰富的测试工具&#xff0c;用于编写和运行测试用例。以下是testing包中一些常用的函数和类型&#xff1a; func TestMain(m *testing.M): 这是一个特殊的函数&#xff0c;用于执行测试的主函数。如果定义了TestMain&#xff0c;那么在运行go test时…...

基于phpstudy的靶场搭建和github加速

微软商店下载 watt toolkit&#xff0c;然后在侧边栏选择网络加速&#xff0c;勾选 github&#xff0c;就可以快速访问 github 1、下载搭建 sqlilabs github 找到 sqlilabs 靶场&#xff0c;点击 code&#xff0c;下载 zip解压之后&#xff0c;整体移动到 phpstudy_pro 文件夹…...

【数据结构】Map与Set

前言 前两篇文章我们研究了二叉搜索树与哈希表的结构与特点&#xff0c;他们二者是Map与Set这两个接口实现的底层结构&#xff0c;他们利用了搜索树与哈希表查找效率高这一特点&#xff0c;是一种专门用来进行搜索操作的容器或数据结构。本篇文章就让我们一起来梳理这两个接口的…...

Flamingo: a Visual Language Model for Few-Shot Learning

发表时间&#xff1a;NeurIPS 2022 论文链接&#xff1a;https://proceedings.neurips.cc/paper_files/paper/2022/file/960a172bc7fbf0177ccccbb411a7d800-Paper-Conference.pdf 作者单位&#xff1a;DeepMind Motivation&#xff1a;仅使用少量注释示例可以快速适应新任务…...

flume性能调优

作者&#xff1a;南墨 1.Source性能调优 1.1 Spooldir Source 使用Spooldir Source采集日志数据时&#xff0c;若每行日志数据<100bp&#xff0c;可以通过将多行合并传输来提升传输性能 建议合并时根据数据长度来确定多少行合并为一个单位进行传输&#xff0c;合并后的长…...

mysql 字符串转数组

在 MySQL 中&#xff0c;可以使用内置的字符串函数 SUBSTRING_INDEX() 和 REPLACE() 来实现将字符串转换为数组。 首先&#xff0c;使用 REPLACE() 函数将字符串中的分隔符替换为空格&#xff0c;然后使用 SUBSTRING_INDEX() 函数将字符串按空格分割成多个子字符串。最后&…...

UE基础 —— 术语

目录 Project Blueprint Class Object Actor Casting Component Pawn Character Player Controller AI Controller Player State Game Mode Game State Brush Volume Level World Project 项目&#xff08;Project&#xff09;包含游戏的所有内容&#xff0c…...

kubernets学习笔记——使用kubeadm构建kubernets集群及排错

使用kubeadm构建kubernets集群 一、准备工作1、repo源配置&#xff1a;阿里巴巴开源镜像源2、更新软件包并安装必要的系统工具3、同步时间4、禁用selinux5、禁用交换分区swap6、关闭防火墙 二、安装docker-ce、docker、cri-docker1、安装docker-ce2、开启内核转发&#xff0c;转…...

简述MYSQL聚簇索引、二级索引、索引下推

一丶聚簇索引 InnoDB的索引分为两种&#xff1a; 聚簇索引&#xff1a;一般创建表时的主键就会被mysql作为聚簇索引&#xff0c;如果没有主键则选择非空唯一索引作为聚簇索引&#xff0c;都没有则隐式创建一个索引作为聚簇索引&#xff1b;辅助索引&#xff1a;也就是非聚簇索…...

电脑开机后出现bootmgr is missing原因及解决方法

最近有网友问我为什么我电脑开机后出现bootmgr is missing&#xff0c;这个提示意思是:意思是启动管理器丢失&#xff0c;说明bootmgr损坏或者丢失&#xff0c;系统无法读取到这个必要的启动信息导致无法启动。原因有很多&#xff0c;比如我们采用的是uefi引导&#xff0c;而第…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...