[料理佳餚] 讓 Jenkins 在對 GitHub 執行 git pull 指令時自動帶上 SSH Keys

有一些專案的建置作業中,某些步驟是需要對 Git Repository 做操作的,比如說在一切測試都通過之後,發行一個可執行的版本並 commit,然後 push 到待上線的 Git Repository,這時候賦予給 CI 的 Git 帳號就至少要有 Write 的權限,並且執行需要授權的操作時,自動帶上認證。

ppk 轉換成 OpenSSH Key

我們選擇用 SSH 的方式跟遠端儲存庫做認證,如果我們之前有用 PuTTY Key Generator 產生過 ppk 檔案的話,那麼我們可以直接拿來轉換成 OpenSSH 的格式,打開 PuTTYgen 程式載入我們之前產生過的 ppk 檔案。

點擊 Conversions -> Export OpenSSH Key

儲存成檔名為 id_rsa 的檔案

複製我們的 Public Key 儲存成檔名為 id_rsa.pub 的檔案

最後將 id_rsa 及 id_rsa.pub 這兩個檔案複製到 C:\Users\your_account_name\.ssh 當前使用者目錄的 .ssh 資料夾底下,如果沒有 .ssh 資料夾那就建一個。

用 Git Bash 產生 OpenSSH Key

但是如果我們之前沒有產生過 ppk 檔案,那麼我們可以利用 Git Bash 來幫助我們產生一組 Keys,在 Windows 環境下有安裝 Git for Windows 的話應該可以找得到 Git Bash。

打開 Git Bash,執行下列指令,切換到當前使用者目錄之後建立 .ssh 資料夾,並產生 id_rsa 及 id_rsa.pub 這兩個檔案。

cd /c/users/your_account_name
ssh-keygen -t rsa -C "username@emailhost"

到 GitHub 上設定 SSH Key

接著我們把 id_rsa.pub 裡面的 Public Key 設定到 GitHub 上

產生 known_hosts 檔案

接下來我們要產生 known_hosts 檔案,記錄 GitHub 的 Public Key 以便後續讓 ssh 程序自動對應,打開命令提示字元執行下列指令。

cd "C:\Program Files\Git\usr\bin"
ssh -T "git@github.com"

執行成功應該會看到 Hi xxxx! You've successfully authenticated, ... 的訊息,也會在當前使用者目錄的 .ssh 資料夾內看到 known_hosts 檔案,裡面存放的就是 GitHub 的 Public Key。

為 Jenkins 設置 HOME 目錄

如果你跟我一樣以為這樣就搞定了的話,在 Jenkins 執行 git pull 的時候應該會有八成七以上的機率會看到這個錯誤訊息。

這是因為 ssh 會到各個使用者的 HOME 目錄底下去找尋 id_rsa 及 id_rsa.pub 檔案,而 Jenkins 的 HOME 目錄預設是空的,我們只要到 Jenkins 的組態設定裡面找到全域屬性區塊,新增一個環境變數叫 HOME,HOME 的值就指定一個目錄路徑給它就可以了,我這邊指定的是 Jenkins 的安裝目錄。

最後把剛剛很辛苦弄好的 .ssh 資料夾複製一份到 HOME 目錄,就大功告成了。

我們再執行一次 git pull 指令就可以成功了

參考資料

相關資源

C# 指南
ASP.NET 教學
ASP.NET MVC 指引
Azure SQL Database 教學
SQL Server 教學
Xamarin.Forms 教學