如何为Ubuntu

时间:2016-01-14 21:52:34

标签: debian war

我们有一个war文件,liquibase xml文件和sha1校验和,我们想要打包成Debian脚本,以便部署到一个平台:ubuntu 14.1 64位,带有tomcat 7和java 7.

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

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

我们有两个阶段:

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

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

    1. 以root身份使用apt-get安装java,tomcat7。据推测,这可以通过依赖性自动化
    2. 使用目标数据库连接字符串/密码等大量编辑var / lib / tomcat7 / conf / context.xml。据推测,安装后仍需手动完成。
    3. 为我们的应用创建新用户和群组,例如“foo” 的。
    4. 以foo登录
    5. 在foos home目录中,安装基本应用: 4.1创建脚本目录并复制install.sh文件 4.2编辑install.sh文件并更改数据库连接字符串,最高机密用户并传递以匹配目标数据库(在另一台服务器上) 4.3将liquibase二进制分布的jar和脚本复制到liquibase子目录中。
    6. 我们通过使用Jenkins构建的tar文件分发应用程序本身。在tar中有以下内容:

      1. app.sha1
      2. migration / changelog.xml(以及一堆liquibase xml文件)
      3. app.war
      4. classes.sha1
      5. 我们将tar文件scp到/ home / foo目录中,并运行/home/foo/scripts/install.sh,它执行以下操作:

        1. 从/ home / foo
        2. 删除旧焦油和未经处理的东西
        3. 解开新的tar文件。
        4. 停止tomcat
        5. 使用untarred迁移目录运行liquibase jar命令来创建/更新db
        6. 删除/ var / lib / tomcat7 / webapps / *
        7. 将新战争复制到var / lib / tomcat7 / webapps /
        8. 启动tomcat
        9. 稍等一下
        10. 使用sha1sum来确保类是正确的(除了客户的要求之外,这没有用处)
        11. 我们遇到的问题是:

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

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

            我们已经尝试阅读Debian政策手册(https://www.debian.org/doc/debian-policy/),但这是对Linux软件包开发人员的参考资料。我们确信答案在那里,但我们无法弄清楚在哪里。

          9. 这篇文章:https://help.ubuntu.com/community/Tomcat/PackagingWebapps还有其他两个选项(我们选择“将系统范围的实例击败提交”),但没有提供有关如何实际构建软件包的线索。

1 个答案:

答案 0 :(得分:0)

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

您需要编辑 debian/control 以在 Depends: 中指定必要的包 - 可能是 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.d 或 { {1}},具体取决于目标 init 系统)在 postinst 和 postrm 脚本中。

回答具体问题:

  1. 如果您需要创建新用户,请在 preinst 脚本中创建(从另一个包中获取,或阅读手册)。你真的需要另一个用户,还是tomcat用户合适?

  2. 包管理器安装和卸载提供的所有文件,并运行提供的 preinst、postinst、prerm 和 postrm 脚本。

  3. 该列表不是与同类比较 - 例如systemctl 用于管理系统上的包,而不是用于创建包。使用合适的 dpkg 目录,构建可以像

    一样简单
    debian

    诸如 pbuilder 之类的工具可用于确保在构建系统上安装诸如库之类的依赖项,而不是手动安排,如果您正在构建发行版,这会变得乏味。您不应该需要那种程度的自动化。

  4. 软件包的文件安装到 fakeroot debian/rules binary $DESTDIR 放置它们的任何目录中。

  5. 可能有比在 make install 中编辑文件更好的方式来配置 Tomcat。我不太了解那个服务器,所以我自己也不知道。

  6. 目标文件的权限和所有权与 /etc 集完全相同。

  7. Debian 打包手册中有很多内容需要阅读;我建议您在机制开始变得有意义时经常回顾它。

  8. 我不确定您所说的“发送文件”是什么意思。并且该包不应该包含您从中解压缩的 tarball - 那只是重复。