web-dev-qa-db-fra.com

Variables Git dans le plugin Jenkins Workflow

J'aimerais accéder à des variables git telles que GIT_COMMIT et GIT_BRANCH lorsque j'ai extrait un référentiel de git plus bas dans le flux de construction. Actuellement, je ne trouve aucune variable disponible pour accéder à ces deux paramètres.

node {
    git git+ssh://git.com/myproject.git
    echo "$GIT_COMMIT - $BRANCH_NAME"
}

Ces variables sont-elles disponibles et, au cas où, où les trouverais-je? Cela ne me dérange pas si elles sont disponibles via des variables groovy ou ailleurs, juste que je peux y accéder.

Peut-être que je n’ai pas les compétences de débogage dans Groovy et c’est facile à trouver, mais je ne le trouve pas avec mes compétences limitées.

32
Oldek

Pour résoudre ce problème, le meilleur moyen pour le moment consiste à utiliser le pipeline multi-branches, et il peut être intéressant de savoir que Bitbucket et Github ont des plugins dans Jenkins qui configurent une organisation et découvrent automatiquement de nouveaux projets. Cela fonctionne nativement puis avec env.GIT_BRANCH

Pour commit ID, je suggérerais ce que @mkobit a écrit ci-dessus.

0
Oldek

En fonction du plug-in SCM que vous utilisez, l'étape checkout peut renvoyer des informations supplémentaires sur la révision. Cela a été résolu dans JENKINS-26100 . Il a été publié dans la version 2.6 du plugin workflow-scm-step .

Par exemple, en utilisant le plugin Git, vous pouvez faire quelque chose comme:

final scmVars = checkout(scm)
echo "scmVars: ${scmVars}"
echo "scmVars.GIT_COMMIT: ${scmVars.GIT_COMMIT}"
echo "scmVars.GIT_BRANCH: ${scmVars.GIT_BRANCH}

Cela varie en fonction du plug-in que vous utilisez, donc la réponse d'origine pourrait mieux fonctionner pour vous.


Réponse originale

Avec la version 2.4 du plug-in Nœuds et processus de pipeline , vous pouvez simplement faire:

def gitCommit = sh(returnStdout: true, script: 'git rev-parse HEAD').trim()
27
mkobit

C’est ce que je suis en train de faire, à partir de exemple fourni dans l’exemple de rapport Jenkins

node {
    git url: 'https://git.com/myproject.git'

    sh 'git rev-parse --abbrev-ref HEAD > GIT_BRANCH'
    git_branch = readFile('GIT_BRANCH').trim()
    echo git_branch

    sh 'git rev-parse HEAD > GIT_COMMIT'
    git_commit = readFile('GIT_COMMIT').trim()
    echo git_commit
}

Edit vous pouvez le faire plus rapidement via

git_commit = sh(returnStdout: true, script: "git rev-parse HEAD").trim()
8
Kevin London

En fonction des informations dont vous avez besoin, il existe une solution très simple: récupérez l'opération "checkout scm": elle fournit GIT_BRANCH, GIT_COMMIT, GIT_PREVIOUS_COMMIT, GIT_PREVIOUS_SUCCESSFUL_COMMIT et GIT_URL.

node { 
    stage ("Checkout") {

        scmInfo = checkout scm

        /*...*/
        echo "scm : ${scmInfo}"
        echo "${scmInfo.GIT_COMMIT}"


    }
}

Cela produira:

...
[Pipeline] echo
    scm : [GIT_BRANCH:my-branch, GIT_COMMIT:0123456789abcdefabcdef0123456789abcdef01, GIT_PREVIOUS_COMMIT:aaaabbbcccdddeeeefffe0123456789012345678, GIT_PREVIOUS_SUCCESSFUL_COMMIT:aaaabbbcccdddeeeefffe0123456789012345678, GIT_URL:http://my.si.te/my-repository.git]
[Pipeline] echo
    0123456789abcdefabcdef0123456789abcdef01
...

Plus de détails ici Jenkins Pipeline SCM Steps

3
Jonathan Vanderick

Vous pouvez définir vos tâches (extraire les informations git de la dernière validation) dans node pour les exécuter dans une file d'attente.

node {

  //Code checkout from SCM (here - `git`)
  checkout scm

  stage("GIT INFO"){
    echo ":::::::::::GIT_SHORT_COMMIT::::::::::::::::::::::::"

    GIT_SHORT_COMMIT = sh(returnStdout: true, script: "git log -n 1 --pretty=format:'%h'").trim()
    //echo in jenkins console
    echo GIT_SHORT_COMMIT
    //wanted to send these info to build artifacts, append to any file
    sh("echo ${GIT_SHORT_COMMIT} > GIT_SHORT_COMMIT")

    //Similar proceed for other git info's 
    echo ":::::::::::GIT_COMMITTER_EMAIL::::::::::::::::::::::::"

    GIT_COMMITTER_EMAIL = sh(returnStdout: true, script: "git show -s --pretty=%ae").trim()
    sh("echo ${GIT_COMMITTER_EMAIL} > GIT_COMMITTER_EMAIL-${GIT_COMMITTER_EMAIL}")



    echo ":::::::::::GIT_COMMITTER_NAME::::::::::::::::::::::::"

    GIT_COMMITTER_NAME = sh(returnStdout: true, script: "git show -s --pretty=%an").trim()
    sh("echo ${GIT_COMMITTER_NAME} > GIT_COMMITTER_NAME-${GIT_COMMITTER_NAME}")
  }

Une fois votre travail terminé, vous verrez trois fichiers supplémentaires provenant de la tâche ci-dessus dans votre espace de travail: 

. |-- [email protected] |-- GIT_COMMITTER_NAME-username |-- GIT_SHORT_COMMIT_<commit-short-ID-ef9e91c>

1
daemonsl

Cet exemple pourrait vous amener plus loin: https://github.com/jenkinsci/pipeline-examples/tree/master/pipeline-examples/gitcommit

Dans cet exemple, ils dirigent la sortie des commandes git vers un fichier, puis lisent le fichier. 

1
BritishKnight

Le moyen le plus simple d'extraire la variable Git dans Jenkins via Jenkinsfile

node {
  def scmVars = checkout scm
  echo 'scm : the commit id is ' +scmVars.GIT_COMMIT
  echo 'scm : the commit branch  is ' +scmVars.GIT_BRANCH
  echo 'scm : the previous commit id is ' +scmVars.GIT_PREVIOUS_COMMIT
  def commitEmail = sh(returnStdout: true, script: "git --no-pager show -sformat=\'%ae\'")
  echo " the commiter email is'${commitEmail}'"
  def commitName = sh(returnStdout: true, script: "git --no-pager show -s format=\'%an\'")
  echo " the commiter name is'${commitName}'"
}

En console, vous obtiendrez le 

GIT_COMMIT:
GIT_BRANCH:
GIT_PREVIOUS_COMMIT:
commitEmail:
commitName:
0
pix data