我使用Jenkins Git插件(v2.0)的Branch Specifier选项在特定分支上运行构建,例如1.4
。
${GIT_BRANCH}
包含origin/1.4
值。
如何收到用于克隆的本地Git分支的名称(即只有1.4
没有origin/
前缀?
我已尝试使用分支名称Check out to specific local branch
的{{1}}附加行为,但没有任何更改。
我在GitHub上看到了相关的PR,但它被拒绝了(因为它只修复了只有1.4
远程的一个案例。)
答案 0 :(得分:55)
您可以非常轻松地从变量中删除前缀:${GIT_BRANCH##origin/}
虽然这不是一个非常通用的解决方案,但它很简单,我还没有看到Jenkins克隆的存储库,它会使用除origin
以外的其他东西作为远程名称。
更新:实际上,${GIT_BRANCH#*/}
适用于任何来源,甚至适用于包含斜杠的分支。 #
执行非贪婪的全局匹配,##
启用贪婪匹配。有关详细信息,请参阅Bash Reference Manual。
答案 1 :(得分:8)
截至2016年3月(Git Plugin v2.4.3),现在支持本机。只需将**
作为Git插件中Check out to specific local branch
的值,而不是任何宏/变量。
该字段的说明详细说明了新行为:
如果选中,其值为空字符串或" **",则从没有原点的远程分支计算分支名称。在这种情况下,远程分支origin / master将被检出到名为master的本地分支,远程分支origin / develop / new-feature将被检出到名为develop / newfeature的本地分支。
这是由@roostergx& amp; @NickVolynkin在发布时提到了。我只是记录在这里希望将来帮助那些人。
答案 2 :(得分:7)
我设法通过几个步骤来实现这一目标:
使用以下内容添加Execute shell
预先步骤:
git_branch_local=$(echo $GIT_BRANCH | sed -e "s|origin/||g")
echo GIT_BRANCH_LOCAL=$git_branch_local > build.properties
为Inject environment variables
文件
build.properties
预备步骤
醇>
那么你应该有一个没有GIT_BRANCH_LOCAL
origin/
环境变量
答案 3 :(得分:5)
如果您将其作为本地分支查看,然后使用$ {GIT_LOCAL_BRANCH},则会提供本地分支名称(即' develop'而不是' origin / develop'。(Git插件版本3.0.0)
答案 4 :(得分:4)
我向jenkins-ci小组(https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/jenkinsci-dev/xuweZbwn9zE/BAWfs-ZeFAAJ)发了一条消息,建议对Git插件“Check out to Local Branch”选项进行增强。默认情况下,git插件检出分离的头。 Local Branch允许您指定特定的分支名称。配置后,使用此方法,本地分支名称与指定完全相同。
如果您使用Jenkins进行maven版本,则必须使本地分支名称与远程分支名称相同。有关详情,请参阅google网上论坛。
为了满足这一要求,我创建了一个包含代码和测试用例的拉取请求(https://github.com/jenkinsci/git-plugin/pull/381)。
还创建了一个JIRA问题(https://issues.jenkins-ci.org/browse/JENKINS-33202)来记录问题。
如果有人需要此功能,我建议您发布小组讨论,并投票选举JENKINS-33202。
答案 5 :(得分:3)
虽然这是正确的,正如dtabuenc在对JanVčelák的回答中所说的那样,如果你试图在Execute Shell构建步骤中获取分支名称,那么shell语法不会直接对令牌宏起作用(或者类似的),你仍然可以使用相同的想法。
TEMP_GIT_BRANCH=${GIT_BRANCH}
MY_GIT_BRANCH="${TEMP_GIT_BRANCH#*/}"
工作正常(这是有效的POSIX,不需要bash)。
答案 6 :(得分:2)
在管道中你可以这样做:
// get arround a git scm anoying feature
stage ('Bootstrap') {
sh "echo GIT_BRANCH_LOCAL=\\\"$GIT_BRANCH\\\" | sed -e 's|origin/||g' | tee version.properties"
}
stage('Checkout') {
load('version.properties')
checkout([$class: 'GitSCM', branches: [[name: '**']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'LocalBranch', localBranch: "${GIT_BRANCH_LOCAL}"]], submoduleCfg: [], userRemoteConfigs: [[url: 'https://github.com/webofmars/grails-website.git']]])
}
答案 7 :(得分:1)
我今天遇到了这个问题。原因是Jenkins git插件会将“origin /”添加到您提供给GIT_BRANCH构建参数的任何分支名称。看到 https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin
git插件设置了几个可以在脚本中使用的环境变量: GIT_BRANCH - 当前正在使用的分支的名称,例如“master”或“origin / foo”
因此,当您使用参数GIT_BRANCH = foo进行构建时,Jenkins将在其前面添加“origin /”。然后,当你做
git check out ${GIT_BRANCH}
你实际上在做什么
git check out origin/foo
您可以采取哪些措施来避免这种情况,在您的构建参数中使用其他内容,例如GIT_BRANCH_NAME或其他任何内容,只是不要使用GIT_BRANCH。在配置中,删除GIT_BRANCH参数,然后添加名为GIT_BRANCH_NAME的另一个参数。然后在“使用参数构建”中,在GIT_BRANCH_NAME下,指定您的分支。
答案 8 :(得分:1)
我也遇到了这个问题。似乎当我更改Check out to specific local branch
的值时,我需要在触发新构建之前删除构建服务器上的本地存储库。
答案 9 :(得分:1)
我使用了这个,最后能够使它工作(下面的例子假设一个$Branch
的分支变量):
stage('Checkout') {
GIT_BRANCH_LOCAL = sh (
script: "echo $Branch | sed -e 's|origin/||g'",
returnStdout: true
).trim()
echo "Git branch: ${GIT_BRANCH_LOCAL}"
git branch: "${GIT_BRANCH_LOCAL}", credentialsId: '...', url: 'git@github.com:......git'
}
答案 10 :(得分:0)
经过很长一段时间,我终于找到了解决方案,可以在我的 Jenkins自由式项目中获得本地git名称(对于SonarQube)而没有“ origin /” (不是Jenkinsfile)。我正在使用 Windows 环境。
在詹金斯:
**
/d:sonar.branch.name=${GIT_LOCAL_BRANCH}
所以只有**
和${GIT_LOCAL_BRANCH}
的组合才对我有用。
答案 11 :(得分:0)