背景:
我們經常發現,利用jenkins執行重啟tomcat的命令一直失敗,job構建成功了,但是事實上tomcat并沒有正確的重新啟動。原因是這樣:jenkins在執行sh腳本的時候,如果腳本中有啟動后臺進程的情況,例如tomcat的關閉和啟動,jenkins在job構建結束之后,會kill所有的腳本里面衍生出的子進程。
場景一:jenkins和tomcat部署在在相同的機器
jenkins有一些環境變量,例如JOB_NAME、WORKSPACE、BUILD_ID等,一個小的技巧就是在執行sh shutdown.sh的命令前面,加上如下一條命令,修改環境變量BUILD_ID的值,這樣,衍生出來的子進程就不會被kill了。
BUILD_ID=dontKillMe
舉個簡單的例子
jenkins
sleep 10目的是為了讓shutdown腳本執行結束,這么寫是為了方便。為了確保這一點,讀者可以用下面命令殺掉進程。
ps -ef | grep xxx | awk '{print $2}' | xargs kill -9
場景二:jenkins和tomcat部署在在不同的機器
這種場景下,會發現使用上面的方法不生效,這里介紹一種親自試驗過的方法。
假如部署jenkins的機器是A,部署tomcat的機器是B。那可以在A機器上寫一個腳本,把需要在B機器上執行的命令封裝在A機器上的這個腳本里面,這樣也能保證衍生進程正確執行結束。
舉個簡單的例子
A機器上touch一個腳本,譬如tomcat-restart.sh
#!/bin/sh
# restart romote tomcat
# ssh to remote server
ssh work@xx.xxx.xx.xxx <<EOF
cd /home/work/services/apache-tomcat-8.5.8
./bin/shutdown.sh
sleep 10
./bin/startup.sh
exit
EOF
注意別忘記了最后的EOF(可以用任意字符串替換),表示之間的命令是在B機器上執行的。當然,腳本正確執行的前提是A和B之間建立了SSH的信任關系,如果不熟悉的話,可以自行去百度一下。然后,在execute shell里面執行tomcat-restart.sh腳本即可。
jenkins