在Hudson CI上,活动的Git分支是“(无分支)”。

17

我的Ant build.xml脚本以以下方式开始:

<property environment="env"/>
<echo>GIT_BRANCH = ${env.GIT_BRANCH}</echo>
<echo>PWD = ${env.PWD}</echo> 

Hudson CI 被设置为当任何分支发生更改时构建。 控制台输出如下...

Commencing build of Revision 90906a63929e9074035eb5b10c71ee055ad3e13c (origin/DPM-48)
GitAPI created
Checking out Revision 90906a63929e9074035eb5b10c71ee055ad3e13c (origin/DPM-48)
[workspace] $ git.exe checkout -f 90906a63929e9074035eb5b10c71ee055ad3e13c
[workspace] $ cmd.exe /C '"C:\Program Files\WinAnt\bin\ant.bat" -file build.xml ...'
 [echo] GIT_BRANCH = ${env.GIT_BRANCH}
 [echo] PWD = /cygdrive/d/.hudson

从控制台输出可以看出,Hudson知道它正在构建主题分支DPM-48,但环境变量GIT_BRANCH未设置,并且“git branch”命令返回Git处于“游离HEAD”状态。

* (no branch)
master
DPM-48

我想知道我正在Hudson上构建的是哪个分支。一定有方法可以做到这一点。


我发现Hudson的Git SCM插件覆盖了buildEnvVars()方法来设置GIT_BRANCH环境变量,但是在使用<property environment="env"/> <echo>GIT_BRANCH = ${env.GIT_BRANCH}</echo>的ant脚本中没有传递过来。 - milkplus
好的观点,我已经在我的答案中整合了它,并提到了一个可能解释你当前情况的问题。 - VonC
http://issues.hudson-ci.org/browse/HUDSON-6856 看起来暗示了在Hudson上的分离分支问题可能已经被解决。我将确保我拥有最新版本的Hudson和Git插件。 - milkplus
好的,我已经在我的回答中包含了那个问题的参考。我还会包括你的测试结果(我猜是使用Hudson 1.379)。 - VonC
3个回答

34

已解决

在查看abayer在Hudson bug 6856中的评论后,我采取了以下步骤:

  • 使用Hudson插件管理器,更新我的Hudson Git插件版本(1.1),以获取abayer的修复程序。
  • 使用Hudson作业配置,在“源代码管理”->“要构建的分支”下点击“高级”按钮。然后将“要使用的本地分支”更改为任何名称。这并不重要。
  • 然后我点击“保存”按钮,并开始进行“立即构建”

alt text

构建日志显示
[workspace] $ git.exe checkout -b ChangeTester d6caef27759495c5714923c1ddf19551a70d6083

代替

[workspace] $ git.exe checkout -f d6caef27759495c5714923c1ddf19551a70d6083

这意味着我不处于“分离头部”状态,因此可以提交、创建标签和推送。如果需要,我可以使用“git rev-parse HEAD”获取提交哈希,并在“git show-ref”的输出中查找实际的分支名称。现在,我可以成功地将构建标签推送到我的git仓库。

1
我浪费了几个小时来尝试解决这个问题...谢谢! - Piotr Zawadzki
这也与这个答案相符:http://jenkins-ci.361315.n4.nabble.com/git-plugin-after-checkout-not-on-any-branch-tp4673842p4673855.html - Leif Gruenwoldt

10

注意:提问者milkplus的评论所提到的是最近的Hudson bug 6856(2010年6月),该问题提到:

无论如何,Git构建都是分离的头部

尽管目前不清楚是否会解决这个特定问题(回答表明它可能实际上“按设计工作”!),但它也涉及到hudson Git插件的此版本,允许检出本地分支。


您处于DETACHED HEAD状态,因为git插件当前正在工作,它直接检出了提交的SHA1,而不是分支HEAD

  

当您的HEAD处于分离状态时,您所处的状态不会由任何分支记录(这是自然的--您没有任何分支)。   这意味着您可以通过切换回现有分支来丢弃临时提交和合并。

您的构建脚本可以首先尝试查找相关提交来自哪个分支


正如提问者milkplus通过查看Hudson Git插件源代码所意识到的:

public void buildEnvVars(AbstractBuild build, java.util.Map<String, String> env) {
    super.buildEnvVars(build, env);
    String branch = getSingleBranch(build);
    if(branch != null){
        env.put(GIT_BRANCH, branch);
    }
}

已经设置了一个环境变量 GIT_BRANCH,但在XML构建脚本中似乎没有任何值:

<property environment="env"/>
<echo>GIT_BRANCH = ${env.GIT_BRANCH}</echo>
如果真是这种情况,那可能是因为问题7554

在选择多个分支进行构建时,未设置GIT_BRANCH

当尝试确定当前构建所在的分支时,我发现当选择多个分支进行构建时,未设置GIT_BRANCH环境变量。

我认为这不是一个错误,而是一个功能请求 - 只有在存在单个分支时才设置GIT_BRANCH环境变量,因此,在存在多个分支时,它并不相关。我不确定如何在这种情况下格式化多个分支的环境变量。

我认为GIT_BRANCH应该设置为当前正在构建的分支。例如,如果构建在主分支上,则会包含主分支。

这将有助于例如将构建期间构建的分支推送到另一个远程位置。或以正确的分支设置触发另一个构建。

类似于此处描述的NPE

alt text

由于某种原因,Git插件开始将GIT_BRANCH环境变量的值传递为null。
这导致Maven插件在调用System.getProperties().putAll(systemProps)时失败。

解决方案是将“master”用作Git分支的默认值,而不是使用“**”或空字符串。


那就是问题所在。我不知道如何找到触发Hudson构建的分支名称。 - milkplus
1
@milkplus: 但是我提到的链接应该包含各种脚本(包括我在那里回答中提到的“what-branch”脚本),专门用于查找分支名称。 - VonC

3
非常感谢您分享这个解决方案!
我曾经遇到过一些麻烦,找不到可选的对话框来设置本地分支,并向其他人展示这仍然是2015年当前方法的一些截图,以便更清楚地了解jenkins的当前gui对话框。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接