如何配置Git post commit hook

时间:2012-10-09 07:06:03

标签: git jenkins hook commit

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

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

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


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

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

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

4 个答案:

答案 0 :(得分:149)

如“Polling must die: triggering Jenkins builds from a git hook”中所述,您可以通知Jenkins新提交:

  

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

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

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

     

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

作为mentioned here,请务必使用Jenkins服务器的正确地址:

  

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

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

为了强调最后一点,ptha添加了in the comments

  

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

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

url 参数应与您在Jenkins作业的存储库网址中完全匹配。   在复制示例时,我遗漏了协议,在我们的案例ssh://中,它没有用。


您还可以使用“Push based builds using Jenkins and GIT

中的简单收发后挂钩
#!/bin/bash
/usr/bin/curl --user USERNAME:PASS -s \

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

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

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


  

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

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

  • 在第一次通话中填写“构建”备注(请参阅git notes
  • 在后续调用中,获取用于构建的分支候选者HEADgit notes'构建'(git show refs/notes/build)引用的提交之间的提交列表:{{1 }}。
  • 您的脚本可以解析该列表并确定是否需要继续构建。
  • 无论如何,请将git diff --name-only SHA_build HEAD'git notes'创建/移至build

2016年5月:cwhsu指出in the comments以下可能的网址:

  

如果您在项目中设置了触发器配置,则可以使用HEAD

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


2016年6月,polaretto指出in the comments

  

我想通过一些shell脚本添加它,您可以避免手动URL配置,特别是如果您在公共目录下有许多存储库。
  例如,我使用这些参数扩展来获取回购名称

curl --user USER:PWD http://JENKINS_SERVER/job/JOB_NAME/build?token=YOUR_TOKEN
     

然后像:

一样使用它
repository=${PWD%/hooks}; 
repository=${repository##*/} 

答案 1 :(得分:16)

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

只需使用curl使用git提供的git hook来触发Jenkins作业。 命令

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

可以运行Jenkins作业,其中someJob是Jenkins作业的名称。

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

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

答案 2 :(得分:3)

正如之前的回答确实显示了完整钩子如何看起来像这样的例子是我工作的post-receive钩子的代码:

#!/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工作。

答案 3 :(得分:2)

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

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

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

1:将我的钩子改为:

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

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

以前的解决方案的缺点是我不得不在钩子文件中公开我的passwd。在我的情况下是不可接受的。

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

这仍然不是一个完美的解决方案,因为现在你可以在没有登录的情况下在Jenkins中看到该项目。使用http登录的前一种方法可能会有一个更好的解决方案,但我还没想到它。