Git学习-->关于Jenkins编译时候,如何获取Git分支的当前分支名?

一、背景

因为代码都迁移到了Gitlab,所以Jenkins编译的时候我们都需要将之前的SVN信息换成现在的Git信息。最近编译一个Lib库的时候,因为团队规定上传Release版本的AAR到Maven的话,必须需要在Jenkins上编译而且Git Branch 必须是master分支才能够上传到Maven。
因此我们就需要在Gradle脚本中,获取Git Branch ,Git Commit等相关信息。但是在获取Git Branch的时候出现了问题,在本地Android Studio编译的时候能够获取到Git Branch的名字,但是使用Jenkins编译的时候,一直获取不到信息。

下面是我写的一份gradle文件,用于获取Git和Jenkins的相关信息

/**
 * 获取Git 分支名
 */
def getGitBranch() {
    return 'git symbolic-ref --short -q HEAD'.execute().text.trim()
}

/**
 * 获取Git 版本号
 */
def getGitSHA() {
    return 'git rev-parse --short HEAD'.execute().text.trim()
}

/**
 * 获取Git Tag
 */
def getGitTag() {
    return 'git describe --tags'.execute([], project.rootDir).text.trim()
}

/**
 * 获取Git 提交次数
 */
def getGitCommitCount() {
    return 100 + Interger.parse('git rev-list --count HEAD'.execute([], project.rootDir).text.trim())
}

/**
 * 判断是否有jenkins
 */
boolean isInJenkins() {
    Map<String, String> map = System.getenv()
    if (map == null) {
        return false
    }
    String str = map.get("Path")
    if (str != null) {
        //it's windows
        return false
    } else {
        str = ""
        Iterator it = map.iterator()
        while (it.hasNext()) {
            str += it.next()
        }
        return str.contains("jenkins")
    }
}
/**
 * 获取jenkins任务名
 */
def getJenkinsName() {
    boolean flag = isInJenkins()
    if (flag) {
        ext.env = System.getenv()
        ext.name = env.JOB_URL
        String[] stringArray = ext.name.split("/")
        if (stringArray.length > 0) {
            return stringArray[stringArray.length - 1]
        } else {
            return "Local"
        }
    } else {
        return "Local"
    }
}

/**
 * 获取Jenkins Build 号
 * @return
 */
def getJenkinsBuildCode() {
    boolean flag = isInJenkins()
    if (flag) {
        ext.env = System.getenv()
        ext.buildNumber = env.BUILD_NUMBER?.toInteger()
        return "$buildNumber"
    } else {
        return 0
    }
}

/**
 * 定义几个变量,在build.gradle里面引用
 */
ext {
    gitTag = getGitTag()
    gitBranch = getGitBranch()
    gitSHA = getGitSHA()
    jenkinsRevision = getJenkinsBuildCode()
    jenkinsName = getJenkinsName()
}

其中的方法,getGitBranch方法在Android Studio编译的时候,能够正常获取到Git分支名。

    println "pom_version_type = " + pom_version_type
    println "jenkinsName = " + jenkinsName
    println "gitBranch = " + gitBranch

我在进行编译的时候,是会通过如上代码打印出Git Branch的信息。

在Android Studio 本地编译的时候,是可以打印出相关的信息的。

但是在Jenkins编译的时候,是不能够上传的,如下所示:

二、解决方法

后来我尝试找了很多种方法去获取Git Branch的名字,在Android Studio本地都可以获取到,如下所示:

参考链接:https://stackoverflow.com/questions/6245570/how-to-get-the-current-branch-name-in-git

方法1、git symbolic-ref --short -q HEAD

D:\GitLab Source\XTCLint>git symbolic-ref --short -q HEAD
master

D:\GitLab Source\XTCLint>

方法2、git rev-parse --abbrev-ref HEAD

D:\GitLab Source\XTCLint>git rev-parse --abbrev-ref HEAD
master

方法3、git branch | grep \* | cut -d ' ' -f2

D:\GitLab Source\XTCLint>git branch | grep \* | cut -d ' ' -f2
master

方法4、git symbolic-ref HEAD | sed -e "s/^refs\/heads\///"

D:\GitLab Source\XTCLint>git symbolic-ref HEAD | sed -e "s/^refs\/heads\///"
master

以上所有的方法,仅仅在Android Studio的终端或者本地gradle代码中有效,然而在Jenkins服务器编译的时候都是获取为空。

后来我查看了Jenkins的Git插件上的介绍,参考链接:https://wiki.jenkins.io/display/JENKINS/Git+Plugin

如上所示,在上面的链接中有介绍,有几个Environment variables环境变量可以使用。

Environment variables

The git plugin sets several environment variables you can use in your scripts:

  • GIT_COMMIT - SHA of the current
  • GIT_BRANCH - Name of the remote repository (defaults to origin), followed by name of the branch currently being used, e.g. “origin/master” or “origin/foo”
  • GIT_LOCAL_BRANCH - Name of the branch on Jenkins. When the “checkout to specific local branch” behavior is configured, the variable is published. If the behavior is configured as null or **, the property will contain the resulting local branch name sans the remote name.
  • GIT_PREVIOUS_COMMIT - SHA of the previous built commit from the same branch (the current SHA on first build in branch)
  • GIT_PREVIOUS_SUCCESSFUL_COMMIT - SHA of the previous successfully built commit from the same branch.
  • GIT_URL - Repository remote URL
  • GIT_URL_N - Repository remote URLs when there are more than 1 remotes, e.g. GIT_URL_1, GIT_URL_2
  • GIT_AUTHOR_NAME and GIT_COMMITTER_NAME - The name entered if the “Custom user name/e-mail address” behaviour is enabled; falls back to the value entered in the Jenkins system config under “Global Config user.name Value” (if any)
  • GIT_AUTHOR_EMAIL and GIT_COMMITTER_EMAIL - The email entered if the “Custom user name/e-mail address” behaviour is enabled; falls back to the value entered in the Jenkins system config under “Global Config user.email Value” (if any)

然后我将这几个变量,在一个app的Jenkins任务中,编译完成后的邮件内容中添加了这几个变量的内容,如下所示:

在构建后的操作中,Editable Email Notification的邮件通知中,将邮件内容改为如下所示的代码。

$DEFAULT_CONTENT

<br />
<font color="#0B610B">单元测试</font>
  <li>Launcher单元测试报告&nbsp;:<a href="${BUILD_URL}testReport">点击查看测试报告</a></li>
  <li>Launcher代码覆盖率&nbsp;:<a href="${BUILD_URL}jacoco">点击查看代码覆盖率</a></li>
  <li>Launcher Android Lint&nbsp;:<a href="${BUILD_URL}androidLintResult">点击查看Android Lint</a></li>

<br />
 <li>GIT_COMMIT&nbsp;:${GIT_COMMIT}</a></li>
 <li>GIT_BRANCH&nbsp;:${GIT_BRANCH}</a></li>
 <li>GIT_LOCAL_BRANCH&nbsp;:${GIT_LOCAL_BRANCH}</a></li>
 <li>GIT_PREVIOUS_COMMIT&nbsp;:${GIT_PREVIOUS_COMMIT}</a></li>
 <li>GIT_PREVIOUS_SUCCESSFUL_COMMIT&nbsp;:${GIT_PREVIOUS_SUCCESSFUL_COMMIT}</a></li>
 <li>GIT_URL&nbsp;:${GIT_URL}</a></li>
 <li>GIT_URL_N&nbsp;:${GIT_URL_N}</a></li>
 <li>GIT_AUTHOR_NAME&nbsp;:${GIT_AUTHOR_NAME}</a></li>
 <li>GIT_COMMITTER_NAME&nbsp;:${GIT_COMMITTER_NAME}</a></li>
 <li>GIT_AUTHOR_EMAIL&nbsp;:${GIT_AUTHOR_EMAIL}</a></li>
 <li> GIT_COMMITTER_EMAIL&nbsp;:${ GIT_COMMITTER_EMAIL}</a></li>

这样编译完后,收到的邮件内容如下:

如上所示,收到的邮件内容包含了Git的相关信息:

GIT_COMMIT :118fa74e6a09c8c5ae713523692add256bfa6afb
GIT_BRANCH :origin/feature/UseByAnonymousDBMigrateAndApiChange
GIT_LOCAL_BRANCH :${GIT_LOCAL_BRANCH}
GIT_PREVIOUS_COMMIT :118fa74e6a09c8c5ae713523692add256bfa6afb
GIT_PREVIOUS_SUCCESSFUL_COMMIT :118fa74e6a09c8c5ae713523692add256bfa6afb
GIT_URL :git@172.28.1.116:Android/WatchApp/Third/NetEaseCloudMusic.git
GIT_URL_N :${GIT_URL_N}
GIT_AUTHOR_NAME :${GIT_AUTHOR_NAME}
GIT_COMMITTER_NAME :${GIT_COMMITTER_NAME}
GIT_AUTHOR_EMAIL :${GIT_AUTHOR_EMAIL}
GIT_COMMITTER_EMAIL :${ GIT_COMMITTER_EMAIL}

其中,GIT_BRANCH这个环境变量的值为origin/feature/UseByAnonymousDBMigrateAndApiChange,代表Jenkins上/UseByAnonymousDBMigrateAndApiChange分支远程Gitlab上该分支映射的远程分支。因此我们可以对GIT_BRANCH这个环境变量做做文章。

将之前gradle脚本中的getGitBranch方法,做如下修改,区分编译环境是Jenkins还是本地。环境不同,运行不同的脚本获取Git Branch的名字。当处于Jenkins环境的时候,先通过GIT_BRANCH这个环境变量获取到Jenkins拉下来的分支对应的远程分支,然后通过字符串分离,获取到分支名。

/**
 * 获取Git 分支名
 *
 *参考Jenkins git 创建文档: https://wiki.jenkins.io/display/JENKINS/Git+Plugin
 *   Environment variables

 The git plugin sets several environment variables you can use in your scripts:

 GIT_COMMIT - SHA of the current
 GIT_BRANCH - Name of the remote repository (defaults to origin), followed by name of the branch currently being used, e.g. "origin/master" or "origin/foo"
 GIT_LOCAL_BRANCH - Name of the branch on Jenkins. When the "checkout to specific local branch" behavior is configured, the variable is published.  If the behavior is configured as null or **, the property will contain the resulting local branch name sans the remote name.
 GIT_PREVIOUS_COMMIT - SHA of the previous built commit from the same branch (the current SHA on first build in branch)
 GIT_PREVIOUS_SUCCESSFUL_COMMIT - SHA of the previous successfully built commit from the same branch.
 GIT_URL - Repository remote URL
 GIT_URL_N - Repository remote URLs when there are more than 1 remotes, e.g. GIT_URL_1, GIT_URL_2
 GIT_AUTHOR_NAME and GIT_COMMITTER_NAME - The name entered if the "Custom user name/e-mail address" behaviour is enabled; falls back to the value entered in the Jenkins system config under "Global Config user.name Value" (if any)
 GIT_AUTHOR_EMAIL and GIT_COMMITTER_EMAIL - The email entered if the "Custom user name/e-mail address" behaviour is enabled; falls back to the value entered in the Jenkins system config under "Global Config user.email Value" (if any)
 *
 *
 */
def getGitBranch() {
    //判断是否处于Jenkins编译环境
    boolean flag = isInJenkins()
    if (flag) {
        ext.env = System.getenv()
        ext.gitBranch = env.GIT_BRANCH
        String[] stringArray = ext.gitBranch.split("/")
        if (stringArray.length > 0) {
            return stringArray[stringArray.length - 1]
        } else {
            return "UnKnown Branch"
        }
    } else {
        return 'git symbolic-ref --short -q HEAD'.execute().text.trim()
    }
}

完整代码如下所示:



/**
 * 获取Git 分支名
 *
 *参考Jenkins git 创建文档: https://wiki.jenkins.io/display/JENKINS/Git+Plugin
 *   Environment variables

 The git plugin sets several environment variables you can use in your scripts:

 GIT_COMMIT - SHA of the current
 GIT_BRANCH - Name of the remote repository (defaults to origin), followed by name of the branch currently being used, e.g. "origin/master" or "origin/foo"
 GIT_LOCAL_BRANCH - Name of the branch on Jenkins. When the "checkout to specific local branch" behavior is configured, the variable is published.  If the behavior is configured as null or **, the property will contain the resulting local branch name sans the remote name.
 GIT_PREVIOUS_COMMIT - SHA of the previous built commit from the same branch (the current SHA on first build in branch)
 GIT_PREVIOUS_SUCCESSFUL_COMMIT - SHA of the previous successfully built commit from the same branch.
 GIT_URL - Repository remote URL
 GIT_URL_N - Repository remote URLs when there are more than 1 remotes, e.g. GIT_URL_1, GIT_URL_2
 GIT_AUTHOR_NAME and GIT_COMMITTER_NAME - The name entered if the "Custom user name/e-mail address" behaviour is enabled; falls back to the value entered in the Jenkins system config under "Global Config user.name Value" (if any)
 GIT_AUTHOR_EMAIL and GIT_COMMITTER_EMAIL - The email entered if the "Custom user name/e-mail address" behaviour is enabled; falls back to the value entered in the Jenkins system config under "Global Config user.email Value" (if any)
 *
 *
 */
def getGitBranch() {
    //判断是否处于Jenkins编译环境
    boolean flag = isInJenkins()
    if (flag) {
        ext.env = System.getenv()
        ext.gitBranch = env.GIT_BRANCH
        String[] stringArray = ext.gitBranch.split("/")
        if (stringArray.length > 0) {
            return stringArray[stringArray.length - 1]
        } else {
            return "UnKnown Branch"
        }
    } else {
        return 'git symbolic-ref --short -q HEAD'.execute().text.trim()
    }
}

/**
 * 获取Git 版本号
 */
def getGitSHA() {
    return 'git rev-parse --short HEAD'.execute().text.trim()
}

/**
 * 获取Git Tag
 */
def getGitTag() {
    return 'git describe --tags'.execute([], project.rootDir).text.trim()
}

/**
 * 获取Git 提交次数
 */
def getGitCommitCount() {
    return 100 + Interger.parse('git rev-list --count HEAD'.execute([], project.rootDir).text.trim())
}

/**
 * 判断是否有jenkins
 */
boolean isInJenkins() {
    Map<String, String> map = System.getenv()
    if (map == null) {
        return false
    }
    String str = map.get("Path")
    if (str != null) {
        //it's windows
        return false
    } else {
        str = ""
        Iterator it = map.iterator()
        while (it.hasNext()) {
            str += it.next()
        }
        return str.contains("jenkins")
    }
}
/**
 * 获取jenkins任务名
 */
def getJenkinsName() {
    boolean flag = isInJenkins()
    if (flag) {
        ext.env = System.getenv()
        ext.name = env.JOB_URL
        String[] stringArray = ext.name.split("/")
        if (stringArray.length > 0) {
            return stringArray[stringArray.length - 1]
        } else {
            return "Local"
        }
    } else {
        return "Local"
    }
}

/**
 * 获取Jenkins Build 号
 * @return
 */
def getJenkinsBuildCode() {
    boolean flag = isInJenkins()
    if (flag) {
        ext.env = System.getenv()
        ext.buildNumber = env.BUILD_NUMBER?.toInteger()
        return "$buildNumber"
    } else {
        return 0
    }
}

/**
 * 定义几个变量,在build.gradle里面引用
 */
ext {
    gitTag = getGitTag()
    gitBranch = getGitBranch()
    gitSHA = getGitSHA()
    jenkinsRevision = getJenkinsBuildCode()
    jenkinsName = getJenkinsName()
}

现在测试下Jenkins编译是否正常,可以看到一切都正常了。

参考链接



作者:欧阳鹏 欢迎转载,与人分享是进步的源泉!
转载请保留原文地址:http://blog.csdn.net/ouyang_peng/article/details/77802596

如果觉得本文对您有所帮助,欢迎您扫码下图所示的支付宝和微信支付二维码对本文进行随意打赏。您的支持将鼓励我继续创作!

时间: 2024-12-27 21:58:09

Git学习--&gt;关于Jenkins编译时候,如何获取Git分支的当前分支名?的相关文章

《Git学习指南》——2.2 第一个Git项目

2.2 第一个Git项目 在这里,我们建议你最好能为接下来的Git测试单独开辟一个项目.总之应先从一个简单的小项目开始.在我们这个小小的示例项目中,first-steps目录下只有两个文本文件,如图2.1所示. 图2.1 我们的示例项目 在开始摆弄这个玩具项目之前,我们建议你最好先做一个备份!尽管在Git中,想要造成永久性的删除或破坏也不是件容易的事情,而且每当你要做某些"危险"动作的时候,Git通常也会发出相应的警告消息.但是,有备无患总是好的. 2.2.1 创建版本库现在,我们首先

git学习------&amp;gt;写给 Git 初学者的7个建议

PS:本文转载于(http://blog.jobbole.com/50603/),本文由 伯乐在线 - 吴鹏煜 翻译. 英文出处:(http://sixrevisions.com/web-development/git-tips/) 当我刚刚开始使用Git的版本控制时,我根本不确定我付出那么多时间是不是会得到回报.Branch.Stage.Stash,这些Git名词对我来说都非常陌生. 而今天的我已不能想象生活没有Git会变成什么样.Git不仅提供了我非常需要的版本控制功能,还让我变成一个更优秀

Git学习备忘

    本文参考廖雪峰写的精彩的git学习文档,大家可以直接去官网看原版,我这里只是便于自己记录梳理 原版地址:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000     ubuntu下可以直接sudo apt-get install git来安装git.如果是mac,Xcode自带git,但是版本可能比较低.你可以到git官网下载最新的git src或较旧的dmg文件到本地安装.安

Git学习--&amp;gt;如何通过Shell脚本实现 监控Gitlab备份整个过程并且通过邮件通知得到备份结果?

一.背景 Git学习–>如何通过Shell脚本自动定时将Gitlab备份文件复制到远程服务器? http://blog.csdn.net/ouyang_peng/article/details/77334215 git学习--> Gitlab如何进行备份恢复与迁移? http://blog.csdn.net/ouyang_peng/article/details/77070977 Linux学习–>如何通过Shell脚本实现发送邮件通知功能? http://blog.csdn.net/o

Git学习--&amp;gt;如何通过Shell脚本自动定时将Gitlab备份文件复制到远程服务器?

一.背景 在我之前的博客 git学习--> Gitlab如何进行备份恢复与迁移? (地址:http://blog.csdn.net/ouyang_peng/article/details/77070977) 里面已经写清楚了如何使用Gitlab自动备份功能. 但是之前的备份功能只是备份到Gitlab服务运行的那台服务器上,如果哪一天那台服务器的磁盘损坏了的话,数据无法取出,那么对于公司来说是一匹无法想象的损失,因为 代码是公司的重要资产,需要以防万一. 代码是公司的重要资产,需要以防万一. 代码

git学习------&amp;gt; Gitlab如何进行备份恢复与迁移?

前段时间,在某台CenterOS服务器上搭建了Gitlab环境,并且大家陆陆续续的都把代码从svn迁移到了gitlab,但是之前的CenterOS服务器并不是搭建在公司的机房环境,而是搭建在办公室的某台闲置的电脑上,因此为了保证数据安全性,领导要求为将之前的Gitlab数据全部重新迁移到公司机房的服务器上面去. 1.Gitlab 创建备份 1.1 创建备份文件 首先我们得把老服务器上的Gitlab整体备份,使用Gitlab一键安装包安装Gitlab非常简单, 同样的备份恢复与迁移也非常简单. 使

git学习------&amp;gt;Git 分支管理最佳实践

ps:本文转载于 : https://www.ibm.com/developerworks/cn/java/j-lo-git-mange/index.html Git 是目前最流行的源代码管理工具.大量的软件项目由 GitHub.Bitbucket 和 GitLab 这样的云服务平台或是私有的 Git 仓库来管理.在使用 Git 时通常会遇到的一个问题是采用何种分支管理实践,即如何管理仓库中作用不同的各类分支.和软件开发中的其他实践一样,Git 分支管理并没有普遍适用的最佳做法,而只有对每个团队

thinkphp学习笔记3—项目编译和调试模式

原文:thinkphp学习笔记3-项目编译和调试模式 1.项目编译 在章节2.4项目编译中作者讲到使用thinkphp的项目在第一次运行的时候会吧核心需要加载的文件去掉空白和注释合并到一个文件中编译并缓存,第二次运行时直接载入编译缓存,这样省去一些IO开销,加快执行速度.并且在3.0以上的版本中海做了一些优化: 1.合并和兴编译缓存和项目编译缓存,不再生成两个缓存文件 2.直接对本地环境生成设置和常量定义减少环境判断 3.编译缓存可以直接替换框架入口甚至项目入口,甚至脱离框架独立运行 4.通过参

git学习------&amp;gt;如何修改git已提交的记录中的Author和Email?

一.背景 最近搭建好GitLab后,准备陆陆续续的将之前在SVN仓库中保存的代码迁移到GitLab上,昨天顺利将三个Android组件的代码迁移到GitLab后,其他同事发现迁移是成功了,但是pull下来命令后查看git log 发现所有人的有些都配置成了我的邮箱,尴尬啊. GitLab上面全部变成了我的提交记录,尴尬. 二.原因分析 下面具体分析下为什么产生这个的原因. 具体原因是因为再做SVN–>Git迁移准备的时候,第一步要建议SVN用户到Git用户的映射文件.而这个映射文件最终我将所有用