Hudson CI上的Active Git分支是"(无分支)"

mil*_*lus 17 git hudson git-checkout

我的Ant build.xml脚本以

<property environment="env"/>
<echo>GIT_BRANCH = ${env.GIT_BRANCH}</echo>
<echo>PWD = ${env.PWD}</echo> 
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

从控制台输出,Hudson知道它正在构建主题分支DPM-48但是没有设置环境变量GIT_BRANCH并且'git branch'返回git处于'分离的HEAD'状态

* (no branch)
master
DPM-48
Run Code Online (Sandbox Code Playgroud)

我想知道的是我正在哈德森建立的分支.必须有办法做到这一点.

mil*_*lus 33

解决

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

  • 使用Hudson插件管理器,我更新了我的Hudson Git插件版本1.1)以获得abayer的修复.
  • 使用Hudson作业配置,我点击了"源代码管理" - >"要构建的分支"下的"高级"按钮.然后我将"使用本地分支"更改为用于名称的内容.什么都没关系.
  • 然后我点击"保存"按钮并开始使用"立即构建"构建

替代文字

构建日志显示

[workspace] $ git.exe checkout -b ChangeTester d6caef27759495c5714923c1ddf19551a70d6083
Run Code Online (Sandbox Code Playgroud)

代替

[workspace] $ git.exe checkout -f d6caef27759495c5714923c1ddf19551a70d6083
Run Code Online (Sandbox Code Playgroud)

这意味着我不处于'独立头'状态,因此可以提交,创建标签和推送.

我可以使用'git rev-parse HEAD'来获取提交哈希并在'git show-ref'的输出中找到它,以便在需要时找到分支的真实名称.

我现在能够将成功的构建标记推送到我的git仓库.


Von*_*onC 10

注意:OP milkplus的评论是指最近的Hudson bug 6856(2010年6月),其中提到:

无论如何,Git都会以独立的头部构建

虽然不清楚这个特定问题是否会得到解决(答案表明它可能实际上"按设计工作"!),但它也引用了这个版本的hudson Git插件,允许签出本地分支.


你是一个DETACHED HEAD因为,因为git插件现在正在工作,它确实直接签出提交SHA1,而不是分支HEAD.

HEAD分离时你所处的状态不会被任何分支记录(这很自然 - 你不在任何分支上).这意味着您可以通过切换回现有分支来丢弃临时提交和合并.

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


通过查看Hudson Git插件源代码实现OP milkplus:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

<property environment="env"/>
<echo>GIT_BRANCH = ${env.GIT_BRANCH}</echo>
Run Code Online (Sandbox Code Playgroud)

如果是这种情况,可能是因为问题7554:

GIT_BRANCH 选择多个分支进行构建时不设置

在尝试识别当前构建的分支时,我发现GIT_BRANCH当选择构建多个分支时,不会设置环境变量.

我认为这不是一个真正的bug,而是一个功能请求 - GIT_BRANCH只有在有一个分支时才设置env var,因此,如果/当有多个分支时,它就不相关了.我不确定在这种情况下我们如何为多个分支格式化env var.

我认为GIT_BRANCH应该设置为当前正在构建的分支.就像构建在master上一样,它将包含master.

这将有助于例如推送到在此构建期间构建的另一个远程分支.或者使用要构建的正确分支集触发另一个Build.

有点镜像这里描述NPE

替代文字

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

解决方案是使用" master"作为默认Git分支而不是" **"或空字符串.