在 Jenkins 中使用 SSH 部署密鑰

本文檔介紹了如何在 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. 線性查找&…