6

我刚刚开始为基于 Play 的应用程序设置防弹夜间构建环境。到目前为止,我还没有找到关于这个主题的好教程。您能否查看我正在设置的当前解决方案?谢谢。

将 Play Framework 设置到 Jenkins 服务器并创建一个作业,该作业每 24 小时从 git/svn 存储库创建一个分发包。

play dist

上面的命令创建 app-1.0.zip 文件。文件被复制并解压缩到多个节点。我们正在使用负载均衡器。最终文件被解压到 /home/play/webapp/app-1.0 文件夹。

解压缩后,我更改符号链接 /home/play/webapp/app => /home/play/webapp/app-1.0 并重新加载项目。这个符号链接真的需要吗?我可以在旧文件上解压缩文件吗?我真的需要解压缩项目吗?我可以只创建一个 jar 文件并在服务器上运行它吗?

play reload

最后旧应用程序被删除。

rm -rf /home/play/webapp/app-0.9

版本 app-0.9 最初是通过运行以下脚本启动的。

/etc/init.d/play start

脚本是以下脚本的修改:

http://monocaffe.blogspot.fr/2012/09/a-play-framework-server-setup.html

基本上脚本运行以下命令,该命令是我从 app-xxx.zip 文件中的启动文件中找到的。

exec java $* -cp "`dirname $0`/lib/*" play.core.server.NettyServer `dirname $0`

我确实也考虑过创建一个重新加载脚本,它验证播放应用程序是否正在运行,如果没有,播放应用程序已启动,而不是重新启动。

/etc/init.d/play reload

最好的问候, 马尔库

4

2 回答 2

1

我创建了一个python 脚本来从 Jenkins 连续部署一个 play 应用程序。基本上脚本的作用如下:

  • 轮询 Jenkins 以检查是否有新版本可用
  • 如果有一个
    • 查看commit对应的代码
    • 编译
    • 创建一个包。
    • 重启播放服务器
  • 否则在轮询另一次之前延迟睡眠

重启策略目前是基本的,但您可以修改脚本以很容易地实现另一个。没有更多的文档,但代码配置文件是可读和注释的。

于 2012-10-19T14:20:59.467 回答
1

我是你发布的博客中的那个人。在那篇文章中,我建议您应该将所有 Play jar 放在一个位置(/home/play/libs/current -> play-2.0.4),因此无需执行play dist。在我们的例子中,我们使用play stage,将我们的文件分别 scp 到 webapps/foo/0.1-SNAPSHOT-20121011/ 然后更改符号链接current

解压缩后,我更改符号链接 /home/play/webapp/app => /home/play/webapp/app-1.0 并重新加载项目。这个符号链接真的需要吗?我可以在旧文件上解压缩文件吗?

这就是我喜欢我们的设置,使用符号链接的方式,但这只是因为我想在某种程度上保留以前的版本,特别是那些来自 CI 的版本。

我可以只创建一个 jar 文件并在服务器上运行它吗?

从技术上讲,您可以创建一个可运行的 JAR,其中包含所有 Play 和您的依赖项,包括 Netty,但这将是一个巨大的文件(只有 Play deps 为 33MB),您失去了轻松更改正在使用的 Play 版本的能力(我在过去的两个月里已经改变了三次)最后,你需要使用比 Play 更多的东西,因为不支持这个选项(即http://maven.apache.org/plugins/maven-shade-plugin/examples/可执行jar.html )

我确实也考虑过创建一个重新加载脚本,它验证播放应用程序是否正在运行,如果没有,播放应用程序已启动,而不是重新启动。

这是博客条目中显示的部署脚本:

#!/bin/bash
#
# Script to automate CI deployments. Simply stop all
# servers, change the "current" symlinks to the given
# target folder and finally, start all servers
#

export JAVA_HOME="/usr/lib/jvm/default-java"

play_home="/home/play"
webapps_folder="${play_home}/webapps"

apps=( "foo" "bar" "api" )

for app in ${apps[@]}; do

    echo "Stopping server ${app}"
    ${play_home}/bin/${app} stop

    echo "Regenerate current symlink of ${app}"
    rm ${webapps_folder}/${app}/current
    ln -s ${webapps_folder}/${app}/${1} ${webapps_folder}/${app}/current

    echo "Starting server ${app}"
    ${play_home}/bin/${app} nohup

done

exit 0

这个脚本的想法是使用 SSH 从 Jenkins 中的 ANT 脚本调用,或者像 ./deploy 0.1-SNAPSHOT-20121012 一样手动调用

于 2012-10-20T17:36:33.453 回答