gradle中自动生成git提交信息

Posted 恒奇恒毅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gradle中自动生成git提交信息相关的知识,希望对你有一定的参考价值。

maven有一个git-commit-id插件,可以在打包的时候自动生成git commit相关的信息。对于查看版本是否发布正常非常有意义。
很遗憾gradle却没有。只有自己动手了。

  1. 首先编写一个gradle文件version-commit.gradle,定义一个gradle的task用于生成git信息,使用默认任务的方式defaultTasks或者在processResources任务之后执行。因为processResources就是专门处理资源文件的,所以生成git信息的文件在processResources之后生成就很合理。
import java.text.SimpleDateFormat

//使用默认task的方式嵌入
//defaultTasks 'versionCommit'
task("versionCommit")
    versionCommit()

//在processResources之后执行
processResources.finalizedBy versionCommit

static def versionCommit() 
    Properties p = new Properties()
    p.put("branch", getGitBranch())
    p.put("commitId", getGitCommit())
    p.put("commitAuthor", getGitCommitAuthor())
    p.put("commitTime", getGitCommitTime())
    p.put("packageTime", getCurrentTime())
    p.store(new FileWriter("src/main/resources/version-commit.properties"), "generated by gradle git info plugin")

static def getGitCommit() 
    return 'git rev-parse --short HEAD'.execute().text.trim()


static def getGitCommitAuthor() 
    String commitId = getGitCommit();
    String cmd = "git log --pretty=format:%an $commitId -1";
    return cmd.execute().text.trim()

static def getGitCommitTime() 
    String commitId = getGitCommit();
    String cmd = "git log --pretty=format:%ai $commitId -1";
    return cmd.execute().text.trim();

static def getGitBranch() 
    return (System.getProperty("version") ?: "1.0-SNAPSHOT").replace("origin/", "")

static def getCurrentTime() 
    return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())



  1. 然后在build.gradle中引入,在打包的时候就会在类路径下生成version-commit.properties,保存最后一次提交相关的信息。
apply from: "$rootDir/version-commit.gradle"
  1. 然后在项目启动的时候读取version-commit.properties再打印出来即可。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.InputStream;
import java.util.Properties;

/**
 * 记录版本,每次发版打包的时候自动生成git相关信息
 * gradle 生成git信息保存在类路径的version-commit.txt中
 * @see https://blog.csdn.net/xxssyyyyssxx/article/details/128530853?spm=1001.2014.3001.5501
 */
public class VersionCommit 
    private static final Logger logger = LoggerFactory.getLogger(VersionCommit.class);
    private static final String VERSION_COMMIT_FILE_NAME = "version-commit.properties";

    //已实现的这些字段,还可以动态添加其他字段
    public static final String BRANCH        = "branch";
    public static final String COMMIT_ID     = "commitId";
    public static final String COMMIT_AUTHOR = "commitAuthor";
    public static final String COMMIT_TIME   = "commitTime";
    public static final String PACKAGE_TIME  = "packageTime";

    public static Map<String, String> fromFile()
        Properties v = getVersionCommitInfo();
        if(null != v)
            HashMap<String, String> map = new HashMap<>(v.size());
            for (String n : v.stringPropertyNames()) 
                map.put(n, v.getProperty(n));
            
            return map;
        
        return null;
    
    public static void print()
        try 
            Map<String, String> map = fromFile();
            if(null != map)
                logger.info("start up successfully with version-commit: \\r\\n ", map);
            
         catch (Exception e) 
            logger.error(e.getMessage(), e);
        
    

    private static Properties getVersionCommitInfo()
        String fileName = getCommitInfoFileName();
        try (InputStream inputStream = VersionCommit.class.getClassLoader().getResourceAsStream(fileName);
        ) 
            Properties properties = new Properties();
            properties.load(inputStream);
            return properties;
        catch (Exception e)
            //有异常的时候返回null
            return null;
        
    

    /**
     * 给一个修改的机会
     */
    private static String getCommitInfoFileName() 
        String fileName = VERSION_COMMIT_FILE_NAME;
        String v = System.getProperty("version.commit.file.name");
        if(StrUtil.isNotEmpty(v))
            fileName = v;
        
        return fileName;
    



效果如下:

start up successfully with version-commit: 
 commitId=9ca343594, commitTime=2023-01-01 17:00:00 +0800, branch=feature-123, packageTime=2023-01-01 18:00:00, commitAuthor=someone

  1. 如果还有其他信息需要输入到version-commit.properties中,在versionCommit方法中加入即可。

以上是关于gradle中自动生成git提交信息的主要内容,如果未能解决你的问题,请参考以下文章

使用gradle构建Android时 版本号versionName中嵌入git提交信息

Android 发布自动版本号方案 ( gradle + git )/ git rev-list HEAD/git describe --tags

gradle插件更新后生成的apk未签名

Git中的使用.gitignore忽略不想要提交的文件

通过Gradle Plugin实现Git Hooks检测机制

awk 处理 Git 提交信息生成 Release Note