wake-up-neo.net

Git-Variablen im Jenkins Workflow-Plugin

Ich möchte auf git-Variablen wie GIT_COMMIT und GIT_BRANCH zugreifen, wenn ich ein Repository von git weiter unten im Build-Stream ausgecheckt habe. Derzeit finde ich keine verfügbare Variable, um auf diese beiden Parameter zuzugreifen.

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

Gibt es solche Variablen und falls, wo würde ich sie finden? Es macht mir nichts aus, ob sie durch groovige Variablen verfügbar sind oder wo auch immer, nur dass ich darauf zugreifen kann.

Vielleicht fehlt mir das Debugging-Können in Groovy, und das ist leicht zu finden, aber ich kann es mit meinen begrenzten Fähigkeiten nicht finden.

32
Oldek

Ich kann dies vorläufig beheben, indem Sie die Multi-Branch-Pipeline verwenden. Es ist vielleicht gut zu wissen, dass Bitbucket und Github Plugins in Jenkins haben, die eine Organisation einrichten und neue Projekte automatisch erkennen. Das funktioniert dann nativ mit env.GIT_BRANCH

Für Commit ID würde ich vorschlagen, was @mkobit oben geschrieben hat.

0
Oldek

Abhängig vom verwendeten SCM-Plugin kann der Schritt checkout zusätzliche Informationen zur Revision zurückgeben. Dies wurde in JENKINS-26100 gelöst. Es wurde in der 2.6-Version des workflow-scm-step-Plugins veröffentlicht.

Mit dem Git-Plugin können Sie beispielsweise Folgendes tun:

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

Dies variiert je nach verwendetem Plugin, sodass die ursprüngliche Antwort möglicherweise besser für Sie funktioniert.


Originalantwort

Mit der Version 2.4 des Pipeline-Knoten und Prozess-Plugin können Sie einfach Folgendes tun:

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

Dies mache ich, basierend auf dem Beispiel in den Jenkins-Beispielen repo

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 können Sie dies mit kürzer machen

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

Abhängig von den Informationen, die Sie benötigen, gibt es eine sehr unkomplizierte Lösung: Holen Sie sich die Operation "checkout scm" zurück.

node { 
    stage ("Checkout") {

        scmInfo = checkout scm

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


    }
}

Dies wird ausgegeben:

...
[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
...

Weitere Details hier Jenkins Pipeline SCM Steps

3

Sie können Ihre Jobs in node für die Ausführung in einer Warteschlange definieren (Extrahieren von Git-Informationen aus dem letzten Commit).

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}")
  }

Nachdem der Job abgeschlossen ist, werden in Ihrem Arbeitsbereich drei zusätzliche Dateien von der obigen Aufgabe angezeigt: 

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

1
daemonsl

Dieses Beispiel könnte Sie weiterbringen: https://github.com/jenkinsci/pipeline-examples/tree/master/pipeline-examples/gitcommit

In diesem Beispiel übergeben sie die Ausgabe von git-Befehlen in eine Datei und lesen dann die Datei. 

1
BritishKnight

Die einfachste Möglichkeit, die Git-Variable in Jenkins über Jenkinsfile abzurufen.

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}'"
}

In der Konsole erhalten Sie die 

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