wake-up-neo.com

Jenkins Workflow Checkout Zugriff auf BRANCH_NAME und GIT_COMMIT

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?

14
Oldek

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.

28
Jesse Glick

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-Instanz 1

Jenkins-Version: 2.46.1

Plugin-Version "Pipeline: SCM Step": 2.5

Der Versuch, auf die Umgebungsvariable zuzugreifen, wie in checkoutdocumentation 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-Instanz 2

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.

7
Antony

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

0