我们目前正在使用PHP,持续部署非常简单。我们在服务器上有一个裸露的 git 存储库,Jenkins 推送到它,一个 git post 接收钩子会结帐并将新的符号链接移动到旧符号链接上的新版本。
我们如何用Java Web项目做同样的事情?
- 一键部署(目前是 git push --tags ${VERSION}^0:master) 没有
- 停机时间(没有重新启动 servlet 容器?
- 仅使用自由软件
- 可以快速回滚到以前的版本(几秒钟)
- 额外:旧会话仍使用旧代码,但收到重新加载页面的警告
- 部署只需几秒钟
我应该为此调查OSGI吗?
一般来说,你需要投入更多的精力来自动化Java的过程,而不是PHP,因为Java至少需要编译,而且基础设施与PHP不同。
- 考虑您的架构
根据您的问题,您似乎希望完全在 Java 中重新实现现有的 PHP Web 应用程序,即前端也将在 Java 中实现。与其在 Java 中重新实现完整的应用程序,不如讨论仅将 Java 用于后端服务,这些服务可能是无状态的,不需要使用会话。前端可以是PHP和/或HTML,只有JavaScript框架(如Angular,Ember等),它直接调用后端服务。
- 选择部署模型
如果要开发 JavaEE 风格的 Web 应用程序,则需要一个容器,并以容器可部署的格式打包应用程序。您可以选择一个 servlet 容器,例如 Tomcat 或 Jetty,并将您的应用程序打包为 WAR 文件,然后将其部署到容器中。假设遵循该路径,则需要确定是要在每次部署应用程序时将容器部署为应用程序的一部分,还是要求已在服务器上安装容器。
另一种选择是将 servlet 引擎嵌入到您的应用程序中,或者选择一种不同的技术,例如带有另一种部署模型的 Vert.x。这两种方法都有优点和缺点。我个人更喜欢将我的应用程序打包为一个完整的、随时可以执行的可运行应用程序,即使容器成为部署的一部分。
- 选择一个部署策略(git push hook、CI 服务器等)
我会推荐像Hudson或Jenkins这样的CI服务器。它可以轮询 Git 存储库以查找更改,并在推送新版本后编译 Java 代码库。也可以实现一个 Git 钩子,该钩子在推送时触发 CI 服务器中的进程。
CI 服务的好处是它附带了对代码分析、测试和构建报告的额外支持,这允许您在部署过程中实施决策过程。例如,如果生成失败、出现测试错误或代码扫描发现潜在的安全问题,则部署将中止。
假设您使用 CI 服务,则可以随时部署任何"良好"的 Git 修订。因此,CI 服务也可用于回滚。
您还需要考虑部署数据库更新。它可以在启动/初始化期间从应用程序内部完成。但这在回滚时可能变得至关重要。某些更改不向后/向前兼容。但是无论技术如何,即在Java和PHP中,这都需要解决。
- 无停机时间
我不确定OSGi是这个问题的解决方案/答案。如果停机时间对您至关重要,那么您无论如何都需要 HA 解决方案。OSGi 或任何其他 Java 容器中的停机部署很难实现。鉴于无论如何都需要 HA 环境,因此付出的努力通常不值得(这是我个人的观点)。因此,我建议不要走这条路,而是为此利用 HA/负载平衡基础设施。关闭节点,部署它,测试它,使其重新投入使用 - 或者如果您在可编写脚本的 IaaS 环境中运行 - 获取一台新计算机,部署它,测试它,使其投入使用。当然,所有这些都需要自动化。
- 旧会话
这也在很大程度上取决于您的基础架构/架构。但是您可能希望会话存储与容器(例如Memcache,Redis,其他数据库)分开。会话仅包含数据。因此,代码/应用程序逻辑需要处理会话中的静态/不兼容数据。
- 部署时间
如今,任何好的容器都会在几秒钟内启动。这是经常搞砸它的应用程序。IoC 容器(如 Spring 或 Guice)倾向于在启动时急切地初始化内容。这不是一件坏事,但会增加启动时间,直到您的应用程序准备就绪。懒惰的方法在这里可能更有帮助,尤其是在并非所有节点都需要所有功能的情况下。因此,即使在 Java 中也可以实现快速部署。但这需要认真执行。