Jenkins Git плагин отсоединенный HEAD

Я новичок в Git, а также в Дженкинс. Моя проблема в том, что я не могу заставить работать плагин выпуска Jenkins Maven.

Когда я собираю общую сборку Maven с Jenkins, она работает хорошо, но когда я пытаюсь выполнить релиз с помощью плагина релиза 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 "(без ветки)", которая, как мне кажется, вызывает проблему. Но я понятия не имею, почему создается эта ссылка или как я могу решить эту проблему.

Буду благодарен за любую помощь.

Ответ 1

Поле Checkout/merge to local branch (optional) отсутствует в текущей (2.2.1) версии плагина Git.

Он переместился в Additional Behaviours → Check out to specific local branch:

Jenkins screenshot of setting option "Check out to specific local branch"

Установка этого значения в master дала мне извлеченную ветвь вместо отсоединенной головки.

Ответ 2

Ни один из других ответов конфигурации Jenkins не работали для меня без необходимости создавать ручные шаги. Что действительно работает, просто:

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

Ответ 3

ОБНОВЛЕНИЕ (ноябрь 2015): Обратите внимание, что это решение было предоставлено для конкретной версии плагина 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 1.492 и плагином Jenkins Git версии 1.1.26.

Ответ 4

В 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

Теперь большую часть времени плагин Git в Jenkins работает с кодом в отключенном состоянии HEAD. Я не уверен, как работает плагин релиза Maven, но я на 99% уверен, что он требует, чтобы вы выпускали из определенной ветки. Чтобы это исправить, я бы рекомендовал указать что-то вроде следующего в качестве шага предварительной сборки или команды оболочки:

git checkout master; git pull origin master

Надеюсь, это решит проблему;)

Ответ 5

Я хочу создать несколько ветвей и проверить каждую ветвь под ее именем. Я использую GIT плагин 2.4.0.

Ответ Маттиаса Брауна дает вам именованную ветку, но она не названа в честь удаленной ветки.

Вместо установки локальной ветки master, установите локальную ветвь $GIT_BRANCH.

Я нашел это решение в https://issues.jenkins-ci.org/browse/JENKINS-6856

Ответ 6

(Раскрыты)

Привет, у меня была та же проблема при попытке сделать параметризованную сборку релиза из ветки с помощью maven-release-plugin: 2.5.3 и maven-scm-provider-jgit: 1.9.5.

Я хотел иметь возможность выбрать ветку для "параметризованной сборки выпуска", это не сработало, и когда я выбрал "Оформление/слияние с локальной веткой (необязательно)", это сработало, но в итоге получилось с веткой "origin/origin/mybranch" в удаленном (повторного происхождения).

Так:

  • Добавить "Git Parameter" в "Этот проект параметризован"
    Наименование: филиал
    ParameterType: Branch
    Нажмите Дополнительно:
    Фильтр ветвления: origin/(.*)
    (это был трюк!)

  • Git Repository:
    Ветки для сборки: refs/remotes/origin/$ {branch}

  • Дополнительные поведения: → Выезд в конкретную местную ветку
    Название ветки: $ {branch}

Повеселись :-)

Ответ 7

Похожая проблема. Решение @Eugene работало только один раз. Во второй попытке произошла ошибка: "невозможно удалить HEAD из репозитория" или что-то вроде этого.

Я основал это (источник):

И дополнительные шаги m2 (предварительная сборка)

git мастер проверки || git checkout -b master

git reset - грубое происхождение/мастер

И теперь я думаю, что все в порядке.

Ответ 8

У меня была та же проблема. Я попробовал решение Constantine, которое отлично работало, но тег и коммиты были помещены в удаленный репозиторий localbranchname.

Итак, я сделал то же самое, но вручную: сначала добавьте оболочку pre-steps script:

git branch -f localJenkins
git checkout localJenkins

Затем оболочка post-steps script:

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

Это работает! Таким образом, у вас нет удаленной ветки jenkins, фиксации и теги будут находиться на главной (или другой) ветке.

надеюсь, что это поможет!

Ответ 9

Добавить в командную строку 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/}"

Это подталкивает все изменения maven, такие как pom.xml и теги.

Ответ 10

Я была такая же проблема. После клонирования, если я делаю 'git branch', я получаю это → * (HEAD отсоединен от e9d2011).

Я решил проблему, следуя этому fooobar.com/info/13728874/... Это сработало для меня.