web-dev-qa-db-fra.com

Comment recevoir le nom de la branche Git locale avec le plugin Jenkins Git?

J'utilise l'option Branch Specifier de Jenkins Git plug-in (v2.0) pour exécuter la génération sur une branche spécifique, par exemple. 1.4.

${GIT_BRANCH} Contient dans ce cas la valeur Origin/1.4.

Comment puis-je recevoir le nom de la branche Git locale utilisée pour le clonage (c'est-à-dire juste 1.4 Sans le préfixe Origin/?

J'ai essayé Check out to specific local branch Comportement supplémentaire avec le nom de la branche 1.4, Mais rien n'avait changé.

J'ai vu des informations associées PR sur GitHub, mais elles ont été refusées (car cela ne corrige qu'un cas avec seulement Origin à distance).

47
Max Romanovsky

Vous pouvez facilement enlever le préfixe de la variable: ${GIT_BRANCH##Origin/}

Bien que ce ne soit pas une solution très générale, c'est assez simple et je n'ai pas vu de référentiel cloné par Jenkins, qui utiliserait autre chose que Origin pour le nom distant.

Update : En fait, ${GIT_BRANCH#*/} fonctionnera pour n’importe quelle origine et même pour les branches contenant des barres obliques. Le # ne fait-il pas une correspondance globale non gourmande, ## permet la correspondance gourmande. Voir Manuel de référence de Bash pour plus de détails.

58
Jan Včelák

Depuis mars 2016 (Git Plugin v2.4.3), cela est maintenant supporté de manière native. Tout simplement ** comme valeur pour Check out to specific local branch dans le plugin Git, au lieu de n’importe quelle macro/variable.

La description du champ détaille le nouveau comportement:

Si cette option est sélectionnée et que sa valeur est une chaîne vide ou "**", le nom de la branche est calculé à partir de la branche distante sans l'origine. Dans ce cas, une branche distante Origine/maître sera extraite vers une branche locale nommée maître et une branche distante Origine/développement/nouveauté sera extraite vers une branche locale nommée develop/newfeature.

Ceci a été introduit par @roostergx & @NickVolynkin lors de sa publication. J'essaie juste de documenter ici pour aider, espérons-le, les gens à l'avenir.

9
Sean Connolly

J'ai réussi à le faire en quelques étapes:

  1. Ajoutez Execute Shell Pre step avec ces:

    git_branch_local=$(echo $GIT_BRANCH | sed -e "s|Origin/||g") echo GIT_BRANCH_LOCAL=$git_branch_local > build.properties

  2. Ajouter une étape préalable Inject environment variables Pour le fichier build.properties

alors vous devriez avoir une variable d'environnement GIT_BRANCH_LOCAL qui n'a pas Origin/

7
burcakulug

Si vous l'utilisez comme branche locale et que vous utilisez ensuite $ {GIT_LOCAL_BRANCH}, le nom de la branche locale sera attribué (c'est-à-dire 'develop' au lieu de 'Origin/develop'. (Plugin Git version 3.0.0)

5
Tim Webster

J'ai posté un message au groupe jenkins-ci ( https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/jenkinsci-dev/xuweZbwn9zE/BAWfs-ZeFAAJ ) ce qui suggère une amélioration de l’option "Check Out to Local Branch" du plugin Git. Par défaut, le plugin git vérifie une tête détachée. La branche locale vous permet de spécifier un nom de branche spécifique. Une fois configuré, en utilisant cette méthode, le nom de la branche locale est exactement tel que spécifié.

Si vous utilisez Jenkins pour créer une version maven, le nom de la branche locale doit obligatoirement être identique à celui de la branche distante. Voir l'article sur Google Groupes pour plus d'informations.

Pour répondre à cette exigence, j'ai créé une demande d'extraction ( https://github.com/jenkinsci/git-plugin/pull/381 ) avec du code et des scénarios de test.

Également créé un problème JIRA ( https://issues.jenkins-ci.org/browse/JENKINS-33202 ) pour documenter le problème.

Si quelqu'un a besoin de cette fonctionnalité, je vous encourage à participer à la discussion de groupe et à voter pour le JENKINS-33202.

4
roostergx

Comme le dit dtabuenc dans un commentaire à la réponse de Jan Včelák, il est vrai que la syntaxe du shell ne fonctionnera pas directement sur les macros de jetons, si vous essayez d'obtenir le nom de la branche dans une étape de construction d'Execute Shell (ou similaire), vous pouvez toujours utiliser la même idée.

TEMP_GIT_BRANCH=${GIT_BRANCH}
MY_GIT_BRANCH="${TEMP_GIT_BRANCH#*/}"

fonctionne bien (et c'est POSIX valide, pas de bash requis).

4
Steven Collins

J'ai rencontré le problème aujourd'hui. La raison en est que Jenkins git plug-in ajoute "Origin /" à tout nom de branche que vous avez fourni au paramètre de génération GIT_BRANCH. Voir https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin

Le plugin git définit plusieurs variables d’environnement que vous pouvez utiliser dans vos scripts: GIT_BRANCH - Nom de la branche en cours d’utilisation, par exemple. "maître" ou "origine/foo"

En conséquence, lorsque vous construisez avec le paramètre GIT_BRANCH = foo, Jenkins ajoutera simplement "Origin /" devant lui. Puis, quand tu fais

git check out ${GIT_BRANCH}

vous faites réellement

git check out Origin/foo

Pour éviter cela, vous pouvez utiliser quelque chose d'autre dans votre paramètre de construction, tel que GIT_BRANCH_NAME ou quoi d'autre, n'utilisez simplement pas GIT_BRANCH. En configuration, supprimez le paramètre GIT_BRANCH et ajoutez-en un autre portant le nom GIT_BRANCH_NAME. Ensuite, dans "Construire avec paramètre", sous GIT_BRANCH_NAME, spécifiez votre branche.

2
fangmobile.com

Dans un pipeline, vous pouvez le faire comme ceci:

// get arround a git scm anoying feature
stage ('Bootstrap') {
    sh "echo GIT_BRANCH_LOCAL=\\\"$GIT_BRANCH\\\" | sed -e 's|Origin/||g' | tee version.properties"
}

stage('Checkout') {
    load('version.properties')
    checkout([$class: 'GitSCM', branches: [[name: '**']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'LocalBranch', localBranch: "${GIT_BRANCH_LOCAL}"]], submoduleCfg: [], userRemoteConfigs: [[url: 'https://github.com/webofmars/grails-website.git']]])
}
2
webofmars

Basé sur ceci SO réponse: Comment puis-je obtenir le résultat d'une commande Shell exécutée à l'aide d'une variable de Jenkinsfile (groovy)?

Je l'ai utilisé et j'ai finalement réussi à le faire fonctionner (l'exemple ci-dessous suppose une variable de branche de $Branch):

stage('Checkout') {
    GIT_BRANCH_LOCAL = sh (
        script: "echo $Branch | sed -e 's|Origin/||g'",
        returnStdout: true
    ).trim()
    echo "Git branch: ${GIT_BRANCH_LOCAL}"
    git branch: "${GIT_BRANCH_LOCAL}", credentialsId: '...', url: '[email protected]:......git'
}
1
Josh

Après longtemps, j'ai enfin trouvé la solution pour que mon cas reçoive nom du git local (pour SonarQube) sans "Origine /" dans mon projet Jenkins Freestyle = (pas Jenkinsfile). J'utilise l'environnement Windows.

À Jenkins:

  • Dans la section "Gestion du code source": ajoutez "Extraire dans une branche locale spécifique" et dans "Nom de la branche", entrez: **
  • Dans la section "Construire": j'ai utilisé et ajouté "SonarScanner pour MSBuild - Begin Analysis", alors que dans "Arguments supplémentaires", j'ai ajouté: /d:sonar.branch.name=${GIT_LOCAL_BRANCH}

Donc, seulement avec cette combinaison de ** et ${GIT_LOCAL_BRANCH} ça a fonctionné pour moi.

1
Chris

J'ai rencontré ce problème aussi bien aujourd'hui. Il semble que lorsque je change la valeur de Check out to specific local branch, Je dois supprimer le référentiel local sur le serveur de génération avant de déclencher une nouvelle génération.

La réponse de @Chris m'a aidé. Merci!

N'oubliez pas d'ajouter le "comportement supplémentaire -> consultez une branche locale spécifique" sous "Gestion du code source".

enter image description here

Jusqu'à ce que je n'ajoute pas le fait que la variable $ {GIT_LOCAL_BRANCH} n'était pas disponible lorsque j'ai essayé de l'utiliser. (Exemple: exécutez la commande shell 'printenv' puis vérifiez la sortie de la console)

0