构建在SVN中的预提交

时间:2013-05-24 08:22:59

标签: svn

我知道这已经被问到了,但是我们真的想拒绝任何提交文件的尝试,这些文件会破坏trunk中的项目。拒绝已提交文件的决定基于正在提交的文件所属的项目构建过程的结果。我知道在预提交阶段,无法同时访问存储库,但这对我们来说不是问题,因为我们的构建非常快,我们可以容忍任何延迟。

有没有工具可以达到我们想要的效果?请注意,有必要重新编译整个项目单元,而不仅仅是要提交的单个文件。

如果无法以任何合理的方式完成,是否可以在后提交时构建代码,然后在构建步骤失败的情况下立即回滚? Hudson或其他工具可以配置为我们想要的吗?

3 个答案:

答案 0 :(得分:8)

即使您的构建速度很快。我们假设您可以在90秒内构建整个项目。你希望人们每次提交代码都等待90秒吗?可能会发生的是,人们只会做更少的提交,做出更大的更改,并导致更多的错误。

首先要意识到做出错误的修改不是世界末日。如果您在早期发现问题,则可以轻松恢复更改。这里的关键是早期发现。

如果您还没有,请获取Jenkins等持续集成系统。每当有人提交代码更改时,Jenkins都会进行构建。如果构建速度与您声明的速度一样快,那么当更改破坏构建时,您将在几分钟内收到通知。如果你愿意,你甚至可以让詹金斯恢复变革。我们的理念是开发人员有10分钟的时间来解决问题,或者还原他们的变化。然后,我们把它们放在栅栏里,用烂番茄去皮。 (实际上,人力资源部门不会让我们这样做。)

其次,设置易于遵循的标准,允许开发人员确保他们的更改能够正常工作。我们有几个基本的:

  • 我们定义了一组基本工具,所有开发人员都应该拥有(Java,Ant,Subversion)。
  • 在这三个基本工具之外,所有其他工具和所需部件都放在工作目录中并检查到Subversion。
  • 不需要特殊的环境设置。构建不需要配置
  • 构建完成后,所有构建的对象都在工作目录中完成。

这使我可以轻松地在Jenkins服务器上设置构建。而且,更重要的是,它使开发人员可以轻松使用Jenkins将用于构建的相同构建系统。如果他们可以构建它,Jenkins可以构建它。

接下来,您必须更改您的开发文化。打破构建很糟糕。一旦完成,Jenkins将公开羞辱任何破坏构建的开发人员。我看到一家商店设有红绿灯。如果Jenkins构建破了,那些灯会变红。发生这种情况时,这是一件大事。经理们出来想知道发生了什么。当我在那里时,那些灯永远不会变红。

当然,能够运行构建是软件的第一步。这是一个很小的婴儿步骤 - 甚至可能是爬行。不,甚至不是,它是六个月大婴儿第一次蠕动的版本。如果破碎的构建是您所在地区的主要问题,那么您就会遇到非常严重的问题。

除了确保编译所有内容之外,下一步是确保代码遵循编码标准,并且代码不会做一些可能不好的事情。在Java世界中,它针对代码运行Checkstyle,Findbugs和PMD。詹金斯允许我发布漂亮的图表,向我展示这些程序的结果。我们还收集所有编译警告和JavaDoc错误并绘制图表。如果来自任何这些进程的警告太多,我们甚至可以设置Jenkins使构建失败。您的代码可能会编译,但由于技术不良,构建失败。

接下来是单元测试。在Java世界中,它的JUnit和Jenkins再次显示结果。如果任何JUnit测试失败,我们将失败。如果您的基本界面不好,那么建立良好的构建并没有多大帮助。

然后,有代码覆盖率。我们的代码有多少是经过单元测试的。我们使用JaCoCo。我们不会因为代码覆盖率低而无法构建,但我们确实会对开发人员施加压力,以提高代码覆盖率。最后,我们可以做其他测试。我们部署并运行自动化功能和系统测试。

开发人员所做的每一次更改都会被一直抨击到单元测试。这是我非常喜欢Java的一个方面,我认为Java开发领先于Java。典型的Java构建可以在几分钟内完成。我们无法进行构建,并在10分钟内完成所有单元测试,这种情况很少见。任何问题都可以及早发现并及早修复。并且,所有问题都在Jenkins公开展示。我们看到谁破坏了构建或导致单元测试失败。我们看到谁有需要修复的编译器警告,或者做了一些糟糕的编码练习。

因为我给开发人员提供了Jenkins用于构建的相同工具集,所以他们可以很容易地看到Jenkins会看到什么。他们也可以运行单元测试和代码测试。没有理由他们提交的代码导致的问题比解决的问题多得多。

这是您取得巨大进步的地方:改善发展文化,关注他们正在做的事情,并为不良做法发出亮点。

在开发之前设置障碍 - 比如让开发人员在每次提交后等待90秒以确保他们的更改构建 - 构建怨恨并且通常会适得其反。您不再是团队的一员,而是构建警察,他们将每个人视为潜在的嫌疑人。相反,与开发人员合作,让他们相信你想要的是他们的利益。一旦他们看到了,他们将与您合作,您的整个开发周期将更加顺畅。

答案 1 :(得分:0)

我知道一些CI工具能够执行“预提交CI”,因此变更集首先发送到CI服务器进行构建,一旦成功构建,它就会提交给SVN。

我没有亲自试过这个功能,但我相信工作流程可能需要稍微更改(而不是直接提交,更改会发送到CI进行预提交构建)

QuickBuild: Proof-Build

Teamcity: Pre-tested commit

答案 2 :(得分:0)

在大多数情况下,您提交分支,它会构建,如果成功,分支代码将合并到主干。这适用于大多数SCM系统,这些系统没有明确支持您要求的内容 - 考虑到scm只发送已更改的文件,您需要签出完整列表以使构建服务器正常工作(您不要&# 39;我真的想根据前一个版本中的文件进行编译,现在就开始编译。

SVN很乐意在预提交钩子中执行此操作,我在此钩子中使用perl脚本检查可接受的签入注释并拒绝可能添加到repo的狡猾文件类型,因此没有理由为什么你不能简单地运行一个检查当前分支的脚本,然后将提交文件复制到它们的顶部,构建,然后检查构建日志。要使预先提交失败,只需从脚本返回1(返回0以传递它)。

很难准确说出您需要什么,因为我不知道您执行构建的内容或方式,但您的脚本需要与任何预提交钩子脚本几乎相同。 SVN附带了几个示例,您可以看到several more on the internet