Jenkins Git plugin detached HEAD
Solution 1
The Checkout/merge to local branch (optional) field is gone in the current (2.2.1) version of the Git plugin.
It has moved to Additional Behaviours → Check out to specific local branch:
Setting that value to master got me a checked out branch instead of a detached head.
Solution 2
None of the other answer's Jenkins configurations worked for me without having to create manual steps. What indeed works is plain simple:
Repository URL: <repo>
Branches to build: master
Checkout/merge to local branch (optional): master
Solution 3
UPDATE (November 2015): Please, note that this solution was given for a specific version of Git plugin (1.1.26). In later versions, the plugin was updated to make configuration easier.
For Jenkins Git plugin version 1.1.26 try this:
Go to Job Configuration. Scroll down to Git section and click "Advanced..." button under "Repositories". Then set:
Name: origin
Refspec: +refs/heads/branch-0.1:refs/remotes/origin/localbranchname
Then click another "Advanced..." button and set:
Checkout/merge to local branch (optional): localbranchname
You can name the local branch as you like, but the destination in Refspec must match the local branch name in that optional field (in this case "localbranchname"). This will attach HEAD to localbranchname like this:
HEAD -> refs/heads/localbranchname -> 7a698457751bdc043cfda631b81e3812c5361790
Maven Release should pass now in Jenkins.
By the way, this works for me with Jenkins 1.492 and Jenkins Git plugin version 1.1.26.
Solution 4
In Git, when you have a branch checked out, like master or dev or any other local branch, your HEAD (file in .git folder) will contain a reference to the corresponding branch. Therefore it is "attached".
When you perform some operations like rebase, merges or when you're checking out a particular commit, i.e. anytime you see "no branch", your HEAD doesn't have a reference to any local branch but points directly to the commit, i.e. it has the actual SHA-1 inside. That means it is detached - detached from any branch. There is no new reference "no branch" created.
The command git symbolic-ref HEAD
checks if the HEAD content is a reference or a SHA-1 and prints it out.
You can see that by doing:
git checkout master
git symbolic-ref HEAD
git checkout HEAD~2 # going two commits back
git symbolic-ref HEAD
git checkout master # coming back
Now, most of the time the Git plugin in Jenkins works with the code in detached HEAD state. I'm not sure how the Maven release plugin works, but I'm 99% sure that it requires you to release from a specific branch. In order to fix that, I would recommend to specify something like the following as a prebuild step or shell command:
git checkout master; git pull origin master
That will solve the problem, I hope ;)
Solution 5
I want to build several branches, and check out each branch under its name. I am using Git plugin 2.4.0.
The answer by Matthias Braun gets you a named branch, but it is not named after the remote branch.
Instead of setting the local branch to master
, set the local branch to $GIT_BRANCH
.
I found that solution in this bug report.
Related videos on Youtube
Michel Werren
Updated on July 08, 2022Comments
-
Michel Werren almost 2 years
I am new to Git and also to Jenkins. My problem is that I can't get the Jenkins Maven release plugin to work.
When I build a common Maven build with Jenkins, it works well, but when I try to perform a release with the Maven release plugin, I get the following stack trace:
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
The failing command and error message are:
[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
I have figured out that the Jenkins Git plugin creates a detached HEAD ref "(no branch)" which causes the problem, I think. But I have absolutely no idea why this ref is created or how I can solve this problem.
I would be grateful for any help.
-
Eugene Sajine over 11 yearsWas your problem solved? If so it would be nice if you could accept the answer if it helped or provide your own so other people could benefit from the knowledge, thanks!
-
Alberto about 8 yearsPossible duplicate of Active Git branch is "(no branch)" on hudson CI
-
-
Michel Werren almost 12 yearsThank you for your help! This way to checkout the master branch again i already have found. But the maven release plugin uses also the git plugin to get the source, this means the maven release plugin only invokes the release goals with parameters. There is no posibility to invoke a prebuild step between this to two steps.
-
Eugene Sajine almost 12 yearsWell, as i understand the release goals are something that you supposed to be able to tweak. You know that it fails to determine current branch so you should be able to tweak the release goal prepare in order for it to be able to checkout project in correct branch. I think the best way would be to define single branch that you always release from, like master, and change your "prepare" goal to accommodate the plugin by checking out master branch explicitly.
-
Zac Thompson over 11 yearsThe local branch (optional) setting was the only one I needed
-
Jeff Fairley about 11 yearsSame with me. The (optional) setting made enough difference. Also, I'm using CloudBees and have an SSH key registered on GitHub. Supplying a username/password to the maven release plugin was causing issues. I finally successfully released with no username/password, letting SSH take over.
-
fbl over 10 yearsBy the way, as of Jenkins 1.547 (at least that's what I am running) the second advanced button is gone. You can check out to a specific local branch by selecting an additional behavior under the 'Additional Behaviors'.
-
Derk over 8 yearsI was able to fix this in Jenkins 1.627 by just setting the "Check out to specific local branch" field under "Additional Behaviors" to "master".
-
Christian Semrau about 8 yearsIf you want to build multiple branches, in GIT plugin 2.4.0 (and maybe earlier?) you can set the local branch name
$GIT_BRANCH
, and get a branch named after the remote branch. (Just posted my own answer with that info.) -
yorch almost 8 yearsIt works partially, my repo is now on the branch I want, but when I try to push I'm getting
fatal: The current branch master has no upstream branch
. I've tried with different params in the Jenkins Git config but no luck, I just don't want to hardcode the branch name in the push likegit push -u origin master
-
apa64 over 7 yearsSetting the local branch to $GIT_BRANCH created a new branch on the remote for me: origin/origin/master. Leaving the parameter empty seemed to work correctly.
-
MatPag over 4 yearsThis requires "Git parameters" plugin installed
-
Andrey Klochkov over 4 yearsJust want to add that setting the value to "**" or leaving it empty is much better option. The local branch name will be computed. origin/test -> test
-
Jon about 3 years@AndreyKlochkov It does do what you say, but the problem is that it uses the commit sha as the start point, e.g.
git checkout -b develop 1694bf...
-- this prevents the branch from having an upstream remote set, meaning you need to do a manual shell script to set it after the fact -
lewis over 2 yearsFor me "*" caused an error, but leaving it blank worked as expected
-
Matthias Braun over 2 years@lewis: I think it's supposed to be two asterisks, not one.