Jenkins Git插件分离了HEAD

Mic*_*ren 67 git jenkins

我是Git和Jenkins的新手.我的问题是我无法让Jenkins Maven发布插件工作.

当我使用Jenkins构建一个常见的Maven构建时,它运行良好,但是当我尝试使用Maven版本插件执行发布时,我得到以下堆栈跟踪:

org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.3.2:prepare (default-cli) on project parent: An error is occurred in the checkin process: Exception while executing SCM command.
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:217)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
    at org.jvnet.hudson.maven3.launcher.Maven3Launcher.main(Maven3Launcher.java:79)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchStandard(Launcher.java:329)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:239)
    at org.jvnet.hudson.maven3.agent.Maven3Main.launch(Maven3Main.java:158)
    at hudson.maven.Maven3Builder.call(Maven3Builder.java:98)
    at hudson.maven.Maven3Builder.call(Maven3Builder.java:64)
    at hudson.remoting.UserRequest.perform(UserRequest.java:118)
    at hudson.remoting.UserRequest.perform(UserRequest.java:48)
    at hudson.remoting.Request$2.run(Request.java:326)
    at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:72)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Caused by: org.apache.maven.plugin.MojoExecutionException: An error is occurred in the checkin process: Exception while executing SCM command.
    at org.apache.maven.plugins.release.PrepareReleaseMojo.prepareRelease(PrepareReleaseMojo.java:295)
    at org.apache.maven.plugins.release.PrepareReleaseMojo.execute(PrepareReleaseMojo.java:247)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
    ... 27 more
Caused by: org.apache.maven.shared.release.ReleaseExecutionException: An error is occurred in the checkin process: Exception while executing SCM command.
    at org.apache.maven.shared.release.phase.AbstractScmCommitPhase.checkin(AbstractScmCommitPhase.java:160)
    at org.apache.maven.shared.release.phase.AbstractScmCommitPhase.performCheckins(AbstractScmCommitPhase.java:145)
    at org.apache.maven.shared.release.phase.ScmCommitPreparationPhase.runLogic(ScmCommitPreparationPhase.java:76)
    at org.apache.maven.shared.release.phase.AbstractScmCommitPhase.execute(AbstractScmCommitPhase.java:78)
    at org.apache.maven.shared.release.DefaultReleaseManager.prepare(DefaultReleaseManager.java:234)
    at org.apache.maven.shared.release.DefaultReleaseManager.prepare(DefaultReleaseManager.java:169)
    at org.apache.maven.shared.release.DefaultReleaseManager.prepare(DefaultReleaseManager.java:146)
    at org.apache.maven.shared.release.DefaultReleaseManager.prepare(DefaultReleaseManager.java:107)
    at org.apache.maven.plugins.release.PrepareReleaseMojo.prepareRelease(PrepareReleaseMojo.java:291)
    ... 30 more
Caused by: org.apache.maven.scm.ScmException: Exception while executing SCM command.
    at org.apache.maven.scm.command.AbstractCommand.execute(AbstractCommand.java:63)
    at org.apache.maven.scm.provider.git.AbstractGitScmProvider.executeCommand(AbstractGitScmProvider.java:291)
    at org.apache.maven.scm.provider.git.AbstractGitScmProvider.checkin(AbstractGitScmProvider.java:217)
    at org.apache.maven.scm.provider.AbstractScmProvider.checkIn(AbstractScmProvider.java:410)
    at org.apache.maven.shared.release.phase.AbstractScmCommitPhase.checkin(AbstractScmCommitPhase.java:156)
    ... 38 more
Caused by: org.apache.maven.scm.ScmException: Detecting the current branch failed: fatal: ref HEAD is not a symbolic ref
    at org.apache.maven.scm.provider.git.gitexe.command.branch.GitBranchCommand.getCurrentBranch(GitBranchCommand.java:147)
    at org.apache.maven.scm.provider.git.gitexe.command.checkin.GitCheckInCommand.createPushCommandLine(GitCheckInCommand.java:192)
    at org.apache.maven.scm.provider.git.gitexe.command.checkin.GitCheckInCommand.executeCheckInCommand(GitCheckInCommand.java:132)
    at org.apache.maven.scm.command.checkin.AbstractCheckInCommand.executeCommand(AbstractCheckInCommand.java:54)
    at org.apache.maven.scm.command.AbstractCommand.execute(AbstractCommand.java:59)
    ... 42 more
channel stopped
Finished: FAILURE
Run Code Online (Sandbox Code Playgroud)

失败的命令和错误消息是:

[INFO] Executing: /bin/sh -c cd
/var/lib/jenkins/workspace/test_maven/parent && git symbolic-ref HEAD
[INFO]  Working directory:
/var/lib/jenkins/workspace/test_maven/parent  mojoFailed
org.apache.maven.plugins:maven-release-plugin:2.3.2(default-cli)
projectFailed ch.apkern.achilles:parent:1.0-SNAPSHOT  sessionEnded
Run Code Online (Sandbox Code Playgroud)

我已经发现Jenkins Git插件会创建一个独立的HEAD引用"(无分支)",这会导致问题,我想.但我完全不知道为什么要创建这个参考或如何解决这个问题.

我将不胜感激任何帮助.

Mat*_*aun 67

Checkout/merge to local branch (optional)字段在Git插件的当前(2.2.1)版本中消失了.

它似乎已转移到Additional Behaviours ? Check out to specific local branch:

在此输入图像描述

设置该值使master我得到一个签出分支而不是分离头.

  • 花了我4个小时找到这个,谢谢! (7认同)
  • 如果你想在GIT插件2.4.0中建立多个分支(可能更早?),你可以设置本地分支名称`$ GIT_BRANCH`,并得到一个以远程分支命名的分支.(刚刚用自己的信息发布了自己的答案.) (4认同)
  • 只是想补充一点,将值设置为“**”或将其留空是更好的选择。将计算本地分支名称。起源/测试 -> 测试 (2认同)

Jur*_*sur 59

没有其他答案的Jenkins配置对我有用,无需创建手动步骤.确实有效的很简单:

Repository URL: <repo>
Branches to build: master
Checkout/merge to local branch (optional): master
Run Code Online (Sandbox Code Playgroud)

  • 这在使用git插件版本`1.1.26`时有效 (2认同)

小智 24

更新(2015年11月):请注意,此解决方案是针对特定版本的Git插件(1.1.26)提供的.在更高版本中,插件已更新,以使配置更容易.

对于Jenkins GIT插件版本1.1.26试试这个:

转到作业配置.向下滚动到Git部分,然后单击"存储库"下的"高级..."按钮.然后设置:

Name: origin
Refspec: +refs/heads/branch-0.1:refs/remotes/origin/localbranchname
Run Code Online (Sandbox Code Playgroud)

然后单击另一个"高级..."按钮并设置:

Checkout/merge to local branch (optional): localbranchname
Run Code Online (Sandbox Code Playgroud)

您可以根据需要为本地分支命名,但Refspec中的目标必须与该可选字段中的本地分支名称匹配(在本例中为"localbranchname").这会将HEAD附加到localbranchname,如下所示:

HEAD -> refs/heads/localbranchname -> 7a698457751bdc043cfda631b81e3812c5361790
Run Code Online (Sandbox Code Playgroud)

Maven Release现在应该通过Jenkins了.顺便说一句,这适用于Jenkins 1.492和Jenkins GIT插件版本1.1.26.

  • 本地分支(可选)设置是我唯一需要的设置 (5认同)
  • 顺便说一下,从Jenkins 1.547(至少那是我正在运行的)开始,第二个高级按钮消失了.您可以通过选择"附加行为"下的其他行为来签出特定的本地分支. (4认同)

Eug*_*ine 7

在Git中当您检出分支时,如master或dev或任何其他本地分支,您的HEAD(.git文件夹中的文件)将包含对相应分支的引用.因此它是"附加的".

当您执行某些操作(如rebase,合并或签出特定提交)时.即,只要你看到"无分支",你的HEAD就没有对任何本地分支的引用,而是直接指向提交,即它内部有实际的SHA-1.这意味着它是分离的 - 与任何分支分离.没有创建新的参考"无分支".

该命令git symbolic-ref HEAD正在检查HEAD内容是引用还是SHA-1并将其打印出来.

您可以通过以下方式看到:

git checkout master
git symbolic-ref HEAD
git checkout HEAD~2 # going two commits back
git symbolic-ref HEAD
git checkout master # coming back
Run Code Online (Sandbox Code Playgroud)

现在大多数时候Jenkins中的git插件使用处于分离HEAD状态的代码.我不确定Maven发布插件是如何工作的,但我99%肯定它要求你从特定的分支发布.为了解决这个问题,我建议将其指定为prebuild步骤或shell命令:

git checkout master; git pull origin master
Run Code Online (Sandbox Code Playgroud)

这将解决问题,我希望;)


Chr*_*rau 7

我想建立几个分支,并检查其名称下的每个分支。我正在使用 Git 插件 2.4.0。

Matthias Braun答案为您提供了一个命名分支,但它不是以远程分支命名的。

不是将本地分支设置为master,而是将本地分支设置为$GIT_BRANCH

我在此错误报告中找到了该解决方案。


R.S*_*R.S 6

我在尝试从带有 maven-release-plugin:2.5.3 和 maven-scm-provider-jgit:1.9.5 的分支进行参数化发布构建时遇到了同样的问题。

我希望能够为“参数化发布版本”选择分支。这不起作用,当我选择“结帐/合并到本地分支(可选)”时,它起作用了,但我最终在远程(重复源)中找到了一个分支“origin/origin/mybranch”。

所以:

  • 将“Git Parameter”添加到“This project is parameterized”
    Name: branch
    ParameterType: Branch
    Click Advanced:
    Branch Filter:origin/(.*)
    (这就是诀窍!)

  • Git 存储库:
    要构建的分支:refs/remotes/origin/${branch}

  • 附加行为:-> 签出到特定的本地分支
    分支名称:${branch}

玩得开心 :-)