我希望能够让Jenkins通过API对特定提交进行构建。
到目前为止,我能找到的最佳方法是使用“api-build”分支并强制推送所需的提交,然后以典型方式触发构建。如果没有更好的东西我会感到惊讶,但到目前为止我还没有找到它。什么是“正确”的方式(如果有的话)?
答案 0 :(得分:1)
您可以将 git hooks 与 Jenkins远程构建结合使用来实现此目的。
我使用 post-receive 钩子来处理这类事情。
在钩子的代码中(它是一个shell脚本,但你可以让它包装其他东西,比如 Python 脚本),你可以检查最后一次提交(保持<记住em> merge ,在这种情况下,你必须回到最后一次非合并提交才能找到实际的最后一次提交,看看它是否是提交的类型您想要触发构建(即包含特定子目录中的更改)。
可以通过标准 git 命令行工具获取变更集,然后使用 regexes 查看变更集是否包含任何感兴趣的路径。
一旦确定应该触发构建,您可以发送 curl 以获取触发 Jenkins远程构建所需的URL(远程需要在作业上启用已触发的构建,并且可选择设置令牌。
有关远程构建的详细信息,请参阅:https://wiki.jenkins-ci.org/display/JENKINS/Remote+access+API
根据OP的评论进行编辑:
如果您使用 post-receive 挂钩,我相信无论分支或提交是什么,它都会起作用(尽管我个人只是在 master 的基础上做到了这一点) )。它特定于* git r * epo *,因为 post-receive 钩子代码存在于该repo中。您可以通过钩子包装的代码控制如何根据已更改的内容确定是否要触发构建。这个钩子代码将与每个 git push 一起运行。
根据OP的后续评论进行编辑:
我不相信这会在没有变化时触发,因为 git 在这种情况下实际上不会推动。如果你想在没有任何变化的情况下触发构建,那么通过API的 curl 就像我之前提到的那样 - 可以随时触发构建,而不管是否通过如果在作业上启用了远程构建,则 curl 命令。
在告诉 Jenkins 构建方面,这是由构建&gt;完成的。执行shell Command ,您可以在其中指定构建操作,例如运行特定的shell脚本或 ant 命令等。
我不认为你会想通过钩子创造新的工作(我不认为这实际上是你可以通过API做的事情 - 它适用于现有的工作,IIRC)。
使用其他一些信息进行修改:
在指定构建哪个分支方面,即使通过git钩子,也可以任意指定我认为无法指定的东西。但是,您可以在 Jenkins 作业的配置的 SCM 部分中指定要构建的多个分支。
因此,如果您想要在每次提交时构建一组分支,则可以在该部分中定义多个分支,然后它将在每个分支上构建(尽管当触发给定构建时,可能只有一个branch会有那个提交。)
在 Jenkins 作业上克隆一些可能更实际,每个分支一个,只构建那个分支,然后 git hook 可以只定位该工作基于提交的分支,而不是构建在一堆分支上,其中大部分分支都不适用。
虽然这并没有让你进入任意分支,但这可能是一种方法来做一些,比如, master , dev ,测试,或类似的东西(或者可能是少数发行版本)。
如果你真的需要任意分支,你可以看一下使用 Job DSL Plugin (https://wiki.jenkins-ci.org/display/JENKINS/Job+DSL+Plugin),它应该允许对作业创建进行非常具体的控制。这可以通过调用另一个脚本( DSL 使用 Groovy )在git钩子内完成。
我自己没有试过这个插件,但听起来很有希望。它还有助于模板的使用,然后可以指定模板,这听起来也许对你的情况有好处,例如,分支会有所不同,但其他很多内容都是相当静态的。