一、相關閱讀
1、使用Jenkins配置Git+Maven的自動化構建
http://blog.csdn.net/xlgen157387/article/details/50353317
2、Jenkins部署Maven多環境項目(dev、beta、prod)的參數設置
3、使用Generic Webhook Trigger插件實現Jenkins+WebHooks(碼雲)持續集成
4、使用Generic Webhook Trigger插件實現Jenkins+WebHooks(碼雲)持續集成–指定具體分支集成
二、項目結構
這是一個SpringBoot項目,碼雲地址爲:https://gitee.com/xuliugen/ufind-server(私有的,不用試啦!)
這裏假設你已經配置好了Jenkins的環境,如果還沒有配置的話可以參考上文中的相關閱讀進行配置。
三、配置Jenkins
1、新建Job
這裏是因爲我已經新建了一個相同名字的所以會報已經存在,忽略即可!
2、設置具體內容
這裏指定項目名稱和描述,以及源碼管理中的Git地址和用戶名密碼。
Build指定源代碼拉下來之後需要做的事情,Post Steps指定編譯好之後需要做的事情。
其他沒有截圖的默認即可!
3、具體分析:
(1)Build是當把代碼拉下來之後需要做的操作,由於是一個maven項目,因此我們需要指定編譯打包的命令,這裏是:
clean package -Dmaven.test.skip=true
注意這裏沒有mvn,因爲他是默認使用maven編譯的!完整的命令是:
mvn clean package -Dmaven.test.skip=true
其中:-Dmaven.test.skip=true
是跳過測試。
(2)關鍵是Post Steps的腳本,這裏詳細的解釋:
首先,我們應該要明白Jenkins的原理,他是這樣的,如果我們在新建的時候指定了Maven項目和代碼的Git地址,Jenkins首先會通過Git將代碼clone到本地,然後執行在Build中指定的pom.xml文件和指定的命令。
下邊是Jenkins的工作區間詳細信息(默認位置是:~/.jenkins):
這裏的workspace就是我們創建的任務的工作區間:
可以看到就有我們上述創建的ufind-server
,如下:
最後的編譯好的jar的位置就是:
/home/xuliugen/.jenkins/workspace/ufind-server/ufind-web/target
然後,我們可以根據需要將編譯好的jar移到另外一個位置,然後啓動即可,在啓動的時候是後臺啓動,不然的話他的日誌會一直顯示在Jenkins的任務界面(有興趣的可以試一下效果!),後臺啓動的時候需要把進程ID記錄到一個文件中,這裏是:ufind-web.pid
因此,上圖中的腳本的完整解釋如下:
這裏需要注意的是設置export BUILD_ID=dontKillMe,另一個是每次啓動的時候先要殺掉以前的進程,不然的話不會啓動還會報錯!
可以看出,只要明白了Jenkins的工作機制,儘管目前Jenkins上SpringBoot相關的插件還沒有,但是我們可以一步步的通過腳本的方式進行運行!
四、運行結果
通過遊覽器訪問服務是否可以正確的運行!
五、將編譯好的jar文件傳到另一個服務器
上述中我們只是通過cp命令將編譯好的jar移動到同一個服務器中的另外一個位置,正常情況肯定不會是這樣的,他應該是其他服務器上指定的位置,並且服務器的數量可能還不止一個。因此,我們下邊研究一下!
將一個文件從一個服務器移動到另一個服務器使用的是scp命令,例如:
scp是一個基於ssh的Linux環境下傳輸文件的好工具,但是使用shell腳本調用scp時會面臨一個問題,即scp強制要求通過交互方式輸入密碼,而不像mysql
等擁有-u -p
選項。
下面有兩種方法幫助shell腳本跨過輸入密碼這個障礙!
1、建立機器間完全信任關係
假設需要從機器A傳輸文件至機器B
(1)在機器A上運行
ssh-keygen -t rsa
上述命令會在~/.ssh/
目錄生成私鑰證書id_rsa
和公鑰證書id_rsa.pub
;
(2)將公鑰證書id_rsa.pub
複製到機器B的用戶根目錄的.ssh
子目錄中,再將文件內容append
到文件authorized_keys
中。
其實只要用一條單行命令就可以完成步驟2,它被commandlinefu.com的用戶投票選爲十大最酷的Linux單行命令之一:
ssh-copy-id [-i [identity_file]] [user@]machine
identity_file
是公鑰證書的路徑,默認情況下是~/.ssh/id_rsa.pub
.
如果要建立雙方向的完全信任關係,還要從機器B到機器A再重複一遍上面的操作。
不過這樣的方法並不完美,一是運維成本太高,二是機器間的安全屏障完全消失,安全代價太大,所以本人強烈推薦第二種方法。
2、expect腳本
expect腳本是一種建立在tcl基礎上的腳本語言,曝光率不高,卻堪稱shell腳本的好基友。expect腳本爲交互而生,被設計爲專門針對交互式程序的工具,常與對telnet、ftp、fsck、rlogin、tip、scp等配合使用。使用之前要先安裝expect,安裝過程(Ubuntu Server):
Expect中最關鍵的四個命令是send、expect、spawn、interact
。
send:用於向進程發送字符串expect:從進程接收字符串spawn:啓動新的進程interact:允許用戶交互
示例代碼例如:
運行結果:
可以發現文件已經上傳成功!
上面是一個獨立的expect腳本文件,如果像把這段腳本嵌入其它shell腳本中就要用到expect -c
簡單測試之後,那我們的腳本應該改成如下方式:
這裏執行了遠程主機192.168.1.241上的一個腳本startup.sh
,腳本如下:
爲什麼,執行這個遠程腳本而不是直接通過expect執行哪?哈哈,你可能沒有想到,這是因爲本人能力有限,多次嘗試使用expect執行都沒有成功,所以,不得已才使用這麼愚蠢的方式!哈哈,不要打我!
看執行的結果: