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).
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.
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.
J'ai réussi à le faire en quelques étapes:
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
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/
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)
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.
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).
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.
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']]])
}
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'
}
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:
**
/d:sonar.branch.name=${GIT_LOCAL_BRANCH}
Donc, seulement avec cette combinaison de **
et ${GIT_LOCAL_BRANCH}
ça a fonctionné pour moi.
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".
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)