2

我已经为我的 Web 应用程序设置了一个自动部署脚本(在 shell 脚本中)。

它使用 java、tomcat、maven 和 postgres 数据库。

部署脚本执行以下操作:

  1. 从源存储库构建可部署的应用程序
  2. 停止Tomcat
  3. 应用数据库迁移补丁
  4. 在tomcat中部署war文件
  5. 启动 tomcat(通过调用 $TOMCAT_HOME/bin/startup.sh)
  6. 退出并显示成功消息

一切正常,而且非常整洁 - 但需要一点改进。您会看到,即使它退出并显示成功消息,有时部署也不会成功,因为 Web 应用程序没有正确启动。

我想重构步骤 5 和 6,以便在启动 tomcat 服务器后,部署脚本将在 catalina.out 文件中“tail -f”,查找“服务器已成功启动”消息或异常堆栈跟踪。

到那时为止的 tail -f 输出应该是部署脚本输出的一部分,并且步骤 6 将相应地“退出 0”或“退出 1”。

我知道这应该是可能的,如果不是在 shell 脚本中,也许是 python。问题是我是一名 Java 专家——所谓专家,我的意思是我对其他一切都很糟糕 :-)

请帮忙?:-)

4

3 回答 3

0

也许是这样的?

tmp=$(mktemp -t catalina.XXXXXXX) || exit 136
trap 'rm "$tmp"' 0
trap 'exit 255' 2 15
tail -n 200 catalina.out >"$tmp"
if grep -q error "$tmp"; then
    cat "$tmp"
    exit 1
fi
exit 0

另一方面,如果startup.sh编码得当,你可以

if startup.sh; then
    tail -f catalina.out
else
    exit $?
fi

可以缩短为

startup.sh || exit $?
tail -f catalina.out
于 2012-05-25T03:41:28.740 回答
0

作为替代方案,您可能想看看Apache Tomcat Manager应用程序。除其他外,它还支持:

  • 从本地路径远程部署应用程序
  • 列出当前部署的应用程序
  • 重新加载现有应用程序
  • 启动现有应用程序
  • 停止现有应用程序
  • 取消部署现有应用程序

管理器提供了一个可以通过 调用的 Web 界面,curl它返回简单的、可解析的消息以指示调用命令的状态。也可以通过 JMX 或 Ant 脚本调用管理功能。总而言之,一个非常方便的工具。

于 2012-05-25T03:56:15.910 回答
0

正如@snies 所建议的那样,我最终使用 Python 的 subprocess.Popen 实现了一个解决方案。

这是它的样子:

等待它.py

#! /usr/bin/env python
import subprocess
import sys

def main(argv):
    filename = argv[1]
    match=argv[2]
    p = subprocess.Popen(['tail', '-n', '0', '-f', filename], stdout=subprocess.PIPE)
    while True :
        line = p.stdout.readline()
        print line ,
        if match in line :
            break
    p.terminate()

if __name__ == "__main__":
    main(sys.argv)

tailUntil.sh

#!/bin/bash
set -e

filename=$1
match=$2

thisdir=$(dirname $0)
python $thisdir/waitForIt.py "$filename" "$match"

进而

启动Tomcat.sh

${TOMCAT_HOME}/bin/startup.sh
logDeploy.sh "Agora vamos dar um tail no catalina.out..."
util_tailUntil.sh "$TOMCAT_HOME/logs/catalina.out" 'INFO: Server startup in '

它没有做我最初想要的(即使有堆栈跟踪,它仍然以返回码 0 退出 - 但这可以通过更多的 Python 魔法来改变),但是所有 tomcat 的初始化日志都是自动化的一部分部署(并且在 Jenkins 的部署工作中很容易查看)——这就足够了。

于 2012-07-17T14:41:40.330 回答