22

我似乎无法从 Jenkins Workflow Checkout 步骤中提取 $GIT_COMMIT 和 $BRANCH_NAME 。

我希望能够将此信息发送到我的 Gradle 脚本,以便将其传递到静态分析等外部资源。

目前我尝试运行这个:

checkout([$class: 'GitSCM', branches: [[name: '*/master']], userRemoteConfigs: [[credentialsId: '2b74a351-67d5-4d00-abd3-49842a984201', url: 'ssh://git@corporate.com:repo.git']]])

我想实现以下或类似的目标:

// Specified variables that can be reused
def branch = ${BRANCH_NAME}
def commit = ${GIT_COMMIT}

或者也许这也可以:

print "BRANCH: ${BRANCH_NAME}, COMMIT: ${GIT_COMMIT}"
// or the following
print "BRANCH: ${env.BRANCH_NAME}, COMMIT: ${env.GIT_COMMIT}"

我确实发现了以下似乎已解决但在 1.15 版中不起作用的问题:

https://issues.jenkins-ci.org/browse/JENKINS-30252

任何人都知道如何解决这个问题,或者如果有一个我找不到的变量?

4

3 回答 3

42

首先,

def branch = ${BRANCH_NAME}

不是有效的 Groovy,或者至少没有按照你的想法去做。也许你的意思是

def branch = "${BRANCH_NAME}"

这只是一种愚蠢的写作方式

def branch = BRANCH_NAME

无论如何,环境变量目前不能作为管道中的 Groovy 变量直接访问(有一个建议允许它);您需要使用env全局变量:

def branch = env.BRANCH_NAME

从外部进程内部,例如一个sh步骤,它是一个实际的环境变量,所以

sh 'echo $BRANCH_NAME'

有效(注意这'意味着 Groovy没有对变量进行插值)。

现在,JENKINS-30252 指的是多分支项目。如果您创建了独立的 Pipeline 作业,则不会设置此变量。

无论如何,在您的情况下,您的checkout步骤始终是检查master分支。如果您实际上有一个多分支项目,那么您Jenkinsfile应该使用

checkout scm

这将检查正确分支上的提交(始终与Jenkinsfile自身的修订匹配)。

至于提交哈希,待处理的 JENKINS-26100这不是自动可用的,但您可以使用类似的东西

sh 'git rev-parse HEAD > commit'
def commit = readFile('commit').trim()

访问它。

于 2016-03-31T11:29:37.713 回答
20

我有两个 Jenkins 实例。

在这两种情况下,GIT_COMMITBRANCH_NAME没有定义环境变量。

当我尝试从checkout()call 的返回值中获取它们时,每个实例的行为都不同。

詹金斯实例 1

詹金斯版本:2.46.1

《管道:单片机步骤》插件版本:2.5

尝试按照checkout 文档中的说明访问环境变量失败。

def scmVars = checkout([$class: 'GitSCM', branches: [[name: '*/master']], 
    userRemoteConfigs: [[credentialsId: '2b74a351-67d5-4d00-abd3-
    49842a984201', url: 'ssh://git@corporate.com:repo.git']]])
def commitHash = scmVars.GIT_COMMIT

scmVars返回 NULL,访问scmVars.GIT_BRANCH失败并出现异常java.lang.NullPointerException: Cannot get property 'GIT_BRANCH' on null object

因此,我必须执行以下操作才能获得分支:

sh 'git name-rev --name-only HEAD > GIT_BRANCH'
sh 'cat GIT_BRANCH'
git_branch = readFile('GIT_BRANCH').trim()
env.GIT_BRANCH = git_branch

詹金斯实例 2

詹金斯版本:2.60.2

《管道:单片机步骤》插件版本:2.6

在这种情况下,我可以成功执行以下操作:

def scmVars = checkout([$class: 'GitSCM', branches: [[name: '*/master']], 
    userRemoteConfigs: [[credentialsId: '2b74a351-67d5-4d00-abd3-
    49842a984201', url: 'ssh://git@corporate.com:repo.git']]])
env.GIT_COMMIT = scmVars.GIT_COMMIT
env.GIT_BRANCH = scmVars.GIT_BRANCH

因此,请检查哪种方法适用于您的 Jenkins 实例并使用它。

于 2017-08-23T16:43:30.943 回答
1

如果您想以BRANCH_NAMEshell 脚本的形式访问 Jenkins 环境变量,请使用以下代码段。

sh 'echo Branch Name: $BRANCH_NAME'

响应应如下所示:

Branch Name: the_checkedout_branch

于 2018-02-19T11:20:02.960 回答