Je n'arrive pas à extraire $ GIT_COMMIT et $ BRANCH_NAME d'une étape de vérification du flux de travail Jenkins.
J'aimerais pouvoir envoyer cette information à mes scripts Gradle afin de la transmettre à des sources externes telles que l'analyse statique, etc.
Actuellement, j'essaye de lancer ceci:
checkout([$class: 'GitSCM', branches: [[name: '*/master']], userRemoteConfigs: [[credentialsId: '2b74a351-67d5-4d00-abd3-49842a984201', url: 'ssh://[email protected]:repo.git']]])
Et j'aimerais atteindre les objectifs suivants ou quelque chose de similaire:
// Specified variables that can be reused
def branch = ${BRANCH_NAME}
def commit = ${GIT_COMMIT}
Ou peut-être que cela fonctionnerait aussi:
print "BRANCH: ${BRANCH_NAME}, COMMIT: ${GIT_COMMIT}"
// or the following
print "BRANCH: ${env.BRANCH_NAME}, COMMIT: ${env.GIT_COMMIT}"
J'ai trouvé le problème suivant qui semble avoir été résolu, mais il ne fonctionne pas dans la version 1.15:
https://issues.jenkins-ci.org/browse/JENKINS-30252
Quelqu'un a une idée sur la façon de résoudre ce problème ou sur une variable que je ne trouve pas?
Tout d'abord,
def branch = ${BRANCH_NAME}
n'est pas valide Groovy, ou du moins ne fait pas ce que vous pensez. Peut-être que vous vouliez dire
def branch = "${BRANCH_NAME}"
ce qui serait juste une façon idiote d'écrire
def branch = BRANCH_NAME
De toutes façons, les variables d'environnement ne sont pas directement accessibles en tant que variables Groovy dans Pipeline (une proposition l'autorise); vous devez utiliser la variable globale env
:
def branch = env.BRANCH_NAME
À partir d’un processus externe, tel qu’une étape sh
, il s’agit d’une variable d’environnement réelle.
sh 'echo $BRANCH_NAME'
fonctionne (notez que '
signifie que Groovy est pas en interpolant la variable).
JENKINS-30252 faisait référence à des projets multi-branches. Si vous avez créé un travail de pipeline autonome, cette variable ne sera pas définie.
Quoi qu'il en soit, dans votre cas, votre étape checkout
recherche toujours la branche master
. Si vous avez réellement un projet multibranches, votre Jenkinsfile
devrait utiliser
checkout scm
qui vérifiera un commit sur la bonne branche (correspondant toujours à la révision de Jenkinsfile
elle-même).
En attente JENKINS-26100 ceci n’est pas disponible automatiquement, mais vous pouvez utiliser quelque chose comme:
sh 'git rev-parse HEAD > commit'
def commit = readFile('commit').trim()
pour y accéder.
J'ai deux instances de Jenkins.
Dans les deux cas, les variables d'environnement GIT_COMMIT
et BRANCH_NAME
ne sont pas définies.
Lorsque j'essaie de les obtenir à partir de la valeur de retour de l'appel checkout()
, chaque instance se comporte différemment.
Version Jenkins: 2.46.1
Version du plug-in "Pipeline: SCM Step": 2.5
Essayer d'accéder à la variable d'environnement comme expliqué dans la checkout
documentation échoue.
def scmVars = checkout([$class: 'GitSCM', branches: [[name: '*/master']],
userRemoteConfigs: [[credentialsId: '2b74a351-67d5-4d00-abd3-
49842a984201', url: 'ssh://[email protected]:repo.git']]])
def commitHash = scmVars.GIT_COMMIT
scmVars
renvoie NULL et l'accès à scmVars.GIT_BRANCH
échoue avec l'exception Java.lang.NullPointerException: Cannot get property 'GIT_BRANCH' on null object
.
Donc, je devais faire ce qui suit pour obtenir la branche:
sh 'git name-rev --name-only HEAD > GIT_BRANCH'
sh 'cat GIT_BRANCH'
git_branch = readFile('GIT_BRANCH').trim()
env.GIT_BRANCH = git_branch
Version Jenkins: 2.60.2
Version du plug-in "Pipeline: SCM Step": 2.6
Dans ce cas, je pourrais faire ce qui suit avec succès:
def scmVars = checkout([$class: 'GitSCM', branches: [[name: '*/master']],
userRemoteConfigs: [[credentialsId: '2b74a351-67d5-4d00-abd3-
49842a984201', url: 'ssh://[email protected]:repo.git']]])
env.GIT_COMMIT = scmVars.GIT_COMMIT
env.GIT_BRANCH = scmVars.GIT_BRANCH
Vérifiez donc quelle approche fonctionne pour votre instance Jenkins et utilisez-la.
Si vous souhaitez accéder à la variable d'environnement BRANCH_NAME
from Jenkins en tant que script Shell, utilisez l'extrait ci-dessous.
sh 'echo Branch Name: $BRANCH_NAME'
La réponse devrait être comme ci-dessous:
Branch Name: the_checkedout_branch