最近模塊拆分,獨立出了幾個服務。上線流程並不復雜,只需要在指定目錄執行bash deploy.sh master即可上線master分支。但是架不住模塊太多,每天在上線流程上也花費了不少時間,所以嘗試搭了個jenkins來自動化上線。上線時遇到了一個小坑,jenkins已經輸出了啟動成功的日志,但是實際上服務並沒有跑起來,也就是說服務啟動以后又被kill掉了。上網找了找資料,得出結論是jenkins殺掉了剛啟動的服務。
服務被殺的原因是:jenkins默認會在構建完成后殺死構建過程中由jenkins中的shell命令觸發的衍生進程。
我在jenkins中調用bash deploy.sh master,雖然有supervisord保護我的服務,但是jenkins將supervisord和服務一同殺掉了。在網上找到了兩種解決辦法,親測有效,兩種方法中我個人更推薦第二種,方法三是我自己想到的,親測也有效喲~:
方法一:
修改配置,啟動jenkins時禁止其殺死衍生進程
在/etc/sysconfig/jenkins中加入參數-Dhudson.util.ProcessTree.disable=true
即java -Dhudson.util.ProcessTree.disable=true -jar jenkins.war
方法二:
修改構建號,使jenkins找不到衍生進程
OLD_BUILD_ID=$BUILD_ID
BUILD_ID=dontKillMe
bash deploy.sh master
BUILD_ID=$OLD_BUILD_ID
方法三:
這是我自己想到的方法,也確實生效了。我們訪問生產環境需要先登錄跳板機器,然后從跳板機器跳到線上服務器,所以我把jenkins部署到跳板機上,在jenkins的shell腳本中使用ssh腳本訪問線上機器。
sh online.sh
cd webserver/server/***
bash deploy.sh master
這樣啟動之后jenkins殺死的是跳板機上衍生出的ssh進程而不會影響真正線上服務器的進程
希望對大家有所幫助~