在詹金斯(Jenkins)工作中,“仅在SCM更改时才构建”设置为true,但不使用最新提交进行构建

时间:2019-02-25 22:04:19

标签: jenkins build version-control

我有一个作业 BuildApp ,该作业的构建(MultiJob阶段)调用另一个作业 BuildAppJar 来构建一个jar。在作业 BuildApp 中,“ 仅在SCM更改时构建”设置为true。我希望作业 BuildAppJar 将使用最新的提交构建jar文件,因为作业 BuildApp 被配置为在SCM更改时生成。但是,这没有发生。取而代之的是,我得到的日志是“子作业自上次构建以来没有变化”。为什么会这样呢?任何想法?詹金斯不应该使用最新的代码来构建吗?我正在使用Git。

[WS-CLEANUP] Deleting project workspace...
[WS-CLEANUP] Deferred wipeout is used...
[WS-CLEANUP] Done
    >> Job status: [BuildAppJar] subjob has no changes since last build. 

谢谢。

2 个答案:

答案 0 :(得分:1)

这可能是由于此错误(我相信两者都是同一个问题):

https://issues.jenkins-ci.org/browse/JENKINS-50168

https://issues.jenkins-ci.org/browse/JENKINS-55524

症状是Jenkins正在轮询两个存储库,但没有检查正确的存储库进行更改。添加您的“ git polling log”(或者,取决于您的插件,在您的构建历史记录上方的列表底部显示的任何日志)以进行确认。我没有找到解决方法。

Webhooks(gitlab,bitbucket或其他任何东西)实际上并不会导致Jenkins建立特定的提交-Webhook只是通知Jenkins 某事已更改,Jenkins轮询存储库以查看是否更改应触发构建。在我的情况下,Jenkins接收到该挂钩,轮询该回购,然后轮询另一个回购(也由该作业使用,但很少更新)并检查是否有更改。因此,您需要同时选中“将更改推送到GitLab时进行构建”和“轮询SCM”。

有关其他可能性的详细列表,请检查 https://issues.jenkins-ci.org/browse/JENKINS-17614

答案 1 :(得分:0)

有效!问题是-詹金斯无法检测到子作业分支的变化。您必须为每个子作业执行SCM轮询或使用WebHook通知Jenkins。

我在WebHook中使用的示例:

  1. 安装SCM跳过插件(https://github.com/jenkinsci/scmskip-plugin),以避免在推送到分支机构后自动构建。
  2. 在您的子作业项目中Configs:

    部分构建触发器

    • 选中“将更改推送到GitLab时进行构建。GitLab Webhook URL:”
    • 检查“轮询SCM”(无计划)。
    • 单击“高级”按钮,并验证是否已选中“启用[ci-skip]”选项(默认情况下必须选中)。

    部分构建环境

    • 选中“ SCM跳过”。
  3. 在GIT项目中,添加位于设置-> WebHooks 的WebHook。

    • 输入网址:<jenkins_url>/gitlab/notify_commit
    • 检查“推送事件”
  4. 在多作业配置中:

    部分针对多作业的配置

    • 选中“轮询时除了多任务外还轮询子任务”

    部分构建触发器

    • 检查“轮询SCM”(无计划)。
  5. 使用包含单词 [ci-skip] 的消息来进行更改以跳过自动构建。

现在您可以将更改推送到您的分支,Jenkins将收到通知并跳过构建。之后,运行您的MultiJob。