Плагін Jenkins Git від'єднав HEAD


76

Я новачок у Git, а також у Jenkins. Моя проблема полягає в тому, що я не можу змусити плагін випуску Jenkins Maven працювати.

Коли я будую спільну збірку 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 ("немає гілки)", що, як мені здається, спричиняє проблему. Але я абсолютно не уявляю, для чого створений цей реф або як я можу вирішити цю проблему.

Буду вдячний за будь-яку допомогу.


4
Вашу проблему вирішено? Якщо так, було б непогано, якби ви могли прийняти відповідь, якщо вона допомогла або надала свою, щоб інші люди могли скористатися знаннями, дякую!
Євген Саджин

Відповіді:


82

Поле Checkout / merge to local branch (необов’язково) зникло в поточній (2.2.1) версії плагіна Git.

Він перейшов до Додаткові поведінкиПеревірте до конкретного місцевого відділення :

Знімок екрану Дженкінса з параметром налаштування "Перевірити до конкретного місцевого відділення"

Встановивши це значення для master, я отримав перевірену гілку замість відокремленої голови.


5
Якщо ви хочете побудувати кілька гілок, у плагіні GIT 2.4.0 (а може і раніше?) Ви можете встановити назву локальної гілки $GIT_BRANCHта отримати гілку, названу на честь віддаленої гілки. (Щойно опублікував мою власну відповідь із цією інформацією.)
Крістіан Семрау,

2
Просто хочу додати, що встановити значення "**" або залишити його порожнім - набагато кращий варіант. Буде обчислено назву місцевої гілки. походження / тест -> тест
Андрій Клочков

61

Жодна з конфігурацій Дженкінса для іншої відповіді не працювала для мене без необхідності створювати кроки вручну. Те, що справді працює, просто:

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

25

ОНОВЛЕННЯ (листопад 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 до імені локальної гілки таким чином:

HEAD -> refs/heads/localbranchname -> 7a698457751bdc043cfda631b81e3812c5361790

Випуск Maven повинен пройти зараз у Дженкінса.

До речі, це працює для мене з Jenkins 1.492 та плагіном Jenkins Git версії 1.1.26.


5
Мені потрібне було лише місцеве відділення (необов’язково)
Зак Томпсон,

1
В мене так само. Налаштування (необов’язково) мало достатню різницю. Крім того, я використовую CloudBees і маю SSH-ключ, зареєстрований на GitHub. Проблеми викликало надання імені користувача / пароля для плагіна випуску maven. Я нарешті успішно випустив без імені користувача / пароля, дозволивши SSH взяти на себе.
Джефф Фейрлі,

4
До речі, станом на Дженкінс 1.547 (принаймні це те, що я запускаю) друга розширена кнопка відсутня. Ви можете звернутися до певної місцевої гілки, вибравши додаткову поведінку в розділі "Додаткові поведінки".
fbl

Мені вдалося це виправити в Jenkins 1.627, просто встановивши для поля "Додаткова поведінка" в полі "Перевірка до конкретної локальної гілки" значення "master".
Дерк,

Це працює частково, зараз мій репо знаходиться у потрібній мені гілці, але коли я намагаюся натиснути, я отримую 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 всередині. Це означає, що він відокремлений - відірваний від будь-якої гілки. Не створено нове посилання "немає гілки".

Команда 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

Це вирішить проблему, сподіваюся;)


Дякую за твою допомогу! Цей спосіб знову перевірити головну гілку я вже знайшов. Але плагін випуску maven використовує також плагін git для отримання джерела, це означає, що плагін випуску maven викликає лише цілі випуску з параметрами. Немає можливості викликати попередній крок між цим і двома кроками.
Мішель Веррен,

Ну, як я розумію, цілі випуску - це те, що ви, напевно, мали змогу налаштувати. Ви знаєте, що йому не вдається визначити поточну гілку, тому ви повинні мати можливість налаштувати підготовку цілі випуску, щоб вона могла перевірити проект у правильній гілці. Я думаю, найкращим способом було б визначити одну гілку, з якої ви завжди звільняєте, як-от master, і змінити ціль "підготовки" на розміщення плагіна, явно перевіривши гілку master.
Eugene Sajine

7

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

Відповідь Матіас Браун отримує вас ім'я гілка, але не ім'ям віддаленого філії.

Замість того, щоб встановлювати локальну гілку master, встановіть локальну гілку$GIT_BRANCH .

Я знайшов це рішення в https://issues.jenkins-ci.org/browse/JENKINS-6856


1
Встановивши для локальної гілки $ GIT_BRANCH, для мене на пульті створено нову гілку: origin / origin / master. Залишення параметра порожнім, здавалося, працювало правильно.
apa64

5

(ВИРІШЕНО)

Привіт, у мене виникла та сама проблема, коли я намагався виконати параметризовану збірку випуску з гілки з maven-release-plugin: 2.5.3 та maven-scm-provider-jgit: 1.9.5.

Я хотів мати можливість вибрати гілку для "параметризованої збірки випусків", це не спрацювало, і коли я вибрав "Замовлення / злиття в локальну гілку (необов'язково)", це спрацювало, але в кінцевому підсумку з'явилася гілка "origin / origin / mybranch" у віддаленому (повторне походження).

Так:

  • Додайте "Параметр Git" до "Цей проект параметризований"
    Назва: галузь
    ПараметрТип: Відділення
    Клацніть Додатково:
    Відділення Фільтр: початок /(.*)
    (це був фокус!)

  • Репозиторій Git:
    Відділення для побудови: refs / remotes / origin / $ {branch}

  • Додаткова поведінка: -> Зверніться до конкретного місцевого
    відділення Назва відділення: $ {branch}

Веселіться :-)


Для цього потрібен встановлений плагін "Параметри Git"
MatPag

1

У мене така сама проблема. Рішення @Eugene спрацювало лише один раз. Під час другої спроби сталася помилка - "не вдається видалити HEAD зі сховища" або щось подібне.

Я заснував це ( джерело ):

І м2 додаткових кроків (попередня збірка)

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

git reset - жорстке походження / майстер

І зараз я думаю, що це нормально.


1

У мене була та сама проблема. Я спробував рішення Костянтина, яке спрацювало чудово, але тег і коміти були висунуті на віддалене сховище "localbranchname".

Тож я зробив те саме, але вручну: спочатку додайте сценарій оболонки до кроків:

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, коміти та теги будуть на головній (або іншій) гілці.

сподіваюся, це допоможе!


1

Додайте до командного рядка maven для підготовки до випуску: -DpushChanges=false -DlocalCheckout=true

Це означає, що maven буде використовувати те, що отримали дженкіни всередині робочого каталогу .git, і ні клонувати пульт, ні натискати на віддалений.

Я рекомендую налаштувати повністю кваліфікований refs/remotes/origin/developяк ваш Git "Відділок для побудови". Таким чином, це здається мені більш зрозумілим.

У такому випадку ваш $ GIT_BRANCH магічно встановив би Дженкінс origin/develop

Потім, замість використання надто складного (але портативного) 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 та теги.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.