ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Jenkins插件安装教程:依赖管理、离线部署与Java Web自动部署

Jenkins插件安装教程:依赖管理、离线部署与Java Web自动部署 1. 插件机制的底层逻辑为什么 Jenkins 离开插件寸步难行刚接触 Jenkins 的人容易有一个错觉装完 war 包、打开 8080 端口这工具就能自动部署了。实际用下来你会发现裸装的 Jenkins 除了能跑一个最简单的自由风格任务、执行几条 shell别的基本什么都不会——不会拉 Git 代码、不会发通知、不会连 Docker、甚至连构建历史的时间戳都看不全。这不是 Jenkins 做得差而是它的设计哲学就是把核心做薄把能力全部外放到插件里。所以谈 Jenkins 插件安装第一步不是急着点安装而是搞清楚插件这套机制是怎么运转的。我在带新人的时候发现凡是安装失败、装完不生效、升级后一堆任务报错的问题八成都能从这套机制上找到答案。这篇内容我会按真实的落地顺序来写先讲清楚插件依赖链再讲四种安装方式的取舍然后是必装清单、配置实战、Java Web 自动部署的串联最后是排查速查表和一些只有踩过坑才知道的细节。无论你是刚装完 Jenkins 想补插件的新手还是在内网隔离环境里做离线部署的老手下面这些内容都能直接抄作业。关键词Jenkins 插件安装和使用教程我会贯穿始终但更想讲的是那些官方文档里不会写的判断依据。1.1 裸装 Jenkins 的能力边界一台刚部署好的 Jenkins默认只带极少数核心模块。你能做的操作非常有限创建一个自由风格项目、填一条 shell 命令、点构建、看控制台输出。这中间涉及的 Git 拉取、凭据管理、构建触发、结果通知全都是空白。举个具体的例子你想让 Jenkins 从代码仓库拉代码必须要有 Git 插件想用账号密码而不是明文写死的方式访问仓库必须要有 Credentials Binding 插件想让构建结果推送到聊天工具那又是另一套通知插件。这带来一个很现实的问题很多人第一次用 Jenkins 时会觉得这工具怎么这么难用。其实不是难用是你还没把该装的能力装上去。理解这一点之后安装插件就不再是别人说要装我就装而是我这条流水线缺哪块能力就补哪块插件。提示判断一个功能是否需要插件最简单的办法是在任务配置页面找对应的选项。如果找不到源码管理构建触发器构建后操作里的某类配置那基本就是插件没装。1.2 插件依赖链为什么装一个会牵出一串Jenkins 插件不是孤立存在的每个插件都在元数据里声明了自己依赖哪些其他插件、依赖什么最低版本。当你从更新中心安装某个插件时Jenkins 会自动把它的依赖一并拉下来。这在大多数情况下是好事省得你手动找依赖但也会带来两个坑。第一个坑是版本冲突。A 插件要求依赖 X 的 2.0 以上版本B 插件又锁死只能用 X 的 1.5两者同时存在时Jenkins 会提示版本不满足安装直接失败。第二个坑是装完不生效。有时候你在线装了一个插件页面提示成功但任务配置里就是看不到新选项原因往往是依赖没装全或者 Jenkins 没有重启加载。所以我的习惯是装插件前先看它的依赖列表尤其是那些依赖很多的插件比如 Pipeline 全家桶、Docker 相关插件宁可分批装也不要一次性勾一大堆。分批装的好处是一旦失败你能快速定位是哪个插件拖累的。另外要理解一个概念叫插件元数据manifest。每个 .hpi 文件里都写明了插件名、版本、依赖关系和兼容的 Jenkins 核心版本。离线安装失败时百分之九十的原因都在这份元数据上——要么版本不匹配要么依赖缺失。后面第 6 章我会用表格把这些情况逐条列出来。2. 四种插件安装方式按场景选才对插件的安装方式不止一种很多教程只讲在线安装结果一到内网或者要批量部署就抓瞎。实际工作中我常用的有四种在线更新中心安装、离线 hpi 上传安装、容器镜像预装、CLI 命令行安装。它们各有各的适用场景选错了要么效率低要么根本装不上。2.1 在线安装更新中心的常规操作这是最省事的方式。进入「系统管理」→「插件管理」→「可选插件」搜索插件名勾选后点安装。Jenkins 会自动处理依赖。我这里不重复每一步的点击路径重点讲几个实际会卡住人的细节。第一默认的更新站点在国内访问经常很慢下载一个几十兆的插件可能要等几分钟甚至超时。解决思路是把更新站点改成访问更快的国内镜像源很多高校开源镜像和企业镜像都提供了 Jenkins 更新中心的镜像。改法是在「插件管理」→「高级」里替换更新站点的 URL保存后再回到可选插件页面会发现列表加载明显变快。第二装完插件记得看是否需要重启。部分插件尤其是涉及 Jenkins 核心行为、监听器、安全模块的装完后会提示需要重启才能生效。这时候别急着建任务先去「系统管理」里点重启或者安全重启避免出现配置保存了但行为不一致的诡异情况。第三装之前建议先勾选安装完成后自动重启或手动重启尤其是当你一次装了很多插件时。装一半不重启后面的插件可能因为前一个插件的类没加载而报错。注意在线安装前最好先确认 Jenkins 核心版本以及在更新中心高级里看下当前推荐的插件版本列表。盲目点全部更新是新手最容易犯的错升级完核心和一堆插件后任务集体报错回滚又很麻烦。2.2 离线安装隔离环境的唯一出路只要你的 Jenkins 部署在内网、不能直连公网离线安装就是唯一选择。流程是在一台能上网的机器上从 Jenkins 更新中心下载对应插件的 .hpi 文件再把文件传到内网 Jenkins在「插件管理」→「高级」→上传插件里逐个上传。离线安装的核心难点是依赖补全。在线装的时候依赖是自动带的离线时你得自己把依赖一个个找齐。我的做法是准备一个下载机在能上网的环境里装一个和产线版本一致的 Jenkins用它来下载插件包然后连依赖一起复制过去。因为 Jenkins 在在线安装时会把完整依赖解析出来你可以从这个下载机的插件目录里直接把 .hpi 捞出来。具体操作可以这样在下载机上安装目标插件装完后去 Jenkins 的插件目录默认在$JENKINS_HOME/plugins里找对应文件。每个已安装插件都会有一个.hpi或.jpi文件把它连同依赖一起拷到内网再逐个上传。批量上传时注意顺序先上传被依赖的底层插件再上传上层插件否则上层插件会因为找不到依赖而报错。关于离线安装还有个很容易忽略的点有些插件在安装时会要求更高版本的 Jenkins 核心。如果你的内网 Jenkins 版本偏老就算插件包下对了上传时也会提示该插件需要 Jenkins xxx 或更高版本。这种情况下要么升级核心要么去更新中心找旧版本插件历史版本页面里通常能翻到。2.3 容器镜像预装与 CLI 批量安装现在越来越多团队用容器跑 Jenkins插件管理方式也跟着变了。常见的做法是自定义一个 Dockerfile基于官方 Jenkins 镜像在构建时用 Jenkins 自带的 CLI 或插件管理脚本把需要的插件预装进去。这样每次拉起容器插件环境都是确定的不会有这台机器装了那台没装的问题。用 CLI 安装的思路大致是容器内进入 Jenkins 的 CLI 目录用jenkins-plugin-cli工具配合一个插件清单文件列出插件名和版本来批量安装。插件清单写成文本文件一行一个格式类似plugin-name:version。这种方式的优势是可版本化、可复现配合 Git 管理插件清单团队里谁拉到代码都能建出一样的环境。装好后可以用一句简单的检查命令确认插件目录里有没有对应文件比如在容器里ls $JENKINS_HOME/plugins | grep git能看到相关文件就说明装上了。这种确认习惯比反复点界面靠谱得多。2.4 四种方式横向对比安装方式适用场景优点主要坑点在线更新中心能直连外网的开发环境依赖自动解析最省事国内下载慢、易超时批量升级易冲突离线 hpi 上传内网、隔离环境不依赖网络可控依赖要手动补齐顺序错了会失败容器镜像预装容器化、多环境一致环境可复现便于版本管理构建镜像耗时长改插件要重建镜像CLI 批量安装自动化部署、批量维护可脚本化、可审计需要熟悉命令清单写错排查成本高选哪种没有绝对标准我的经验是开发测试环境用在线装产线和内网用离线或镜像预装团队协作场景优先把插件清单纳入版本控制。把这套思路定下来后面每次扩容或重建环境都不用手忙脚乱。3. 必装插件清单从基础到部署的选型逻辑插件市场里有上千个插件全装是不现实的装了只会拖慢启动、增加冲突概率。合理的做法是按能力层次分批装先保证基础能跑通再叠加部署和通知能力。下面这份清单是我这几年在不同项目里反复验证过的按层次来组织。3.1 基础层没有它们 Pipeline 跑不起来基础层负责代码拉取、任务定义、凭据管理和权限控制是任何流水线的前置条件。Git / Git Client 插件源码管理的基础配合 Git 参数插件可以实现分支选择、提交信息展示。没它连仓库都连不上。Pipeline工作流系列包括 Pipeline、Pipeline: Stage View、Pipeline Utility Steps 等。想用 Jenkinsfile 定义流水线这组插件是刚需。Stage View 能让构建过程可视化排查哪一步卡住非常直观。Credentials / Credentials Binding管理账号密码、SSH 私钥、令牌。它的价值在于把敏感信息从脚本里剥离出来避免明文写死在 Jenkinsfile 或 shell 里。Role-based Authorization Strategy做基于角色的权限控制。默认的权限模型很粗团队多人共用时几乎必须装它否则没法区分谁能改配置、谁只能触发构建。Build Timestamp / Build Name Setter给构建加上可读的时间戳和自定义名称出问题时能快速定位是哪次构建。Workspace Cleanup构建前后清理工作区。不清理的工作区会越积越大还可能导致上次构建的残留文件混进新构建结果里。实操心得Pipeline Utility Steps 这个插件容易被忽略但它提供的readJSON、readYAML、findFiles等步骤在做参数化构建和版本号处理时特别顺手。比如从package.json或pom.xml里读版本号用它比写一堆 shell 解析稳得多。3.2 部署与通知层把构建送到目标机器基础层搞定后构建产物还在 Jenkins 本地要真正上线还得靠部署层插件。Publish Over SSH通过 SSH 把产物拷贝到目标服务器并执行命令。经典但稳定适合传统物理机或虚拟机部署。配置时注意先在系统设置里配好远程主机凭据用密钥而不是密码。Docker Pipeline / Docker 插件在流水线里构建和推送镜像。配合容器化部署场景使用。Kubernetes 系列插件如果部署目标是 K8s 集群用它可以动态拉起构建 Pod做到构建资源弹性伸缩。Email ExtensionEmail-ext比默认邮件通知灵活得多能自定义收件人、主题模板、触发条件。DingTalk / 企业微信通知类插件把构建结果推送到聊天工具。很多团队会自定义消息内容这块在第 5 章会展开。这里要提醒一句通知类插件通常只需要装一个符合团队习惯的就行装多个容易出现一次构建发好几条通知的尴尬情况。我之前就遇到过一个项目同时装了邮件和两种聊天工具的插件结果每次构建失败群里、邮箱里全是重复消息后来统一收敛到一个渠道才清净。3.3 安装顺序与依赖陷阱装插件的顺序不是随便定的。下面这套顺序是我踩过坑之后总结出来的能显著降低失败率先装被依赖的底层插件比如 Credentials、Git 这类基础件。再装 Pipeline 全家桶它们依赖前面这几类。然后装部署类插件比如 Publish Over SSH、Docker 相关。最后装通知和增强类插件它们依赖最少放最后压力小。每装完一批重启一次 Jenkins确认这一批都能正常加载再装下一批。注意如果某个插件装完后 Jenkins 启动变慢甚至起不来八成是版本冲突。此时别慌进插件目录把最近装的那个 .hpi 文件删掉或改名为 .bak重启即可回滚。养成装插件前记录当前版本组合的习惯回滚会轻松很多。4. 插件配置实战从 Credentials 到 GitLab Connection插件装完只是第一步能不能用起来还看配置。这一章挑几个最容易配错的环节来讲都是我在实际项目里反复遇到的问题。4.1 全局工具与凭据的配置要点凭据Credentials是很多插件的前置依赖。配置入口在「系统管理」→「凭据」→「系统」→「全局凭据」。常见类型有用户名密码、SSH 私钥、Secret Text。配的时候有几个要点第一给凭据起一个语义清晰的名字比如gitlab-deploy-key、prod-server-ssh。不要用aaa、test1这种名字两三个月后你自己都忘了它是干什么的。第二SSH 私钥要贴完整包括开头的-----BEGIN ... KEY-----和结尾的标识行少一行都会连不上。而且私钥本身不能有密码短语passphrase否则 Jenkins 加载时会卡在交互输入上。第三凭据 ID 在 Pipeline 里是通过字符串引用的比如credentials(prod-server-ssh)。一旦凭据被删除或改名引用它的所有流水线都会失效。所以批量改凭据名是个危险操作改之前先全局搜一遍引用。全局工具配置Global Tool Configuration则负责 JDK、Maven、Git 这些构建工具的路径。自动安装的方式看似方便但国内网络下下载经常失败我更推荐手动安装工具后在配置里指定本地路径稳定且不依赖外网。4.2 GitLab Connection 打通代码仓库想让 Jenkins 和代码仓库联动比如提交代码自动触发构建、把构建状态回写到仓库需要配置 GitLab Connection。这块配置错一步就连不通我把关键点列出来。需要在代码仓库侧创建一个访问令牌Access Token权限给到读取仓库和回写提交状态即可。然后在 Jenkins 的「系统管理」→「系统配置」里找到 GitLab 配置区填入仓库地址和令牌先点测试连接确认能通再保存。真正容易出问题的是 Webhook。仓库侧要配置一个指向 Jenkins 的 Webhook 地址而 Jenkins 侧对应的任务要勾选通过 Webhook 触发构建。两边都配好之后提交一次代码测试。如果没触发优先检查Jenkins 地址是否是仓库能访问到的地址不能填 localhost、令牌权限是否够、任务里的触发方式有没有勾对。提示内网部署时Jenkins 的对外地址常常和实际监听地址不一致。GitLab Connection 里填的那个地址必须是代码仓库服务能够实际访问到的地址否则 Webhook 永远发不过来。4.3 Pipeline 中调用插件的写法插件能力最终要通过流水线脚本调用出来。下面这段是个简化示例展示几类插件的典型用法凭据、Git 拉取、Docker 构建、通知你可以把它当作模板改。pipeline { agent any environment { IMAGE_TAG app:${env.BUILD_NUMBER} } stages { stage(拉取代码) { steps { git branch: main, credentialsId: gitlab-deploy-key, url: gityour-git-host:group/repo.git } } stage(构建镜像) { steps { script { def img docker.build(${env.IMAGE_TAG}) docker.withRegistry(https://your-registry, registry-cred) { img.push() } } } } } post { success { echo 构建成功${env.BUILD_NUMBER} } failure { echo 构建失败请检查日志 } } }这段脚本里credentialsId是凭据插件提供的引用方式docker.build来自 Docker Pipeline 插件post块则是 Pipeline 自带的构建后处理。写的时候有个经验凡是涉及凭据的地方都用credentials()或credentialsId引用绝不把密码明文写进脚本。这一点在多人协作的项目里尤其重要脚本一旦提交到仓库明文密码就等于公开了。5. Java Web 自动部署落地把插件串成一条流水线讲了半天安装和配置最终要落到一个真实场景上。Java Web 应用自动部署是最经典的 Jenkins 用例也是插件协作最密集的场景。这一章我完整走一遍流程顺带把环境变量的用法讲清楚。5.1 流程设计与环境变量使用一条完整的 Java Web 流水线大致包含拉代码、Maven 构建、单元测试、打包、推送到目标服务器、重启服务、通知结果。设计阶段要想清楚两件事产物怎么传到目标机SSH 拷贝还是镜像推送、服务怎么重启脚本还是进程管理工具。这两点定了插件选型也就定了。环境变量在这套流程里非常重要它让脚本具备可移植性。Jenkins 内置了一批环境变量构建过程中可以直接引用常用的有环境变量含义典型用法BUILD_NUMBER当前构建号作为产物版本号后缀BUILD_ID构建标识命名构建目录JOB_NAME任务名称拼接日志路径WORKSPACE工作区绝对路径脚本里定位产物GIT_COMMIT当前提交哈希记录部署版本BUILD_URL构建详情地址通知消息里附链接在 Pipeline 里引用它们写env.BUILD_NUMBER这种形式在 shell 步骤里引用则写$BUILD_NUMBER两种写法不要混。我之前见过同事在 shell 里写${env.BUILD_NUMBER}结果变量没被替换产物名变成了原样字符串排查了好一会儿。此外自己定义的环境变量建议写在environment块里而不是散落在各个 shell 脚本中统一管理更清晰。5.2 Jenkinsfile 关键片段拆解下面这段是 Java Web 部署的核心片段包含 Maven 构建和 SSH 推送两个关键步骤。pipeline { agent any tools { maven local-maven jdk local-jdk } stages { stage(编译打包) { steps { sh mvn clean package -DskipTestsfalse } } stage(部署到目标机) { steps { sshPublisher( publishers: [ sshPublisherDesc( configName: prod-server, transfers: [ sshTransfer( sourceFiles: target/*.jar, removePrefix: target, remoteDirectory: /opt/app/release, execCommand: sh /opt/app/deploy.sh ) ] ) ] ) } } } }这里的tools块引用了前面在全局工具配置里定义的 Maven 和 JDK 名称sshPublisher来自 Publish Over SSH 插件configName对应系统设置里配置好的远程主机。execCommand是拷贝完成后在目标机上执行的命令我习惯把重启逻辑写进一个独立的deploy.sh这样改动部署脚本不用动 Jenkinsfile维护成本低。实操心得deploy.sh里一定要做健康检查比如脚本启动新进程后用循环探测端口或访问一个健康接口确认服务真的起来了再退出。否则 Jenkins 显示部署成功实际服务却没起来问题会被掩盖到很久以后。这个部署成功但服务没起的坑我至少踩过三次。5.3 DingTalk 自定义消息通知部署完成后把结果推到群里能极大提升团队感知。用 DingTalk 类插件配置自定义消息时重点是消息模板的写法。消息内容建议包含任务名、构建号、结果状态、提交人、构建链接。这样一条消息发出来谁都能一眼看明白发生了什么。消息模板一般支持变量替换把环境变量填进去即可。要注意的是通知插件的触发条件要设置好只在失败或者状态变化时发不要每次构建都发。我见过有团队每次构建都推一条群消息一天几百条最后大家都把群屏蔽了通知就失去意义了。推送地址通常是聊天工具提供的机器人 Webhook配置时把它当作凭据管理不要明文写死在任务配置里。虽然机器人地址泄露的风险相对小但保持敏感信息走凭据的习惯长期看能省掉很多麻烦。6. 插件安装常见报错与排查速查表安装和使用插件的路上报错是常态。这一章把高频问题整理成速查表配合具体的排查思路遇到问题时可以对照着看。6.1 更新中心连不上、下载龟速现象是打开可选插件页面转圈、列表半天加载不出来或者安装时停在某个百分比不动。原因通常是默认更新站点访问慢或超时。处理办法前面提过替换更新站点为访问更快的镜像源重启后再试。如果换源后还是慢可以尝试在网络空闲时段操作或者干脆走离线安装路线。还有一种隐蔽情况换源后部分插件列表能加载但某些插件下载仍然失败。这多半是该插件在镜像里没有同步。解法是回到官方源单独下载这个插件的 .hpi用离线方式补装。6.2 离线 hpi 安装失败离线安装报错按下面的顺序排查效率最高报错提示可能原因处理办法依赖插件未安装缺少被依赖的插件先补装依赖注意顺序需要更高版本的 Jenkins核心版本过旧升级核心或下载旧版插件插件文件已损坏下载不完整重新下载核对文件大小版本冲突与其他插件依赖同一组件不同版本卸载冲突插件或统一版本排查时一个实用技巧是把报错信息里的插件名复制出来去更新中心搜一下看它的依赖列表逐个比对本地已装插件。缺哪个补哪个通常几轮就能解决。6.3 版本不兼容与内核升级Jenkins 核心升级后插件不兼容是最常见的后遗症。典型表现是任务打开报错、流水线执行到某一步抛异常、插件配置页面显示异常。根因是插件的编译目标版本和新核心对不上。处理思路有两条一是升级所有插件到与当前核心兼容的版本在「插件管理」里看有没有标记需要更新的二是如果升级插件风险太大就回退 Jenkins 核心版本。回退的代价通常比较小因为核心的 war 包替换即可前提是你保留了旧版 war 和 jenkins home 的备份。我的原则是Jenkins 核心和插件尽量同批升级并且在升级前做完整备份。备份就三样东西war 包、$JENKINS_HOME目录、当前插件清单。有了这三样出任何问题都能半小时内回到可用状态。6.4 插件冲突导致启动失败的回滚最坏的情况是装完插件 Jenkins 直接起不来日志里全是类加载异常。这时候界面已经进不去了只能从后台处理。步骤是停掉服务进入$JENKINS_HOME/plugins目录把最近安装的那个插件文件删掉或改名加.bak后缀重启服务。因为插件冲突往往由最新的那个引起从最近装的开始回滚成功率最高。如果删一个不行就按安装时间倒序批量回滚直到能启动为止。启动恢复后再逐个补装定位到具体是哪个插件的问题。这个过程虽然笨但在没有图形界面的时候是最可靠的。注意插件目录里的文件除了.hpi还有解压后的同名目录。回滚时如果只删了.hpi而目录还在插件可能仍然被加载。稳妥做法是两者一起处理。7. 我这些年在插件管理上踩过的坑最后聊几句不在教程里的东西都是从实际项目里摔出来的经验。装插件千万别贪多。我早期接手过一个 Jenkins前人装了七八十个插件启动要三分钟升级一次核心就崩一批任务最后花了两天做插件瘦身砍掉三分之一才稳定下来。后来我给自己的规矩是每个插件都要能说清楚它在哪条流水线里起了什么作用说不清的就别装。版本控制比你想的重要。插件升级这事团队里一定有人手快看到有新版本就点更新。等到某天构建突然挂了谁都说不清是哪个插件引起的。现在的做法是把插件清单写进 Git谁的机器要重建直接从清单装环境偏差几乎为零。还有一点日志是排查插件问题的唯一真相来源。界面报错往往很模糊真正的堆栈都在日志里。遇到插件相关的问题第一反应应该是去看 Jenkins 日志$JENKINS_HOME/logs或者系统日志而不是反复点重试。日志里那行ClassNotFoundException或NoSuchMethodError基本就把罪魁祸首点出来了。Jenkins 插件这套体系说复杂也复杂说简单也简单核心就是理解能力靠插件、插件有依赖、依赖要匹配这三句话。把这层逻辑吃透剩下的都是熟练度问题。
返回列表