如何部署:1 个补丁中的数据库、源代码和二进制更改?

Posted

技术标签:

【中文标题】如何部署:1 个补丁中的数据库、源代码和二进制更改?【英文标题】:How to deploy: database, source and binary changes in 1 patch? 【发布时间】:2009-11-24 16:59:05 【问题描述】:

我是一个开发团队的一员,该团队使用 Joomla 和 Drupal 等系统处理许多基于 CMS 的项目。

在我们的开发过程中,我们所有的代码更改都在 Git 内部进行管理。在 sprint 结束时,我们会创建一个 DIFF,我们可以通过 patch 将其应用到实时站点。

问题是大多数时候,变化包括

数据库架构更改 数据库数据更改 源代码更改 二进制文件更改(如图像)

Git Diff 可以很好地处理源代码更改。二进制文件仅不包含在 Diff 中,除非参考文件已更改的事实。

数据库架构更改和数据库数据更改是一团糟。

我在徘徊,是否存在类似统一的补丁系统,可用于在 1 个补丁中部署所有这些更改。

所以问题是,“是否有一个系统可用于一次性部署所有这些更改?

理想情况下,该系统将允许像补丁一样运行干运行,但适用于所有 4 种数据类型。

编辑: 感谢大家提供的反馈,这是我在这方面研究的起点。

这是我目前发现的:

    很难部署基于php的 使用linux打包的应用程序 系统因为改变 项目迭代地发生 然后作为发行版。

    可以使用 dbconfig 将更改部署到 项目,但问题是 生成 mysql 数据库差异(模式 和数据)

    部署基于 php 的应用程序真正缺少什么 是一个部署管理器,它将 安装在服务器上,并且会 是部署的接口 补丁

我启动了一个关于这个主题的 Google Wave,结果产生了很多信息。 如果有人有兴趣阅读这一波,请告诉我,我会加你。

【问题讨论】:

【参考方案1】:

为了处理我们的应用程序的安装和升级,我们使用debian packaging system 。 (.deb 包)

上下文: 我们正在制作 J2EE + Flex 应用程序。通过 *** 进行运输和管理。 所以离你不远。

一个版本的全新安装和升级是通过 puppet(用于自动化系统管理任务的系统:他安装我们的 .deb)进行的

在 .deb 中我们有

    我们编译的源代码 数据库的架构(由 [db-config][1] 处理) 二进制文件 如何通过 apt 安装所需的所有其他应用程序(mysql、tomcat ...)

=全新安装的所有东西

我们还添加了从一个版本到另一个版本的信息

    数据库升级脚本(各版本) 新的二进制文件 在机器启动时推出新的东西(例如:几周前我们添加了一个 activeMQ 服务器)

=> 正确制作 .deb 后,我们可以在一次操作中无缝安装或升级。 (它是自动制作的,没有任何提示)。

每个版本都有一个 .deb,每个 .deb 都有一个版本号和一个签名。 您可以选择我们的任何 .deb 文件进行全新安装或从实际版本升级到他持有的版本号。

.deb 在我们的持续集成系统中。 (我们每小时构建一个 .deb,就像我们即将发布一个新版本一样)


有什么好处?

自信地自动安装/升级。 回滚版本 原生支持run dry

在你的确切情况下

* Database Schema Changes
* Database Data Changes
* Source Code changes
* Binary file changes (like images)

数据库 => 您将不得不编写迁移脚本。每个版本一个。 (例如:1.2-update.sql 1.3-update.sql)

源代码和二进制文件 => 添加它们,比如在女巫版本中它们必须被复制/使用

编辑:我不确定源代码。我们正在用编译后的代码来做这件事......


一些链接开始:

https://wiki.ubuntu.com/PackagingGuide/Complete

http://www.debian.org/doc/manuals/maint-guide/index.fr.html#contents(法语)

[1]:http://pwet.fr/man/linux/formats/dbconfigdbconfig

[1]:http://www.debian.org/doc/FAQ/ch-pkg_basics.en.htmldebian

【讨论】:

+1 符合我说的,有特定的包装系统使用+版本跟踪评论。请注意,在不考虑数据库与应用程序先前版本的兼容性的情况下,您应该在发布和回滚期间使站点/服务脱机,以防万一发生故障。 @Antoine Claval,非常感谢您的反馈,我发现它非常有帮助。感谢您花时间概述您的部署策略,我认为您应该获得声誉积分 :)【参考方案2】:

我认为您不会找到故障安全机制。

我建议您在进行架构/数据更改时尽可能考虑与当前发布的源的兼容性。

通过这种方式,您可以制作一个简单的工具来运行提交到特定 svn 位置的数据库脚本(您不希望在数据库更改上产生差异,就好像您需要进一步修改您需要不同的语句一样)。

完成上述操作后,您可以使用一个简单的命令来运行数据库更改,然后更改二进制和源代码。

对于数据库,还有模式和数据比较工具的选项,这些工具可用于比较环境并确保更改脚本中没有任何意外丢失 - 也可以生成更改脚本,但正如我所说,你真的想确保它不会破坏当前源。

【讨论】:

【参考方案3】:

您可以创建一个工具来轻松完成迁移——类似于 Peoplesoft 的补丁升级助手。

它基本上是一个独立的可执行文件,可以读取“升级模板”并执行任务。升级模板以声明方式描述升级任务或“步骤”。这些步骤可能是 - 复制(用于备份或移动预编译对象,如类和其他二进制文件)、数据库(用于更改模式元素)、SQL 脚本(用于加载或转换当前数据)。这些步骤将具有一些谓词逻辑能力 - 如果是这样,则执行此操作,否则跳过它并转到下一步等。

模板通常是一个 XML 文件。它还提供带有手动操作说明的手动步骤。每个步骤还指定它是否可恢复。它还将验证该步骤是否成功。

围绕这个很常见的要求可能有一个开源项目。

【讨论】:

@srini.venigalla,到目前为止,您的回答最接近我的要求。我想知道这样的工具是否已经存在,开源与否。我认为需要这样的开源工具。我一直在考虑如何生成数据库模式和内容数据差异以与这样的工具一起使用。你对这个话题有什么想法吗? @srini.venigalla 您正在描述 debian 打包系统:)。升级模板是一个 rules.xml,您可以在其中说明每种情况下的操作(安装、更新、卸载 ...) 嗯.. 我主要是 Windows 人。刚搬到Mac。对 Ubuntu 和 Mac 端口有点混乱,但对 Debian 并不多。将 Debian 的这个子系统创建为通用包会很好!我多次尝试构建这样的工具,但从未听说过更高的呼唤:-)【参考方案4】:

您需要将 git commit 对象保存在本地文件中,然后将它们导入其他 repo/branch。

【讨论】:

以上是关于如何部署:1 个补丁中的数据库、源代码和二进制更改?的主要内容,如果未能解决你的问题,请参考以下文章

在 vs2010 中使用 Database 项目部署和应用发布补丁

如何将 Git 补丁应用于具有不同名称和路径的文件?

Backbone.stickit 和 html-form:如何只保存(补丁)更改的属性?

如何有效地为列表列表中的多个补丁设置动画

如何在erlang中应用热代码交换功能作为补丁?

工具使用-BinDiff