debian - 如何为 Ubuntu 的 war 文件创建 debian 包

标签 debian war

我们有一个 war 文件、liquibase xml 文件和 sha1 校验和,我们要打包为 Debian 脚本以部署到一个平台:ubuntu 14.1 64bit with tomcat 7 和 java 7。

我们已经浏览了大量难以理解的(对于我们作为 Java 开发人员)Debian 打包指南,其中大部分需要“上游源 tar 球”(例如这个: https://wiki.debian.org/IntroDebianPackaging )和/或通过 make/生成的东西安装。

我们两者都没有,这是我们问题的症结所在。

我们有两个阶段:

  • 初始安装(完成一次)
  • 更新(做了很多次)

  • 指南没有提到如何管理这两个阶段。

    初始安装(我们现在在每台服务器上手动执行的操作):
  • 使用 apt-get 作为 root 安装 java、tomcat7。据推测,这可以通过依赖项实现自动化
  • 使用目标数据库连接字符串/密码等大量编辑 var/lib/tomcat7/conf/context.xml。据推测,这仍然必须在安装后手动完成。
  • 为我们的应用程序创建一个新用户和组,例如“富”。
  • 以 foo 身份登录
  • 在 foos home 目录中,安装基本应用程序:
    4.1 创建scripts目录并复制一个install.sh文件
    4.2 编辑 install.sh 文件并更改数据库连接字符串、绝密用户和密码以匹配目标数据库(在另一台服务器上)
    4.3 将 liquibase 二进制分发的 jars 和脚本复制到 liquibase 子目录中。

  • 我们通过 Jenkins 构建的 tar 文件分发应用程序本身。 tar 中的内容如下:
  • app.sha1
  • migration/changelog.xml(和一堆 liquibase xml 文件)
  • app.war
  • classes.sha1

  • 我们将 tar 文件 scp 到/home/foo 目录中,然后运行 ​​/home/foo/scripts/install.sh 执行以下操作:
  • 从/home/foo
  • 中删除旧的 tar 和 untared 的东西
  • 解压新的 tar 文件。
  • 停止 tomcat
  • 使用未压缩的迁移目录运行 liquibase jar 命令以创建/更新数据库
  • 删除/var/lib/tomcat7/webapps/*
  • 将新 war 复制到 var/lib/tomcat7/webapps/
  • 启动tomcat
  • 稍等一下
  • 使用 sha1sum 来确保类是正确的(除了客户的要求之外,这没有任何用处)

  • 我们的问题是:
  • 用户在哪里以及如何创建?例如。在我们的例子中是 foo,在 tomcats 的例子中是 tomcat7。
  • 软件包是否“自行安装”?或者它只是将文件放在文件系统中(因此需要管理员稍后运行一个或多个脚本来完成工作?是否有一些执行工作的脚本的标准,例如标准名称?
  • 有很多打包工具,例如 Jenkins 插件、dpkg、fpm、debuild、dpkg-buildpackage。我们应该使用哪个?我们查看了 fpm,但它假设您有一个从带有 make 文件等的源安装构建的目录,我们没有。
  • 包安装在哪里?它最终会出现在/var/lib/foo 或 var/lib/foo-0.3.4 中吗?如果是后者,我们就麻烦了,因为系统的其他部分需要访问 .sha1 文件,因此需要一个固定的地方来安装。
  • 有没有比手动编辑每个服务器 context.xml 和 install.sh 更好的方法来使每个客户拥有正确的数据库连接详细信息?例如,人们是否从脚本中使用 awk/sed 进行此类操作,或者是否有某种 mysql 密码和连接字符串存储库?
  • 目标文件的所有权和权限是如何设置的?
  • 有没有人遇到过“hello world”类型的打包教程,不依赖现有的“source tar + make +install”,展示安装后包中文件与目标服务器中文件的关系,以及包生命周期,包括更新如何工作?
  • 系统如何管理只发送更新的文件,例如在这种情况下不发送 liquibase 二进制文件?我假设我们需要两个包,一个用于基本安装,一个用于 tar,以避免重复?

    我们知道我们需要将工件放在一个特殊的目录结构中,这以某种方式映射到目标服务器的文件结构,我们需要构建各种控制文件,但不知道它如何在各个阶段粘合在一起,以及什么脚本是必需的。

    我们曾尝试阅读 Debian 政策手册 ( https://www.debian.org/doc/debian-policy/ ),但这是有经验的 linux 软件包开发人员的引用书。我们确信答案就在那里,但我们无法弄清楚在哪里。

  • 本帖:https://help.ubuntu.com/community/Tomcat/PackagingWebapps有另外两个选项(我们选择“击败系统范围的实例提交”)但没有提供关于如何实际构建包的线索。

    最佳答案

    最简单的方法是安装dh-make并使用它来生成骨架 debian/目录以帮助您入门。您可以删除不相关的文件(例如,如果您不提供手册页)。
    您需要编辑 debian/controlDepends: 中指定必要的包- 可能 tomcat7tomcat7-java ;不用提sha1sum因为它在 coreutils ,这是一个 Essential 包。
    context.xml 添加必要的修改到 postinst脚本,如果(且仅当)您无法通过简单地在某处添加文件来覆盖现有设置。
    添加带有 install 的 Makefile将必要文件放入 $DESTDIR 的子目录中的目标:

    install:
            install -d $(DESTDIR)/var/lib/tomcat7/webapps
            install -m 644 app.war $(DESTDIR)/var/lib/tomcat7/webapps
    
    我希望在更新依赖包时可以触发 Tomcat 重新加载(通过在 debian/triggers 中提及),但如果没有,您需要重新启动它(使用 invoke-rc.dsystemctl ,取决于目标init 系统)在 postinst 和 postrm 脚本中。
    回答具体问题:
  • 如果您需要创建新用户,请在 preinst 脚本中执行此操作(来自另一个包的婴儿床,或阅读手册)。你真的需要另一个用户,还是 tomcat 用户合适?
  • 包管理器安装和卸载提供的所有文件,并运行提供的 preinst、postinst、prerm 和 postrm 脚本。
  • 该列表不是与同类比较 - 例如dpkg用于管理系统上的包,而不是用于创建包。用合适的debian目录,构建可以很简单
     fakeroot debian/rules binary
    
    诸如 pbuilder 之类的工具可用于确保在构建系统上安装诸如库之类的依赖项,而不是手动安排,如果您正在构建发行版,这会变得乏味。您不应该需要那种程度的自动化。
  • 软件包的文件安装到 $DESTDIR 下的任何目录中那个make install把他们。
  • 可能有比在 /etc 中编辑文件更好的方式来配置 Tomcat .我不太了解那个服务器,所以我自己也不知道。
  • 目标文件的权限和所有权与 make install 完全相同套。
  • Debian Packaging Manual 中有很多内容需要阅读;我建议您在机制开始变得有意义时经常回顾它。
  • 我不确定您所说的“发送文件”是什么意思。并且该软件包不需要包含您从中解压缩的 tarball - 那只是重复。
  • 关于debian - 如何为 Ubuntu 的 war 文件创建 debian 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34800471/

    相关文章:

    linux - 注册手册 MAC 地址

    java - 如何找到正确的 *.class 文件来运行 Java 应用程序?

    正则表达式在 if 语句中匹配带空格的字符串(使用引号?)

    java - 将 war 应用程序名称与 war 文件名分开

    java - 在 JBoss 4.0.2 war 部署中找不到 WEB-INF/lib jar

    eclipse - 从 Eclipse 导出 WAR 文件时忽略 SVN 文件?

    python - 反射(reflect) cx_Oracle/sqlalchemy 中的数据库表

    docker - 如何使 openvpn 与 docker 一起工作

    tomcat6 - 强制 Tomcat 6 在 Windows 上停止

    java - Spring Boot 2.0 使用 WAR 打包在 Tomcat 中外部化属性文件