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.
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.
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()
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()
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
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>
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.
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: