如何使用 Jenkins 在本地自动部署 Play Framework (2.4) 应用程序?

How to auto-deploy Play Framework (2.4) application locally with Jenkins?

如何在 Jenkins 正在 运行ning 的同一台服务器上本地自动部署带有 Jenkins 的 Play Framework (2.4) 应用程序?在某些时候,我们将单独设置一个适当的生产环境,并且可能会以相同的方式实现测试环境,但此时我想检查一下是否可以设置一个简单的测试环境到同一台服务器 Jenkins 运行ning.

我有一个 Jenkins 作业 运行正在测试,它似乎工作正常。基本上 "Execute shell" 运行ning 激活器命令(可以合并为一行)。

./activator clean
./activator test

在 Play 1 中,我用 play startplay stop 来做类似的事情。在我的开发环境中尝试 activator start,我收到消息:

The start command is deprecated, and will be removed in a future version of Play.
To run Play in production mode, run 'stage' instead, and then execute the generated start script in target/universal/stage/bin.
To test your application using production mode, run 'testProd' instead.

所以我用 "Execute shell" 和阶段评估了两个(不完整的)备选方案:

阶段 & 运行 没有hup:

./activator clean
./activator stage
nohup target/universal/stage/bin/my-app -Dplay.evolutions.db.default.autoApply=true

-> 应用程序正常启动,但 Jenkins 任务没有停止。

阶段 & 运行 后台没有 hup:

./activator clean
./activator stage
nohup target/universal/stage/bin/my-app -Dplay.evolutions.db.default.autoApply=true &

-> 应用程序似乎已经启动到某个点但没有继续 运行ning?

这里首选(甚至唯一有效)的方式是什么?

Jenkins 在构建完成时终止其所有子进程以避免内存泄漏,因此没有应用程序 运行。使用 Playframework 2.4 设置 jenkins 的最简单方法是使用 sbt 任务和 sbt plugin. If you want to perform a release from jenkins, the best way would be to build debian package and install it using jenkins shell - no process would be killed. See release plugin.

对于特定情况,我最终使用了 Docker:

  • 安装Docker到服务器
  • 根据play-docker-ci
  • 创建了一个Docker文件
  • 将 Jenkins 配置为
    • 构建Docker图像
    • 如果 运行ning 则停止现有容器,如果存在则移除现有容器
    • 运行 Docker 图片

到目前为止,这似乎工作得很好。

我通过让 Team City 生成一个 startup.sh 脚本来设置它,该脚本包含将 Play 服务器作为后台进程启动的命令:

nohup /pathToApp/bin/app_name -Dhttp.port=8180 &

然后下一个构建步骤只是 运行s 这个 shell 脚本并启动它。 nohup& 使这个 运行 作为后台进程,当构建服务器断开连接时,它将保持 运行ning。为了清晰起见,我从启动脚本中删除了很多额外的内容,但您可以添加要用于您的应用程序的 whatever startup parameters