Automatic versioning of Android build using git describe with Gradle

后端 未结 10 1977
醉酒成梦
醉酒成梦 2020-11-30 18:18

I have searched extensively, but likely due to the newness of Android Studio and Gradle. I haven\'t found any description of how to do this. I want to do basically exactly

10条回答
  •  Happy的楠姐
    2020-11-30 19:16

    This is a slightly changed version of Diego's answer, which fulfils my desire to have version name in following style:

    {latest tag} - {short hash of current commit} - {time of current commit}

        import java.text.SimpleDateFormat
    
        buildscript {
            repositories {
                jcenter()
            }
            dependencies {
                classpath 'org.ajoberstar.grgit:grgit-core:3.1.1'
            }
        }
    
        /**
         * Version name will be in following format:
         *
         * "{latest release tag}-{short commit hash of current commit}-{time of current commit}"
         *
         * Example: 1.6.0-5ae9b86-2019-07-04-13:20
         */
        ext {
            git = org.ajoberstar.grgit.Grgit.open(currentDir: projectDir)
    
            listOfTags = git.tag.list()
            noTags = listOfTags.isEmpty()
            head = git.head()
    
            if (noTags) {
                gitVersionCode = 0
                gitVersionName = "no-tag-${head.abbreviatedId}-${head.time}"
            } else {
                tagNames = listOfTags.collect { git.describe(commit: it.commit, tags: true) }
                mostRecentVersion = mostRecentVersion(tagNames)
    
                def date = new SimpleDateFormat('yyyy-MM-dd-HH:mm').format(new Date(head.time * 1000))
                gitVersionCode = listOfTags.size()
                gitVersionName = "$mostRecentVersion-${head.abbreviatedId}-${date}"
            }
        }
    
        /**
         * Shamelessly stolen from StackOverflow.
         */
        static String mostRecentVersion(List versions) {
            def sorted = versions.sort(false) { a, b ->
                List verA = a.tokenize('.')
                List verB = b.tokenize('.')
    
                def commonIndices = Math.min(verA.size(), verB.size())
    
                for (int i = 0; i < commonIndices; ++i) {
                    def numA = verA[i].toInteger()
                    def numB = verB[i].toInteger()
    
                    if (numA != numB) {
                        return numA <=> numB
                    }
                }
                // If we got this far then all the common indices are identical, so whichever version is longer must be more recent
                verA.size() <=> verB.size()
            }
    
            // println "Sorted versions: $sorted"
            sorted[-1]
        }
    
        task printVersion() {
            println("Version Code: $gitVersionCode")
            println("Version Name: $gitVersionName")
        }
    
    

    Assuming you have also specified versionNameSuffix in app module's build.gradle following way:

        android {
            ...
            productFlavors {
                debug {
                    versionCode gitVersionCode
                    versionName gitVersionName
                    versionNameSuffix '-DEBUG'
                    ...
                }
                // ... other flavors here
            }
        }
    

    Then this will be the version name:

提交回复
热议问题