Jenkins Git plugin detached HEAD

匿名 (未验证) 提交于 2019-12-03 01:49:02

问题:

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.

回答1:

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:  Branches to build: master Checkout/merge to local branch (optional): master 


回答2:

The Checkout/merge to local branch (optional) field is gone in the current (2.2.1) version of the Git plugin.

It seems to have 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.



回答3:

UPDATE (November 2015): Please, note that this solution was given for 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 local branch as you like, but destination in Refspec must match 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. Btw, this works for me with Jenkins 1.492 and Jenkins GIT plugin version 1.1.26.



回答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 you 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 is checking 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 git plugin in Jenkins works with the code in detached HEAD state. I'm not sure how 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 as a prebuild step or shell command something like that:

git checkout master; git pull origin master 

That will solve the problem, i hope;)



回答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 master, set the local branch $GIT_BRANCH.

I found that solution in https://issues.jenkins-ci.org/browse/JENKINS-6856



回答6:

Got same problem. @Eugene solution worked only once. There was error in second try - "can't delete HEAD from repository" or something like this.

I've founded this (source):

And m2 extra steps (pre-build)

git checkout master || git checkout -b master

git reset --hard origin/master

And now i think its ok.



回答7:

I had the same problem. I tried Constantine's solution, that worked perfectly but the tag and the commits were pushed on the "localbranchname" remote repository.

So I did the same but manually : first add a pre-steps shell script :

git branch -f localJenkins git checkout localJenkins 

Then a post-steps shell script :

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

This works ! This way, you don't have jenkins remote branch, commits and tag will be on the master (or other) branch.

hope this helps !



回答8:

Add to maven command line for the release prepare: -DpushChanges=false -DlocalCheckout=true

This means maven would use what jenkins got inside working directory .git, and neither clone the remote or push to remote.

I recommend to configure fully qualified refs/remotes/origin/develop as your Git "Branch to build". This way it seems more understandable to me.

In such case your $GIT_BRANCH would get magically set by Jenkins to origin/develop

Then, instead of using overly complicated (but portable) GitPublisher, just add a post-build step "Execute Shell":

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

This pushes whatever maven changed, like pom.xml and tags.



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!