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

如何为Ubuntu的war文件创建debian包,debian,war,Debian,War,我们有一个war文件、liquibase xml文件和sha1校验和,我们想打包成Debian脚本,部署到一个平台:Ubuntu14.1 64位、tomcat 7和java 7 我们已经浏览了大量难以理解的Debian打包指南(对于我们java开发人员来说),其中大多数都需要一个“上游源tarball”(例如,这个:)和/或通过make/install生成的东西 我们两者都没有,这是我们问题的症结所在 我们分两个阶段: 初始安装(完成一次) 更新(多次完成) 指南没有提到如何管理这两个阶段 初始

我们有一个war文件、liquibase xml文件和sha1校验和,我们想打包成Debian脚本,部署到一个平台:Ubuntu14.1 64位、tomcat 7和java 7

我们已经浏览了大量难以理解的Debian打包指南(对于我们java开发人员来说),其中大多数都需要一个“上游源tarball”(例如,这个:)和/或通过make/install生成的东西

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

我们分两个阶段:

  • 初始安装(完成一次)
  • 更新(多次完成)
  • 指南没有提到如何管理这两个阶段

    初始安装(我们现在在每台服务器上手动执行的操作):

  • 使用apt get作为根安装java、tomcat7。据推测,这可以通过依赖关系实现自动化
  • 使用目标数据库连接字符串/密码等大量编辑var/lib/tomcat7/conf/context.xml。可能在安装后仍需手动完成
  • 为我们的应用程序创建新用户和组,例如“foo”
  • 以foo身份登录
  • 在foos home dir中,安装基本应用程序: 4.1创建脚本目录并复制install.sh文件 4.2编辑install.sh文件并更改数据库连接字符串、绝密用户和密码,以匹配目标数据库(在另一台服务器上) 4.3将JAR和脚本的liquibase二进制分发复制到liquibase子目录中
  • 我们通过Jenkins构建的tar文件分发应用程序本身。tar中包含以下内容:

  • app.sha1
  • migration/changelog.xml(和一堆liquibase xml文件)
  • app.war
  • 第1.1节
  • 我们将tar文件scp到/home/foo目录中,然后运行/home/foo/scripts/install.sh,它执行以下操作:

  • 从/home/foo中删除旧焦油和未经处理的内容
  • 卸载新的tar文件
  • 阻止雄猫
  • 使用untarred migrations dir运行liquibase jar命令以创建/更新数据库
  • 删除/var/lib/tomcat7/webapps/*
  • 将新war复制到var/lib/tomcat7/webapps/
  • 启动雄猫
  • 稍等
  • 使用sha1sum确保类是正确的(这只是客户的要求,没有其他用途)
  • 我们的问题是:

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

    我们理解,我们需要将工件放在一个特殊的目录结构中,这以某种方式映射到目标服务器的文件结构上,我们需要构建各种控制文件,但不需要在各个阶段将其粘在一起,也不需要脚本

    我们试图阅读Debian策略手册(),但这是一本供有经验的linux软件包开发人员参考的手册。我们确信答案就在这里,但我们不知道在哪里


  • 这篇文章:还有两个选择(我们选择了“击败系统范围的实例提交”)但是没有给出关于如何实际构建软件包的线索。

    最简单的方法是安装
    dh make
    ,并使用它生成一个框架
    debian/
    目录来开始。您可以删除不相关的文件(例如,如果不提供手册页)

    您需要编辑
    debian/control
    来指定
    依赖项中的必要包:
    -可能是
    tomcat7
    tomcat7java
    ;您不需要提及
    sha1sum
    ,因为它在
    coreutils
    中,这是一个基本包

    如果(且仅当)您无法通过简单地在某处添加文件来覆盖现有设置,请将对
    context.xml
    的必要修改添加到
    postinst
    脚本中

    添加一个带有
    安装
    目标的Makefile,该目标将必要的文件放入
    $DESTDIR
    的子目录中:

    install:
            install -d $(DESTDIR)/var/lib/tomcat7/webapps
            install -m 644 app.war $(DESTDIR)/var/lib/tomcat7/webapps
    
    我希望在更新依赖包时(通过在
    debian/triggers
    中提及),Tomcat可以被触发重新加载,但如果没有,则需要在postinst和postrm脚本中重新启动它(使用
    invoke rc.d
    systemctl
    ,具体取决于目标init系统)

    回答具体问题:

  • 如果需要创建新用户,请在preinst脚本中执行此操作
     fakeroot debian/rules binary