资讯动态

Jenkins持续集成实战:从环境搭建到团队习惯养成

发布时间:2026/10/16 1:20:23 来源:尧图企业网站定制
1. 为什么我最终选择了 Jenkins 而不是其他方案第一次接触持续集成这个概念是在一个三人小团队里。当时我们的协作方式极其原始每个人本地跑完测试手动把代码合并到主分支然后由一个人负责打包、上传、部署。听起来好像没什么问题但实际执行起来一周至少出两次事故——要么是某个人忘了跑测试就合并要么是打包时用了错误的配置文件要么是部署到一半发现依赖版本对不上。最夸张的一次我们花了整整一个下午排查一个线上问题最后发现只是因为某台机器上的构建产物是三天前的旧版本。那时候我就意识到持续集成不是“锦上添花”的东西而是团队协作的基础设施。它的核心价值不在于“自动化”这三个字本身而在于把“构建、测试、验证”这些动作从“人肉执行”变成“机器强制执行”从而消除人为疏忽带来的不确定性。市面上可选的持续集成工具不少有云端托管的有自建开源的也有商业化的。我最终选择 Jenkins 作为主力方案原因有几个而且这些原因在后续几年的使用中不断被验证是正确的。第一Jenkins 的插件生态足够成熟。无论你需要对接什么代码托管平台、什么构建工具、什么通知渠道几乎都能找到对应的插件。这意味着你不需要为了某个特定需求去写大量胶水代码大部分场景下配置一下就能跑通。第二Jenkins 对自建环境非常友好。你可以把它装在自己的服务器上完全掌控构建环境的每一个细节。对于需要特定系统依赖、特定编译工具链的项目来说这一点至关重要。云端托管方案虽然省事但环境定制能力往往受限。第三Jenkins 的 Pipeline 能力足够灵活。早期的 Jenkins 主要靠界面配置后来推出的 Pipeline 功能让整个构建流程可以用代码来描述。这意味着你的构建配置可以像业务代码一样进行版本管理、代码审查和复用这对于团队协作来说是一个巨大的提升。第四社区活跃度高。遇到问题的时候你大概率能在社区里找到别人踩过的坑和解决方案。这一点在实际使用中非常关键因为持续集成环境搭建过程中遇到的问题往往不是“文档里写了怎么做”就能解决的而是需要有人告诉你“这个参数要这样配”“那个插件有版本兼容问题”。当然Jenkins 也不是没有缺点。它的界面确实不算现代初次配置的学习曲线也比较陡峭插件之间的版本兼容性偶尔会出问题。但综合来看对于需要自主可控、需要深度定制、需要对接多种工具链的团队来说Jenkins 仍然是一个非常稳妥的选择。如果你所在的团队规模很小项目也不复杂云端托管方案可能更省心。但如果你需要完全掌控构建环境或者项目涉及多种语言、多种构建工具、多种部署目标Jenkins 的灵活性和扩展性会让你觉得前期投入的学习成本是值得的。接下来我会从零开始把整个搭建过程拆解开包括环境准备、Jenkins 安装、与代码托管平台的对接、构建任务的配置、以及实际使用中会遇到的各种坑和应对方法。每一步我都会解释“为什么这样做”而不是只给一堆命令让你照抄。2. 搭建前的环境准备与关键决策2.1 服务器配置的取舍逻辑搭建 Jenkins 的第一步是准备一台服务器。这里有一个常见的误区很多人觉得“持续集成服务器随便给个低配机器就行了”结果构建任务一多就开始排队或者构建过程中频繁出现内存不足导致任务失败。我的经验是Jenkins 主节点不需要太强的性能但构建节点Agent的配置要根据项目实际情况来定。如果你只是跑一些轻量级的单元测试和打包任务2 核 4G 的机器基本够用。但如果涉及编译大型项目、跑集成测试、构建容器镜像等操作建议至少 4 核 8G 起步并且要预留足够的磁盘空间。磁盘空间这一点特别容易被忽略。Jenkins 会保存每一次构建的产物、日志、工作空间时间一长磁盘很容易被占满。我建议在初始配置时就规划好磁盘分区把 Jenkins 的工作目录单独挂载到一个容量充足的盘上并且设置定期清理策略。操作系统方面Linux 是首选。Ubuntu 和 CentOS 都是常见的选择我个人更倾向于 Ubuntu LTS 版本因为软件包更新及时社区文档也丰富。如果你习惯用容器化部署用 Docker 跑 Jenkins 也是一个很干净的选择但要注意容器内外的文件权限映射问题这个后面会详细说。2.2 代码托管平台侧的准备在开始安装 Jenkins 之前建议先把代码托管平台侧的事情理清楚。你需要确认几件事你的代码仓库是否已经创建好并且有至少一个可以构建的分支。你打算用哪种方式让 Jenkins 访问代码仓库。常见的有两种一种是使用访问令牌Token另一种是使用部署密钥Deploy Key。访问令牌的好处是权限控制更细可以限定只读或者只访问特定仓库部署密钥的好处是配置简单但权限粒度较粗。你是否需要 Jenkins 在代码推送时自动触发构建。如果需要就要配置 Webhook。这一步在不同平台上的操作方式不同但核心逻辑是一样的当代码仓库收到推送事件时向 Jenkins 发送一个 HTTP 请求Jenkins 收到请求后启动对应的构建任务。这里有一个实操中很容易踩的坑Webhook 的地址必须是 Jenkins 能够被外部访问到的地址。如果你的 Jenkins 部署在内网而代码托管平台在公网那么 Webhook 是发不进来的。这种情况下要么把 Jenkins 暴露到公网需要做好安全防护要么使用轮询Poll SCM的方式让 Jenkins 定期检查代码变更。轮询的缺点是实时性差而且会增加 Jenkins 的负载但对于内网环境来说是一个可行的折中方案。2.3 需要提前安装的依赖在安装 Jenkins 之前服务器上需要先准备好 Java 运行环境。Jenkins 本身是一个 Java 应用不同版本的 Jenkins 对 Java 版本的要求不同。较新的 Jenkins 版本通常需要 Java 11 或 Java 17。我建议直接安装 Java 17因为它是当前的长期支持版本兼容性和稳定性都比较好。除了 Java还需要确保服务器上安装了 Git。Jenkins 需要调用 Git 命令来拉取代码如果服务器上没有 Git构建任务会在拉取代码这一步直接失败。这个错误看起来很低级但我在实际工作中见过不止一次——有人花了好几个小时排查构建失败的原因最后发现只是服务器上没装 Git。另外如果你打算在构建过程中使用 Maven、Gradle、npm 等构建工具也需要提前在服务器上安装好或者在 Jenkins 中配置自动安装。我个人的习惯是提前在服务器上装好因为这样版本可控而且构建速度更快。一个实用的建议在服务器上创建一个专门的用户来运行 Jenkins不要直接用 root 用户。这样做的好处是权限隔离即使 Jenkins 被攻击攻击者也无法直接获得 root 权限。同时这个用户需要有权限访问代码仓库、写入构建产物目录、执行构建命令。3. Jenkins 的安装与初始配置3.1 安装方式的选择与实操Jenkins 的安装方式有好几种直接下载 war 包运行、通过系统包管理器安装、使用 Docker 镜像、使用 Kubernetes 部署。对于大多数场景来说通过系统包管理器安装是最省心的方式因为它会自动处理依赖、创建系统服务、配置开机自启。在 Ubuntu 上安装过程大致是这样的先添加 Jenkins 的软件源和密钥然后通过 apt 安装。安装完成后Jenkins 会自动作为一个系统服务启动默认监听 8080 端口。你可以通过systemctl status jenkins来检查服务状态。安装完成后第一次访问 Jenkins 界面时它会要求你输入一个初始管理员密码。这个密码保存在服务器的特定路径下你可以通过查看该文件来获取。输入密码后Jenkins 会引导你安装推荐的插件。这一步建议选择“安装推荐的插件”因为推荐的插件集合涵盖了大多数常用功能包括 Git 集成、Pipeline、凭据管理等。插件安装完成后Jenkins 会要求你创建一个管理员账户。这里我建议不要跳过直接创建一个管理员账户而不是继续使用初始管理员密码。因为初始密码是随机生成的不方便记忆而且权限管理也不够灵活。3.2 全局工具配置的要点进入 Jenkins 主界面后第一件要做的事情是配置全局工具。路径是“系统管理”-“全局工具配置”。在这里你需要配置 Git、Java、Maven、Gradle 等工具的路径或自动安装方式。对于 Git如果你已经在服务器上安装了 Git可以直接在“Path to Git executable”中填入 Git 的路径通常是/usr/bin/git。如果你希望 Jenkins 自动安装 Git也可以选择自动安装选项但我不太推荐这种方式因为自动安装的版本可能不是你想要的版本。对于 Java同样可以指定已安装的 JDK 路径或者让 Jenkins 自动安装。如果你需要在构建中使用多个 Java 版本可以在这里配置多个 JDK然后在具体的构建任务中选择使用哪一个。对于 Maven 和 Gradle如果你在服务器上已经安装了直接指定路径即可。如果没有安装也可以让 Jenkins 自动安装。自动安装的好处是版本管理方便坏处是第一次构建时需要下载会稍微慢一些。这里有一个细节需要注意全局工具配置中的路径必须是 Jenkins 运行用户有权限访问的路径。如果你用的是一个专门的 jenkins 用户而 JDK 安装在 root 用户的目录下那么 Jenkins 可能无法访问。这种情况下要么修改权限要么把 JDK 安装到一个所有用户都能访问的路径下。3.3 凭据管理的正确姿势凭据管理是 Jenkins 安全体系中非常重要的一环。你需要在 Jenkins 中配置访问代码仓库的凭据、访问其他服务的凭据、以及构建过程中需要用到的各种密钥。Jenkins 的凭据管理支持多种类型用户名密码、SSH 密钥、Secret Text、证书等。对于访问代码仓库来说如果你使用的是访问令牌可以选择“Secret Text”类型把令牌内容填进去。如果你使用的是 SSH 密钥可以选择“SSH Username with private key”类型。我个人的建议是尽量使用访问令牌而不是密码尽量使用 SSH 密钥而不是用户名密码。原因很简单令牌和密钥可以随时撤销和重新生成而密码一旦泄露影响范围更大。而且令牌可以设置权限范围比如只读权限这样即使令牌泄露攻击者也无法修改代码。在配置凭据时给每个凭据起一个清晰的名字非常重要。我见过有人把所有凭据都命名为“git-credential”结果时间一长根本分不清哪个是哪个仓库的。建议的命名方式是“平台-仓库名-用途”比如“github-projectA-readonly”。还有一个容易忽略的点Jenkins 的凭据是加密存储的但加密密钥保存在 Jenkins 的主目录下。如果你迁移 Jenkins 或者备份 Jenkins 配置一定要把主目录下的密钥文件一起迁移或备份否则迁移后所有凭据都无法解密使用。4. 与代码托管平台的对接实战4.1 创建第一个构建任务的完整流程在 Jenkins 中创建一个构建任务有两种主要方式一种是使用自由风格Freestyle项目通过界面配置每一步操作另一种是使用 Pipeline 项目通过代码描述整个构建流程。对于新手来说自由风格项目更容易上手因为每一步都有界面引导。但对于需要长期维护的项目我强烈建议使用 Pipeline因为 Pipeline 的配置可以纳入版本管理而且更容易复用和调试。创建自由风格项目的流程大致是这样的点击“新建任务”输入任务名称选择“构建一个自由风格的软件项目”然后进入配置页面。在配置页面中你需要配置以下几个核心部分源码管理选择 Git填入仓库地址选择对应的凭据指定要构建的分支。构建触发器选择什么时候触发构建。可以配置为代码推送时触发需要 Webhook也可以配置为定时轮询。构建环境根据需要配置构建前的准备工作比如清理工作空间、设置环境变量等。构建步骤配置具体的构建命令比如执行 Maven 打包、运行测试脚本等。构建后操作配置构建完成后的动作比如归档构建产物、发送通知、触发下游任务等。配置完成后点击“保存”然后可以手动触发一次构建来验证配置是否正确。第一次构建通常会比较慢因为需要拉取代码、下载依赖。如果构建失败可以查看控制台输出里面会显示详细的错误信息。4.2 Webhook 自动触发的配置细节让 Jenkins 在代码推送时自动触发构建是持续集成的核心体验之一。配置 Webhook 需要两边配合代码托管平台侧要配置 Webhook 地址Jenkins 侧要配置对应的触发器和认证方式。在代码托管平台侧Webhook 的地址通常是http://你的Jenkins地址/github-webhook/或者http://你的Jenkins地址/generic-webhook-trigger/invoke具体取决于你使用的插件。配置时需要选择触发事件通常选择“Push events”就够了如果你希望合并请求也触发构建可以额外选择“Pull request events”。在 Jenkins 侧需要在构建触发器中勾选“GitHub hook trigger for GITScm polling”或者对应的选项。如果你使用的是 Generic Webhook Trigger 插件还需要配置令牌和参数提取规则。这里有一个非常关键的细节Webhook 的请求必须能够成功到达 Jenkins并且 Jenkins 必须能够验证请求的合法性。如果代码托管平台和 Jenkins 之间的网络不通Webhook 就会失败。如果 Jenkins 没有配置正确的认证方式Webhook 请求可能会被拒绝。排查 Webhook 问题时可以看两个地方一是代码托管平台的 Webhook 投递记录里面会显示每次请求的响应状态码二是 Jenkins 的系统日志里面会记录收到的 Webhook 请求和处理结果。如果响应状态码是 200说明请求成功到达并被处理如果是 403说明认证失败如果是 404说明地址配置错误。4.3 多分支构建的策略选择当一个仓库有多个分支需要构建时你有几种策略可以选择。最简单的方式是为每个分支创建一个独立的 Jenkins 任务但这种方式维护成本高分支一多就很难管理。更好的方式是使用“多分支流水线”功能它会自动发现仓库中的所有分支并为每个分支创建一个构建任务。多分支流水线的配置方式是这样的创建一个“多分支流水线”类型的任务配置好仓库地址和凭据然后 Jenkins 会自动扫描仓库中的所有分支。每个分支下需要有一个 Jenkinsfile 文件用来描述该分支的构建流程。Jenkins 会根据 Jenkinsfile 中的内容来执行构建。这种方式的优点是分支的增删自动同步不需要手动创建或删除任务每个分支的构建配置可以不同因为 Jenkinsfile 是跟着分支走的构建历史按分支隔离查看起来很清晰。缺点是第一次扫描分支时会比较慢如果仓库分支很多扫描时间会明显增加Jenkinsfile 的语法需要学习对于不熟悉 Pipeline 的人来说有一定门槛。我的建议是如果团队规模不大分支数量不多用自由风格项目就够了。如果团队规模较大分支策略比较复杂比如有功能分支、发布分支、热修复分支等那么多分支流水线会帮你省很多事。5. 构建流程的精细化配置5.1 构建触发器的组合使用在实际项目中构建触发器往往不是单一使用的而是组合使用的。比如你可能希望主分支在代码推送时自动构建同时每天凌晨再定时构建一次做全量验证。或者你希望合并请求创建时触发构建但只在特定分支上触发。Jenkins 支持配置多个触发器它们之间是“或”的关系。也就是说只要满足任意一个触发条件构建就会被启动。这个特性非常实用但也要注意不要配置过多的触发器否则构建频率过高会浪费资源。对于定时构建Jenkins 使用的是 cron 表达式。这里有一个容易踩的坑Jenkins 的 cron 表达式格式和标准 Linux cron 略有不同。Jenkins 的格式是“分 时 日 月 周”而且支持一些特殊符号比如H表示哈希值用来分散构建时间。比如H 2 * * *表示每天凌晨 2 点左右构建具体时间会根据任务名称的哈希值分散避免所有任务都在同一时刻启动。对于轮询 SCM同样使用 cron 表达式来配置轮询频率。轮询的缺点是会增加 Jenkins 的负载因为每次轮询都需要检查代码仓库是否有变更。如果仓库比较大轮询的开销会更明显。所以如果条件允许优先使用 Webhook 而不是轮询。5.2 构建环境的隔离与清理构建环境的隔离是一个容易被忽视但非常重要的问题。如果多个构建任务共享同一个工作空间可能会出现文件冲突、依赖版本冲突等问题。Jenkins 默认会为每个任务分配独立的工作空间但如果多个任务使用了相同的自定义路径就可能出现冲突。我建议在构建配置中勾选“删除工作空间后再构建”或者“构建前清理工作空间”。这样做的好处是每次构建都是在一个干净的环境中开始避免了上一次构建残留的文件对本次构建造成干扰。缺点是每次构建都需要重新拉取代码和下载依赖构建时间会变长。对于依赖下载的问题可以通过配置本地缓存来解决。比如 Maven 可以配置本地仓库路径Gradle 可以配置缓存目录npm 可以配置缓存目录。这样即使工作空间被清理依赖也不需要重新下载构建速度不会受太大影响。另一个隔离维度是环境变量。不同的构建任务可能需要不同的环境变量比如不同的 API 地址、不同的数据库连接串等。Jenkins 支持在任务级别配置环境变量也支持通过凭据来注入敏感信息。建议把敏感信息都放在凭据中管理而不是直接写在构建脚本里。5.3 构建产物的归档与版本管理构建产物的归档是持续集成流程中容易被忽略的一环。很多人只关注构建是否成功却不关注构建产物是否被正确保存和版本化。结果当需要回滚或者排查问题时发现找不到对应的构建产物。Jenkins 提供了“归档构建产物”的功能可以把构建生成的文件保存到 Jenkins 的服务器上。归档后的产物可以通过 Jenkins 界面下载也可以被下游任务使用。归档时可以使用通配符来匹配多个文件比如target/*.jar表示归档 target 目录下所有 jar 文件。除了归档还可以给构建产物打上版本号。版本号可以基于构建编号、时间戳、Git 提交哈希等生成。我个人的习惯是使用“版本号-构建编号-短提交哈希”的格式这样既能看出版本信息又能追溯到具体的代码提交。一个实用的技巧在构建产物归档时同时归档一份构建信息文件里面记录本次构建的 Git 提交哈希、构建时间、构建参数等信息。这样当需要排查问题时可以直接查看这个文件而不需要去翻构建日志。6. 实际使用中踩过的坑与应对方法6.1 构建突然失败的排查思路构建突然失败是使用 Jenkins 过程中最常见的问题。失败的原因可能有很多种代码本身有问题、依赖下载失败、构建环境变化、磁盘空间不足、内存不足等。面对构建失败最重要的是有一套系统的排查思路而不是盲目地重试。我的排查顺序通常是这样的先看控制台输出的最后几行通常错误信息就在那里。如果错误信息指向代码问题那就去检查代码变更。如果错误信息指向依赖问题那就检查依赖仓库是否可访问、依赖版本是否存在。如果错误信息指向环境问题那就检查服务器状态、磁盘空间、内存使用情况。如果控制台输出没有明显的错误信息可以查看 Jenkins 的系统日志。系统日志中会记录构建任务的启动、执行、结束等事件以及一些框架级别的错误信息。有时候构建失败是因为 Jenkins 本身的问题比如插件冲突、内存溢出等这些信息会在系统日志中体现。还有一种情况是构建看起来成功了但实际产物有问题。这种情况通常是因为构建脚本没有正确检查命令的退出码。比如某个命令执行失败了但脚本没有检查退出码就继续执行了后续步骤最后构建状态显示为成功。解决方法是确保构建脚本中每一步都检查退出码一旦有命令失败就立即退出。6.2 插件版本冲突的处理经验Jenkins 的插件生态虽然丰富但插件之间的版本冲突是一个让人头疼的问题。有时候你安装了一个新插件结果导致另一个插件无法正常工作。有时候你升级了 Jenkins 版本结果某些插件不兼容了。处理插件冲突的经验是尽量不要盲目升级插件尤其是生产环境。在升级之前先查看插件的更新日志看看是否有破坏性变更。如果可能的话先在测试环境中验证升级后的效果确认没有问题再在生产环境中执行。如果已经出现了插件冲突可以尝试以下步骤先查看 Jenkins 的系统日志找到报错的插件名称和错误信息。然后去插件的官方页面查看是否有已知的兼容性问题。如果有可以尝试降级到之前的版本或者等待插件作者发布修复版本。如果没有已知问题可以尝试重启 Jenkins有时候重启就能解决一些临时性的冲突。还有一个经验是保持 Jenkins 和插件的版本相对稳定不要频繁升级。除非有安全漏洞需要修复或者有新功能确实需要否则没有必要追新。稳定比新功能更重要。6.3 构建速度优化的几个实用手段构建速度直接影响开发效率。如果每次构建都要等十几分钟甚至更久开发者就会不愿意频繁提交代码持续集成的效果就会大打折扣。优化构建速度可以从几个方面入手。第一使用增量构建。很多构建工具都支持增量构建只重新编译变更的部分而不是全量编译。比如 Maven 的增量编译、Gradle 的增量构建等。开启增量构建后构建速度通常会有明显提升。第二缓存依赖。把常用的依赖缓存到本地避免每次构建都从远程仓库下载。Maven 的本地仓库、Gradle 的缓存目录、npm 的缓存目录都可以配置。如果使用 Docker 构建还可以利用 Docker 的层缓存。第三并行执行。如果构建流程中有多个相互独立的步骤可以配置为并行执行。比如单元测试和代码风格检查可以同时进行不需要串行等待。Jenkins 的 Pipeline 支持并行步骤可以显著缩短构建时间。第四选择合适的构建节点。如果 Jenkins 主节点负载较高可以把构建任务分配到专门的构建节点上执行。构建节点的配置可以根据任务需求来定比如编译任务用高 CPU 的机器测试任务用大内存的机器。第五减少不必要的步骤。审视构建流程看看是否有可以省略的步骤。比如每次构建都重新下载依赖、每次都执行全量测试等。有些步骤可以改为定时执行而不是每次构建都执行。6.4 权限管理与安全加固Jenkins 的权限管理是一个需要认真对待的问题。默认情况下Jenkins 的权限控制比较宽松任何登录用户都可以看到所有任务、执行所有构建。在生产环境中这显然是不够的。Jenkins 支持基于矩阵的权限控制可以针对不同的用户或用户组配置不同的权限。比如开发人员只能看到自己项目的构建任务运维人员可以管理所有任务访客只能查看构建状态但不能执行构建。配置权限时建议遵循最小权限原则只给用户完成工作所必需的权限不要多给。比如开发人员通常只需要“读取”和“构建”权限不需要“配置”和“删除”权限。管理员才需要完整的权限。除了权限控制还需要注意其他安全加固措施启用 HTTPS 加密传输、配置防火墙只允许特定 IP 访问、定期更新 Jenkins 和插件以修复安全漏洞、审计构建日志以发现异常行为等。一个容易被忽略的点Jenkins 的构建脚本中可以执行任意命令如果攻击者能够修改构建脚本就可以在服务器上执行任意代码。所以构建脚本的修改权限一定要严格控制最好纳入代码审查流程。7. 从手动构建到持续集成的思维转变搭建好 Jenkins 环境只是第一步更重要的是团队工作方式的转变。我见过不少团队虽然装了 Jenkins但大家还是习惯本地构建、手动部署Jenkins 只是一个摆设。这种情况的根本原因不是工具不好用而是团队没有建立起持续集成的工作习惯。持续集成的核心习惯是每次代码提交都触发构建构建失败立即修复保持主分支始终可构建。这个习惯看起来简单但坚持下来并不容易。尤其是在项目紧张的时候很容易出现“先提交再说构建失败回头再修”的情况。一旦这种心态蔓延持续集成就形同虚设了。要建立这个习惯可以从几个方面入手。首先把构建状态可视化让所有人都能看到当前主分支的构建状态。可以在办公区放一个大屏幕显示构建状态或者在团队沟通工具中配置构建通知。其次把构建失败当作最高优先级的问题来处理构建失败时立即通知相关责任人。最后把构建通过作为代码合并的前提条件构建不通过就不允许合并。还有一个经验是持续集成的配置本身也应该纳入版本管理。Jenkinsfile、构建脚本、配置文件都应该放在代码仓库中和业务代码一起管理。这样做的好处是配置变更可以追溯、可以审查、可以回滚而不是散落在 Jenkins 的界面配置中无法管理。从手动构建到持续集成本质上是从“信任人的自觉性”到“信任系统的强制性”的转变。人总会犯错、总会偷懒、总会有疏忽而系统不会。把那些重复的、容易出错的、需要严格一致性的工作交给系统去执行人只需要关注那些真正需要创造力和判断力的工作。这才是持续集成的真正价值所在。我在实际使用中最大的体会是持续集成环境搭建的技术难度其实不高难的是让团队真正用起来、坚持下去。工具只是手段习惯才是目的。当你发现团队已经离不开持续集成每次提交代码后都会下意识地去看构建状态时这个环境才算真正搭建成功了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑