web-dev-qa-db-fra.com

Jenkins Workflow Checkout Accès à BRANCH_NAME et à GIT_COMMIT

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?

14
Oldek

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.

28
Jesse Glick

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.

Instance Jenkins 1

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 checkoutdocumentation é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

Instance Jenkins 2

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.

7
Antony

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

0
Eazhilan Nagarajan