Gradle(groovy)中执行Git命令,Jenkins构建后提交文件到Git仓库

首先来说一下为什么会有这个操作,也就是应用的场景。
我们项目里面有用AndResGuard做资源压缩,为了保证每个版本压缩后的资源能保持不变(如果你用了热修复资源变了打补丁包就直接崩了),每次混淆前都要传入上一版本的resource_mapping,但我们的项目每次都是在Jenkins上面完成打包的,这就导致resource_mapping文件是在Jenkins上面生成的,我们需要在Jenkins打包完成后执行Git命令把resuource_mapping文件提交到我们的Git仓库,那每次构建完成就可以直接自动更新resource_mapping文件了。
这里可能有点坑如果你也是用的AndResGuard可以看下我另外的文章
AndResGuard keepmapping 的一个坑
1.你的Jenkins上面一定要安装了GitPlugin
2.在app目录现在创建一个resource_mapping.txt,然后提交到仓库。
3.然后在app/build.gradle里面加上gitTadk,代码如下:

task gitTask() {
    doLast {
        println "git start"
        ext.env = System.getenv()
        def curBranchName = env.GIT_LOCAL_BRANCH
        def originBranchName = env.GIT_BRANCH
        def originUrl = env.GIT_URL
        println "curBranchName:" + curBranchName
        println "originBranchName:" + originBranchName
        println "originUrl:" + originUrl
        //这个是app目录下
        def mappingFile = file("./resource_mapping.txt")
        println "path:${mappingFile}"

        if (mappingFile.exists()) {
            println "mappingFile isEmpty:" + mappingFile.text.isEmpty()
        } else {
            println "mappingFile not exists"
        }
        
        //定义Git语句
        def statusPro = "git status".execute()
        //打印Git命令的结果,一开始就是不知道有这个,执行不成功也没有日志输出,走了很多弯路
        println "git status:\n" + statusPro.inputStream.text
        statusPro.waitFor()

        def pullPro = "git pull".execute()
        println "git pull:\n" + pullPro.inputStream.text
        pullPro.waitFor()

        def addPro = "git add ${mappingFile.getAbsolutePath()}".execute()
        println "git add:\n" + addPro.inputStream.text
        addPro.waitFor()

        def commitPro = 'git commit -m resource_mapping'.execute()
        println "git commit:\n" + commitPro.inputStream.text
        commitPro.waitFor()

        def pushPro = "git push origin ${curBranchName}".execute()
        println "git push:\n" + pushPro.inputStream.text
        pushPro.waitFor()


        def statusPro2 = "git status".execute()
        println "git status:" + statusPro2.inputStream.text
        statusPro2.waitFor()

        println "git end"
    }
}

4.最后记得执行这个Task

    task ->
        if (task.name == 'assembleRelease') {
            task.finalizedBy apkResGuard
            //可能你还有其它task,总之把gitTask放到最后就行了。
            apkResGuard.finalizedBy gitTask
        }
}

这样就大功告成了,最主要的还是打日志那几句,有日志都好说,至少知道是什么原因,然后对着改就行了。不然真的无从下手。

你可能感兴趣的:(Gradle(groovy)中执行Git命令,Jenkins构建后提交文件到Git仓库)