Jenkins工作流程:检出访问BRANCH_NAME和GIT_COMMIT

26

我似乎无法从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

有人有任何想法如何解决这个问题,或者是否有我找不到的变量?

3个回答

44

首先,

def branch = ${BRANCH_NAME}

不是有效的Groovy代码,或者至少不是你认为的那样。也许你的意思是

def branch = "${BRANCH_NAME}"

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

def branch = BRANCH_NAME

无论如何,环境变量目前无法直接作为Groovy变量在Pipeline中访问(有一个提案允许这样做);您需要使用env全局变量:

无论如何,环境变量目前无法直接作为Pipeline中的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()

访问它。


好的,这样帮助我更好地理解问题。正如上面提到的,有一些关于Groovy的事情我不清楚,但这也帮助我理解了引号的区别。很有趣,我会试一试! - Oldek
2
关于最后一段,请参见当前建议的语法 - Jesse Glick
"环境变量目前无法直接作为Groovy变量访问。您是否有来自Jenkins源的支持参考资料?" - Judy007
@JoeyStallmeyer 他还指出“你需要使用env全局变量”。因此,可以使用以下方式访问环境变量BRANCH_NAMEenv.BRANCH_NAME(如答案中所述)。 - alexbt

23

我有两个 Jenkins 实例。

在这两个实例中,GIT_COMMITBRANCH_NAME 环境变量都没有定义。

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

Jenkins 实例 1

Jenkins 版本:2.46.1

"Pipeline: SCM Step" 插件版本: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,并通过异常java.lang.NullPointerException:Cannot get property 'GIT_BRANCH' on null object访问scmVars.GIT_BRANCH失败。

因此我不得不执行以下操作才能获取分支:

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 实例 2

Jenkins 版本:2.60.2

“Pipeline: SCM Step” 插件版本: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实例并使用它。


非常感谢您对版本失败问题进行的详细解释。我可以确认,在Jenkins Instance 2中,使用“Pipeline: SCM Step”插件版本2.5也会出现您第二个解释中的故障。在Jenkins的版本2.73.3上,所以这绝对是在2.6以下版本的插件上出现的错误,更新后问题得到了解决。 - Ilhicas
@Antony 非常感谢你的回答,你几乎救了我的工作!!第二种方法对我起作用了!:-) - Hussain K

1
如果你想从Jenkins环境变量中作为shell脚本访问BRANCH_NAME,请使用以下代码片段。

sh 'echo Branch Name: $BRANCH_NAME'

响应应如下所示:

Branch Name: the_checkedout_branch


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