jenkins 構建任務 —— 通過 Publish over SSH 將專案部署到遠端伺服器 jenkins 構建任務 —— 通過 Publish over SSH 將專案部署到遠端伺服器
轉自:https://www.cnblogs.com/jying/p/15467956.html
jenkins 構建任務 —— 通過 Publish over SSH 將專案部署到遠端伺服器
原文地址:https://www.cnblogs.com/jying/p/15467956.html
作者:一定會去旅行
歡迎任何形式的轉載,但請務必在文章開始位置使用明顯加粗字型註明出處。
限於本人水平,如果文章和程式碼有表述不當之處,還請不吝賜教。
部門的專案都是通過jenkins構建的,之前都是jenkins和tomcat以及jdk在一個伺服器上,所以構建後的專案也只是在同一個伺服器不同資料夾之間呼叫,最近新專案嘗試使用微服務,整個專案有5個微服務項,第一次使用也沒什麼經驗,釋出後發現每個小服務竟然在16G記憶體情況下佔比達到10%左右,整個專案5個微服務佔比達到了50%左右,對於一個目前並不複雜的專案來說,顯然佔比有點多,因為之前的伺服器有多個單獨的專案,佔比也有50%左右,所以如果微服務跟原來的專案放在一起整個伺服器記憶體佔比瞬間超過了90%以上,這顯然有隱患。
於是新申請了伺服器,微服務只需要安裝jdk就好了,而發現新申請的centos7 伺服器竟然自帶了jdk1.8(不會是之前被用過的伺服器回收的吧哈哈哈哈),不過追蹤jdk安裝路徑,竟然是放在/usr/local/java 下。。。
迴歸正題。jenkins釋出構建專案之前已經有經驗了,現在只是要遠端把新專案部署到新伺服器上啟動執行。
需求:
jenkins構建專案後遠端部署到新伺服器並啟動執行。
解決方案:
jenkins的構建原理:
jenkins將遠端(git或svn伺服器上)程式碼拉取到 /使用者/.jenkins/workspace/目錄下,該目錄下的每個資料夾都對應jenkins上的一個專案,對於maven專案,拉取到程式碼後會執行專案下的pom.xml檔案來構建專案,所以最終專案生成的可執行檔案在對應專案/target資料夾下,比如,我這裡的jinkins上專案是test-microservice,則對應拉取的程式碼存放在/root/.jenkins/workspace/test-microservice,執行構建/root/.jenkins/workspace/test-microservice/pom.xml後生成的jar(或war)檔案在/root/.jenkins/workspace/test-microservice/target目錄。
之前的操作是在構建完專案後,直接通過jenkins的構建後操作編寫shell程式碼,將對應jar(或war)移動到tomcat下。
現在新伺服器沒有tomcat,只有jdk,所以要將構建完後的jar(或war)移動到新伺服器,並通過shell執行java -jar 專案名.jar 啟動。
第一步,將jar(或war)移動到新遠端伺服器。
多個伺服器之間傳遞檔案,需要用到jenkins外掛 Publish Over SSH,如果之前沒有安裝過,需要先安裝該外掛。
jenkins左側 系統管理(Manage Jenkins)-->外掛管理( GlobalTool Configuration)。
如果沒安裝過,則在可選外掛中搜索 Publish Over SSH 安裝。如果之前安裝過則在“已安裝”中可搜到。
如果沒安裝過,更多的時候是你當前的jenkins版本已經和推薦的 Publish Over SSH版本不匹配了,類似這樣的:
這個時候,你要麼更新到最新的jenkins,要麼手動安裝對應版本的Publish Over SSH外掛。這裡我選擇第二種方式,手動安裝Publish Over SSH。
去這裡查詢下載所需要的版本:http://updates.jenkins-ci.org/download/plugins/publish-over-ssh
因為我的jenkins是2017年安裝的,所以找版本根據2017年的下載。下載後是一個 .hpi 檔案。
在jenkins外掛管理中選擇“高階”——>上傳外掛。
上傳完成後需要重啟jenkins。
重啟後重新進入jenkins檢視外掛安裝成功。
第二步:配置Publish Over SSH。
要先在jenkins所在的機器上生成祕鑰。生成方式為:
ssh-keygen -t rsa #產生公鑰與私鑰對
因為沒加密碼所以一路enter完成。此時在 使用者名稱資料夾/.ssh/資料夾下生成兩個檔案:
is_rsa 為金鑰檔案 id_rsa.pub 為公鑰檔案
網上大部分檔案都通過以下語句將公鑰檔案複製到目標伺服器:
ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
而我直接用的複製貼上。。。。還好後面也成功了~
!!!!!!
提示:這裡大部分其他文章提示的是在目標伺服器上新增 /root/.ssh/authorized_keys 檔案。而我也是這麼做的。。。在authorized_keys檔案中追加源伺服器的公鑰。
!!!!!!
開啟 系統管理——>系統設定,下拉到底部的Publish over SSH區域。
Passphrase:根據網上的資料說這裡是生成祕鑰時的密碼,如果生成祕鑰沒有加密碼,直接enter到底生成的,則這裡不用填寫。(儲存後會有些·········表示空密碼)。
Path to key:網上說這裡填的是私鑰的路徑,沒嘗試,因為在下面填寫了私鑰key。
Key:私鑰的值。要將前後的-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----帶著。
點選SSH Servers的“增加”,新添目標伺服器。
Name:你起的可以分辨伺服器的名稱。
Hostname:目標伺服器的ip,一般伺服器之間互動的話用內網ip就行。
Username:登入目標伺服器的賬號。
Remote Directory:將jenkins構建的檔案傳送到目標伺服器的哪個資料夾下。
此時點選 右下角的 Test Configuration,據說有的能成功,反正我的是報錯了。於是點開右下角的“高階”按鈕。
Use password authentication,or use a different key,該選項貌似是必須項,因為要登入目標伺服器需要驗證密碼啊。。。
Passphrase/Password:此處填寫目標伺服器的登入密碼。 Path to key:據說此處填寫跟上面一樣的私鑰路徑,這裡沒用到所以沒填。 Key:私鑰的值。據說這裡填寫跟上面一樣的Key,而且這裡可以覆蓋上面的,那我理解這裡是不是可以直接只填寫這裡不填寫上面呢?結果驗證上面不填是會報錯的,但是這裡不填只填上面竟然是可以的。 Port:目標伺服器的埠,預設是22,根據自己伺服器埠填寫,我這裡不是22一直沒通,後來問了it部門才知道給開的別的埠,哭泣。。。
完整的配置如下:
最終的填寫內容如上,測試通過。
PS:剛才寫本篇文章,試著刪掉了上面的Key,竟然測試連線也成功了????難道只有密碼就可以???
如果出問題可以先在linux中用 ssh root@你的ip -p你的埠號(-p和埠號之間沒有空格)測試能否遠端登入成功另一臺伺服器。
如果jenkins報錯:
jenkins.plugins.publish_over.BapPublisherException: Failed to connect and initialize SSH connection. Message: [Failed to connect session for config [xiaochengxu]. Message [java.net.ConnectException: Connection refused (Connection refused)]]
是可能配置的ip或port或賬戶等不對。
如果jenkins報錯:
jenkins.plugins.publish_over.BapPublisherException: Failed to connect and initialize SSH connection. Message: [Failed to connect session for config [xiaochengxu]. Message [Auth fail]]
是配置的密碼不對。
到此Publish Over SSH配置完成,記錄一下。
下面是maven專案的構建配置。
其他配置不變,只有在 Post Steps 中的配置變化了
以前在伺服器本機的時候,直接選 Execute shell 然後輸入要執行的語句就行,比如:nohup java -jar init.jar > init.log 2>&1 &。
現在要選 Send files or execute commands over SSH,然後配置對應的伺服器資訊。
Name:對應Publish Over SSH中的私有配置SSH Server Name Transfer Set Source files:jenkins專案所在目錄需要遠端傳輸的檔案,比如假如我的是:test_user/target/test-1.0-SNAPSHOT.jar(相對於工作區的路徑。可以填寫多個,預設用,分隔, **/* 表示這個job的工作目錄下所有的檔案和目錄。) Remove prefix:該操作是針對上面的Source files目錄,會移除匹配的目錄。比如針對上面的則是test_user/target,這樣遠端傳送後就直接在對應的目錄下存放jar包,而沒有多級目錄。
Remote directory:遠端伺服器目錄(假如這裡的是test,那麼加上 公共配置(系統配置)->私有配置->Remote Directory 最後就是 /xcxdata/test/)
Exec command:檔案傳輸到遠端伺服器後要執行的語句,比如我這裡是通過java啟動jar包。當然也可以附帶這生產環境的額外配置引數,如 nohup java -jar /data/你的.jar --config.active=prod --config.password=你的額外加密密碼等 > /data/你的記錄日誌.log 2>&1 &
經測試,如果有多個微服務專案,可以新增多個Server。
我這裡沒用到高階功能,就無法做介紹啦~~
到此,整個配置完成,執行後直接在遠端伺服器上啟動了對應的jar包服務~~