jenkinsGit插件分离头

我是Git新手,还有Jenkins。 我的问题是让Jenkins Maven发布插件工作。

当我使用Jenkins构build一个通用的Maven构build时,它运行良好,但是当我尝试使用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 

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

[INFO]执行:/ bin / sh -c cd / var / lib / jenkins / workspace / test_maven / parent && git symbolic-ref HEAD [INFO]工作目录:/ 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

我想,jenkinsGit插件创build了一个分离的HEAD ref“(no branch)”,导致这个问题,我想。 但我完全不知道为什么这个裁判创build或如何解决这个问题。

我会感激任何帮助。

提前致谢。

格林斯米歇尔

没有其他答案的jenkinsconfiguration为我工作,而无需创build手动步骤。 确实有效的是简单的:

 Repository URL: <repo> Branches to build: master Checkout/merge to local branch (optional): master 

Git插件的当前(2.2.1)版本中没有Checkout/merge to local branch (optional)字段。

它似乎已经转移到Additional Behaviours -> Check out to specific local branch

在这里输入图像说明

设置这个价值master给我一个检出分支,而不是一个分离的头。

更新(2015年11月):请注意,这个解决scheme是为特定版本的Git插件(1.1.26)提供的。 在以后的版本中,插件已更新,使configuration更容易。

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

转到作业configuration。 向下滚动到Git部分,然后单击“存储库”下的“高级…”button。 然后设置:

 Name: origin Refspec: +refs/heads/branch-0.1:refs/remotes/origin/localbranchname 

然后点击另一个“高级…”button并设置:

 Checkout/merge to local branch (optional): localbranchname 

您可以随意命名本地分支,但Refspec中的目标必须与该可选字段中的本地分支名称(本例中为“localbranchname”)匹配。 这将像这样将HEAD添加到localbranchname:

 HEAD -> refs/heads/localbranchname -> 7a698457751bdc043cfda631b81e3812c5361790 

现在在Jenkins,Maven发布应该会通过。 顺便说一句,这适用于我与jenkins1.492和jenkinsGIT插件版本1.1.26。

在Git当你有一个分支签出,如主或开发或任何其他本地分支您的头(文件.git文件夹)将包含对相应的分支的​​引用。 因此它是“附加的”。

当你执行一些像rebase,merge或者你签出一个特定的提交操作。 即任何时候你看到“没有分支”你的HEAD没有任何本地分支的引用,但直接指向提交,即它有实际的内部SHA-1。 这意味着它是分离的 – 从任何分支分离。 没有新的参考“没有分支”创build。

命令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 

现在大部分时间,Jenkins的git插件都使用分离HEAD状态的代码。 我不确定Maven发布插件是如何工作的,但是我确信它需要你从特定的分支发布。 为了解决这个问题,我build议指定一个预构build步骤或shell命令:

 git checkout master; git pull origin master 

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

我想build立几个分支,并检查每个分支的名称。 我正在使用GIT插件2.4.0。

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

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

我在https://issues.jenkins-ci.org/browse/JENKINS-6856find了这个解决scheme

有同样的问题。 @Eugene解决scheme只能工作一次。 第二次尝试有错误 – “无法从仓库中删除HEAD”或类似的东西。

我创立了这个( 来源 ):

和M2额外的步骤(预build)

git checkout master || git checkout -b master

git reset –hard origin / master

现在我认为它可以。

我有同样的问题。 我尝试了康斯坦丁的解决scheme,完美的工作,但标签和提交被推上了“localbranchname”远程存储库。

所以我做了相同的手动操作:首先添加一个预先步骤的shell脚本:

 git branch -f localJenkins git checkout localJenkins 

然后是一个后步骤shell脚本:

 git checkout master git rebase localJenkins git branch -D localJenkins git push origin master git push --tag 

这工作! 这样,你没有jenkins远程分支,提交和标签将在主(或其他)分支。

希望这可以帮助 !

添加到maven命令行进行发布准备: -DpushChanges=false -DlocalCheckout=true

这意味着maven会使用jenkins进入工作目录.git ,既不克隆远程也不推送到远程。

我build议configuration完全合格的refs/remotes/origin/develop作为你的Git“Branch to build”。 这样对我来说似乎更容易理解。

在这种情况下,您的$ GIT_BRANCH将由Jenkins神奇地设置origin/develop

然后,而不是使用过度复杂(但便携式)的GitPublisher,只需添加后生成步骤“执行shell”:

 echo Remote branch is $GIT_BRANCH, replacing origin with refs/heads. git push --follow-tags "$GIT_URL" "+HEAD:${GIT_BRANCH/#origin\//refs/heads/}" 

这推动任何maven改变,如pom.xml和标签。