相关文章推荐
含蓄的闹钟  ·  Uncaught ...·  2 周前    · 
纯真的熊猫  ·  关于前端 vue ...·  1 年前    · 
玩滑板的冲锋衣  ·  sql error (1582) ...·  1 年前    · 
版权声明:本文为【字节卷动】原创,依据 [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) 许可证进行授权,欢迎转载,转载请附上出处链接及本声明。【博客地址 http://blog.csdn.net/ouyang_peng】 本文链接: https://blog.csdn.net/ouyang_peng/article/details/77802596

因为代码都迁移到了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
<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>
 <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

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

一、背景因为代码都迁移到了Gitlab,所以Jenkins编译的时候我们都需要将之前的SVN信息换成现在的Git信息。最近编译一个Lib库的时候,因为团队规定上传Release版本的AAR到Maven的话,必须需要在Jenkins上编译而且Git Branch 必须是master分支才能够上传到Maven。 因此我们就需要在Gradle脚本中,获取Git Branch ,Git Commit... 因为代码都迁移到了Gitlab,所以Jenkins编译的时候我们都需要将之前的SVN信息换成现在的Git信息。最近编译一个Lib库的时候,因为团队规定上传Release版本的AAR到Maven的话,必须需要在Jenkins编译而且Git Branch 必须是master分支才能够上传到Maven。 因此我们...
1、git删除远程分支 git push origin :branch-name //origin前面必须有空格,表示push一个空分支到远程分支,即可删除远程分支。注意:这个操作需要拥有force push的权限 2、清空git暂存区 git reset HEAD //可以清空之前git add 的内容 3、从windows上面上传项目到git服务器时出现问题:提示换行符不一致 后来...
为什么要动态获取gitlab分支? 每个项目代码库都会有不同的分支,(如果你没有用多分支流水线的情况下)对于普通的流水线项目我们可以 让一条流水线来支持多个分支的发布,其实有时候你会发现每个分支的集成步骤都是差不多的。如果出现差异步骤我们也可以在jenkinsfile中根据不同的分支执行不同的stage。 如何解决固定分支问题?起初我们的流水线项目配置分支可能是采用的选项参数。创建一个选项参数然后把项目经常用到的分支给更新上去,最后开发人员在发布的时候来选择对应的分支。看似解决了固定分支问题,但是后期维护起
你将会学到: 掌握CI/CD自动化部署Git\Jenkins\Sonar\Nexus\Ansible\shell 掌握持续集成、持续交付、持续部署、自动化部署流程、容器发布流程、部署策略(蓝绿、灰度、滚动) 掌握Git提交代码、回退代码、区域概念、分支模型;掌握远程仓库Gitee、Gitlab、备份、恢复 掌握Jenkins基本应用、Jenkins集成Gitlab、集成Shell脚本、集成Ansible 掌握Jenkins构建静态站点CI与CD,使用Shell、Ansible来实现不同环境的滚动升级策略 掌握Jenkins构建Java应用(War包类型、Jar包类型),实现WebHook全自动CI流程 掌握Nexus制品库,以及Jenkins如何集成制品库,实现自动拉取代码,自动编译代码,自提交制品库 掌握Sonarqube质量检测,以及Jenkins集成Sonarqube进行代码质量扫描 掌握Jenkins集成DingDing,实现Sonarqube质量检测结果状态通知 掌握Jenkins全自动化
JenKins-Android--GIT-Gradle安装配置 一步步的描述了如果使用jenkins编译安卓项目,配置过程中出现的错误, Gradle不是内部也是外部命令 Git拉取出现C:\\WINDOWS\TEMP\hudson...的错误 gradle build 出现abortOnError false编译不通过的错误 编译完成后直接推送到蒲公英上
jenkins中没有找到构建前插件,每次构建时间很长,希望可以实现判断代码是否更新,如果没更细则停止构建步骤。 在构建时执行shell命令,而jenkins提供的的环境变量可以实现此判断https://wiki.jenkins.io/display/JENKINS/Conditional+BuildStep+Plugin GIT_COMMIT
GitLab触发Jenkins流水线时,Jenkins会自动拉取GitLab仓库的源代码,并在流水线中执行一系列操作。下面是一些详细操作步骤: 1. 拉取代码:在Jenkins流水线中使用git插件,从GitLab仓库中拉取源代码,并检出到指定的分支上。 2. 安装依赖:如果源代码中包含有依赖,需要在流水线中执行安装命令,例如npm install、pip install等。 3. 构建代码:执行编译、打包等操作,生成可执行文件或者部署文件。 4. 测试代码:执行单元测试、集成测试等操作,检查代码的正确性和稳定性。 5. 部署代码:将代码部署到测试环境或者生产环境中。 以下是一个简单的Jenkins流水线脚本示例: pipeline { agent any stages { stage('拉取代码') { steps { git branch: 'master', url: 'git@gitlab.com:myproject.git' stage('安装依赖') { steps { sh 'npm install' stage('构建代码') { steps { sh 'npm run build' stage('测试代码') { steps { sh 'npm run test' stage('部署代码') { steps { sh 'npm run deploy' 这个流水线脚本中包含了5个阶段,每个阶段都有特定的操作,按照顺序执行。你可以根据自己的需求,修改流水线脚本,例如添加更多的阶段、增加自动化测试等。
我的Java开发学习之旅------>Java NIO 报java.nio.charset.MalformedInputException: Input length = 1异常 107308 1 :q --退出(如果没有做任何操作,可以直接退出,如果修改内容,还没有保存,这样就退不了) 2 :q! --不保存退出(没有保存,就可直接退出了,也就是强退) 3 :wq --写入文件并退出 4 :wq! --强制写入,并退出(有些打开的文件是只读的,可以用这个命令) [/code] 【git学习】如何编辑git config --global的配置文件 wenjingguo: 没学过计算机表情包 【git学习】如何编辑git config --global的配置文件 字节卷动: 搜一下vim怎么退出表情包 我以为这是基本操作,没想到也是个难点 快捷键被占用了,这能忍吗?赶紧使用 OpenArk 找出元凶并干掉它!!! 字节卷动: 还是有遗憾的 表情包 快捷键被占用了,这能忍吗?赶紧使用 OpenArk 找出元凶并干掉它!!! 耕耘北上: 我也是idea编译器问题 然后我也就找到了搜狗 然后这个软件就用不上 哈哈哈