Jenkins Git环境变量在Pipeline中未设置

9

我正在尝试在Jenkins流水线脚本中读取一些由Git插件设置的环境变量,但似乎它们没有被设置,因为当我尝试在脚本中使用时,其值为空字符串,并且如果我使用sh 'printenv',我可以看到它们没有被设置。

可能我错过了什么,但我找不到原因。

有任何想法吗?


这个回答解决了你的问题吗?无法使用Groovy Jenkinsfile读取Jenkins中的Git环境变量 - MrAaronOlsen
3个回答

9
根据这个页面:http://JenkinsURL/pipeline-syntax/globals
像GIT_COMMIT这样的SCM特定变量不会自动定义为环境变量;您可以使用checkout步骤的返回值来代替。我相信这个问题已经在Jenkins 2.60中得到解决:
请参见https://plugins.jenkins.io/pipeline-model-definition的JENKINS-45198项目。
您可以通过在shell中运行适当的git命令并将其分配给一个变量来解决此问题:
GIT_REVISION = sh( script: 'git rev-parse HEAD', returnStdout: true )

在声明式流水线中,您需要将此内容包装在script{}块中,并且可能需要在流水线之外声明变量以获取适当的作用域。

这对你有帮助吗? - Rob Hales
1
5年过去了,Jenkins的最新版本是2.335。我不知道你为什么说这个问题在Jenkins 2.60中已解决? - cowlinator

3

如果您像我一样使用checkout scm,您会注意到没有任何GIT相关的环境变量可以帮助您,因此在这种情况下,您需要执行以下操作:

scm_variables = checkout scm

echo scm_variables.get('GIT_COMMIT')

1
这个能用声明式吗,还是必须使用脚本部分?实际上...我试过了...两种方式都不行? - RoboticRenaissance
3
在结账阶段之前能否获取这些信息? - red888

0

由于Git插件对声明式脚本的支持良好,您可以使用声明式脚本获取Git环境变量并将其设置为可供脚本部分使用。

因此,简而言之:

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}"
}

这绝对是一种hack方法,但它对我们有效。我们希望问题能够很快得到解决,这样我们就可以完全删除声明性部分。

我相信这个方法的原理是创建了一个Declarative: Checkout SCM stage,使得环境变量在后续的流水线阶段中可以被访问。我认为这相当于answer中所描述的内容。我不太清楚的是为什么重置它们会将它们保留到脚本化阶段。这就是为什么这是一种hack方法的原因...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接