Jenkins Git plugin detached HEAD

59,601

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 BehavioursCheck out to specific local branch:

Jenkins screenshot of setting option "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.

Share:
59,601

Related videos on Youtube

Michel Werren
Author by

Michel Werren

Updated on July 08, 2022

Comments

  • Michel Werren
    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
      Eugene Sajine over 11 years
      Was 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
      Alberto about 8 years
  • Michel Werren
    Michel Werren almost 12 years
    Thank 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
    Eugene Sajine almost 12 years
    Well, 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
    Zac Thompson over 11 years
    The local branch (optional) setting was the only one I needed
  • Jeff Fairley
    Jeff Fairley about 11 years
    Same 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
    fbl over 10 years
    By 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
    Derk over 8 years
    I 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
    Christian Semrau about 8 years
    If 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
    yorch almost 8 years
    It 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 like git push -u origin master
  • apa64
    apa64 over 7 years
    Setting 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
    MatPag over 4 years
    This requires "Git parameters" plugin installed
  • Andrey Klochkov
    Andrey Klochkov over 4 years
    Just 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
    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
    lewis over 2 years
    For me "*" caused an error, but leaving it blank worked as expected
  • Matthias Braun
    Matthias Braun over 2 years
    @lewis: I think it's supposed to be two asterisks, not one.