Jenkins Workflow Checkout访问BRANCH_NAME和GIT_COMMIT

时间:2016-03-30 09:03:24

标签: jenkins groovy jenkins-plugins jenkins-workflow jenkins-pipeline

我无法从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 个答案:

答案 0 :(得分:30)

首先,

def branch = ${BRANCH_NAME}

无效Groovy,或者至少没有按照您的想法行事。也许你的意思是

def branch = "${BRANCH_NAME}"

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

def branch = BRANCH_NAME

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

def branch = env.BRANCH_NAME

在外部流程中,例如sh步骤,它是一个实际的环境变量,所以

sh 'echo $BRANCH_NAME'

有效(注意'表示Groovy 插入变量)。

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

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

checkout scm

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

对于提交哈希,待处理JENKINS-26100这不会自动提供,但您可以使用

之类的内容
sh 'git rev-parse HEAD > commit'
def commit = readFile('commit').trim()

访问它。

答案 1 :(得分:9)

我有两个Jenkins实例。

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

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

Jenkins Instance 1

詹金斯版本:2.46.1

“Pipeline:SCM Step”插件版本:2.5

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

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

Jenkins Instance 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实例并使用它。

答案 2 :(得分:0)

如果要从Jenkins环境变量访问static作为shell脚本,请使用下面的代码段。

BRANCH_NAME

回复应如下:

sh 'echo Branch Name: $BRANCH_NAME'

相关问题