[英]Jenkins pipeline branch name returns null
我正在尝试获取 jenkins groovy 脚本的分支名称。 我无法获取当前的分支名称。 我尝试以下操作:
stage('Check out code')
checkout scm
echo "My branch is: ${env.BRANCH_NAME}"
这是 output - 它总是返回 null。
Checking out Revision 33b531b2f1caaf8b64d968e437306f39d2dba1da (origin/pipeline)
> git.exe config core.sparsecheckout # timeout=10
> git.exe checkout -f 33b531b2f1caaf8b64d968e437306f39d2dba1da
[Pipeline] echo
My branch is: null
我错过了什么吗?
此变量仅适用于多分支管道:
BRANCH_NAME 对于多分支项目,这将设置为正在构建的分支的名称,例如,如果您希望从主分支而不是功能分支部署到生产环境。
我在一个正常的管道中测试
在 Jenkins 中有两个管道选项:
env.BRANCH_NAME
返回分支null
env.BRANCH_NAME
返回分支master or branch name
我的解决方法,不知道是否为别人工作..
def branchName = getCurrentBranch()
echo 'My branch is' + branchName
def getCurrentBranch () {
return sh (
script: 'git rev-parse --abbrev-ref HEAD',
returnStdout: true
).trim()
}
git.exe checkout -f 33b531b2f1caaf8b64d968e437306f39d2dba1da
这将使 git repo 进入分离的 HEAD模式,就其本质而言,它没有分支。
从Jenkinsfile :
签出步骤将从源代码管理中签出代码;
scm
是一个特殊变量,它指示检出步骤克隆触发此管道运行的特定修订。
所以${env.BRANCH_NAME}
为空。
如“ Jenkins Workflow Checkout Accessing BRANCH_NAME and GIT_COMMIT ”中所述,您可以使用 groovy 语法(在 Jenkins 管道 DSL 中进行调整)获取刚刚签出的 SHA1:
sh 'git rev-parse HEAD > commit'
def commit = readFile('commit').trim()
在管道作业中,我使用env.GIT_BRANCH
解析为origin/{BRANCH}
在多分支作业的情况下, env.GIT_BRANCH
解析为{BRANCH}
(无origin/
)。
我遇到了同样的问题,但我通过更改解决了
println "${env.BRANCH_NAME}"
至
println "${BRANCH_NAME}"
请注意,我的插件也在分离模式下签出:
git checkout -f e10a170e17fb5f9282f903a7b3cd17bd2e181dee
从一个简单的管道中,您可以使用以下脚本:
\\...
stage('Test') {
steps {
script {
branchName = sh(label: 'getBranchName', returnStdout: true, script: 'git rev-parse --abbrev-ref HEAD').trim()
println branchName
}
}
}
\\...
这段代码对我有用。
def BRANCH_NAME = getCurrentBranch()
echo 'Current branch is' + BRANCH_NAME
def getCurrentBranch () {
return sh (
script: 'git name-rev --name-only HEAD',
returnStdout: true
).trim()
}
以下对我有用:
env.BRANCH_NAME = scm.branches[0].name
我在Get git branch name in Jenkins Pipeline/Jenkinsfile上找到了这个答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.