web-dev-qa-db-fra.com

Jenkins Git plugin détaché HEAD

Je suis nouveau chez Git et aussi chez Jenkins. Mon problème est que je ne parviens pas à faire fonctionner le plug-in Jenkins Maven release.

Lorsque je construis une version commune de Maven avec Jenkins, cela fonctionne bien, mais lorsque j'essaie d'effectuer une publication avec le plug-in Maven Release, j'obtiens le suivi de pile suivant:

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

La commande et le message d'erreur ayant échoué sont les suivants:

[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

J'ai compris que le plugin Jenkins Git crée un ref HEAD détaché "(pas de branche)" qui cause le problème, je pense. Mais je ne sais absolument pas pourquoi cette référence est créée ni comment je peux résoudre ce problème.

Je vous serais reconnaissant pour toute l'aide apportée.

57
Michel Werren

Aucune des configurations Jenkins de l'autre réponse ne fonctionnait pour moi sans avoir à créer des étapes manuelles. Ce qui fonctionne vraiment est simple:

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

Le champ Checkout/merge to local branch (optional) a disparu de la version actuelle (2.2.1) du plugin Git.

Il semble être passé à Additional Behaviours -> Check out to specific local branch:

enter image description here

Définir cette valeur sur master m'a valu une branche extraite au lieu d'une tête détachée.

56
Matthias Braun

UPDATE (novembre 2015): Veuillez noter que cette solution a été fournie pour une version spécifique du plugin Git (1.1.26). Dans les versions ultérieures, le plugin a été mis à jour pour faciliter la configuration.

Pour le plugin Jenkins GIT version 1.1.26, essayez ceci:

Aller à la configuration du travail. Faites défiler jusqu'à la section Git et cliquez sur le bouton "Avancé ..." sous "Référentiels". Puis définissez:

Name: Origin
Refspec: +refs/heads/branch-0.1:refs/remotes/Origin/localbranchname

Cliquez ensuite sur un autre bouton "Advanced ..." et réglez:

Checkout/merge to local branch (optional): localbranchname

Vous pouvez nommer la branche locale comme vous le souhaitez, mais la destination dans Refspec doit correspondre au nom de la branche locale dans ce champ facultatif (dans ce cas, "localbranchname"). Cela va attacher HEAD au nom de branche local comme ceci:

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

La libération de Maven devrait passer maintenant dans Jenkins . Btw, cela fonctionne pour moi avec Jenkins 1.492 et le plugin Jenkins GIT version 1.1.26. 

24
Constantine

in Git Quand vous avez une branche extraite, comme master ou dev ou toute autre branche locale, votre HEAD (fichier dans le dossier .git) contiendra une référence à la branche correspondante. Par conséquent, il est "attaché".

Lorsque vous effectuez des opérations telles que rebase, fusionne ou que vous extrayez un commit particulier. c’est-à-dire qu’à chaque fois que vous ne voyez aucune branche, votre HEAD n’a pas de référence à une branche locale, mais pointe directement sur le commit, c’est-à-dire qu’il contient le SHA-1 réel. Cela signifie qu'il est détaché - détaché de toute branche . Aucune nouvelle référence "aucune branche" n'a été créée.

La commande git symbolic-ref HEAD vérifie si le contenu HEAD est une référence ou un SHA-1 et l’imprime.

Vous pouvez voir cela en faisant:

git checkout master
git symbolic-ref HEAD
git checkout HEAD~2 # going two commits back
git symbolic-ref HEAD
git checkout master # coming back

Maintenant, la plupart du temps, le plugin git dans Jenkins fonctionne avec le code dans l'état détaché HEAD. Je ne sais pas comment fonctionne le plug-in de publication de Maven, mais je suis sûr à 99% que cela nécessite que vous publiiez à partir d'une branche spécifique. Afin de remédier à cela, je vous conseillerais de spécifier comme étape de pré-construction ou commande Shell:

git checkout master; git pull Origin master

Cela résoudra le problème, j'espère;)

6
Eugene Sajine

(RESOLU)

Bonjour, J'ai eu le même problème lorsque j'essayais de construire une version paramétrée à partir d'une branche avec maven-release-plugin: 2.5.3 et maven-scm-provider-jgit: 1.9.5.

Je voulais pouvoir sélectionner la branche pour la "version paramétrée", cela ne fonctionnait pas et lorsque je choisissais "Checkout/fusion avec une branche locale (facultatif)", cela fonctionnait, mais aboutissait à une branche "Origine/origine/mybranch". en distance (origine répétée).

Alors:

  • Ajouter "Paramètre Git" à "Ce projet est paramétré"
    Nom: branche
    ParameterType: Branch
    Cliquez sur Avancé:
    Filtre de branche: Origine /(.*)
    (c'était le truc!)

  • Dépôt Git:
    Branches à construire: refs/remotes/Origin/$ {branch}

  • Comportements supplémentaires: -> Départ vers une branche locale spécifique
    Nom de la branche: $ {branche} 

S'amuser :-)

2
R.S

Je veux construire plusieurs branches et vérifier chaque branche sous son nom. J'utilise le plugin GIT 2.4.0.

Le réponse de Matthias Braun vous donne une branche nommée, mais elle ne porte pas le nom de la branche distante.

Au lieu de définir la branche locale master, définissez la branche locale $GIT_BRANCH.

J'ai trouvé cette solution dans https://issues.jenkins-ci.org/browse/JENKINS-6856

2
Christian Semrau

Ajoutez à la ligne de commande maven pour la version prepare: -DpushChanges=false -DlocalCheckout=true 

Cela signifie que maven utilisera ce que jenkins a obtenu dans le répertoire de travail .git, et ne clone ni la télécommande ni le Push to remote.

Je recommande de configurer le refs/remotes/Origin/develop pleinement qualifié en tant que votre "branche à construire" Git. De cette façon, cela me semble plus compréhensible. 

Dans un tel cas, votre $ GIT_BRANCH serait magiquement défini par Jenkins sur Origin/develop

Ensuite, au lieu d’utiliser GitPublisher trop complexe (mais portable), ajoutez simplement une étape de post-construction "Exécuter Shell":

echo Remote branch is $GIT_BRANCH, replacing Origin with refs/heads.
git Push --follow-tags "$GIT_URL" "+HEAD:${GIT_BRANCH/#Origin\//refs/heads/}"

Cela pousse tout ce qui a changé, comme pom.xml et les balises.

0
kubanczyk

J'ai le même problème. La solution @ Eugène n'a fonctionné qu'une fois. Il y a eu une erreur au deuxième essai - "impossible de supprimer HEAD du référentiel" ou quelque chose comme ça.

J'ai fondé ceci ( source ):

Et m2 marches supplémentaires (pré-construction)

maître de caisse de git || git checkout -b maître

réinitialisation git - Hard Origin/master

Et maintenant je pense que ça va.

0
Pawel

J'ai eu le même problème ... J'ai essayé la solution de Constantine, cela fonctionnait parfaitement, mais le tag et les commits ont été placés dans le dépôt distant "localbranchname".

J'ai donc fait la même chose, mais manuellement: D'abord, ajoutez un script Shell aux étapes préalables:

git branch -f localJenkins
git checkout localJenkins

Ensuite, un script Shell post-étapes:

git checkout master
git rebase localJenkins
git branch -D localJenkins
git Push Origin master
git Push --tag

Cela fonctionne! De cette façon, vous n'avez pas de branche distante jenkins, les commits et les balises seront sur la branche principale (ou autre).

j'espère que cela t'aides !

0
antoine