本文档介绍了如何在 Jenkins 中配置 SSH 部署密钥,以便更稳定地拉取 Git 仓库代码,避免常见的 RPC 错误。

1. 背景

在使用 Jenkins 进行持续集成时,常常需要从 Git 仓库拉取代码。如果使用 HTTP/HTTPS 协议,有时会遇到 RPC 错误,这可能是由于网络不稳定或大文件传输导致的。使用 SSH 协议可以提供更稳定的连接,并且在处理大文件时表现更好。

2. 常见的 RPC 错误

常见的错误信息如下:

remote: Enumerating objects: 12443, done.
remote: Counting objects: 100% (946/946), done.
remote: Compressing objects: 100% (762/762), done.
error: RPC failed; curl 92 HTTP/2 stream 7 was not closed cleanly: INTERNAL_ERROR (err 2)
error: 40022 bytes of body are still expected
fetch-pack: unexpected disconnect while reading sideband packet
fatal: early EOF
fatal: fetch-pack: invalid index-pack output

在这里插入图片描述

remote: Enumerating objects: 12443, done.
remote: Counting objects: 100% (946/946), done.
remote: Compressing objects: 100% (762/762), done.
error: RPC failed; curl 56 GnuTLS recv error (-9): Error decoding the received TLS packet.
error: 9443 bytes of body are still expected
fetch-pack: unexpected disconnect while reading sideband packet
fatal: early EOF
fatal: fetch-pack: invalid index-pack output

在这里插入图片描述

这个错误信息表明在 Jenkins 中使用 Git 插件进行代码拉取时,出现了一个与 RPC(远程过程调用)相关的错误。具体来说,HTTP/2 流在关闭时没有正常关闭,并且在读取 sideband 包时发生了意外断开连接。

而使用 SSH 通常更稳定,并且在处理大文件或大量数据时表现更好。

3. 配置 SSH 部署密钥

3.1 本地生成 SSH 密钥对

在本地终端或构建代理上运行:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -f deploy_key

说明:

  • -t rsa:密钥类型为 RSA;
  • -b 4096:密钥长度 4096 位,增强安全性;
  • -C:注释,可填邮箱或用途;
  • -f deploy_key:密钥输出文件名。

执行后生成两个文件:

  • deploy_key私钥,用于身份验证;
  • deploy_key.pub公钥,需添加到远程仓库的部署密钥列表中。

在这里插入图片描述

3.2 将公钥添加到 Git 仓库

具体操作方式视平台而定:

  • GitHub:仓库 → Settings → Deploy keys → Add deploy key;
  • GitLab:仓库 → Settings → Repository → Deploy Keys;
  • Bitbucket:仓库 → Repository Settings → Access keys。

💡 一般建议使用 只读权限 的 Deploy Key,以提升安全性。

4. 在 Jenkins 中配置 SSH 凭据

4.1 添加 SSH 凭据

  1. 登录 Jenkins,进入 系统管理 → 凭据。
  2. 选择对应的作用域(如 全局)。
  3. 点击 Add Credentials,选择SSH Username with private key填写以下信息:
字段内容说明
Id内部唯一ID,可以为空,会自动生成一个,本案例中也可以填 deploy_user
Username任意标识名(如 gitdeploy_user
Private Key选择 “Enter directly”,粘贴 deploy_key 的内容
Passphrase如果有设置过密钥密码,则在此输入
  1. 保存凭据。

在这里插入图片描述

4.2 在 Jenkins Job 中配置 Git 仓库

在你的构建 Job 中:

  1. Source Code Management 中选择 Git

  2. 将 Git 仓库地址改为 SSH 格式,如:

    git@github.com:username/repo.git
    
  3. Credentials 中选择你刚刚添加的 SSH 凭据;

  4. 保存配置并尝试构建。

不出意外,你应该能看到类似下图的输出:

在这里插入图片描述

这是因为 Jenkins 第一次连接时需要验证 SSH 主机密钥。我们接下来将配置主机密钥验证策略。

4.3 配置 SSH 主机密钥验证

Jenkins 的 Git 插件支持自定义 SSH 主机密钥验证策略,以防止中间人攻击。可选策略说明(参考 Git Client Plugin 文档):

策略名称说明
Known hosts file (默认)使用 ~/.ssh/known_hosts 进行校验
Accept first connection第一次连接自动信任并缓存主机密钥(适用于自动化场景)
Manually provided keys手动维护一组受信任的主机密钥
No verification (不推荐)完全跳过验证,存在安全风险

在 Jenkins 中配置方式:

  1. 进入 系统管理 → 全局安全设置;
  2. 找到 Git plugin 部分;
  3. 设置 Git Host Key Verification Configuration

在这里插入图片描述

  1. 这里我们选择 Manually provided keys,并将 GitHub 的SSH 公钥添加到文本框中。可以使用本地的 known_hosts 文件,或者直接从 GitHub 获取:
ssh-keyscan -t rsa github.com

在这里插入图片描述

5. 验证与测试

完成上述配置后:

  • 手动运行一次 Job,确认能成功克隆代码;
  • 查看控制台输出是否有如下类似信息:
Cloning the remote Git repository...
Using credentials github-ssh> git init ...> git fetch --tags --progress git@github.com:xxx/xxx.git ...

若成功,则表示 SSH 配置无误。

6. 常见问题与排查建议

问题原因解决方案
构建报错 “Permission denied (publickey)”公钥未配置正确检查公钥是否添加至 Git 仓库
报错 “Host key verification failed”主机密钥未受信任设置正确的主机验证策略或添加到 known_hosts
连接 GitHub 太慢国内网络问题尝试使用加速服务或镜像仓库

7. 总结

通过配置 SSH 部署密钥,你可以:

  • 避免 Jenkins 使用 HTTP 协议拉取代码时的 RPC 错误;
  • 提升 CI 流程中的稳定性;
  • 加强身份验证安全性。

建议将 deploy_key 设置为项目独立密钥,避免多个项目共享同一密钥,提高安全性与可维护性。

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

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

相关文章

小红书采集工具:无水印图片一键获取,同步采集笔记与评论

我用python语言开发了一款名为“爬xhs图片软件”的工具,该工具不仅能采集图片,还可获取笔记数据、评论数据等内容。 软件界面长这个样子: 采集到的图片:演示视频:https://live.csdn.net/v/485813介绍文章、想你所想&am…

Java行为型模式---命令模式

命令模式基础概念命令模式(Command Pattern)是一种行为型设计模式,其核心思想是将请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。命令模式…

Android性能优化之包体积优化

一、包体积组成与瓶颈分析 1. 典型 APK 结构占比 #mermaid-svg-KEUQMlEifvHlk1CV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-KEUQMlEifvHlk1CV .error-icon{fill:#552222;}#mermaid-svg-KEUQMlEifvHlk1CV .erro…

开源Web播放器推荐与选型指南

Video.js3:是市面上最流行的免费、开源 HTML5 视频播放器之一。可用于直播和点播,支持 HLS、DASH、WebM 和 MP4 等多种格式。它可高度自定义,开源社区中有很多皮肤可供选用,还可通过插件配置 Multi - DRM、广告插入、字幕等功能&a…

sql注入以及Python二分查找

sql注入 /level1.php?name<script>alert(1)</script> "><script>alert(1)</script> οnclickalert(1) " οnclick"alert(1) "><a href"javascript:alert(1)"> "><a HrEf"javascript:alert…

Coze智能体开发实战-旅游助手

智能体第1步&#xff1a;创建智能体第2步&#xff1a;设置开场白您好&#xff0c;我是广州长隆野生动物园旅游助手&#xff0c;有什么能够帮您&#xff1f;1.景点讲解 2.行程规划 3.天气查询 4.酒店查询第3步&#xff1a;创建工作流第4步&#xff1a;添加“意图识别”行程规划第…

51c视觉~合集13

自己的原文哦~ https://blog.51cto.com/whaosoft/11685452 #GKGNet 多标签分类遇上图卷积网络ViG 本文提出了第一个完全图卷积模型&#xff0c;基于分组K近邻的图卷积网络GKGNet&#xff0c;该模型在灵活且统一的图结构中&#xff0c;同时建模语义标签嵌入与图像块之…

子数组的最大累加和问题(8)0718

题目给定一个数组arr&#xff0c;返回子数组的最大累加和。例如&#xff0c;arr[1,-2,3,5,-2,6,-1],所有的子数组中&#xff0c;[3,5,-2,6]可以累加出最大的和12&#xff0c;所以返回12.解答如果arr中没有正数&#xff0c;产生的最大累加和一定是数组中的最大值。如果arr中有正…

LINUX例行性工作(计划任务)实验操作 ---at和crontab以及系统级别的计划任务

1.atd和crond两个任务管理程序的区别at命令是在指定的时间下只能执行一次任务&#xff1b;crontab命令是可以循环重复&#xff08;周期性&#xff09;的执行定时任务&#xff0c;与windows中的计划任务有些类似.2.指定在2024/08/15 09:00将时间写入testmail.txt文件中[rootmast…

二进制写入与文本写入的本质区别:系统视角下的文件操作

目录 一、核心概念 二、二进制写入 1、特点 2、使用场景 3、二进制写入整数 12345 的详细解析示例 1. 变量声明与初始化 2. 文件打开 3. 二进制写入 4. 文件关闭 二进制表示分析 文件内容 重要注意事项 三、文本写入 1、特点 2、使用场景 3、文本模式写入整数的…

在ComfyUI中CLIP Text Encode (Prompt)和CLIPTextEncodeFlux的区别

CLIP Text Encode (Prompt)CLIPTextEncodeFlux在 ComfyUI 中对 token 支持长度是否相同的详细技术对比&#xff1a;1、 CLIP Text Encode (Prompt)通常来自&#xff1a;ComfyUI 官方自带 CLIPTextEncode 节点。特点&#xff1a; ✅ 使用 OpenAI CLIP 模型&#xff08;ViT-L/14 …

Qt窗口(1)-菜单栏

Qt窗口 概念简述 与QWidget的区别&#xff1a; QWidget更多是作为一个窗口的一部分 基本结构构成&#xff1a;以Xshell举例子比较菜单栏和工具栏&#xff1a; 菜单栏&#xff1a;工具栏&#xff1a;工具栏本质是把菜单栏中一些比较常用的选项&#xff0c;直接放到工具栏中&…

弱网测试

使用软件MAC端&#xff1a;Network Link ConditioneriOS端&#xff1a;设置->开发者->网络链接调节器相关参数带宽单位为Kbps&#xff0c;丢包率单位是百分比&#xff0c;延迟单位是msDownlink Bandwidth &#xff08;输入宽带&#xff09;&#xff1a;设备从服务器接收数…

Nuxt 4.0 深度解析:从架构革新到实战迁移 [特殊字符]

引言&#xff1a;Vue生态的"瑞士军刀"又升级了&#xff01; 如果把前端框架比作超级英雄&#xff0c;Nuxt.js 绝对是Vue阵营里最全能的那位——就像钢铁侠的战甲不断迭代升级&#xff0c;Nuxt也从最初的SSR解决方案&#xff0c;进化成了如今的全栈开发框架。2025年&a…

【Linux内核模块】模块参数详解

玩过智能家居的朋友都知道&#xff0c;一盏智能灯通常有亮度调节、色温切换的功能 —— 这些可调节的选项让设备更灵活。其实 Linux 内核模块也有类似的调节旋钮&#xff0c;今天要聊的模块参数。它能让你在加载模块时动态配置参数&#xff0c;不用改代码就能实现功能切换&…

移动平板电脑安全管控方案

一、引言在数字化办公飞速发展的当下&#xff0c;移动平板凭借其便携性、灵活性及强大的功能&#xff0c;已成为企业办公不可或缺的工具。无论是现场作业数据采集、移动办公审批&#xff0c;还是远程会议参与&#xff0c;移动平板都极大地提升了工作效率。然而&#xff0c;如同…

华为业务变革项目IPD基本知识

适应人群为华为内部产品开发相关人员、参与 IPD 项目实施的团队成员及关注企业产品开发模式变革的管理者。主要内容围绕华为 IPD 业务变革项目,介绍 IPD 基本概念(源于 PACE 理念,强调以市场需求为驱动,将产品开发作为投资管理);解析 IPD 框架(含异步开发与共用基础模块…

【51】MFC入门到精通——MFC串口助手(一)---初级版(串口设置、初始化、打开/关闭、状态显示),附源码

文章目录1 功能展示2 实现步骤2.1 添加控件 及 控件变量2.2 添加按钮及静态文本框2.3 声明其他变量 及 函数3 函数实现3.1 初始刷函数3.2 设置串口参数3.3 打开串口函数3.4 显示串口状态3.5 关闭串口3.6 更改串口、波特率、校验位、数据位、停止位3.7 串口状态显示4 完整代码4.…

TBT 5、TBT 4 和 USB4 的差异概述

Thunderbolt 4 和 USB4 如今已成为笔记本电脑、电脑、电码头等移动电子设备中最常见的连接标准。 Thunderbolt 4 和 USB4 皆采用 USB Type-C 连接器&#xff0c;也因设计和功能上有许多相似之处而兼容。 这两种技术还支持 40Gbps 的数据传输速度、视频直通以及高达 240W 的电源…

算法-查找算法

下面是使用 Java 实现的四种查找算法&#xff1a; 线性查找&#xff08;Linear Search&#xff09;二分查找&#xff08;Binary Search&#xff09;插值查找&#xff08;Interpolation Search&#xff09;斐波那契查找&#xff08;Fibonacci Search&#xff09;✅ 1. 线性查找&…