我无法从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
任何人都有任何想法如何解决这个或如果有一个我找不到的变量?
答案 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_COMMIT
和BRANCH_NAME
个环境变量。
当我尝试从checkout()
调用的返回值中获取它们时,每个实例的行为都不同。
詹金斯版本: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版本: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'