轉自: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 root@10.51.xxx.xxx
而我直接用的復制粘貼。。。。還好后面也成功了~
!!!!!!
提示:這里大部分其他文章提示的是在目標服務器上添加 /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包服務~~