如何配置Git Post提交钩子


126

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

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

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


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

我已经将此命令放置在我的git服务器hooks目录中(post commit hook)。
每当存储库中发生更改时,它就会运行自动构建。

我想检查changeset,至少在一个java文件中是否应该开始构建。
假设开发人员仅更改了不应开始构建的xml文件或属性文件。
与一起xml,假设.java文件已在其中开始构建。


我已经编辑了答案,以解决您问题的第二部分。
VonC 2012年

Answers:


164

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

使用最新的Git插件1.1.14(我现在才发布),您现在可以通过简单地执行以下命令来更轻松地执行此操作:

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

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

这样,在詹金斯工作来来去去时,脚本就可以保持不变。
或者,如果在单个存储库宿主应用程序(例如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参数应该完全匹配你所拥有的资源库网址您的詹金斯工作。
在复制示例时,在我们的案例中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月: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,尤其是在公共目录下有许多存储库的情况下。
例如,我使用这些参数扩展来获取存储库名称

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

然后像这样使用它:

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

嗨,冯,正如您在第一次调用中所说的那样,我必须放置一个构建笔记。每当开发人员将更改推入git repo时,我的第一个调用就是读取.java文件。我对所有这些事情都是陌生的,这就是为什么我要求每一步。请不要介意,我必须完成此任务。
phanikumar Raja 2012年

这对我很有帮助。我已经在该主题的帮助下编写了Git hook。Tnx伙计们!
Kirill Bazarov

我必须将curl调用添加到接收后文件中,此答案尚不完全清楚。反正很有帮助!
Magnilex

1
@IgorGanapolsky在裸回购的hooks文件夹中,该文件夹正在接收提交并必须致电jenkins:yourRepo.git/hooks/post-receive
VonC

2
可能很明显,但是我遇到了以下问题:curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>。该URL参数应该完全匹配你所拥有的资源库网址您的詹金斯工作。在复制示例时,我忽略了协议,在我们的情况下为ssh://,但它不起作用。
ptha 2015年

17

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

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

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

可以运行Jenkins作业,Jenkins作业someJob的名称在哪里。

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

而已。每当执行提交时,Git都会触发文件中定义的提交后命令。


从dev机器执行提交后,将调用post-receive,而不是post-commit。通过将日志语句放在两个钩中进行验证。我在阅读文档时是否错了,是否应该在提交后进行提交?
Shirish Hirekodi 2015年

@Shirish:太奇怪了。也许您的做法有所不同
Nav

当我按下最后一次更改提交时,此构建成功,但是当我提交更改时,未构建... ???

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作业。


1
您如何将此Python脚本绑定到Jenkins?还是只运行一次?
IgorGanapolsky 2014年

Jenkins不知道这个钩子,主要部分是在jenkins服务器上加载notifyCommit URL,这将触发轮询。我认为轮询已启用,但詹金斯方面没有时间表。
Zitrax 2014年

那么这个python脚本在哪里呢?我假设您将其与git安装捆绑在一起以跟踪提交...
IgorGanapolsky 2014年

1
答案较晚-但是脚本位置将在钩子/接收后的git服务器上。阅读git钩子以了解更多信息。
Zitrax 2014年

3

我想补充一下上面的答案,如果启用Jenkins授权会变得更加困难。

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

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

1:将钩子更改为:

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

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.