Jenkins Workflow Checkout访问BRANCH_NAME和GIT_COMMIT

Old*_*dek 16 groovy jenkins 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']]])
Run Code Online (Sandbox Code Playgroud)

我想实现以下或类似的东西:

// Specified variables that can be reused
def branch = ${BRANCH_NAME}
def commit = ${GIT_COMMIT}
Run Code Online (Sandbox Code Playgroud)

或许也可以这样做:

print "BRANCH: ${BRANCH_NAME}, COMMIT: ${GIT_COMMIT}"
// or the following
print "BRANCH: ${env.BRANCH_NAME}, COMMIT: ${env.GIT_COMMIT}"
Run Code Online (Sandbox Code Playgroud)

我确实发现以下问题似乎已得到解决,但它在版本1.15中不起作用:

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

任何人有任何想法如何解决这个或如果有一个我找不到的变量?

Jes*_*ick 34

首先,

def branch = ${BRANCH_NAME}
Run Code Online (Sandbox Code Playgroud)

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

def branch = "${BRANCH_NAME}"
Run Code Online (Sandbox Code Playgroud)

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

def branch = BRANCH_NAME
Run Code Online (Sandbox Code Playgroud)

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

def branch = env.BRANCH_NAME
Run Code Online (Sandbox Code Playgroud)

在外部进程(例如sh步骤)内,它是一个实际的环境变量,因此

sh 'echo $BRANCH_NAME'
Run Code Online (Sandbox Code Playgroud)

工作(请注意,这'意味着Groovy 插入变量).

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

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

checkout scm
Run Code Online (Sandbox Code Playgroud)

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

至于提交哈希,等待JENKINS-26100,这是不可用的,但你可以使用类似的东西

sh 'git rev-parse HEAD > commit'
def commit = readFile('commit').trim()
Run Code Online (Sandbox Code Playgroud)

访问它.

  • 至于最后一段,请参见[当前建议的语法](https://github.com/abayer/workflow-scm-step-plugin/blob/39a28c8611c2c06e14d9e60b4a06366c57bfec18/src/main/resources/org/jenkinsci/plugins/workflow/步骤/scm/GenericSCMStep/help.html)。 (2认同)

Ant*_*ony 10

我有两个Jenkins实例.

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

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

詹金斯实例1

詹金斯版本: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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

詹金斯实例2

詹金斯版本: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
Run Code Online (Sandbox Code Playgroud)

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