it-swarm.com.de

Verwenden von GIT-Variablen in einer deklarativen Jenkins-Pipeline

Ich habe Probleme, auf GIT-Variablen in meiner Jenkins-Pipeline zuzugreifen

Ich muss wissen, welcher GIT-Zweig in einem Bash-Code in einer Phase der Pipeline ausgecheckt wurde. Ich werde dies verwenden, um verschiedene Namen der Ausgabedateien zu erstellen. Meine Pipeline ist deklarativ und nicht mit Skripten versehen. Ich verwende Jenkins 2.150.1

Ich habe alles versucht, was ich online finden konnte, aber es ist meistens unvollständiger Code oder für geskriptete Pipelines. Oder ich kann die Informationen einfach nicht zusammenstellen.

Geben Sie an, wie viel Zeit ich dafür aufgewendet habe. Es wäre schön, ein voll funktionsfähiges Beispiel zu haben, das eine deklarative Pipeline verwendet.

Folgendes habe ich bisher versucht:

# 1

Führen Sie git in sh aus, aber Jenkins überprüft ein Commit und keinen Zweig, was zu einem abgetrennten Kopf führt

# 2

Suchen Sie nach Umgebungsvariablen in der Shell, aber es gibt keine Gruppe, die sich auf GIT bezieht. Dieser Ausschnitt

steps {
  sh 'echo $GIT_BRANCH'
}

kehrt immer leer zurück. Ich habe dann Groovy anprobiert:

steps {
  echo "${env.GIT_BRANCH}"
}

druckt null.

#

In der "Global Variable Reference" steht etwas:

SCM-specific variables such as GIT_COMMIT are not automatically defined as environment variables; rather you can use the return value of the checkout step.

Ich habe online gesucht, wie es geht, und diesen Code zusammengestellt:

pipeline {
  stages {
    stage('Build') {
      steps {
        def scmVars = checkout([...])
        echo 'scm : the commit id is ' + scmVars.GIT_COMMIT
      }
    }
  }
}

Aber es scheitert mit einer Ausnahme

# 4

verwenden Sie einen Befehl environment und versuchen Sie, diesen Wert irgendwie zu erhalten

# 5

ich suche nach Variablen auf anderen Ebenen in der Jenkins-Datei, aber anscheinend kann ich das nur für geskriptete Pipelines tun

# 5

Es wurde versucht, auf die Build-URL und den API-Aufruf zuzugreifen, aber ich habe einen Proxy und dies erschwert die URL.

Meine Jenkins-Datei

pipeline {
  stages {
    stage('Build') {
      steps {
        checkout([
          $class: 'GitSCM',
          doGenerateSubmoduleConfigurations: false,
          userRemoteConfigs: [[
            url: '...',
            credentialsId: '...'
          ]],
          branches: [ [name: '*/master'] ]
        ])

        sh '''
        #!/bin/bash -x
        echo $MY_GIT_BRANCH_THAT_I_CANT_FIND
        '''
      }
    }
  }
}
7
ColOfAbRiX

Schließlich fand ich ein Beispiel und konnte verstehen, wie das geht.

Ich muss einen Skriptbefehl verwenden, das von Map zurückgegebene checkout abrufen und das Map als Umgebungsvariable speichern:

stage('Checkout code') {
  steps {
    script {
      // Checkout the repository and save the resulting metadata
      def scmVars = checkout([
        $class: 'GitSCM',
        ...
      ])

      // Display the variable using scmVars
      echo "scmVars.GIT_COMMIT"
      echo "${scmVars.GIT_COMMIT}"

      // Displaying the variables saving it as environment variable
      env.GIT_COMMIT = scmVars.GIT_COMMIT
      echo "env.GIT_COMMIT"
      echo "${env.GIT_COMMIT}"
    }

    // Here the metadata is available as environment variable
    ...
  }
}
9
ColOfAbRiX

Zitieren der docs :

GIT_BRANCH

Bei Git-basierten Projekten enthält diese Variable den Git-Zweig, der für den Build ausgecheckt wurde (normalerweise Origin/Master).

Speziell für das Pipeline-Plugin gibt es eine Antwort auf dieses Problem unter StackOverflow :

Die Variable env.BRANCH_NAME enthält den Zweignamen.

Ab Pipeline Groovy Plugin 2.18 können Sie auch einfach BRANCH_NAME verwenden (env ist nicht erforderlich, wird aber weiterhin akzeptiert.)

nter bestimmten Bedingungen , diese Variable ist möglicherweise leer. Folgendes sollte dies beheben:

Fügen Sie [$ class: 'LocalBranch', localBranch: "**"] zu "Extentions" in Ihrem Checkout-Schritt hinzu.

3
fuero

Der deklarative Jenkins-Pipeline-Job in einer Multibranch-Pipeline berücksichtigt die Git-Konfiguration der Multibranch-Pipeline, die den Job definiert hat. Fügen Sie der Multibranch-Pipeline-Definition das Merkmal "Auschecken in übereinstimmenden lokalen Zweig" hinzu, wenn Sie möchten, dass jeder Job einen lokalen Zweig mit einem Namen auscheckt, der dem Remote-Zweig entspricht. Jeder in dieser Multibranch-Pipeline erstellte Job wird dann in einen benannten lokalen Zweig ausgecheckt.

Wenn Sie einen deklarativen Pipeline-Job verwenden, der nicht Teil einer Mehrzweig-Pipeline ist, können Sie die lokale Verzweigungserweiterung des Git-Plugins verwenden, um den Namen des lokalen Zweigs zu definieren, der erstellt werden soll.

0
Mark Waite