Jenkins与Gitee Webhook配置实战:实现代码推送自动部署
1. 项目概述与核心价值上次我们聊了Jenkins和Gitee对接的基础配置把代码拉取和构建的架子搭起来了。但很多朋友在实际操作时发现从“构建成功”到“服务上线”这最后一步才是真正考验人的地方。今天这篇我们就来啃这块硬骨头聚焦在Jenkins中配置Gitee Webhook实现代码推送后全自动部署的完整闭环。这不仅仅是点几个按钮而是涉及到网络打通、安全配置、脚本编写和错误排查的一整套工程实践。简单来说我们要实现的效果是开发者在本地将代码推送到Gitee的特定分支比如main或masterGitee会立即通知我们的Jenkins服务器。Jenkins收到通知后自动触发预设的构建任务执行拉取代码、安装依赖、编译打包等一系列操作最后将构建产物部署到目标服务器上整个过程无需人工干预。这能极大提升开发到上线的效率也是持续集成/持续部署CI/CD的核心场景。无论你是运维、后端还是前端开发者只要你的项目需要频繁更新这套流程都能帮你节省大量重复劳动时间。2. 环境准备与前置条件核查在开始配置Webhook之前我们必须确保几个关键环节是通畅的。很多自动部署失败的问题根源都出在环境准备阶段。2.1 Jenkins与Gitee的网络连通性这是最基础也最容易被忽略的一点。你的Jenkins服务器必须能够被Gitee的公网服务器访问到。因为Webhook的本质是Gitee向你的Jenkins发送一个HTTP POST请求。如果你的Jenkins部署在公司内网或家庭宽带无公网IPGitee是无法直接访问到的。你需要一个“中间人”来转发请求。通常有两种主流方案内网穿透工具例如使用ngrok、frp或一些云服务商提供的内网穿透服务。你需要将Jenkins的Web服务端口默认8080映射到一个公网可访问的域名或IP上。操作时务必注意安全设置访问令牌避免服务被恶意扫描。使用Gitee企业版或搭建反向代理如果公司有公网服务器可以在其上配置Nginx反向代理将特定路径的请求转发到内网的Jenkins。这需要一定的网络知识。验证方法你可以暂时在防火墙中为Jenkins的端口如8080放行并尝试用你的手机4G网络访问http://你的公网IP:8080看是否能打开Jenkins登录页。如果打不开Webhook配置必然失败。2.2 Jenkins所需插件安装与更新确保以下插件已安装并更新到较新版本。进入Jenkins管理后台 - 管理插件 - 已安装页面进行核对。Gitee Plugin这是核心插件提供了Gitee的专用配置项和触发器。如果之前安装过建议检查更新。Git plugin基础Git支持。Pipeline或Multibranch Pipeline如果你使用流水线Pipeline脚本的方式构建则需要这个插件。它提供了更灵活、可版本化的构建定义方式。Publish Over SSH可选但推荐如果你需要将构建产物部署到另一台Linux服务器这个插件可以方便地通过SSH执行远程命令或传输文件比在脚本里写scp密码要安全方便得多。安装插件后记得重启Jenkins服务以使插件生效。一个小技巧在插件管理页面你可以使用过滤框快速搜索插件名称比一页页翻找高效得多。2.3 Gitee仓库访问权限配置Jenkins需要从Gitee拉取代码。推荐使用SSH密钥方式比账号密码更安全且不受Gitee密码修改的影响。在Jenkins服务器生成SSH密钥对ssh-keygen -t rsa -b 4096 -C jenkinsyour-server -f ~/.ssh/jenkins_gitee执行后会在~/.ssh/目录下生成jenkins_gitee私钥和jenkins_gitee.pub公钥两个文件。私钥必须严格保密。将公钥配置到Gitee登录你的Gitee账号。进入设置 - SSH公钥。标题可以写“Jenkins Production Server”将jenkins_gitee.pub文件的内容全部复制粘贴到“公钥”框中然后点击“确定”。在Jenkins中配置私钥进入Jenkins管理后台 - 管理凭据 - 系统 - 全局凭据 - 添加凭据。种类选择“SSH Username with private key”。范围保持默认。ID可以起一个有意义的名字如gitee-ssh-key。描述可选如“用于拉取Gitee代码的密钥”。用户名填写你在Gitee注册的邮箱或用户名。私钥选择“Enter directly”然后点击“Add”将jenkins_gitee私钥文件的内容全部粘贴进来包括-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----这些行。点击“创建”。测试连接 在Jenkins服务器上可以手动测试一下密钥是否生效ssh -T -i ~/.ssh/jenkins_gitee gitgitee.com如果返回 “Hi XXX! You‘ve successfully authenticated...”说明配置成功。这一步的测试能提前排除80%的代码拉取失败问题。3. Jenkins任务配置详解环境准备好后我们开始配置Jenkins的构建任务。这里以最常用的“自由风格软件项目”为例演示如何配置一个完整的、可被Webhook触发的自动部署任务。3.1 创建与基础设置在Jenkins首页点击“新建Item”输入任务名称例如your-project-auto-deploy选择“自由风格软件项目”点击“确定”。源码管理选择Git。Repository URL填写你的Gitee仓库的SSH地址格式如gitgitee.com:your-username/your-repo.git。强烈建议使用SSH地址避免HTTPS地址可能遇到的证书或密码问题。凭据点击“添加”选择类型为“SSH Username with private key”然后选择我们在上一步创建的gitee-ssh-key凭据。如果列表中没有请检查凭据是否创建在“系统”域下。分支指定要监听的分支例如*/main或*/master。如果你想监听多个分支可以配置多个分支源或者使用后面会提到的“GitLab Hook”触发器的过滤功能。3.2 构建触发器配置Webhook核心这是实现自动化的关键。我们需要配置Jenkins何时开始构建。在任务配置页面找到“构建触发器”区域。勾选“Gitee webhook 触发构建”或类似的选项取决于Gitee插件版本可能叫“Build when a change is pushed to Gitee”。勾选后下方会出现一个“Gitee webhook 密码”的输入框。这里需要生成一个Token。点击输入框旁边的“高级”按钮如果可见。找到“Secret Token”或“生成”按钮。点击“生成”。系统会生成一串随机的字符如a1b2c3d4e5f6...。立即复制这串字符并妥善保存。我们稍后要在Gitee仓库的Webhook设置里填入它。这串Token用于验证Webhook请求的合法性防止任何人随便发个请求就能触发你的构建是重要的安全措施。同时页面上会显示你的Jenkins任务的Webhook URL格式通常为http://你的Jenkins地址/gitee-project/你的任务名。也请复制这个URL。注意这个Token一旦生成在Jenkins页面上就只显示一次。如果你忘记了或丢失了需要删除这个触发器配置项重新勾选并再次生成。所以务必第一时间保存好。3.3 构建环境与构建步骤触发器配置好后我们来定义构建时具体做什么。构建环境可选但有用“Delete workspace before build starts”每次构建前清空工作空间。这能确保每次构建都是从干净的环境开始避免残留文件导致构建失败。对于依赖复杂或构建产物大的项目建议勾选但会稍微增加构建时间因为要重新拉取全部代码。“Provide Node npm bin/ folder to PATH”如果你的项目是Node.js项目可以在这里指定一个全局安装的Node.js版本。这比在构建步骤里用nvm use更稳定。你需要先在“全局工具配置”中安装好对应的Node.js版本。构建步骤 这是任务的核心你可以添加多个步骤。点击“增加构建步骤”。执行Shell对于Linux服务器或执行Windows批处理命令对于Windows服务器这是最常用的步骤。在命令框中编写你的构建和部署脚本。一个典型的Node.js项目脚本可能如下# 打印环境信息便于调试 echo 当前目录$(pwd) echo Node版本$(node -v) echo NPM版本$(npm -v) # 检查是否成功拉取了代码 if [ ! -f package.json ]; then echo 错误未找到package.json代码拉取可能失败 exit 1 fi # 安装依赖使用淘宝镜像加速 echo 正在安装依赖... npm config set registry https://registry.npmmirror.com/ npm install --verbose # 或者使用 yarn # yarn install --verbose # 运行测试如果有 # echo 正在运行单元测试... # npm test # 构建项目例如Vue/React项目 echo 正在构建项目... npm run build # 检查构建产物 if [ -d dist ]; then echo 构建成功构建产物位于 dist 目录。 # 这里可以添加部署到服务器的命令例如使用scp或rsync # scp -r dist/* useryour-server:/path/to/deploy/ else echo 错误构建失败未生成dist目录 exit 1 fi调用顶层Maven目标如果是Java Maven项目可以直接使用这个步骤来执行mvn clean package。Send files or execute commands over SSH如果你安装了Publish Over SSH插件这里会出现这个选项。这是部署的神器。你可以在“系统配置”中预先配置好目标服务器的SSH连接使用密钥登录然后在这里选择服务器并直接编写要在目标服务器上执行的部署命令例如# 在目标服务器上执行的命令 cd /var/www/your-project git pull origin main npm install --production pm2 restart your-app或者选择将构建产物如dist/*传输到目标服务器的指定路径。3.4 构建后操作构建完成后无论成功与否我们可能还需要做一些事情。邮件通知安装Email Extension Plugin后可以配置非常灵活的邮件通知。例如只有构建失败时才发邮件给相关负责人成功则静默。构建产物归档可以归档生成的Jar包、War包或前端静态文件保留历史版本。触发下游项目如果部署流程分多个阶段如构建、测试、部署到预发、部署到生产可以在这里触发下一个Jenkins任务。配置完成后点击页面底部的“保存”。4. Gitee仓库Webhook配置现在我们需要告诉Gitee当代码有变动时应该通知哪个Jenkins。打开你的Gitee仓库页面点击“管理”-“WebHooks”-“添加WebHook”。URL粘贴之前在Jenkins任务中复制的Webhook URL。密码粘贴之前在Jenkins任务中生成的Secret Token。触发事件通常选择“Push 事件”即可。这意味着代码推送包括分支推送、标签推送会触发。你也可以根据需要选择“合并请求”等事件。点击“添加”。添加成功后Gitee会立即发送一个“测试”请求Ping到你的Jenkins URL。你可以在Webhook列表看到最近发送记录。如果显示“成功”恭喜你网络和基础配置通了。如果显示“失败”请点击“编辑”查看失败详情常见原因是URL无法访问网络问题或Jenkins返回了非200状态码。5. 实战调试与排坑指南配置完成后第一次尝试往往不会一帆风顺。下面是我在多次实践中总结的常见问题及解决方法。5.1 Webhook触发失败Gitee端报错问题现象Gitee Webhook测试或实际推送后记录显示“失败”或“超时”。排查思路检查URL可达性在公网环境如用手机4G网络下用浏览器或curl命令访问你的Jenkins Webhook URL。看是否能收到响应哪怕是404或Jenkins登录页。如果完全不通是网络问题。检查Jenkins安全设置进入“系统管理” - “安全设置”。如果启用了“防止跨站点请求伪造CSRF”需要确保Gitee的请求头能被通过。一个简单的测试方法是暂时取消勾选此项保存后测试Webhook。如果通了说明是CSRF问题。更安全的做法是在“安全设置”中将Gitee的IP段添加到“代理兼容性”的“Host Allowlist”中。检查防火墙确保Jenkins服务器的防火墙如iptables、firewalld或云服务商的安全组开放了Web服务端口默认8080。查看Jenkins日志Jenkins的日志位于JENKINS_HOME/logs目录下或者可以在管理页面的“系统日志”中查看。搜索gitee或你的任务名看是否有相关错误信息。5.2 Webhook触发成功但Jenkins不构建问题现象Gitee显示Webhook发送成功200但Jenkins的任务队列里没有出现新的构建。排查思路检查触发器配置确认Jenkins任务中“Gitee webhook触发构建”已勾选并且Secret Token与Gitee中配置的完全一致注意首尾空格。检查分支过滤确认Gitee推送的分支是否匹配Jenkins任务中配置的“分支”字段。例如你推到了develop分支但Jenkins只监听main分支。查看Gitee插件日志在Jenkins的“系统管理” - “系统日志”中找到名为com.dabsquared.gitlabjenkins.GiteeWebHookCause或类似的日志记录器将日志级别调整为FINE或ALL。然后再次触发Webhook查看详细日志看插件是否解析了请求并决定触发构建。手动测试触发器在Jenkins任务页面点击左侧的“立即构建”看任务是否能正常手动运行。如果手动都不行问题出在任务本身的配置如源码拉取、Shell脚本错误而非Webhook。5.3 构建过程中脚本执行失败问题现象构建被触发但在“构建步骤”中失败控制台输出报错。排查思路仔细阅读控制台输出Jenkins构建页面的“控制台输出”是黄金排错资料。从第一行开始看错误信息通常很明确例如npm: command not foundNode环境问题、Permission denied权限问题、脚本语法错误等。环境变量问题Jenkins执行Shell的环境可能与你的登录Shell环境不同。在脚本开头使用env命令打印所有环境变量或者显式地source ~/.bashrc或source /etc/profile来加载你的环境。路径问题Jenkins的工作空间路径可能包含空格或特殊字符。在脚本中使用绝对路径或者用pwd命令确认当前目录。权限问题Jenkins进程通常以jenkins用户运行。确保该用户有权限执行你脚本中的命令如npm、docker以及对工作空间目录的读写权限。对于需要sudo的命令需要谨慎配置通常建议避免在构建脚本中使用sudo而是通过配置jenkins用户的权限组来解决。5.4 一个实用的调试技巧使用“Generic Webhook Trigger”插件如果你觉得Gitee插件调试困难可以尝试一个更通用的插件Generic Webhook Trigger Plugin。它几乎可以处理任何来源的HTTP POST请求。安装该插件。在Jenkins任务的“构建触发器”中勾选“Generic Webhook Trigger”。配置一个Token类似Gitee插件的Secret。在Gitee的Webhook中URL格式变为http://JENKINS_URL/generic-webhook-trigger/invoke?tokenYOUR_TOKEN。该插件强大之处在于你可以配置从POST请求的JSON体中提取变量如分支名、提交者并用这些变量来过滤是否触发构建、或者传递给构建脚本使用。这种方法虽然配置稍复杂但更灵活且日志清晰便于调试Webhook请求本身的内容。6. 进阶使用Pipeline流水线脚本对于更复杂、步骤更多的项目或者希望将构建流程也像代码一样进行版本管理推荐使用Pipeline。你可以创建一个“流水线”类型的任务或者在自由风格任务中增加“Pipeline”构建步骤。Pipeline脚本Jenkinsfile可以存放在你的项目根目录随代码一起管理。一个简单的声明式Pipeline示例如下pipeline { agent any // 指定在任何可用代理上运行 triggers { gitee( secretToken: 你的SecretToken // 这里可以直接写或引用Jenkins的凭据ID ) } stages { stage(拉取代码) { steps { git branch: main, credentialsId: gitee-ssh-key, // 引用之前创建的SSH密钥凭据ID url: gitgitee.com:your-username/your-repo.git } } stage(安装依赖) { steps { sh npm config set registry https://registry.npmmirror.com/ sh npm install } } stage(运行测试) { steps { sh npm run test:unit } } stage(构建) { steps { sh npm run build } } stage(部署) { steps { // 使用SSH插件执行远程命令 sshPublisher( publishers: [ sshPublisherDesc( configName: production-server, // 在系统配置中定义的SSH服务器名称 transfers: [ sshTransfer( sourceFiles: dist/**, removePrefix: dist, remoteDirectory: /var/www/html ) ], execCommand: cd /var/www/html chown -R www-data:www-data . ) ] ) } } } post { success { emailext ( subject: 构建成功: ${env.JOB_NAME} - ${env.BUILD_NUMBER}, body: 项目 ${env.JOB_NAME} 构建成功详情请查看: ${env.BUILD_URL}, to: teamexample.com ) } failure { emailext ( subject: 构建失败: ${env.JOB_NAME} - ${env.BUILD_NUMBER}, body: 项目 ${env.JOB_NAME} 构建失败请及时检查详情: ${env.BUILD_URL}, to: devopsexample.com ) } } }使用Pipeline的好处是整个构建流程清晰可见每个阶段Stage的成功与否一目了然并且可以方便地实现并行构建、条件判断等复杂逻辑。将Jenkinsfile提交到代码仓库也实现了“Pipeline as Code”使CI/CD流程可追溯、可评审。走到这一步你的JenkinsGitee自动部署流水线应该已经能够稳定运行了。核心在于理解Webhook的通信原理、确保网络畅通、仔细配置凭据和触发器并善用控制台输出进行调试。这套流程一旦跑通对于日常的代码集成和部署来说效率的提升是巨大的。

相关新闻

在Windows上解锁Mesa3D的图形潜能:开源驱动完全指南

在Windows上解锁Mesa3D的图形潜能:开源驱动完全指南

在Windows上解锁Mesa3D的图形潜能:开源驱动完全指南 【免费下载链接】mesa-dist-win Pre-built Mesa3D drivers for Windows 项目地址: https://gitcode.com/gh_mirrors/me/mesa-dist-win 想要在Windows系统上获得强大的开源图形支持吗?Mesa3D fo…

2026/10/18 10:22:34 阅读更多 →
C++反射机制实现:从原理到工程实践

C++反射机制实现:从原理到工程实践

1. 项目概述:为什么C需要“镜子”?在C的世界里摸爬滚打久了,你可能会遇到一个非常现实且头疼的问题:面对一个未知的类对象,你如何知道它有哪些成员函数?它的属性叫什么名字?是什么类型&#xff…

2026/10/17 3:44:57 阅读更多 →
STM32开发环境搭建与HAL库应用实战指南

STM32开发环境搭建与HAL库应用实战指南

1. 项目概述:从零搭建STM32开发环境对于刚接触STM32的开发者来说,第一个工程往往是最难迈出的一步。面对芯片选型、工具链配置、代码生成等一系列问题,很容易让人望而却步。今天,我就以最经典的STM32F103C8T6(俗称“蓝…

2026/10/18 5:18:32 阅读更多 →

最新新闻

1~30秒参考音频克隆任意声音:Seed-VC 零样本语音转换完整零训练指南

1~30秒参考音频克隆任意声音:Seed-VC 零样本语音转换完整零训练指南

1~30秒参考音频克隆任意声音:Seed-VC 零样本语音转换完整零训练指南 【免费下载链接】seed-vc zero-shot voice conversion & singing voice conversion, with real-time support 项目地址: https://gitcode.com/GitHub_Trending/se/seed-vc 有一场会要开…

2026/10/19 2:01:28 阅读更多 →
MiniCPM-V-2_6-GPTQ 视频理解全流程:64 帧看懂一整段视频

MiniCPM-V-2_6-GPTQ 视频理解全流程:64 帧看懂一整段视频

MiniCPM-V-2_6-GPTQ 视频理解全流程:64 帧看懂一整段视频 【免费下载链接】antimicrox Graphical program used to map keyboard buttons and mouse controls to a gamepad. Useful for playing games with no gamepad support. 项目地址: https://gitcode.com/Gi…

2026/10/19 2:01:28 阅读更多 →
biliTickerBuy 完整使用指南:免费开源的 B 站会员购抢票辅助工具,开售自动下单

biliTickerBuy 完整使用指南:免费开源的 B 站会员购抢票辅助工具,开售自动下单

biliTickerBuy 完整使用指南:免费开源的 B 站会员购抢票辅助工具,开售自动下单 【免费下载链接】biliTickerBuy b站会员购购票辅助工具 项目地址: https://gitcode.com/GitHub_Trending/bi/biliTickerBuy 开售那几秒,你连刷七八次页面,「立即购买」刚亮起就弹出排队提示…

2026/10/19 2:01:28 阅读更多 →
低功耗设计中的反直觉陷阱:为什么进入 STOP 模式电流反而变大了?

低功耗设计中的反直觉陷阱:为什么进入 STOP 模式电流反而变大了?

摘要: 可穿戴设备续航从 7 天缩水到 2 天,电池容量没变、固件逻辑没改,问题出在低功耗模式上。更诡异的是——进入 STOP 模式后电流反而比 RUN 模式更大。这不是硬件故障,而是低功耗设计里最反直觉的一类陷阱:GPIO 悬空、外设时钟未关、上拉下拉配错、调试接口未禁用……每…

2026/10/19 2:01:28 阅读更多 →
Qwen-Image-Layered-6bit分层质量调优:steps与resolution如何取舍才最划算

Qwen-Image-Layered-6bit分层质量调优:steps与resolution如何取舍才最划算

【免费下载链接】Qwen-Image-Layered-6bit 项目地址: https://ai.gitcode.com/hf_mirrors/zimengxiong/Qwen-Image-Layered-6bit 点击查看 免费下载 Qwen-Image-Layered-6bit 是面向 Apple Silicon 的 6-bit 量化图像分层模型,能把任意图片分解为多张 R…

2026/10/19 2:01:28 阅读更多 →
ABAP Cloud 的 OLTP 开发,从数据增删改查走向完整的业务事务

ABAP Cloud 的 OLTP 开发,从数据增删改查走向完整的业务事务

采购申请页面上的保存按钮,背后通常不只有一次数据库写入。申请抬头需要保存,行项目需要关联,金额需要计算,供应商需要校验,当前操作者还必须具备相应权限。只要其中一项没有满足业务要求,系统就不能把这张申请当成一份完整、有效的业务单据。 这类围绕业务数据开展读取…

2026/10/19 2:00:28 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →