【问题标题】:How can I retain compiler warnings in Hudson (CI) when using SVN Update?使用 SVN 更新时,如何在 Hudson (CI) 中保留编译器警告?
【发布时间】:2011-03-16 00:37:59
【问题描述】:

我使用 Hudson 进行了持续集成设置,最近我将作业配置为使用 svn update 来获取最新版本的代码。我真的很喜欢这种方法,因为它允许 msbuild 适当地进行版本控制并且只构建受影响的程序集。

但是,我注意到,由于我没有再次构建所有程序集,因此如果这些程序集没有构建,我会释放所有编译器警告。

例如,如果我有 3 个程序集,它们通过缩进展示了依赖关系:

  • 程序集 1 10 个警告
    • 程序集 2(取决于 1)10 个警告
      • 程序集 3(取决于 2)10 个警告

第一次构建将构建所有 3 个程序集并记录 30 条警告。

下一个构建,如果我只更改 Assembly 3,Hudson 将只构建 Assembly 3,我只会收到 10 个该构建的警告,实际上将 20 个警告标记为“已修复”。

据我所知,没有办法解决这个问题,但我很想知道是否有人将 Hudson 配置为将这些编译器警告从一个构建保留到另一个构建。

编辑:是的,我意识到这可能会变成“你应该/不应该对 CI 框进行更新”的辩论,但我们采用更新方法是有原因的。

【问题讨论】:

    标签: c# msbuild continuous-integration hudson compiler-warnings


    【解决方案1】:

    我会改变你的 CI 构建方法。在构建机器上进行增量构建非常具有误导性,并且仅具有边际价值(恕我直言),除非您的系统与操作系统一样大,否则您可能不会为自己节省太多时间。

    如果您有不经常或从不更改的程序集,请将它们打包为“第三方”依赖项(甚至可能在合并模块中,以便您的部署可以轻松获取它们)并且不要使用 CI 重新构建它们。

    另一方面,如果您的所有程序集都是易失性的(需要在一个发布周期中多次重建),请始终构建它们。

    【讨论】:

    • 它在什么方面具有误导性?我的 CI 框仍将构建和生成最新版本的程序集。此外,与完全擦除相比,进行更新将我们的 50-75 装配构建从 15 多分钟缩短到平均 2-3 分钟,因此对我们来说是值得的。
    • 也许我太保守了,但我不相信任何不干净的构建。增量构建可以隐藏一些微妙的事情,例如引入会破坏干净构建的循环依赖项。但是,15+ 到 2-3 分钟确实改变了这个等式。
    • 我同意 dkackman 关于信任的观点,但不一定同意等式的重大变化。
    • @dkackman,也许我没有正确描述这一点或增量构建如何正确完成。我有一个包含 50 多个项目的解决方案。 Msbuild 正在构建解决方案。引用由项目完成(而不是由组装的 dll)。如果对任何给定项目中的代码进行了更改,则 msbuild 足够智能,可以构建引用更改后的程序集的每个程序集。没有办法(在上述情况下)您可以将错误或循环依赖项添加到混合中,否则这些错误或循环依赖项会被完全干净的构建捕获
    • @Allen - 每个解决方案有 50 多个项目,我会开始考虑将项目分解为更细化的层,其中每一层都有:1 个解决方案、1 个 CI、1 个生产构建、1 个合并模块(假设你'正在使用 MSI)。我个人不喜欢管理大型系统的“一个解决方案来统治他们并在黑暗中束缚他们”的方法。
    【解决方案2】:

    嗯,msbuild 正在做它应该做的事情:它只记录它遇到的警告。

    如果你必须使用 svn update,唯一的办法就是:

    • 解析构建日志并确定哪些程序集未构建
    • foreach 未构建的程序集
      • 查看上次构建特定程序集的警告
      • 手动将这些警告转移到当前版本中。

    它可能/可能不会笨重,它必须对 msbuild 日志格式有一个很好的理解。

    也有人会争辩说它具有误导性,因为您会记录未针对该特定构建记录的警告。

    【讨论】:

    • 只需三个单独的构建,您将始终收到每个程序集的正确警告。
    • 老实说,我已经考虑过这一点,但我知道这在大型项目中是多么可行
    【解决方案3】:

    您进行持续集成以查看一个程序集如何干扰其他程序集。因此,如果他们有依赖项,您应该全部构建。如果它们根本没有依赖关系,请为每个程序集创建一个作业(在您的情况下为 3)。

    您描述的版本不是完整版本,它只是更新版本,应该在开发人员机器上完成。

    编辑:版本问题

    您可以配置 Hudson(与 SVN 相关)以忽略某些用户的提交。使用此黑名单,msbuild 进行版本控制应该没有问题。

    【讨论】:

    • 对,我们正在按设计进行更新构建,因为无需重新构建未更改的程序集。各个开发人员会根据需要更新构建并完成重建。我认为您将很难争辩说 CI 构建不应该是更新构建(以防您暗指这一点)。另外,通过更新,我们允许 msbuild 处理此处讨论的版本控制:stackoverflow.com/questions/1126880/…
    • 我编辑了问题以表明这 3 个程序集是相关的
    • 我对相关的定义是,如果上游项目发生变化,可能会导致下游项目的构建中断。因此需要一个完整的构建。如果不是这样,那么它们就是独立的。
    • 是的,msbuild 足够聪明,可以理解这一点,因此可以构建所有下游项目...在我的示例中,如果我更改了 Assembly 2,那么 msbuild 将构建 Assemblies 2 和 3。这就是自动版本控制的原因(1.0.*) 非常性感,因为它会将未更改的程序集保持在正确的版本,并自动为所有受影响的程序集增加版本
    • 你只是比我更信任技术。 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 2018-08-31
    相关资源
    最近更新 更多