Jenkins Git插件脱离HEAD


75

我是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 ref“(无分支)”。但是我绝对不知道为什么创建这个引用或如何解决这个问题。

我将不胜感激。


4
您的问题解决了吗?如果是这样,那么如果您可以接受答案(如果有帮助或提供您自己的答案),那就太好了,这样其他人可以从中受益,谢谢!
Eugene Sajine

Answers:


81

当前版本(2.2.1)的Git插件中没有“签出/合并到本地分支(可选)”字段。

它已移至“其他行为”检出到特定的本地分支

Jenkins设置选项“检出到特定本地分支”的屏幕截图

将该值设置为master可以使我签出一个分支,而不是分离的头。


5
如果要构建多个分支,请在GIT插件2.4.0(可能更早吗?)中设置本地分支名称$GIT_BRANCH,并获取以远程分支命名的分支。(只是发布了我自己的回答,并提供了该信息。)
Christian Semrau '16

1
只需添加将值设置为“ **”或将其保留为空是更好的选择。将计算本地分支名称。产地/测试- >测试
安德烈Klochkov

61

无需创建手动步骤,其他答案的Jenkins配置都不适合我。确实有效的方法很简单:

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

25

更新(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。


5
我唯一需要的是本地分支(可选)设置
Zac Thompson

1
和我一样。(可选)设置产生了足够的差异。另外,我正在使用CloudBees,并在GitHub上注册了SSH密钥。向Maven版本插件提供用户名/密码会导致问题。我终于成功发布了没有用户名/密码的文件,让SSH接管了。
杰夫·菲利

4
顺便说一句,从Jenkins 1.547开始(至少这是我正在运行的),第二个高级按钮不见了。您可以通过在“其他行为”下选择其他行为来签出到特定的本地分支机构。
fbl 2014年

通过将“其他行为”下的“签出到特定的本地分支”字段设置为“主”,我能够在Jenkins 1.627中解决此问题。
Derk

它可以部分工作,我的仓库现在就在我想要的分支上,但是当我尝试推送时,我就得到了fatal: The current branch master has no upstream branch。我在Jenkins Git配置中尝试了不同的参数,但是没有运气,我只是不想像这样在推送中对分支名称进行硬编码git push -u origin master
yorch

9

在Git中,当您签出一个分支(如master或dev或任何其他本地分支)时,您的HEAD(.git文件夹中的文件)将包含对相应分支的引用。因此,它是“附加”的。

当您执行诸如变基,合并或检出特定提交之类的操作时,即,只要您看到“无分支”,您的HEAD就不会引用任何本地分支,而是直接指向该提交,即内部具有实际的SHA-1。这意味着它是分离的-从任何分支分离。没有创建新的引用“ no branch”。

该命令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%肯定它需要您从特定分支发行。为了解决此问题,我建议指定类似以下内容的预构建步骤或shell命令:

git checkout master; git pull origin master

我希望这将解决问题;)


感谢您的帮助!我已经找到了这种再次检出master分支的方法。但是,maven版本插件还使用git插件获取源代码,这意味着maven版本插件仅使用参数调用版本目标。在这两个步骤之间无法调用预构建步骤。
米歇尔·沃伦

好吧,据我了解,发布目标是您应该调整的。您知道它无法确定当前分支,因此您应该能够调整发布目标的准备工作,以使其能够在正确的分支中签出项目。我认为最好的方法是定义一个始终从其释放的分支(例如master),并通过显式签出master分支来更改“准备”目标以容纳插件。
Eugene Sajine

7

我要建立几个分支,并以其名称签出每个分支。我正在使用GIT插件2.4.0。

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

代替设置本地分支master,而设置本地分支$GIT_BRANCH

我在https://issues.jenkins-ci.org/browse/JENKINS-6856中找到了解决方案


1
将本地分支设置为$ GIT_BRANCH为我在远程上创建了一个新分支:origin / origin / master。将参数保留为空似乎可以正常工作。
apa64 '16

5

(解决了)

嗨,当我尝试使用maven-release-plugin:2.5.3和maven-scm-provider-jgit:1.9.5从分支中进行参数化的发布版本时,我遇到了同样的问题。

我希望能够为“参数化的发布版本”选择该分支,但该分支不起作用,当我选择“签出/合并到本地分支(可选)”时,该分支起作用了,但最终出现了一个分支“ origin / origin / mybranch”在远程(重复来源)。

所以:

  • 将“ Git Parameter”添加到“此项目已参数化”
    名称:分支
    ParameterType:分支
    单击Advanced:
    分支Filter:origin /
    (。*)(这就是窍门!)

  • Git存储库:
    要构建的分支:refs / remotes / origin / $ {branch}

  • 其他行为:->签出到特定的本地分支
    分支名称:$ {branch}

玩得开心 :-)


这需要安装“ Git参数”插件
MatPag '19

1

有同样的问题。@Eugene解决方案仅工作一次。第二次尝试中出现错误-“无法从存储库中删除HEAD”或类似的内容。

我已经建立了这个(来源):

和m2额外步骤(预构建)

git checkout master || git checkout -b主

git reset-硬来源/主

现在我认为还可以。


1

我有同样的问题。我尝试了康斯坦丁的解决方案,该解决方案效果很好,但是标记和提交已推送到“ localbranchname”远程存储库中。

所以我做了同样的事情,但是是手动进行的:首先添加一个前置步骤的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远程分支,提交和标记将位于master(或其他)分支上。

希望这可以帮助 !


1

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

这意味着maven将使用jenkins进入工作目录的内容 .git,而不会克隆远程或推送到远程。

我建议配置完全合格 refs/remotes/origin/develop为您的Git“构建分支”。这样对我来说似乎更容易理解。

在这种情况下,您的$ GIT_BRANCH将被詹金斯神奇地设置为 origin/develop

然后,不要使用过于复杂(但可移植)的GitPublisher,而只需添加一个后构建步骤“ 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/}"

这将推动任何行家更改,例如pom.xml和标记。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.