Je suis nouveau à Jenkins/Devops; Je suis cet exemple . Quand je fais localement (depuis le terminal):
git rev-parse --abbrev-ref HEAD
Je reçois le nom de la branche actuelle. Cependant, depuis Jenkinsfile, dans les journaux, je reçois:
HEAD
Je fais des recherches en ligne depuis un moment et je n’en ai pas trouvé la raison jusqu’à présent. Quelles sont les causes potentielles de ce résultat?
Dans mon jenkinsfile, j'essaie d'obtenir le nom de la branche git actuelle (celui qui a déclenché le webhook), puis de le diriger à l'intérieur de la commande 'git branch'. Le code est donc le suivant:
pipeline {
agent {
label 'ubuntu'
}
stages {
stage('check') {
steps {
script {
env.GIT_BRANCH_NAME=sh(returnStdout: true, script: "git rev-parse --abbrev-ref HEAD").trim()
}
sh 'echo BRANCH_NAME ${GIT_BRANCH_NAME}'
git branch: GIT_BRANCH_NAME, credentialsId: '******', url: 'https://*****/*****/*****.git'
}
....
}
Dans la ligne
sh 'echo BRANCH_NAME ${GIT_BRANCH_NAME}'
Donne HEAD
J'ai trouvé un moyen de contourner cela en utilisant git name-rev --name-only HEAD et modifié le code du script pour:
script {
env.GIT_BRANCH_PATH=sh(returnStdout: true, script: "git name-rev --name-only HEAD").trim()
env.GIT_BRANCH_NAME=GIT_BRANCH_PATH.split('remotes/Origin/')[1]
}
Maintenant, j'ai le bon nom de branche et les étapes fonctionnent, mais je préférerais avoir une façon de faire les choses moins astucieuse.
Quelle est la meilleure méthode pour atteindre ce que je veux atteindre en utilisant les meilleures pratiques?
PS Je n'utilise pas de pipeline multi-branches et les exigences étaient de ne pas utiliser le multi-branches.
Je suis probablement en retard pour répondre, mais il existe potentiellement un moyen plus simple. Assurez-vous de sélectionner "Extraire vers une branche locale spécifique" sous des comportements supplémentaires dans votre configuration Git. Cela garantira que git vérifie la branche exacte que vous suivez, et que votre commande originale "git rev-parse --abbrev-ref HEAD" fonctionnera correctement.
Si vous utilisez le pipeline multibranches, le nom de la branche doit être disponible dans les variables d'environnement sous la forme env. BRANCH_NAME
. vous pouvez utiliser sh 'printenv'
dans votre étape pour imprimer toutes les variables d'environnement disponibles
La solution que j'ai trouvée pour cette situation est la suivante:
checkout([$class: 'GitSCM', branches: [[name: '*/' + branch]], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'LocalBranch', localBranch: "**"]], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'cred', url: '[email protected]:repofolder/repo.git']]])
La clé ici est [$class: 'LocalBranch', localBranch: "**"]
. Cela permet de récupérer une branche et non une révision.
La source est tirée de ici .