Jenkins SSH to Secret Text Credential Migration¶
概念概覽
遷移路徑¶
核心知識¶
遷移路徑¶
從 SSH Key credential 改用 Secret Text token(如 GitLab Private Token)時,有**兩個必須分開處理的連帶效應**,缺一都會導致失敗:
1. Jenkins 原生 checkout() 不相容 Secret Text¶
Jenkins checkout() SCM 步驟直接以 SSH 方式 clone,無法使用 Secret Text 類型的 credential。必須改成手動 git 指令:
// ❌ 不可行:checkout() 不支援 Secret Text
checkout([$class: 'GitSCM', userRemoteConfigs: [[credentialsId: 'my-token']]])
// ✅ 改為手動 git 指令搭配 withCredentials
withCredentials([string(credentialsId: 'my-token', variable: 'GIT_TOKEN')]) {
sh """
git -c http.extraHeader='PRIVATE-TOKEN: ${GIT_TOKEN}' clone ${REPO_URL}
"""
}
2. oauth2 URL 嵌入方式有嚴重連線延遲¶
oauth2:TOKEN@gitlab.example.com/repo.git 方式在此環境下實測導致約 109 秒連線等待後被中斷(Build #570:04:03:26 → 04:05:15 abort)。
必須改用 PRIVATE-TOKEN header 方式(Build #571 驗證有效):
獨立 Job 的 credential 設定不會自動同步¶
AutoBuildSiteDeploy 的 checkout stage 是**獨立的 credential 設定**,不會因 BuildServer 的 gitlabAccount 參數更換而自動更新。分散在不同 Job 的 credential 設定,必須逐一手動修改。
gitlabAccount 環境變數來自 Jenkins Job 的 Environment Variables 設定頁,不在 Jenkinsfile 的 parameters block 內,容易遺漏。
經驗教訓¶
-
SSH 換 Token 時,checkout() SCM 步驟必須同步改成手動 git 指令
-
oauth2 URL 嵌入方式在某些 GitLab 環境下有嚴重連線延遲,PRIVATE-TOKEN header 是更穩定的選擇
-
跨 Job 的 credential 設定完全獨立,沒有任何自動同步機制
常見陷阱¶
-
oauth2:TOKEN@URL 語法簡單但實測有 109 秒延遲問題,不能想當然認為可用
-
Jenkins Job 的 Environment Variables 頁面設定的變數不在 Jenkinsfile 裡,容易排查時漏看
最佳實踐¶
-
統一使用 PRIVATE-TOKEN header 方式而非 oauth2 URL 嵌入
-
遷移 credential 類型時,建立 checklist 確認所有引用該 credential 的 Job 都已同步更新
相關概念¶
來源 Sessions¶
| 日期 | Session | 貢獻摘要 |
|---|---|---|
| 2026-03-26 | 85f4d935-df5b-46e9-9e46-529869bf6e72 | 完整記錄從 SSH Key 遷移到 Secret Text token 時的兩個必須同步處理的連帶效應 |