Jenkins Git插件分离了HEAD
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jenkins Git插件分离了HEAD相关的知识,希望对你有一定的参考价值。
我是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
失败的命令和错误消息是:
[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
我已经发现Jenkins Git插件会创建一个独立的HEAD引用“(无分支)”,这会导致问题,我想。但我完全不知道为什么要创建这个参考或如何解决这个问题。
我将不胜感激任何帮助。
没有其他答案的Jenkins配置对我有用,无需创建手动步骤。确实有效的很简单:
Repository URL: <repo>
Branches to build: master
Checkout/merge to local branch (optional): master
Checkout/merge to local branch (optional)
字段在Git插件的当前(2.2.1)版本中消失了。
它似乎已移至Additional Behaviours -> Check out to specific local branch
:
将该值设置为master
让我得到了一个签出的分支,而不是一个独立的头。
更新(2015年11月):请注意,此解决方案是针对特定版本的Git插件(1.1.26)提供的。在更高版本中,插件已更新,以使配置更容易。
对于Jenkins GIT插件版本1.1.26试试这个:
转到作业配置。向下滚动到Git部分,然后单击“存储库”下的“高级...”按钮。然后设置:
Name: origin
Refspec: +refs/heads/branch-0.1:refs/remotes/origin/localbranchname
然后单击另一个“高级...”按钮并设置:
Checkout/merge to local branch (optional): localbranchname
您可以根据需要为本地分支命名,但Refspec中的目标必须与该可选字段中的本地分支名称匹配(在本例中为“localbranchname”)。这会将HEAD附加到localbranchname,如下所示:
HEAD -> refs/heads/localbranchname -> 7a698457751bdc043cfda631b81e3812c5361790
Maven Release现在应该通过Jenkins了。顺便说一句,这适用于Jenkins 1.492和Jenkins GIT插件版本1.1.26。
在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
现在大多数时候Jenkins中的git插件使用处于分离HEAD状态的代码。我不确定Maven发布插件是如何工作的,但我99%肯定它要求你从特定的分支发布。为了解决这个问题,我建议将其指定为prebuild步骤或shell命令:
git checkout master; git pull origin master
这将解决问题,我希望;)
我想建立几个分支,并在其名称下查看每个分支。我正在使用GIT插件2.4.0。
answer by Matthias Braun为您提供了一个命名分支,但它不是以远程分支命名的。
而不是设置本地分支master
,设置本地分支$GIT_BRANCH
。
我在https://issues.jenkins-ci.org/browse/JENKINS-6856找到了解决方案
(解决了)
嗨,我尝试使用maven-release-plugin从分支机构进行参数化版本构建时遇到了同样的问题:2.5.3和maven-scm-provider-jgit:1.9.5。
我希望能够为“参数化版本构建”选择分支,这不起作用,当我选择“Checkout / merge to local branch(optional)”时,它工作但最终得到了一个分支“origin / origin / mybranch”在遥远的(重复的起源)。
所以:
- 将“Git参数”添加到“此项目已参数化” 名称:分支 ParameterType:分支 单击高级: 分支过滤器:origin /(.*) (这就是诀窍!)
- Git存储库: 要构建的分支:refs / remotes / origin / $ {branch}
- 其他行为: - >签出特定的本地分支 分行名称:$ {branch}
玩得开心 :-)
有同样的问题。 @Eugene解决方案只工作过一次。第二次尝试时出错 - “无法从存储库中删除HEAD”或类似的内容。
我成立了这个(source):
和m2额外步骤(预建)
git checkout master || git checkout -b master
git reset - hard origin / master
现在我觉得还可以。
我有同样的问题。我尝试过康斯坦丁的解决方案,它完美地运行但标签和提交被推送到“localbranchname”远程存储库。
所以我做了同样但手动:首先添加一个pre-steps shell脚本:
git branch -f localJenkins
git checkout localJenkins
然后是一个post-steps shell脚本:
git checkout master
git rebase localJenkins
git branch -D localJenkins
git push origin master
git push --tag
这有效!这样,你就没有jenkins远程分支,commits和tag将在master(或其他)分支上。
希望这可以帮助 !
添加到maven命令行以获取发布准备:-DpushChanges=false -DlocalCheckout=true
这意味着maven将使用jenkins在工作目录.git
中获得的内容,既不克隆遥控器也不推送到远程。
我建议将完全合格的refs/remotes/origin/develop
配置为你的Git“Branch to build”。这种方式对我来说似乎更容易理解。
在这种情况下,你的$ GIT_BRANCH会被詹金斯神奇地设置为origin/develop
然后,只需添加一个构建后的步骤“Execute Shell”,而不是使用过于复杂(但可移植)的GitPublisher:
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和标签。
以上是关于Jenkins Git插件分离了HEAD的主要内容,如果未能解决你的问题,请参考以下文章