【问题标题】:When building only a subdirectory of a Git repo, Jenkins shows the changes of the whole repo - why?当仅构建 Git 存储库的子目录时,Jenkins 会显示整个存储库的更改 - 为什么?
【发布时间】:2013-09-04 08:29:56
【问题描述】:

我们刚刚迁移到 Git,所以如果我提出愚蠢的问题,请原谅我 :-)

我们的 Git 存储库包含几个 Maven 项目,像这样

ssh://git@git.whatever.com:7999/foo/foo.git
   bar1
   bar2

我有单独的 Jenkins 作业来构建 bar1 和 bar2。为了防止对 bar1 的推送也触发 bar2,我在 bar2 中的 Advanced... Included Regions 下配置了 Git 插件,使其仅包含 bar2/.* - 反之亦然,在 bar1 作业中:bar1/.*

这很好用,但有一件事让我烦恼:两个作业中的更改显示了 repo(bar1 和 bar2)的所有更改,而不仅仅是特定项目的更改。

我该如何配置?

截图:

【问题讨论】:

  • 你是为每个人使用一个 repo(即 bar1 在它自己的 repo 中,bar2 在它自己的 repo 中)还是它们都在同一个 repo 中(我假设后者,但你说 repos 是复数,所以我很困惑)。
  • 是的,bar1 和 bar2 都在同一个 repo foo 中。抱歉,如果不清楚,我改变了问题。
  • 认为这可能是您的意思,在意识到之前写下我的答案已经完成一半,并认为我会在发布答案之前进行检查。
  • 您如何配置您的工作以在此处“仅”执行 bar1/bar2?像这样?stackoverflow.com/questions/17310959/…
  • 嗯,第一件事是(使用 Maven 项目)我指定根 POM 位于 bar1/pom.xml 中。第二件事是我将 Git 插件配置为仅对 bar1 目录中的更改做出反应。为此,我单击“要构建的分支”中的高级...按钮并指定要响应的路径:包含的区域:bar1/.*

标签: git jenkins


【解决方案1】:

非常晚了,但 Jenkins 总是检出整个 repo(即使在进行稀疏检出时,Jenkins 仍然会将整个 repo 克隆到本地磁盘)并在构建页面。

这是 Jenkins 开发人员的意图。 CI 的一个核心方面是能够轻松地跟踪回购历史中的变化。如果每个构建只显示子目录的修订版本,跨存储库的更改跟踪将变得非常困难(并且对于大型存储库几乎不可能)。

【讨论】:

    【解决方案2】:

    当您提到更改时,我假设您指的是提交日志,在这种情况下,如果没有自定义 git 客户端或至少一个自定义 git 提交查看器脚本,您将无法执行您需要的操作。

    理论上,一个存储库应该只包含一个项目。否则你在使用 git “错误”(在非常宽松的意义上使用“错误”这个词,因为 git 只是一个工具,使用它是不可能的,只是为了你自己的需求而使用它很糟糕)。

    做你想做的唯一方法是将 bar1 和 bar2 文件夹拆分为单独的 git repo。如果它们有点像模块,它们都需要在同一个站点上,您可以为每个项目分别 git init/clone 到 bar1 和 bar2 文件夹,以便您可以单独控制它们。

    另一种选择是将它们分成单独的 git 存储库,然后创建第三个“主”存储库,其中仅将另外两个存储库作为子模块包含在它们各自的文件夹中。然后像您可能已经使用的那样使用自定义 git 挂钩,以使主拉动并构建正确的文件夹/项目/栏(x)。然而,这纯粹是为了不必先设置几个文件夹,这有点不合时宜。

    基本上,如果不编写自己的自定义提交查看器,就无法根据文件夹拆分提交日志。您需要将项目分成多个 repo。然后如何将它们重新组合在一起并自动执行任何构建任务,这取决于您。毫无疑问,我上面提到的方法更多。只是为您的需求找到最佳解决方案的一个案例。

    【讨论】:

    • 不幸的是,已经决定将多个项目集成到一个存储库中。不过谢谢你的回答!
    • Google 在一个 (Perforce) 存储库中确实拥有数以万计的项目。 Facebook 对 git 也是如此。如果您决定告诉他们他们做错了,您不妨也让 Torvalds 知道, 因为git itself 有多个项目(从某种意义上说,它们是构建的 i>、打包部署分开):git、gitk、git-gui、gitweb。
    • @Lee,答案令人困惑。从 Eclipse 推送项目时,它会创建子目录,不推荐使用其他选项。表示建议使用 git hub 中的子目录,但与 jenkins 集成很困难。
    • Paul Draper 的评论完全正确。 Google 在一个存储库中有 2 0 亿 行代码,在 uber 存储库中它们有许多单独的项目。将一个项目映射到一个 repo 适用于玩具系统,但很快就会遇到菱形问题,并且创始人缺乏原子提交/回滚。
    • @user1461450 我从来没有说过不是。但是这个人并没有运行谷歌。肥胖和苗条的回购有利有弊,我看到更多的公司由于缺乏对权衡的了解而陷入了肥胖回购的困境。 Slim repo 是一种组织代码的安全方式,直到您拥有做出明智决定的知识和资源。我明确表示,“错误”一词的使用是指“不符合您的要求”,这似乎被每个人在寻求炫耀他们的维基百科技能时所忽视的。
    猜你喜欢
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多