83

我是 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 或如何解决这个问题。

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

4

11 回答 11

93

在 Git 插件的当前 (2.2.1) 版本中,Checkout/merge to local branch (optional) 字段已消失

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

Jenkins 设置选项截图

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

于 2014-04-17T10:56:54.300 回答
61

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

Repository URL: <repo>
Branches to build: master
Checkout/merge to local branch (optional): master
于 2013-04-05T09:11:41.127 回答
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。

于 2012-11-28T05:35:31.207 回答
9

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

当您执行一些操作,如变基、合并或当您检查特定提交时,即任何时候您看到“无分支”时,您的 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% 确定它需要您从特定分支发布。为了解决这个问题,我建议指定如下内容作为预构建步骤或 shell 命令:

git checkout master; git pull origin master

我希望这将解决问题;)

于 2012-07-16T22:10:48.200 回答
8

我想建立几个分支,并检查其名称下的每个分支。我正在使用 Git 插件 2.4.0。

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

不要将本地分支设置为master,而是将本地分支设置为$GIT_BRANCH

我在此错误报告中找到了该解决方案。

于 2016-04-19T08:45:20.230 回答
6

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

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

所以:

  • 将“Git Parameter”添加到“This project is parameterized”
    名称:branch
    ParameterType:Branch
    Click Advanced:
    Branch Filter:origin/(.*)
    (这是诀窍!)

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

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

玩得开心 :-)

于 2018-07-12T16:45:31.203 回答
1

我遇到了同样的问题。@Eugene 解决方案只工作了一次。

第二次尝试出现错误:“无法从存储库中删除 HEAD”或类似的东西。

我发现了这个(来源):

和 m2 额外步骤(预构建)

git 结帐大师 || git checkout -b 大师

git reset --hard origin/master

现在我认为没关系。

于 2012-12-31T18:57:57.950 回答
1

我有同样的问题。我尝试了康斯坦丁的解决方案,效果很好,但标签和提交被推送到“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 远程分支,提交和标记将位于主(或其他)分支上。

于 2013-01-07T10:15:32.957 回答
1

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

这意味着 maven 将使用 jenkins 在工作目录中获得的内容.git,并且既不会克隆远程也不会推送到远程。

我建议将完全限定配置refs/remotes/origin/develop为您的 Git“要构建的分支”。这种方式对我来说似乎更容易理解。

在这种情况下,您的 $GIT_BRANCH 会被 Jenkins 神奇地设置为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/}"

这会推动任何 maven 更改,例如 pom.xml 和标签。

于 2016-11-17T15:38:21.453 回答
0

上面的大多数答案都建议使用Check out to specific local branch作为上述问题的解决方案。不幸的是,这不是最好的选择,因为它会检查到在管道配置中手动定义的本地分支。

很多时候 Jenkins 设置为在 Multibranch Pipeline 模式下工作,这意味着可以从不同的 git 分支构建项目。

在这样的解决方案中,远程分支与本地分支不匹配。

解决方案

对于这些情况,最好和安全的解决方案是检查匹配的本地分支。前任 如果管道正在开发分支上工作,它将在本地签出到开发分支。

要实现这样的结果,请在Branch Sources部分添加其他属性,名为:Check out to match local branch

于 2022-01-20T23:58:37.613 回答
0

如果您正在使用来自 SCM 的管道脚本,这是实现另一个答案中以图形方式显示的内容所需的语法:

extensions: [[$class: 'LocalBranch', localBranch: 'BRANCH_NAME']]

因此,例如,如果您的远程分支是develop并且您想要签出一个也调用develop来跟踪它的本地分支,那么这是一个在上下文中显示本地分支扩展的最小示例:

checkout([$class: 'GitSCM', branches: [[name: '*/develop']], extensions: [[$class: 'LocalBranch', localBranch: 'develop']], userRemoteConfigs: [[credentialsId: 'xxx', url: 'yyy']]])

分别替换为您自己的凭据 ID 和 URL 的位置xxxyyy

您还可以使用图形语法生成器自己生成管道语法。看到这个答案

于 2021-12-07T11:03:16.717 回答