有哪些工具可以帮助将各种软件元素收集到完整的软件版本中?

时间:2011-12-02 15:09:25

标签: continuous-integration release build versioning installer

我们的软件产品由许多部分组成。假设它由内核驱动程序部分,用户dll和GUI软件组成。在开发过程中,我们在最新版本中编译和使用它们,但在发布时它们并不相同。

实际上,内核部分必须比其他部分更早地冻结。然后,dll被冻结,以进行广泛测试,最后冻结是GUI。随着QA的发展,我们需要使用固定的GUI创建完整版本的更新版本,但仍然使用之前包含的内核驱动程序和dll。

我想知道是否存在一个工具,它将管理每个软件部分的哪个版本用于创建发布?

此工具可能会集成到工具链中,以构建所选每个软件的版本并将其收集到Windows安装程序或Linux软件包中。

修改:我们现在在做什么?

截至目前,我们正在将SVN与buildbot一起用作Linux / gcc和Windows / VStudio的CI工具。我们处于根据需要对整个存储库进行分支/标记的模式。但是,由于存在越来越多相对独立的软件部件,这会让人感到痛苦并使发布过程变得痛苦。

我们正在考虑将存储库布局更改为具有多个独立分支/标记的项目。这将更适合软件开发和发布周期。但是,我们绝对需要这样一个工具。

问题与拥有不同的软件有关,每个软件都有自己的分支/标记版本,并收集到完整的软件版本中。

修改:需要什么。

最后,我理解我需要的是Windows的包管理器。 Linux上的RPM或DEB管理器意义上的包管理器。

有人知道Windows上的软件包管理器吗?

6 个答案:

答案 0 :(得分:2)

要处理您的来源,您肯定希望单独分支您的组件。二进制文件通过package manager处理。最佳实践将根据您的目标操作系统而有所不同。我公司使用嵌入式软件,因此我们使用我们设计的自定义脚本进行管理。在Linux上,您想要生成.deb或.rpm包。 Here's Ubuntu指南。我对Windows不太熟悉,但InstallShield是我安装的软件中的一个流行选择。

它们都应该具有指定依赖项版本范围的机制。您可以要求确切的版本,特定版本或更新版本,或两个版本之间的任何内容。然后你有一个没有二进制文件的“父”包,只是指定了组件包的版本。这将允许您升级一个组件,同时保留其他组件的二进制文件。如果你想把它全部保存在一个包中,没有理由不从源代码重建整个东西。如果您的构建脚本受版本控制,那么您的二进制文件将是相同的。

答案 1 :(得分:0)

我一直在玩的一个工具是maven,它在展示各种生命周期的方式上非常有趣。您不仅可以使用java项目,还可以使用.net,并且有很多插件,以及良好的存储库(我使用的是sonatype中的插件)。

答案 2 :(得分:0)

我认为您正在寻找的术语是Software Configuration Management。这里有一篇非常重要的文件:http://www.sei.cmu.edu/reports/87cm004.pdf

答案 3 :(得分:0)

最明显的问题是软件的不同部分之间存在依赖关系的问题(如Kernel 1.0,Driver A 1.1等)。如果它能够管理不那样的依赖关系,那么这将给我一个你必须考虑构建工具的印象。所以你应该看看Maven(已经提到过),SCons(我不确定)或其他像Ant这样的工具和Ivy。您需要定义某种基线,该基线描述哪个版本在哪个版本中协同工作并且可以发布。这是元信息,应由构建工具处理。你可以自己创造一些东西......但我不建议这样做。

答案 4 :(得分:0)

我们有一个系统,其中“主干”是生产中的。我们为下一个版本创建了一个分支,当开发人员完成对某个问题的更改时,他会将这些更改检入我们的发布管理器,并将这些更改的文件与该问题编号或错误ID相关联。

当我们去构建时,我们可以阻止一个问题的所有更改,只是在我们的构建中不包括该问题。当我们折叠分支时,我们可以看到所有已更改但未包含在上一个构建中的文件 - 我们将它们从崩溃中排除。

这个系统的另一个不错的部分是它需要所有SQL脚本并将它们(巧妙地)组合成一个大的SQL文件,用于将版本升级到Test,QA然后Prod。

可以找到更多HERE.

答案 5 :(得分:0)

我们使用Buckminster来管理软件部署的集成级别。

我们有各种代码存储库(内部gitsvn存储库,以及对外部库和存储库的引用,例如PyDev),它将它们完美地结合在一起,只部署了任何给定构建所需的组件。

来自Tech Overview page

  

Buckminster是一个分量分辨率&物化框架。其目的是为您获取软件组件,并在选择的上下文中实现它们,通常是工作空间或文件系统。无论您是在查看本地计算机,开发组织内部还是公共开源云中的可用内容,这都适用。 Buckminster消除了组件描述中的歧义,实现了组件共享,并在开发,构建,组装和部署方案中应用时提高了工作效率。

     

Buckminster是一个可扩展的元框架,包含组件元数据语言和运行时,可以在Eclipse IDE中作为无头或插件执行。虽然Buckminster可用于解决常见的构建,组装和安装问题。部署问题,它本身不是构建或组件管理系统。 Buckminster可以在各种构建和源代码管理工具(Maven,ANT,CVS,SVN,PDE等)中重用现有投资,并且旨在尽可能少地限制这些外部工具可以提供的服务。

使用 Buckminster 我可以在一个步骤中部署我们软件的任何主要版本,以及我的任何一个客户的特定配置。

Buckminster 还与我们的Jenkins(nee Hudson)持续集成服务器很好地集成。

最后, Buickminster 使我们能够将我们的主要源存储库从单一的svn存储库移动到一些更细粒度的git存储库中。安全,有管理的方式。在这个版本中,我们将软件的一个主要组成部分从svn移到了它自己的git存储库中,虽然存在一些重新集成问题,但它们是可管理的。

通过一次转换一个子系统,我们可以显着降低在移动时破坏整个系统的风险,并且必须恢复使用svn或者使用损坏的部署系统直到它被修复了。