如何配置Git提交后钩子

如何配置Git提交后钩子,git,jenkins,hook,commit,Git,Jenkins,Hook,Commit,如何从Jenkins远程触发构建? 如何配置Git提交后钩子 我的要求是,每当对特定项目的Git存储库进行更改时,它都会自动启动该项目的Jenkins build 在詹金斯触发器生成部分,我选择了远程触发器生成。 在.git目录中,hooks目录在其中,我们必须配置提交后文件。 我不知道如何从那里触发构建(我知道我们应该使用curl命令的某些部分) 我已将此命令放在git服务器挂钩目录(提交后挂钩)中。 每当存储库中发生更改时,它都会运行自动构建 我想在变更集中检查是否至少有一个java文件中

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

我的要求是,每当对特定项目的Git存储库进行更改时,它都会自动启动该项目的Jenkins build

在詹金斯触发器生成部分,我选择了远程触发器生成。
.git
目录中,hooks目录在其中,我们必须配置提交后文件。
我不知道如何从那里触发构建(我知道我们应该使用curl命令的某些部分)


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

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

如“”中所述,您可以通知Jenkins新的提交:

使用最新版本(我刚刚发布),您现在只需执行以下命令即可更轻松地执行此操作:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>
为了强调最后一点,补充说:


这可能是显而易见的,但我有以下问题:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>. 
将Jenkins作业配置为能够“远程触发构建”并使用身份验证令牌(本例中为
1qaz2wsx

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


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

基本上,构建脚本可以:

  • 在第一次通话时填写“构建”说明(请参阅)
  • 在随后的调用中,获取分支候选构建的
    HEAD
    git notes
    “build”引用的提交之间的提交列表(
    git show refs/notes/build
    ):
    git diff——仅命名SHA_build HEAD
  • 您的脚本可以解析该列表并决定是否需要继续构建
  • 在任何情况下,创建/移动您的
    git注释
    build
    ”到
    HEAD

2016年5月:指出以下可能的url:

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


2016年6月,他指出:

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

repository=${PWD%/hooks}; 
repository=${repository##*/} 
然后像这样使用它:

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

正如前面的答案所示,完整钩子的外观示例如下所示,这是我的工作岗位接收钩子的代码:

#/usr/bin/python
导入系统
从子流程导入调用
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
对于sys.stdin.xreadlines()中的行:
旧的,新的,ref=line.strip().split(“”)
如果ref==“refs/heads/master”:
打印“============================================================================”
打印“推送至大师,触发詹金斯”
打印“============================================================================”
sys.stdout.flush()
调用([“curl”,“-sS”,”http://jenkinsserver/git/notifyCommit?url=ssh://user@gitserver/var/git/repo.git“])
在这种情况下,我只在推到master而不是其他分支时触发jenkins作业。

希望这有助于:

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

curl http://localhost:8080/job/someJob/build?delay=0sec
可以运行Jenkins作业,其中
someJob
是Jenkins作业的名称

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


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

我想补充一点,如果启用Jenkins授权,则会变得更加困难

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

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

1:将我的挂钩更改为:

curl --user name:passwd -s http://domain?token=whatevertokenuhave
2:设置基于项目的授权

以前的解决方案的缺点是我必须在hook文件中公开我的passwd。对我来说是不可接受的

第二个适合我。在全局身份验证设置中,我必须为匿名用户启用全局>读取。在我想要触发的项目中,我必须启用Job>Build和Job>ReadforAnonymous


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

我已经编辑了我的答案,以解决您问题的第二部分。您好,正如您在第一次调用时所说,我必须放一个构建注释。我的第一个调用是在开发人员将更改推送到git repo时读取.java文件。我对所有这些东西都是陌生的,这就是为什么我要求每一步。请不要介意,我必须完成这项任务。这对我很有帮助。在这个主题的帮助下,我编写了GitHook。Tnx伙计们!我不得不将curl调用添加到post-receive文件中,这个答案并不完全清楚。无论如何都很有帮助@IgorGanapolsky在裸repo的hooks文件夹中,它正在接收提交,并且必须调用jenkins:
yourRepo.git/hooks/post-
curl $JENKINS_URL/git/notifyCommit?url=$GIT_URL/$repository
curl http://localhost:8080/job/someJob/build?delay=0sec
curl --user name:passwd -s http://domain?token=whatevertokenuhave