背景:
我們經(jīng)常發(fā)現(xiàn)治泥,利用jenkins執(zhí)行重啟tomcat的命令一直失敗,job構(gòu)建成功了椭岩,但是事實(shí)上tomcat并沒有正確的重新啟動(dòng)描睦。原因是這樣:jenkins在執(zhí)行sh腳本的時(shí)候,如果腳本中有啟動(dòng)后臺(tái)進(jìn)程的情況嚼蚀,例如tomcat的關(guān)閉和啟動(dòng)禁灼,jenkins在job構(gòu)建結(jié)束之后,會(huì)kill所有的腳本里面衍生出的子進(jìn)程轿曙。
場(chǎng)景一:jenkins和tomcat部署在在相同的機(jī)器
jenkins有一些環(huán)境變量弄捕,例如JOB_NAME、WORKSPACE导帝、BUILD_ID等守谓,一個(gè)小的技巧就是在執(zhí)行sh shutdown.sh的命令前面,加上如下一條命令舟扎,修改環(huán)境變量BUILD_ID的值分飞,這樣,衍生出來的子進(jìn)程就不會(huì)被kill了睹限。
BUILD_ID=dontKillMe
舉個(gè)簡(jiǎn)單的例子
sleep 10目的是為了讓shutdown腳本執(zhí)行結(jié)束譬猫,這么寫是為了方便讯檐。為了確保這一點(diǎn),讀者可以用下面命令殺掉進(jìn)程染服。
ps -ef | grep xxx | awk '{print $2}' | xargs kill -9
場(chǎng)景二:jenkins和tomcat部署在在不同的機(jī)器
這種場(chǎng)景下别洪,會(huì)發(fā)現(xiàn)使用上面的方法不生效,這里介紹一種親自試驗(yàn)過的方法柳刮。
假如部署jenkins的機(jī)器是A挖垛,部署tomcat的機(jī)器是B。那可以在A機(jī)器上寫一個(gè)腳本秉颗,把需要在B機(jī)器上執(zhí)行的命令封裝在A機(jī)器上的這個(gè)腳本里面痢毒,這樣也能保證衍生進(jìn)程正確執(zhí)行結(jié)束。
舉個(gè)簡(jiǎn)單的例子
A機(jī)器上touch一個(gè)腳本蚕甥,譬如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機(jī)器上執(zhí)行的。當(dāng)然菇怀,腳本正確執(zhí)行的前提是A和B之間建立了SSH的信任關(guān)系凭舶,如果不熟悉的話,可以自行去百度一下爱沟。然后帅霜,在execute shell里面執(zhí)行tomcat-restart.sh腳本即可。