Jenkins+Docker+Git实现自动化CI/CD

你是否还在手动构建、测试、部署过程中频繁等待?或者担心“我本地没问题,部署却报错”?在敏捷开发和 DevOps 时代,**持续集成与持续交付(CI/CD)**变得至关重要。将 Jenkins、Docker、Git 三者结合,能够帮助你实现“提交即验证,构建即发布”的极速自动化体验。

在如今的互联网时代,随着软件开发复杂度的不断提高,软件开发和发布管理也越来越重要。目前已经形成一套标准的流程,最重要的组成部分就是持续集成(Continuous Integration,CI)及持续部署、交付(CD)。在此,我们来以一个案例初步了解 CI 流程。那么什么是 CI 呢?简单来讲,CI 就是将传统的代码合并、构建、部署、测试都集成在一起,不断地执行这个过程,并对结果进行反馈。

持续集成和持续部署(CI/CD)是现代软件开发的核心实践,能够显著提高开发效率和代码质量。通过结合 Jenkins(自动化服务器)、Docker(容器化平台)和 Git(版本控制系统),可以构建一个高效的 CI/CD 管道,自动完成代码的构建、测试和部署。本指南详细介绍了如何使用这些工具实现自动化 CI/CD,基于多个可靠来源整理,适合从初学者到高级用户。

那么,怎么利用 Jenkins、Docker 和 Git 搭建一条高效、稳定的 CI/CD 流水线?涉及哪些核心步骤?哪些坑需要提前避开?本文将带你零基础上手,一步步实现自动化部署。

背景

CI/CD 旨在通过自动化流程减少手动操作,确保代码更改能够快速、可靠地集成和部署到生产环境。Jenkins 提供了一个灵活的平台来协调这些流程,Docker 确保环境一致性,而 Git 则用于管理代码版本。本指南以一个简单的 Node.js 应用程序为例,展示如何搭建一个完整的 CI/CD 管道。

CI 流程设计图:

图片

图片

 

工作流程:

  • 开发人员提交代码到Git版本仓库;

  • Jenkins人工/定时触发项目构建;

  • Jenkins拉取代码、代码编码、打包镜像、推送到镜像仓库;

  • Jenkins在Docker主机创建容器并发布

主机环境规划:

  • docker-jenkins:    10.0.0.98

  • docker-git-harbor:10.0.0.99

部署Git代码版本仓库

安装:

yum install git -y

配置git用户:

useradd gitpasswd git

创建库:

[git@docker-git-harbor ~]$ mkdir tomcat-java-demo.git[git@docker-git-harbor ~]$ cd tomcat-java-demo.git/[git@docker-git-harbor tomcat-java-demo.git]$ git --bare initInitialized empty Git repository in /home/git/tomcat-java-demo.git/[git@docker-git-harbor tomcat-java-demo.git]$ lsbranches  config  description  HEAD  hooks  info  objects  refs[git@docker-git-harbor tomcat-java-demo.git]$

另一台docker-jenkins访问该仓库:

[root@docker-jenkins ~]# git clone git@10.0.0.99:/home/git/tomcat-java-demo.gitCloning into 'solo'...The authenticity of host '10.0.0.99 (10.0.0.99)' can't beestablished.ECDSA key fingerprintis SHA256:XNWQhGsAsqd84k/6OYV3xl1+mPGjtASsxeV1YVLZVas.ECDSA keyfingerprint is MD5:b4:bd:16:2b:de:e7:7c:fd:c5:dd:91:75:20:ff:3e:0a.Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added '10.0.0.99' (ECDSA) to the list of known hosts.git@10.0.0.99'spassword:warning: You appear to have cloned an empty repository.[root@docker-jenkins ~]# lsanaconda-ks.cfg  tomcat-java-demo.git[root@docker-jenkins ~]# ls tomcat-java-demo.git[root@docker-jenkins ~]#

模拟生产项目,拉取github上的一个demo,并上传至本地git库

[root@docker-jenkins ~]# mv tomcat-java-demo tomcat-java-demo.bak[root@docker-jenkins ~]# git clone https://github.com/dingkai163/tomcat-java-demo.git[root@docker-jenkins tomcat-java-demo]# cat .git/config[core]repositoryformatversion = 0filemode = truebare = falselogallrefupdates = true[remote "origin"]url = git@10.0.0.99:/home/git/tomcat-java-demo.git  # 修改为本地的git库地址fetch = +refs/heads/*:refs/remotes/origin/*[branch "master"]remote = originmerge = refs/heads/master[root@docker-jenkins tomcat-java-demo]# git add .[root@docker-jenkins tomcat-java-demo]# git status# On branch masternothing to commit, working directory clean[root@docker-jenkins tomcat-java-demo]# git commit -m "all"# On branch masternothingto commit, working directory clean[root@docker-jenkins tomcat-java-demo]# git push origin mastergit@10.0.0.99'spassword:Counting objects: 229, done.Compressing objects: 100% (185/185), done.Writing objects: 100% (229/229), 4.52 MiB | 0 bytes/s, done.Total 229 (delta 25), reused 229 (delta 25)To git@10.0.0.99:/home/git/tomcat-java-demo.git* [new branch]      master -> master[root@docker-jenkins tomcat-java-demo]#

jenkins环境部署

部署jdk环境及maven

[root@docker-jenkins ~]# mkdir tools[root@docker-jenkins ~]# cd tools[root@docker-jenkins tools]# rz -y[root@docker-jenkins tools]# tar zxvf jdk-8u45-linux-x64.tar.gz[root@docker-jenkins tools]# mv jdk1.8.0_45 /usr/local/jdk[root@docker-jenkins tools]# vim /etc/profileJAVA_HOME=/usr/local/jdk PATH=$PATH:$JAVA_HOME/bin  CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME PATH CLASSPATH[root@docker-jenkins tools]# source /etc/profile[root@docker-jenkins tools]# java -versionjava version "1.8.0_45"Java(TM)SE Runtime Environment (build 1.8.0_45-b14)Java HotSpot(TM)64-Bit Server VM (build 25.45-b02, mixed mode)[root@docker-jenkins tools]# tar zxf apache-maven-3.5.0-bin.tar.gz[root@docker-jenkins tools]# mv apache-maven-3.5.0 /usr/local/maven

在10.0.0.98主机安装Jenkins,下载Tomcat二进制包将war包到webapps下即可:

[root@docker-jenkins tools]# wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war[root@docker-jenkins tools]# wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v8.5.38/bin/apache-tomcat-8.5.38.tar.gz[root@docker-jenkins tools]# tar zxf apache-tomcat-8.5.38.tar.gz[root@docker-jenkins tools]# lsapache-tomcat-8.5.38  apache-tomcat-8.5.38.tar.gz  jdk-8u45-linux-x64.tar.gz  jenkins.war[root@docker-jenkins tools]# mv apache-tomcat-8.5.38 /usr/local/tomcat-jenkins[root@docker-jenkins tools]# ls /usr/local/tomcat-jenkins/webapps/docs  examples  host-manager  manager  ROOT[root@docker-jenkins tools]# rm -rf /usr/local/tomcat-jenkins/webapps/*[root@docker-jenkins tools]# mv jenkins.war /usr/local/tomcat-jenkins/webapps/ROOT.war[root@docker-jenkins tools]# ll /usr/local/tomcat-jenkins/webapps/total 75520-rw-r--r--. 1 root root 77330344 Mar 15 00:55 ROOT.war[root@docker-jenkins tools]# cd /usr/local/tomcat-jenkins/bin/[root@docker-jenkins bin]# ./startup.shUsing CATALINA_BASE:   /usr/local/tomcat-jenkinsUsingCATALINA_HOME:   /usr/local/tomcat-jenkinsUsing CATALINA_TMPDIR: /usr/local/tomcat-jenkins/tempUsing JRE_HOME:        /usr/local/jdk1.8Using CLASSPATH:       /usr/local/tomcat-jenkins/bin/bootstrap.jar:/usr/local/tomcat-jenkins/bin/tomcat-juli.jarTomcat started.[root@docker-jenkins bin]#

启动后,浏览器访问http://10.0.0.98:8080/,按提示输入密码,登录即可。

图片

部署私有镜像仓库

构建Tomcat基础镜像,并推送到harbor镜像库:

[root@docker-git-harbor ~]# cd tomcat[root@docker-git-harbor tomcat]# cat Dockerfile-tomcatFROM centos:7MAINTAINER www.cnblogs.com/kaye/ENV VERSION=8.5.38RUN yum install java-1.8.0-openjdkwget curl unzip iproute net-tools -y && \yum clean all && \rm -rf /var/cache/yum/*RUN wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apachetomcat-${VERSION}.tar.gz && \tar zxf apache-tomcat-${VERSION}.tar.gz && \mv apache-tomcat-${VERSION} /usr/local/tomcat && \rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && \mkdir /usr/local/tomcat/webapps/test && \echo "ok" > /usr/local/tomcat/webapps/test/status.html && \sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && \ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeENV PATH $PATH:/usr/local/tomcat/binEXPOSE 8080CMD ["catalina.sh", "run"][root@docker-git-harbor tomcat]# docker build -t tomcat:v1 -f Dockerfile-tomcat .[root@docker-git-harbor tomcat]# docker tag tomcat:v1 reg.dingkai.com/library/tomcat:v1[root@docker-git-harbor tomcat]# docker login reg.dingkai.com[root@docker-git-harbor tomcat]# docker push reg.dingkai.com/library/tomcat:v1

Jenkins安装必要插件

由于jenkins是离线安装,所有在此需要配置一下插件下载地址:系统管理-->插件管理-->Advanced

图片

图片

修改下方地址,将https修改为http 再点Submit

图片

Submit后点击Available,Check now此时我们可以看到很多可获得插件

图片

首先搜索并安装Pipeline插件
pipeline 是一套运行于jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。

图片

再安装SCM to job 插件,同上步骤(搜索,安装)。

 

项目创建

创建jobs

图片

选择流水线类型

图片

到这里我们就开始配置Pipeline script,点击Pipeline语法,来自动生成我们需要的配置。

图片

如下图,我们Git方式,配置Git仓库地址,再添加认证相关

图片

这里我们使用的是秘钥认证方式,需要将jenkins上生成的公钥发送到git服务器上,然后将jenkins上的生成的私钥内容粘贴到下图Key中,这样jenkins就可以免交互的拉取git仓库中的代码了。

[root@docker-jenkins bin]# ssh-keygenGenerating public/private rsa key pair.Enter file in which tosavethe key (/root/.ssh/id_rsa):Enterpassphrase (empty for no passphrase):Enter same passphrase again:Your identification hasbeen saved in /root/.ssh/id_rsa.Your public keyhas been saved in /root/.ssh/id_rsa.pub.The keyfingerprint is:SHA256:1vD8XM3lDYFmrxgAbwPTLwb0fl+oEx8cFgtykpg4ODI root@docker-jenkinsThe key's randomart image is:+---[RSA 2048]----+|   . o==o.o ...  ||E o o +=++ .+o . || o . . .*o o+.. .||       oo*oo o.=o||       .S.*o+.o =||       . ..B.+   ||          o =    ||           .     ||                 |+----[SHA256]-----+[root@docker-jenkins bin]# cd[root@docker-jenkins ~]#[root@docker-jenkins ~]#[root@docker-jenkins ~]# ls .ssh/id_rsa  id_rsa.pub  known_hosts[root@docker-jenkins ~]# ssh-copy-id git@10.0.0.99/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keysgit@10.0.0.99'spassword:Number of key(s)added: 1Now trylogging into the machine, with:   "ssh 'git@10.0.0.99'"andcheck to make sure that onlythe key(s)you wanted were added.[root@docker-jenkins ~]#

图片

 

图片

配置完成后,我们就可以生成Pipeline脚本了。点击下方Generate Pipeline Script,然后复制方框内的内容。

图片

编写我们所需要的Pipeline脚本如下,将其粘贴到script的拉取代码模块中,并修改分支master为${branch},其他模块内容自行编写。

node { // 拉取代码   stage('Git Checkout') { checkout([$class: 'GitSCM', branches: [[name: '${branch}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'c42214eb-db1e-49fb-83c9-f78d1f4310a2', url: 'git@10.0.0.99:/home/git/tomcat-java-demo.git']]])}   // 代码编译   stage('Maven Build') {sh '''        export JAVA_HOME=/usr/local/jdk/usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true        '''   }   // 项目打包到镜像并推送到镜像仓库   /usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true        '''   }   // 项目打包到镜像并推送到镜像仓库   stage('Build and Push Image') {sh '''REPOSITORY=reg.dingkai.com/library/tomcat-java-demo:${branch}cat > Dockerfile << EOFFROM reg.dingkai.com/library/tomcat:v1 MAINTAINER kaiRUN rm -rf /usr/local/tomcat/webapps/*ADD target/*.war /usr/local/tomcat/webapps/ROOT.war
EOFEOFdocker build -t $REPOSITORY .docker login reg.dingkai.com -u admin -p 123456docker push $REPOSITORY'''}// 部署到Docker主机'''}// 部署到Docker主机stage('Deploy to Docker') {sh '''REPOSITORY=reg.dingkai.com/library/tomcat-java-demo:${branch}docker rm -f tomcat-java-demo |truedocker pull $REPOSITORYdocker container run -d --name tomcat-java-demo -p 88:8080 $REPOSITORY'''}
}

图片

在Pipeline脚本里面我们指定了一个branch参数,所以我们需要传递一个参数变量,这里我们选择参数化构建,默认值为master分支。

图片

然后保存配置。

开始构建任务

回到主界面,我们开始构建任务

图片

可以通过Console Output输出查看jenkins构建流程

图片

成功构建会提示: SUCCESS

图片

我们也可以查看构建成功后的图形构建过程

图片

方法比较

方法

优点

缺点

适用场景

Freestyle Project

配置简单,适合初学者

灵活性较低,难以管理复杂流程

简单应用,快速上手

Jenkins Pipeline

高度可定制,支持复杂流程

需要学习 Groovy 语法

复杂项目,需多阶段管理

Docker 集成

环境一致,易于部署

需要熟悉 Docker 命令

容器化应用

GitHub Webhook

实现自动化触发

需要正确配置 Webhook 和网络

任何需要自动化的项目

注意事项

  • 安全性

    • 使用 HTTPS 访问 Jenkins,避免暴露敏感信息。

    • 限制 Jenkins 和 Docker 的访问权限。

  • 扩展性

    • 添加测试阶段(如单元测试、集成测试)以提高代码质量。

    • 使用 Docker Hub 或私有仓库存储镜像,便于版本管理和分发。

  • 法律与道德

    • 确保 CI/CD 管道的自动化操作符合目标环境的条款和法律法规。

    • 避免对服务器或服务造成过大负载。

结论

Jenkins + Docker + Git 共同构建的是一条高度自动化、可监控、灵活扩展的 CI/CD 流水线。实践的关键是三个核心原则:

  1. 环境一致(Docker 容器)

  2. 流程自动(Jenkins Pipeline)

  3. 触发准确(Git Push)

只要掌握以上三点,你的发布流程就能从“手工繁琐”变成“智能流水线”。

随着 DevOps 和微服务趋势深入,CI/CD 已成为团队标配工具链。然而,“自动化”不只是命令式执行,更是一种规范。正确配置 Jenkins + Docker + Git,不仅释放人力,还强化质量管理。不少企业采用该方案后,发布频率从“每月一次”提升至“每天甚至每小时一次”。

通过 Jenkins、Docker 和 Git,可以构建一个高效的 CI/CD 管道,自动化完成代码的构建、测试和部署。Freestyle Project 适合快速上手,而 Jenkins Pipeline 提供更高的灵活性。根据项目需求选择合适的配置,并结合 Webhook 实现全自动化流程。上述步骤和示例代码基于实际案例,确保了可操作性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/90091.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/90091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache Ignite 的 SQL 功能和分布式查询机制

这段内容讲的是 Apache Ignite 的 SQL 功能和分布式查询机制。我们可以从几个关键点来理解&#xff1a;一、Ignite 是一个分布式 SQL 数据库 ✅ 特点&#xff1a; 符合 ANSI-99 SQL 标准水平扩展&#xff08;可扩展到多个节点&#xff09;容错&#xff08;fault-tolerant&#…

C++中的deque容器

deque容器基本概念功能&#xff1a;双端数组&#xff0c;可以对头端进行插入和删除操作deque与vector区别&#xff1a;vector对于头部的插入删除掉率低&#xff0c;数据量越大&#xff0c;效率越低deque相对而言&#xff0c;对头部的插入删除速度会比vector快vetcor访问元素时的…

闲庭信步使用图像验证平台加速FPGA的开发:第三十课——车牌识别的FPGA实现(2)实现车牌定位

&#xff08;本系列只需要modelsim即可完成数字图像的处理&#xff0c;每个工程都搭建了全自动化的仿真环境&#xff0c;只需要双击top_tb.bat文件就可以完成整个的仿真&#xff0c;大大降低了初学者的门槛&#xff01;&#xff01;&#xff01;&#xff01;如需要该系列的工程…

前端性能优化:从“龟速“到“闪电“的终极加速指南

一、性能指标:你的网站"体检报告" 📊 1. 核心Web指标(Google排名因素) 指标 全称 优秀标准 优化方向 LCP 最大内容绘制 ≤2.5s 关键资源预加载 FID 首次输入延迟 ≤100ms 减少长任务 CLS 累计布局偏移 ≤0.1 预留图片尺寸 测量方法: // 使用web-vitals库测量…

Linux 重定向和缓冲区

序言&#xff1a; 前面在Linux 基础文件IO操作-CSDN博客这篇博客里说了很多函数无论是在语言层还是在系统调用的方面。在调用系统调用open的时候会返回一个整型&#xff0c;在write传参的时候第一个参数是一个叫fd的东西&#xff0c;这个是什么东西&#xff1f;这篇博客会详细…

web登录页面

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>简易登录页面</title><style>* {mar…

Java中关于线程池的解析

引语在学习了线程与多线程的相关知识后&#xff0c;我们已经能够实现在程序中使多个任务并行&#xff0c;但是我们在操作时候&#xff0c;往往每执行一个的任务就需要创建一个新的线程。这种方式在需要执行任务很多时不利于我们对线程的管理&#xff0c;且创建过多线程也非常占…

J2EE模式---前端控制器模式

前端控制器模式基础概念前端控制器模式&#xff08;Front Controller Pattern&#xff09;是一种结构型设计模式&#xff0c;其核心思想是将应用程序的所有请求集中到一个中央处理器&#xff08;前端控制器&#xff09;进行处理&#xff0c;由它负责接收请求、协调处理流程并返…

模块加载、ES、TS、Babel 浅析

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

day056-Dockerfile案例与Docker Compose

文章目录0. 老男孩思想-老男孩名言警句1. Dockerfile指令&#xff1a;ENV与ARG的区别&#xff1f;2. 创建WordPress镜像2.1 CA证书2.1.1 客户端访问HTTPS站点&#xff08;阿里云镜像源&#xff09;过程2.1.2 查看Windows的CA证书2.1.3 ubuntu查看CA证书是否安装2.2 准备apt下载…

gcc 源码分析:从IR-RTL 到汇编输出

在完成了IR-RTL的优化与寄存器分配后就来到汇编代码的输出&#xff1a;实现如下&#xff1a;class pass_final : public rtl_opt_pass { public:pass_final (gcc::context *ctxt): rtl_opt_pass (pass_data_final, ctxt){}/* opt_pass methods: */unsigned int execute (functi…

STC89C52系列单片机内部结构详解

STC89C52 是基于 MCS-51 内核的增强型单片机&#xff0c;其内部结构集成了多种功能模块&#xff0c;具备强大的数据处理和控制能力&#xff0c;是嵌入式系统中常用的一种微控制器。本文将结合内部结构框图&#xff0c;详细介绍 STC89C52 的各个核心组成部分及其功能作用。一、中…

Linux防火墙管理和基础服务(FTP/SFTP)

防火墙管理# 开放端口firewalld-cmd --add-port880/tcp --permanent# 移除端口或阻止端口firewalld-cmd --remove-port880/tcp --permanent# 重启服务systemctl restart firewalld# 查看防火墙开放哪些端口&#xff08;查看当前区域的规则&#xff09;firewall-cmd --lis…

Selenium+Java 自动化测试入门到实践:从环境搭建到元素操作

在自动化测试领域&#xff0c;Selenium 凭借其强大的跨浏览器兼容性和灵活的 API&#xff0c;成为 Web 应用测试的首选工具。而 Java 作为一门稳定且广泛应用的编程语言&#xff0c;与 Selenium 结合能构建出高效、可维护的自动化测试框架。本文将从环境搭建开始&#xff0c;逐…

Hugging Face 模型的缓存和直接下载有什么区别?

Hugging Face 模型的缓存和直接下载&#xff08;下载到本地文件夹&#xff09;是两种不同的模型管理方式&#xff0c;它们在使用场景、存储结构和效率上各有优劣。 以下是它们之间的主要区别&#xff1a; Hugging Face 缓存 (Cache) 当您通过 transformers 库中的 from_pretrai…

JavaScript AJAX 实现,演示如何将 Token 添加到 Authorization

以下是一个完整的原生 JavaScript AJAX 实现&#xff0c;演示如何将 Token 添加到 Authorization 头部的示例&#xff1a;基础实现html复制代码<!DOCTYPE html> <html> <head><title>AJAX Token 示例</title><script>// 获取当前用户的 To…

开发语言的优劣势对比及主要应用领域分析

开发语言是程序员用来编写软件指令的工具。每种语言都有自己的设计哲学、语法&#xff08;规则&#xff09;和应用场景&#xff0c;但没有“放之四海而皆准”的最佳语言。以下是主流和重要开发语言的介绍&#xff0c;按主要应用领域分类&#xff1a; 一、全能型语言 (可在多个领…

Java学习-------事务失效

在 Java 开发中&#xff0c;事务是保证数据一致性和完整性的关键机制&#xff0c;尤其在涉及多步数据库操作的业务场景中不可或缺。然而&#xff0c;在实际开发过程中&#xff0c;事务常常会出现 “失效” 的情况 —— 预期的回滚没有发生&#xff0c;数据出现不一致。 Java 事…

JavaScript 01 JavaScript 是什么

1.1 JavaScript 是什么JavaScript 是一门世界上最流行的脚本语言&#xff08;基本所有平台的所有软件都会用到它&#xff09;。“1994年&#xff0c;网景公司(Netscape)发布了Navigator浏览器0.9版。这是历史上第一个比较成熟的网络浏览器&#xff0c;轰动一时。但是&#xff0…

Bun v1.2.19发布,node_modules隔离,sql比node快6倍

大家好,我是农村程序员,独立开发者,行业观察员,前端之虎陈随易。我会在这里分享关于 独立开发、编程技术、思考感悟 等内容,欢迎关注。 技术群与交朋友请在个人网站联系我,网站 1️⃣:https://chensuiyi.me,网站 2️⃣:https://me.yicode.tech。 如果你觉得本文有用…