記一次在Windows10桌面環境搭建Jekins的吐血經歷

目錄

寫在前面

首先聲明,除非萬不得已,千萬不要在Windows環境作這個事情,不然就等着各類坑吧。
本人一向的立場都是堅持用正確的方法作事,顯然在Windows搭建Jenkins這個事情自己並不那麼正確。
之因此有這篇隨筆,也是由於經歷了各類吐血踩坑以後但願留個備忘。固然,若是此文能給閱讀者帶來幫助,那不勝榮幸。html

故事背景

最近在作一個簡單的數據採集項目,一開始只有一臺遠程主機,因此每次更新都是本地打包以後直接scp過去,而後再到目標主機上執行腳本。由於機器只有一臺,作這些動做到也沒以爲不妥,由於就是簡單的幾步操做也犯不着還須要持續集成工具什麼的。可是最近的數據量有所增長,因此必須增長新的遠程主機,因此如今有了2臺機器,每次都是執行文件上傳,而後再依次登陸到每臺主機上執行腳本。老是頻繁打包更新時花費在這些重複性步驟上的時間累加起來也挺可觀的,因而乎就想搭建一個Jenkins系統作一鍵發佈。
之因此在Windows10環境折騰,是由於公司電腦就只有Windows10,其實在Linux環境操做的話也不會遇到以下這些問題了。java

踩坑詳情

第一步:安裝Jekins。git

這一步沒有問題,直接到官網下載安裝包:jenkins.msi。
而後一步一步點擊安裝完成,因爲安裝的是Windows服務包,能夠在Windows服務管理窗口中找到Jenkin後執行啓動/中止操做。固然,也能夠經過Jenkins自帶的可執行程序來操做。
在Windows控制檯進入到Jenkins安裝目錄,執行以下命令:github

jenkins.exe stop | start | restart

第二步:配置項目發佈流程shell

主要的踩坑都是在這裏遇到的。ssh

踩坑1 shell環境工具

爲了能在Windows環境使用一些Unix/Linux命令,因此須要安裝Cygwin,並添加到Windows環境變量Path中:Path=%Path%:C:\cygwin64\bin\
而後執行以下命令打包程序:tar czvf xxx.tar.gz xxx,該命令在Cygwin命令行界面執行是沒有任何問題的,可是到Jenkin中執行時就會報錯:ui

Caused: java.io.IOException: Cannot run program "sh"

顯然,Windows下的shell環境是cmd.exe,而上述打包命令並不能直接運行。this

解決辦法:
在Jenkins中明確指定shell環境,設置路徑:【Manage Jenkins】->【Configure System】-> 【Shell】,明確指定「Shell executable」,以下圖所示:
Jekins Shell命令行

注意: 雖然安裝Cygwin後也帶了「sh.exe」,可是在Jenkins中設置爲「C:\cygwin64\bin\sh.exe」時依然不能執行命令,因此設置爲Git客戶端自帶的sh.exe。

踩坑2: 文件上傳

程序打包完畢以後,須要上傳到遠程主機。
在Linux主機之間傳輸文件一般經過scp命令實現,因而我也想在Windows上使用scp來作這個事情。
但遺憾的是經過Cygwin並不能安裝scp命令,而微軟PowerShell團隊提供的Win32-OpenSSH項目正好帶了scp命令。
到這裏還算順利,在安裝了Win32-OpenSSH以後能夠經過scp命令將文件傳輸到遠程主機。
可是在執行scp命令時必須輸入密碼,顯然在Jenkins中要實現一鍵部署時是沒法執行輸入密碼這個動做的,所以就須要實現本地Windows主機與遠程Linux主機之間的免密傳輸。

咱們知道,在Linux主機之間要實現免密傳輸文件,好比主機L1向主機L2傳輸文件,只須要將L1主機的公鑰信息寫在L2的~/.ssh/authorized_keys文件中便可,具體操做步驟以下:
首先,在主機L1上執行:ssh-keygen -t rsa,而後將L1主機的~/.ssh/id_rsa.pub文件上傳到L2主機上,並命名爲id_rsa_L1.pub
其次,在主機L2上執行:cat id_rsa_L1.pub >> ~/.ssh/authorized_keys
完成上述設置以後,在主機L1上經過scp命令向主機L2傳輸文件時就能夠不用每次都輸入密碼了,這大大簡化了主機之間文件傳輸的流程,也是在Jenkins中能夠實現一鍵部署的關鍵。

但很是遺憾的是,在個人實踐中,這一步並無成功!我嘗試了不少次將本地Windows主機的ssh公鑰寫到遠程Linux主機的~/.ssh/authorized_keys文件中,每次執行scp命令時依然須要手動輸入密碼。
另外,使用Cygwin提供的sshpass命令明確指定密碼也一樣不能成功!
顯然,若是沒法避開手動輸入密碼這個步驟,是沒法在Jenkins中實現一鍵部署的。
極度崩潰

通過一番搜索後知道:在Windows環境要實現相似於scp命令的功能,還能夠經過一個叫作pscp的命令實現,而且pscp命令有一個-pw選項參數能夠指定遠程主機的登陸密碼,這樣就能夠實現不用手動輸入密碼的效果了。
pscp命令有如下2種方式獲取:
(1)Putty安裝包默認已經帶了pscp.exe程序,因此只須要安裝Putty便可,注意必定要選擇「Windows Installer」安裝包默認才帶pscp.exe。
(2)Gow工具包也默認帶有pscp.exe程序:前面咱們說過,在Windows環境要執行一些Unix/Linux命令能夠經過安裝Cygwin來實現,但遺憾的是Cygwin中卻不帶pscp.exe,而Gow是另外一個包含了大量Unix/Linux命令的工具集,能夠做爲Cygwin的輕量級替代品來使用。

我選擇了經過安裝Putty來使用pscp命令。
安裝好Putty以後,須要將Putty的安裝路徑添加到Jenkins中,設置路徑:【Manage Jenkins】->【Configure System】-> 【Global properties】-> 【Environment variables】,設置Name爲「Path」的變量值,以下圖所示:
Jenkins Path

注意: Putty的安裝路徑只能經過在Jenkins中設置Path變量的方式添加才能生效,而設置在主機的Path變量中並不能生效。

此時,彷佛準備工做都已經就緒,能夠經過pscp命令傳輸文件了,因而在Jekins中執行以下命令:

pscp -pw xxx xxxx.tar.gz root@192.168.56.101:/root

可是!卻意外地報錯了:

ssh_init: Network error: Cannot assign requested address
Build step 'Execute shell' marked build as failure
Finished: FAILURE

好氣哦

因而繼續搜索解決辦法,看到Stack Overflow上有人提過ssh_init: Network error: Cannot assign requested address的問題,須要指定端口。
因而明確指定端口再次執行:

pscp -P 22 -pw xxx xxxx.tar.gz root@192.168.56.101:/root

繼續報錯:

The server's host key is not cached in the registry. You
have no guarantee that the server is the computer you
think it is.
The server's ssh-ed25519 key fingerprint is:
ssh-ed25519 255 74:3b:39:b1:c3:e8:6c:a2:88:46:b1:46:dd:58:e9:5a
If you trust this host, enter "y" to add the key to
PuTTY's cache and carry on connecting.
If you want to carry on connecting just once, without
adding the key to the cache, enter "n".
If you do not trust this host, press Return to abandon the
connection.
Store key in cache? (y/n) Connection abandoned.
Lost connection
Build step 'Execute shell' marked build as failure
Finished: FAILURE

根據提示信息能夠知道,大概是沒法確保目標主機是可信任的,須要手動確認(有點相似於在使用scp命令時須要手動輸入密碼的意思)。

因爲在Jenkins中執行命令是沒法手動參與的,因此繼續尋找解決辦法,一樣在Stack Overflow上看到有人提出相同的疑問:getting-the-servers-host-key-is-not-cached-in-the-registry-when-using-pscp-ex
解決辦法是經過pscp的選項參數-hostkey明確指定遠程主機的指紋信息(這個指紋信息就是上述錯誤信息中提示一段十六進制串:74:3b:39:b1:c3:e8:6c:a2:88:46:b1:46:dd:58:e9:5a),再次執行命令以下:

pscp -P 22 -pw xxx -hostkey 74:3b:39:b1:c3:e8:6c:a2:88:46:b1:46:dd:58:e9:5a xxxx.tar.gz root@192.168.56.101:/root

終於成功了!!!

到這裏,無需手動輸入密碼的文件傳輸終於解決了,因而後續的其餘配置也均可以順利進行。

最後總結

以下,對在Windows環境執行Unix/Linux命令作一下小小的總結。

第一,在Windows環境中執行Unix/Liunx命令能夠經過安裝工具集Cygwin或Gow來實現,固然,也有可能還須要安裝OpenSSH。
第二,在Windows環境下的Jenkins執行Unix/Linux命令須要使用Git客戶端提供的sh.exe環境。
第三,在Windows環境下要實現免輸入密碼方式的文件傳輸,只能使用pscp.exe來實現,而且在Jenkins中執行時還必須明確指定端口(-P 22)和遠程主機的指紋信息(-hotkey xx:...)。

最後的最後,仍是要再次告誡你們,除非萬不得已,千萬不要在Windows環境折騰Unix/Linux命令的事情,坑太多了!
祝你幸福

【參考】
https://stackoverflow.com/questions/62817854/ssh-init-network-error-cannot-assign-requested-address
https://stackoverflow.com/questions/42841923/getting-the-servers-host-key-is-not-cached-in-the-registry-when-using-pscp-ex

相關文章
相關標籤/搜索