2013年4月21日 星期日

Jenkins 使用 msysgit 無法正常 clone 專案

這幾天我首次嚐試在 Windows 8 上建立 Jenkins 環境用來編譯一些 Windows Phone 及 Windows RT 的專案,Jenkins 的安裝實在是太方便了,把 Java Runtime 裝好後,執行 Java -jar jenkins.war 再點點滑鼠建立 Windows Service 大概就沒什麼事要做了,反倒是讓 Jenkis 從 GitHub 自行 Clone 專案花了我很多時間找問題。

有使用 GitHub 的應該都知道 GitHub 除了支援利用帳號、密碼做驗證之外,還可以使用 ssh 做驗證,這樣子每次在與 remote 做溝通時只要把驗證的細節交給 ssh 就行了,省去輸入帳號、密碼的步驟,因為我希望 Jenkis 上能夠自動的在每一小時 Pull 最新的程式碼回來編譯且包裝一些特定的檔案,所以當然必須選用 ssh 驗證的方法。

先說一下我發生的狀況,在 Jenkins 安裝好 Git Plugin 後,必須在設定中加入 msysgit 執行檔的位置,供 Jenkins 使用其執行 Clone 等指令,而我發生的狀況是我利用 ssh-keygen -t rsa 指令建立 rsa 的 key,並且上傳到 GitHub 上面後,使用 Git Bash 能夠正常透過該 rsa key 做 Clone、Pull 等所有動作,但是 Jenkins 卻一直無法透過 msysgit 做 Clone 的動作。

利用 "ssh -t 帳號@位置" 的方式可以測試我們的 ssh key 是否可通過某個 Git Server 的身份驗證,例如我想要測試自己是否可以通過 GitHub 的驗證,我可以利用 Git Bash 輸入

ssh -t git@github.com

一直以來我都是習慣使用 msysgit 再加上 Git Bash 來進行 Git 相關操作,所以我把想法轉到是不是 Git Bash 有在 msysgit 上面多加了什麼行為,測試之下發現了一些有趣的現像,在 Git Bash 中輸入 ssh -t 的結果為

$ ssh -t git@github.com
Hi xxxxxxxx! You've successfully authenticated

而如果我使用 D:\Program Files (x86)\Git\bin\ 底下的 ssh 來執行同樣的指令,結果為

D:\>cd D:\Program Files (x86)\Git\bin

D:\Program Files (x86)\Git\bin>ssh -t git@github.com
The authenticity of host 'github.com (204.232.175.90)' can't be established.

再多一個測試,如果我們在 Git Bash 中利用 ssh-keygen 建立 rsa key 時,Private 與 Public Key 的檔案會建立在作業系統使用者目錄下的 .ssh 資料夾中

$ ssh-keygen -t rsa
// 省略過程
// id_rsa 及 id_rsa.pub 出現在 C:\Users\Ascii\.ssh 資料夾中

而使用 D:\Program Files (x86)\Git\bin\ 底下的 ssh-keygen 來執行同樣的指令,rsa 的兩個檔案卻是在和 ssh-keygen.exe 同一層的目錄底下

D:\Program Files (x86)\Git\bin>ssh-kengen -t rsa
// 省略過程
// D:\Program Files (x86)\Git\bin 目錄底下出現了 id_rsa 與 id_rsa.pub 兩個檔案

為什麼使用同樣的工具做同樣的動作,多了一層 shell 會有這些變化呢?看來其中的差異就在 shell 中了,原來讓 ssh 指向使用者目錄下的 .ssh 這些行為都是 Git Bash 額外多做的事情,難怪會發生 Git Bash 可以正常操作,msysgit 無法操作的現像。

我不清楚該如何指定 msysgit 要到哪找 rsa key,但最簡單的方法是把 User\YourName\.ssh 底下的檔案 Copy 一份到 Git\bin\ 底下,但這樣有點奇怪,同一份 key 為什麼要在兩個不同的地方各放一份?

所以我找到了一個方法可以讓 msysgit 知道 .ssh 的檔案在哪裡,方法是建立一個變數名稱為 HOME 的環境變數,其值為使用者目錄,例如我的就是 C:\User\Ascii,如此就可以讓 msysgit 使用底下的 .ssh 各檔案做驗證了。

沒有留言:

張貼留言