如何使用Jenkins Git插件接收本地Git分支名称?

时间:2013-12-12 10:58:34

标签: git jenkins

我使用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远程的一个案例。)

12 个答案:

答案 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)

我设法通过几个步骤来实现这一目标:

  1. 使用以下内容添加Execute shell预先步骤:

    git_branch_local=$(echo $GIT_BRANCH | sed -e "s|origin/||g") echo GIT_BRANCH_LOCAL=$git_branch_local > build.properties

  2. Inject environment variables文件

  3. 添加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)

根据这个SO回答:How to do I get the output of a shell command executed using into a variable from Jenkinsfile (groovy)?

我使用了这个,最后能够使它工作(下面的例子假设一个$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 环境。

在詹金斯:

  • 在“源代码管理”部分:添加“签出到特定的本地分支”,然后在“分支名称”中输入:**
  • 在“构建”部分:我使用并添加了“ SonarScanner for MSBuild-Begin Analysis”,在“其他参数”中添加了:/d:sonar.branch.name=${GIT_LOCAL_BRANCH}

所以只有**${GIT_LOCAL_BRANCH}的组合才对我有用。

答案 11 :(得分:0)

@Chris的回答帮助了我。谢谢!

不要忘记在“源代码管理”下添加“其他行为->检出到特定的本地分支”。

enter image description here

直到我没有添加$ {GIT_LOCAL_BRANCH}变量时,我才尝试使用它。 (例如:执行shell命令'printenv',然后检查控制台输出)