詹金斯Git插件分离头

詹金斯Git插件分离头,git,jenkins,Git,Jenkins,我对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:pre

我对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“(无分支)”,我认为这是问题的根源。但是我完全不知道为什么会创建这个ref,或者我如何解决这个问题


如果您有任何帮助,我将不胜感激。

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

当您执行一些操作(如重设基础、合并)或签出特定提交时,即每当您看到“无分支”时,您的头部不会引用任何本地分支,而是直接指向提交,即内部有实际的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插件大部分时间都是在脱离头部状态下使用代码的。我不确定Maven发布插件是如何工作的,但我99%确定它需要您从特定分支发布。为了解决这个问题,我建议指定如下内容作为预构建步骤或shell命令:

git checkout master; git pull origin 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”)。这会将头连接到localbranchname,如下所示:

HEAD -> refs/heads/localbranchname -> 7a698457751bdc043cfda631b81e3812c5361790
Maven的释放现在应该在Jenkins通过了


顺便说一句,Jenkins 1.492和Jenkins Git插件版本1.1.26也适用于我。

我遇到了同样的问题@尤金溶液只起了一次作用

第二次尝试时出现错误:“无法从存储库中删除头部”或类似的内容

我发现了这个():

和m2额外步骤(预制)

git签出主机| | git签出-b主机

git重置--硬原点/主原点

现在我觉得没问题。

我也有同样的问题。 我尝试了Constantine的解决方案,效果非常好,但是标记和提交被推送到了“localbranchname”远程存储库

所以我也做了同样的事情,只是手动的

首先,添加一个预步骤shell脚本:

git branch -f localJenkins
git checkout localJenkins
git checkout master
git rebase localJenkins
git branch -D localJenkins
git push origin master
git push --tag
然后是一个post steps shell脚本:

git branch -f localJenkins
git checkout localJenkins
git checkout master
git rebase localJenkins
git branch -D localJenkins
git push origin master
git push --tag
这管用!
这样,您就没有jenkins远程分支,提交和标记将在主(或其他)分支上。

如果不创建手动步骤,其他答案的jenkins配置都不适用于我。真正有效的方法很简单:

Repository URL: <repo>
Branches to build: master
Checkout/merge to local branch (optional): master
存储库URL:
要建立的分支:master
签出/合并到本地分支(可选):主
当前(2.2.1)版本的Git插件中没有签出/合并到本地分支(可选)字段

它已转向其他行为→ 签出到特定的本地分支机构:


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

我想构建几个分支,并以其名称签出每个分支。我正在使用Git插件2.4.0

获取一个命名的分支,但它不是以远程分支命名的

将本地分支设置为
$GIT\u branch
而不是将本地分支设置为
master


我在中找到了该解决方案。

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

这意味着maven将使用jenkins在工作目录
.git
中获得的内容,而不是克隆远程或推送到远程

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

在这种情况下,Jenkins会神奇地将$GIT_分支设置为
origin/develope

然后,不要使用过于复杂(但可移植)的GitPublisher,只需添加一个构建后步骤“ExecuteShell”:


这将推送maven更改的任何内容,如pom.xml和标记。

我在尝试使用maven release plugin:2.5.3和maven scm提供程序jgit:1.9.5从分支进行参数化发布构建时遇到了相同的问题

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

因此:

  • 将“Git参数”添加到“此项目已参数化”
    名称:分行
    参数类型:分支
    单击高级:
    分支筛选器:原点/(*)
    (这就是诀窍!)

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

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


玩得开心:-)

谢谢你的帮助!我已经找到了再次签出主分支的方法。但是maven发布插件也使用git插件来获取源代码,这意味着maven发布插件只调用relea