0

环境:

  • Jenkings 项目仅构建 Git 存储库的“主”分支。
  • 一个带有 post-receive 钩子的 Git 存储库,用于通知 Jenkins 新的更改(使用 Git 1.7.10)。虽然脚本告诉 Jenkins 有新的更改,但是当 Jenkins 扫描存储库时,如果更改不在“主”分支中,它不会触发构建。

问题

一位开发人员在 10 天前向远程 master 推送了一个提交。Jenkins 项目成立于 5 天前。昨天,第二个开发人员提取了更改,创建了一个新分支并将其推回远程。也就是说,master 中没有任何变化。然而,Jenkins 项目启动了。查看 Jenkins 检测到的更改,这是第一个开发人员在 10 天前所做的最后一次提交,触发了构建。

4

1 回答 1

2

我意识到这个问题还没有得到回答..这就是我当时修复它的方式..

原因

Jenkins 的构建是从我们的 Git repo 的“post-receive”钩子脚本触发的:

#!/bin/bash
while read oldrev newrev refname
do
    true
done

curl http://jenkins/git/notifyCommit?url=ssh://git@devserver/repos/particualr_repo.git

可以看出,脚本读取标准输入然后忽略它。因此,当从任何分支推送提交时,构建就会启动。但是由于我们的构建项目被配置为构建 master,并且由于最后一次提交到 master 是 10 天前,它会将其注册为导致构建的更改。

解决方案(仅在推送主服务器时排队构建)

更改挂钩脚本以仅推送构建主服务器。

#!/bin/bash

if ! [ -t 0 ]; then
   read -a ref
fi

IFS='/' read -ra REF <<< "${ref[2]}"
branch="${REF[2]}"

if [ "master" == "$branch" ]; then
   curl http://jenkins/git/notifyCommit?url=ssh://git@devserver/repos/particualr_repo.git
fi
于 2013-04-17T20:53:52.760 回答