如何配置 Git 提交钩子

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

我的要求是,只要在 Git 存储库中对特定项目进行了更改,就会自动启动该项目的 Jenkins 构建。

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


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

我已经将这个命令放在 git 服务器挂钩目录(post commit hook)中。
无论何时在存储库中发生更改,它都在运行自动构建。

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

208987 次浏览

正如在“ 轮询必须消亡: 触发 Jenkins 从 Git 钩子构建”中提到的,您可以通知 Jenkins 一个新的提交:

使用最新的 Git 插件1.1.14(我刚刚发布) ,现在只需执行以下命令就可以更轻松地完成这项工作:

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

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

这使得在詹金斯的工作来来去去时,脚本保持不变。
或者,如果在一个存储库主机应用程序(如 Gitosis)下有多个存储库,则可以与所有存储库共享一个接收后钩子脚本。最后,即使对于安全的 Jenkins,这个 URL 也不需要身份验证,因为服务器不直接使用客户机发送的任何内容。它在实际启动构建之前运行轮询来验证是否有更改。

作为 这里提到,请确保为您的 Jenkins 服务器使用正确的地址:

因为我们在8080端口上运行 Jenkins 作为独立的 Webserver,所以 URL 应该没有 /jenkins,像这样:

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

为了强调最后一点,止痛药增加了 在评论中:

这可能很明显,但我有问题:

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

网址参数应该与您在詹金斯作业的 存储库 URL中的参数完全匹配。
在复制示例时,我省略了协议,在我们的例子中是 ssh://,它不起作用。


您也可以使用一个简单的后接收钩,如在“ 使用 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‘ build’(git show refs/notes/build) : git diff --name-only SHA_build HEAD引用的提交之间的提交列表。
  • 您的脚本可以解析该列表并决定是否需要继续构建。
  • 在任何情况下,创建/移动您的 git notesbuild’到 HEAD

2016年5月: (咒语)指出 在评论中可能的网址如下:

如果在项目中设置了触发器配置,那么只需使用 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 配置,特别是如果您在一个公共目录下有许多存储库。
例如,我使用这些参数扩展来获得回购名称

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

然后像这样使用它:

curl $JENKINS_URL/git/notifyCommit?url=$GIT_URL/$repository

正如前面的答案所展示的一个例子,完整的钩子可能看起来像这里是我的工作后接收钩子的代码:

#!/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"])

在这种情况下,我触发 jenkins 作业只有当推到主,而不是其他分支。

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

只需要使用 curl触发 Jenkins 作业,使用 git 提供的 git 钩子即可。
命令

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

可以运行一个詹金斯作业,其中 someJob是詹金斯作业的名称。

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

就是这样。无论何时执行提交,Git 都会触发文件中定义的 post-commit 命令。

我想补充上面的答案,它变得有点困难,如果詹金斯授权启用。

启用后,我得到一个错误消息,匿名用户需要读权限。

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

第1集: 改变我的钩子:

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

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

前一种解决方案的缺点是,我必须在钩子文件中公开密码。对我来说是不可接受的。

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

这仍然不是一个完美的解决方案,因为现在您可以在 Jenkins 中看到该项目而不用登录。可能有一个甚至更好的解决方案使用前一种方法与 http 登录,但我还没有找到它。