133

如何从 Jenkins 远程触发构建?
如何配置 Git 提交后挂钩?

我的要求是,每当在特定项目的 Git 存储库中进行更改时,它将自动为该项目启动 Jenkins 构建。

在 Jenkins 触发器构建部分,我选择了远程触发器构建。
.git目录中,有 hooks 目录,我们必须配置 post commit 文件。
我很困惑如何从那里触发构建(我知道我们应该使用 curl 命令的某些部分)。


curl cmbuild.aln.com/jenkins/view/project name/job/myproject/buildwithparameters?Branch=feat-con

我已将此命令放在我的 git 服务器挂钩目录(提交后挂钩)中。
每当存储库中发生更改时,它都会运行自动构建。

我想检查变更集中是否至少有一个 java 文件应该开始构建。
假设开发人员只更改了构建不应启动的 xml 文件或属性文件。
除了xml,假设.java文件在那里,构建应该开始。

4

4 回答 4

169

如“轮询必须死:从 git hook 触发 Jenkins 构建”中所述,您可以通知 Jenkins 新的提交:

使用最新的Git 插件 1.1.14(我现在刚刚发布),您现在可以更轻松地执行此操作,只需执行以下命令:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>

这将扫描所有配置为检查指定 URL 的作业,如果它们也配置了轮询,它将立即触发轮询(如果发现值得构建的更改,则会依次触发构建。 )

这允许脚本在 Jenkins 中来来去去时保持不变。
或者,如果您在单个存储库主机应用程序(例如 Gitosis)下有多个存储库,则可以与所有存储库共享一个接收后挂钩脚本。最后,即使对于受保护的 Jenkins,此 URL 也不需要身份验证,因为服务器不直接使用客户端发送的任何内容。它在实际开始构建之前运行轮询以验证是否存在更改。

如此处所述,请确保为您的 Jenkins 服务器使用正确的地址:

由于我们在端口 8080 上将 Jenkins 作为独立 Web 服务器运行,因此 URL 应该没有/jenkins,如下所示:

http://jenkins:8080/git/notifyCommit?url=git@gitserver:tools/common.git

为了强调最后一点,ptha在评论中添加:

这可能很明显,但我遇到了以下问题:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>. 

url参数应该与您在Jenkins 作业的Repository URL中的内容完全匹配。
在复制示例时,我省略了协议,在我们的例子ssh://中,它没有工作。


您还可以使用简单的 post-receive 挂钩,如“使用 Jenkins 和 GIT 的基于推送的构建”中的

#!/bin/bash
/usr/bin/curl --user USERNAME:PASS -s \

http://jenkinsci/job/PROJECTNAME/build?token=1qaz2wsx

将您的 Jenkins 作业配置为能够“远程触发构建”并使用身份验证令牌(1qaz2wsx在本例中)。

但是,这是一个特定于项目的脚本,作者提到了一种概括它的方法。
第一个解决方案更容易,因为它不依赖于身份验证或特定项目。


我想检查更改集是否至少有一个 java 文件,构建应该开始。
假设开发人员只更改了 XML 文件或属性文件,那么构建不应该开始。

基本上,您的构建脚本可以:

  • git notes在第一次通话时添加“构建”注释(参见)
  • 在随后的调用中,获取HEAD您的分支候选构建与git notes“构建”(git show refs/notes/build)引用的提交之间的提交列表:git diff --name-only SHA_build HEAD
  • 您的脚本可以解析该列表并决定是否需要继续构建。
  • 在任何情况下,创建/移动你git notes的 ' build' 到HEAD.

2016 年 5 月:cwhsu在评论中指出以下可能的网址:

curl --user USER:PWD http://JENKINS_SERVER/job/JOB_NAME/build?token=YOUR_TOKEN如果您在项目中设置触发器配置,则可以使用

http://i.imgur.com/IolrOOj.png


2016 年 6 月,polaretto在评论中指出:

我想补充一点,只需一点 shell 脚本,您就可以避免手动配置 url,尤其是当您在一个公共目录下有许多存储库时。
例如,我使用这些参数扩展来获取 repo 名称

repository=${PWD%/hooks}; 
repository=${repository##*/} 

然后像这样使用它:

curl $JENKINS_URL/git/notifyCommit?url=$GIT_URL/$repository
于 2012-10-09T07:29:00.503 回答
18

希望这会有所帮助: http: //nrecursions.blogspot.in/2014/02/how-to-trigger-jenkins-build-on-git.html

这只是curl使用 git 提供的 git hooks 来触发 Jenkins 作业的问题。
命令

curl http://localhost:8080/job/someJob/build?delay=0sec

可以运行 Jenkins 作业,这里someJob是 Jenkins 作业的名称。

在隐藏的 .git 文件夹中搜索该hooks文件夹。post-commit.sample将文件重命名为post-commit. 用记事本打开它,删除该: Nothing行并将上面的命令粘贴到其中。

就是这样。每当您进行提交时,Git 都会触发文件中定义的提交后命令。

于 2014-02-07T19:58:00.763 回答
3

正如前面的答案确实显示了一个完整挂钩的示例,这里是我的工作后接收挂钩的代码:

#!/usr/bin/python

import sys
from subprocess import call

if __name__ == '__main__':
    for line in sys.stdin.xreadlines():
        old, new, ref = line.strip().split(' ')
        if ref == 'refs/heads/master':
            print "=============================================="
            print "Pushing to master. Triggering jenkins.        "
            print "=============================================="
            sys.stdout.flush()
            call(["curl", "-sS", "http://jenkinsserver/git/notifyCommit?url=ssh://user@gitserver/var/git/repo.git"])

在这种情况下,我仅在推送到 master 而不是其他分支时触发 jenkins 作业。

于 2013-04-24T12:08:54.253 回答
3

我想在上面的答案中补充一点,如果启用 Jenkins 授权会变得有点困难。

启用它后,我收到一条错误消息,指出匿名用户需要读取权限。

我看到了两种可能的解决方案:

1:将我的钩子更改为:

curl --user name:passwd -s http://domain?token=whatevertokenuhave

2:设置基于项目的授权。

前一种解决方案的缺点是我必须在挂钩文件中公开我的密码。在我的情况下是不可接受的。

第二个对我有用。在全局身份验证设置中,我必须启用整体>为匿名用户读取。在我想触发的项目中,我必须启用 Job>Build and Job>Read for Anonymous。

这仍然不是一个完美的解决方案,因为现在您无需登录即可在 Jenkins 中查看该项目。使用http登录的前一种方法可能会有更好的解决方案,但我还没有弄清楚。

于 2015-12-16T15:44:53.980 回答