Ich kann nicht scheinen, $ GIT_COMMIT und $ BRANCH_NAME aus einem Jenkins Workflow Checkout-Schritt zu extrahieren.
Ich möchte diese Informationen gerne an meine Gradle-Skripte weiterleiten, um sie an externe Quellen wie statische Analyse usw. weiterzuleiten.
Momentan versuche ich das auszuführen:
checkout([$class: 'GitSCM', branches: [[name: '*/master']], userRemoteConfigs: [[credentialsId: '2b74a351-67d5-4d00-abd3-49842a984201', url: 'ssh://[email protected]:repo.git']]])
Und ich möchte folgendes oder ähnliches erreichen:
// Specified variables that can be reused
def branch = ${BRANCH_NAME}
def commit = ${GIT_COMMIT}
Oder vielleicht funktioniert das auch:
print "BRANCH: ${BRANCH_NAME}, COMMIT: ${GIT_COMMIT}"
// or the following
print "BRANCH: ${env.BRANCH_NAME}, COMMIT: ${env.GIT_COMMIT}"
Ich habe das folgende Problem gefunden, das behoben zu sein scheint, aber in Version 1.15 nicht funktioniert:
https://issues.jenkins-ci.org/browse/JENKINS-30252
Hat jemand eine Idee, wie Sie das umgehen können oder ob es eine Variable gibt, die ich nicht finden kann?
Zuerst,
def branch = ${BRANCH_NAME}
ist nicht gültig Groovy oder zumindest nicht das, was Sie denken. Vielleicht meintest du es
def branch = "${BRANCH_NAME}"
das wäre nur eine dumme Schreibweise
def branch = BRANCH_NAME
Trotzdem sind Umgebungsvariablen derzeit nicht direkt als Groovy-Variablen in Pipeline verfügbar (es gibt einen Vorschlag, dies zuzulassen). Sie müssen die globale Variable env
verwenden:
def branch = env.BRANCH_NAME
Innerhalb eines externen Prozesses, beispielsweise eines sh
-Schritts, handelt es sich also um eine tatsächliche Umgebungsvariable
sh 'echo $BRANCH_NAME'
works (beachten Sie, dass '
bedeutet, dass Groovy nicht die Variable interpoliert).
Nun bezog sich JENKINS-30252 auf Multibranch-Projekte. Wenn Sie einen eigenständigen Pipeline-Job erstellt haben, wird diese Variable nicht festgelegt.
Auf jeden Fall checkt Ihr Schritt checkout
immer den Zweig master
aus. Wenn Sie tatsächlich ein Projekt mit mehreren Niederlassungen haben, sollte Ihre Jenkinsfile
verwendet werden
checkout scm
dadurch wird ein Commit für den korrekten Zweig ausgecheckt (entspricht immer der Revision von Jenkinsfile
selbst).
Was den Commit-Hash betrifft, steht anhängig JENKINS-26100 dies ist nicht automatisch verfügbar, aber Sie können so etwas verwenden
sh 'git rev-parse HEAD > commit'
def commit = readFile('commit').trim()
um darauf zuzugreifen.
Ich habe zwei Jenkins-Instanzen.
In beiden Fällen sind die Umgebungsvariablen GIT_COMMIT
und BRANCH_NAME
nicht definiert.
Wenn ich versuche, sie aus dem Rückgabewert von checkout()
aufzurufen, verhält sich jede Instanz anders.
Jenkins-Version: 2.46.1
Plugin-Version "Pipeline: SCM Step": 2.5
Der Versuch, auf die Umgebungsvariable zuzugreifen, wie in checkout
documentation beschrieben, schlägt fehl.
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
gibt NULL zurück und der Zugriff auf scmVars.GIT_BRANCH
schlägt mit der Ausnahme Java.lang.NullPointerException: Cannot get property 'GIT_BRANCH' on null object
fehl.
Also musste ich folgendes tun, um den Zweig zu bekommen:
sh 'git name-rev --name-only HEAD > GIT_BRANCH'
sh 'cat GIT_BRANCH'
git_branch = readFile('GIT_BRANCH').trim()
env.GIT_BRANCH = git_branch
Jenkins-Version: 2.60.2
Plugin-Version "Pipeline: SCM Step": 2.6
In diesem Fall könnte ich mit Erfolg folgendes tun:
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
Bitte prüfen Sie, welcher Ansatz für Ihre Jenkins-Instanz geeignet ist, und verwenden Sie sie.
Wenn Sie von der Jenkins-Umgebungsvariablen als Shell-Skript auf BRANCH_NAME
zugreifen möchten, verwenden Sie den folgenden Ausschnitt.
sh 'echo Branch Name: $BRANCH_NAME'
Die Antwort sollte wie folgt sein:
Branch Name: the_checkedout_branch