Jenkins 多管道构建未检测到存储库中的更改

Jenkins Multi-Pipeline Build Not Detecting Changes in Repository

我们在这个庄园中设置了 Subversion 存储库:

我已经为整个 toast 项目(包括所有子项目)设置了 Jenkins Multi-Pipeline 构建——每个子项目都是一个 jarfile。我想要的是每次在其中一个 toast 项目中更改任何文件时,Jenkins 都会启动一个新版本。该项目应该重建。这样,如果我们在 toast 中创建一个新的子项目或在 toast 子项目之一中创建一个新分支,Jenkins 将自动创建一个新的版本。

这是我的 Jenkins 多分支 设置:

Branch Sources

Subversion

  • Project Repository Base: http://svn.vegicorp.net/svn/toast
  • Credentials: builder/*****
  • Include Branches: */trunk, */branches/*
  • Exclude Branches: */private
  • Property Strategy: All branches get the same properties

Build Configuration

  • Mode: By Jenkinsfile

Build Triggers (None selected)

  • Trigger builds remotely (e.g., from scripts) Help for feature: Trigger * builds remotely (e.g., from scripts)
  • Build periodically Help for feature: Build periodically
  • Build when another project is promoted
  • Maven Dependency Update Trigger Help for feature: Maven Dependency Update Trigger
  • Periodically if not otherwise run

请注意,Build Triggers 列表不包括 Poll SCM。存储库中的更改不会触发任何构建。 Jenkinsfiles 位于每个子项目的根目录。如果我强制重新索引,将构建所有更改的子项目并找到所有新分支。我最初确实 Periodically 检查并每分钟重新索引一次以获取更改,但这很笨拙并且似乎导致 Jenkins 消耗内存。

触发基于 SCM 更改的构建应该是非常基本的,但我没有像处理标准作业那样看到配置参数。我似乎也无法进入子项目并将它们设置为触发构建。

一定有一些非常非常简单的东西是我所缺少的。

配置:

也许您需要在基本目录中进行版本控制。尝试在此处放置一个测试文件 http://svn.vegicorp.net/svn/toast/test.txt。这可能会使轮询 SCM 选项出现。

您从未提到为您的存储库设置 webhook,所以这可能是问题(或部分问题)。

Jenkins 本身不能只知道何时对存储库进行了更改。需要将存储库配置为在进行更改时进行广播。 Webhook 定义了一个 URL 存储库可以 POST 各种信息。将它指向 Jenkins 可以读取的 URL,这允许 Jenkins 响应它接收到的特定类型的信息。

例如,如果您使用的是 github,则可以让 Jenkins 监听 url,例如 https://my-jenkins.com/github-webhook/。 Github 可以配置为在打开 PR 或执行合并后立即发送 POST。这个POST不仅表示动作已经执行,还会包含动作的相关信息,比如SHA,分支名,执行动作的用户...等等

Jenkins 和 SVN 都应该能够定义 URL 它们各自 POST 并继续监听。

我的知识更具体地在于 git。但这可能是开始 SVN webhook 的好地方:http://help.projectlocker.com/knowledge_base/topics/how-do-i-use-subversion-webhooks

我终于找到了答案。我在 Jenkins' Jira Database 中找到了一个条目,其中提到了这个确切的问题。该问题称为 SCM 轮询未在使用 Mercurial SCM 的多分支管道中执行 。其他用户也附和。

答案是 Jenkins 多分支项目不需要轮询 SCM,因为索引分支会为您完成:

Branch projects (the children) do not poll in isolation. Rather, the multibranch project (the parent folder) subsumes that function as part of branch indexing. If there are new heads on existing branches, new branch project builds will be triggered. You need merely check the box Periodically if not otherwise run in the folder configuration.

所以,我需要设置分支的重新索引。我对这个解决方案不满意,因为它看起来很笨拙。我可以在 SVN 和 Git 中添加 post-commit 和 post-push 挂钩以在发生更改时触发构建,然后定期重建索引(比如每小时一次)。问题在于配置这些挂钩,然后使它们保持最新。每个项目都需要自己的 POST 操作,这意味着每次项目更改时都会更新存储库服务器。有了轮询,我就不用担心 hook 的维护了。