热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

git,学习,amp,gt,关于,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 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单元测试报告 :<a href="${BUILD_URL}testReport">点击查看测试报告a>li> <li>Launcher代码覆盖率 :<a href="${BUILD_URL}jacoco">点击查看代码覆盖率a>li> <li>Launcher Android Lint :<a href="${BUILD_URL}androidLintResult">点击查看Android Linta>li> <br /> <li>GIT_COMMIT :${GIT_COMMIT}a>li> <li>GIT_BRANCH :${GIT_BRANCH}a>li> <li>GIT_LOCAL_BRANCH :${GIT_LOCAL_BRANCH}a>li> <li>GIT_PREVIOUS_COMMIT :${GIT_PREVIOUS_COMMIT}a>li> <li>GIT_PREVIOUS_SUCCESSFUL_COMMIT :${GIT_PREVIOUS_SUCCESSFUL_COMMIT}a>li> <li>GIT_URL :${GIT_URL}a>li> <li>GIT_URL_N :${GIT_URL_N}a>li> <li>GIT_AUTHOR_NAME :${GIT_AUTHOR_NAME}a>li> <li>GIT_COMMITTER_NAME :${GIT_COMMITTER_NAME}a>li> <li>GIT_AUTHOR_EMAIL :${GIT_AUTHOR_EMAIL}a>li> <li> GIT_COMMITTER_EMAIL :${ GIT_COMMITTER_EMAIL}a>li> 

这样编译完后,收到的邮件内容如下:
这里写图片描述

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

GIT_COMMIT118fa74e6a09c8c5ae713523692add256bfa6afb GIT_BRANCH :origin/feature/UseByAnonymousDBMigrateAndApiChange GIT_LOCAL_BRANCH${GIT_LOCAL_BRANCH} GIT_PREVIOUS_COMMIT118fa74e6a09c8c5ae713523692add256bfa6afb GIT_PREVIOUS_SUCCESSFUL_COMMIT118fa74e6a09c8c5ae713523692add256bfa6afb 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 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编译是否正常,可以看到一切都正常了。

这里写图片描述

参考链接
  • https://wiki.jenkins.io/display/JENKINS/Git+Plugin
  • https://stackoverflow.com/questions/6245570/how-to-get-the-current-branch-name-in-git

这里写图片描述

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

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

这里写图片描述


推荐阅读
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有