8

I am trying to read some environment variables in Jenkins pipeline script that should be set by Git plugin, but it seems they are not set, because when I tried to use in script its value is empty string and also if I use sh 'printenv' I can see that they are not set.

Probably I am missing something but I cannot find what.

Any idea?

lordofthejars
  • 713
  • 1
  • 6
  • 14
  • Does this answer your question? [Not able to read Git Environment variables Jenkins using Groovy Jenkinsfile](https://stackoverflow.com/questions/38044846/not-able-to-read-git-environment-variables-jenkins-using-groovy-jenkinsfile) – MrAaronOlsen Sep 16 '22 at 12:41

3 Answers3

9

Per this page:

http://JenkinsURL/pipeline-syntax/globals:

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.

This is supposed to be resolved in Jenkins 2.60, I believe:

https://plugins.jenkins.io/pipeline-model-definition

See the item for JENKINS-45198

You can workaround by running the appropriate git commands in a shell and assigning them to a variable:

GIT_REVISION = sh( script: 'git rev-parse HEAD', returnStdout: true )

In a Declarative pipeline, you will have to wrap this in a script{} block, and probably declare the variable outside of your pipeline to get the appropriate scope.

Rob Hales
  • 5,123
  • 1
  • 21
  • 33
2

If you were using checkout scm like me you will notice that you don't have any GIT-RELATED environment variables to help you out so in this case, you need to do this:

scm_variables = checkout scm

echo scm_variables.get('GIT_COMMIT')
Dharman
  • 30,962
  • 25
  • 85
  • 135
Igor Escobar
  • 1,047
  • 1
  • 12
  • 13
0

Since the git plugin works fine for declarative scripts you can use a declarative script to get the git environment variables and set them for the scripted section to use.

So in a nutshell:

pipeline {
    environment {
        gitCommit = "${env.GIT_COMMIT}"
    }
    agent {
        label <agent>
    }
    stages {
        stage('SetEnvironmentProperties') {
            agent {
                label <agent>
            }
            steps {
                env.setProperty("GIT_COMMIT", "$gitCommit")
            }
        }
    }
}

node(<agent>) {
    echo "Using Git Commit Hash ${env.GIT_COMMIT}"
}

This is absolutely a hack, but it works for us. We're hoping that the issue get's resolved soon and we can simply remove the declarative section altogether.

I believe this works because this creates a Declarative: Checkout SCM stage where the environment variables become accessible in subsequent pipeline stages. This is equivalent, I think, to what is described in this answer. What I'm not so clear on is why resetting them would persist them into the scripted stages. Which is why this is a hack...

MrAaronOlsen
  • 131
  • 1
  • 5