Android jenkins打包遇到的坑

一、jenkins打包介绍

       jenkins主要是可以实现自动打包,配置之后用户只需要点击构建按钮即可完成打包,省去了程序员打包的工作,具体可以参考:https://www.jianshu.com/p/38b2e17ced73,这篇文章只记录我在配置jenkins打包过程中遇到的坑。


二、遇到的坑

1、拉去代码权限问题

配置如下:

其中Key里面的内容是.ssh的private key,在C:\Users\dell\.ssh\id_rsa文件中,但是总是报

看提示说是权限问题,在Credentials的Passphrase输入git账号的密码,如图:

再次构建代码,发现可以拉去代码啦,顺便说一句,我在构建另外一个项目时,选择直接输入private key,结果提示没有权限拉去代码,之后选择“From the Jenkins master ~/.ssh”,然后将.ssh目录拷贝到jenkins的安装根目录后,连接成功;

如果选择了“From the Jenkins master ~/.ssh”,则jenkins会在根目录找是否有“~/.ssh/id_rsa”文件,有则直接使用里面的内容作为private key。

顺便说一句,配置.ssh可以参考:http://blog.csdn.net/pzasdq/article/details/59108890

2、自定义构建参数无效

在选择了“参数化构建过程”后,配置了自定义的构建参数,但是再构建的时候发现这些构建参数都没有生效,配置如下:

最终发现在“构建”项下面点击高级后有一个“Pass all job parameters as Project properties”,表示是否将构建参数作为project的属性,必须将这个选项勾选上,自定义的构建参数才能生效,如下:

3、构建项目时概率性出现错误

在构建项目时,有时候能够构建成功,有的时候会直接报错,更加无语的是,有的时候会卡住,我午休的时候等了两个小时也没构建完成,我执行任务的配置参数:

“clean assemble${PRODUCT_FLAVORS}${BUILD_TYPE}”,下面我们来分析卡住和构建错误的情况。

卡住情况


经过多次尝试,发现任务基本都是卡住mergeResourcesBuild这个任务上。

报错情况



每次报错的内容都是一样的,提示“Error: java.util.concurrent.ExecutionException: java.io.IOException: 管道正在被关闭”。

而且有一个非常奇怪的情况,每三次构建中,必然有一次构建成功,一次报错,一次卡住,从上面的日志中,很难发现问题出现在哪里,这个时候我们可以修改构建命令,添加参数以获取更多的日志信息,修改构建命令为:“clean assemble${PRODUCT_FLAVORS}${BUILD_TYPE} --stacktrace --info --debug”,再次观察日志输入。

报错情况:

卡住情况:


看上面的日志,卡住的情况应该是在等待守护进程获取某个锁,报错的情况还是说管道正在被关闭。感觉都是和这个守护进程有关,在观察一下输出日志,发现编译成功和编译失败时使用守护进程的情况是不一样的,具体如下:

编译成功:

编译失败:

对比发现,编译成功时,总会启动一个新的守护进程来编译,而编译失败时则没有启动新的守护进程,网上查了一下关于gradle守护进程的信息,它的目的是改善 Gradle 的启动和执行时间,可以参考:http://wiki.jikexueyuan.com/project/gradle/defend-process.html,现在我们编译异常,可以尝试禁用守护进程,在构建命令后面加上“--no-daemon”,再次构建项目,没有出现过卡死或者编译报错的情况了。

4、svn上传编译包

1、首先需要修改build.gradle文件,将apk输出到svn项目的对应目录中,如下:

            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    // 如果是jenkins打包
                    if ("true".equals(IS_JENKINS)) {
                        def outputFile = output.outputFile
                        if (outputFile != null && outputFile.name.endsWith('.apk')) {
                            def date = Calendar.getInstance();
                            def timeStr = "_" + date.get(Calendar.YEAR) + (((date.get(Calendar.MONTH) + 1) >= 10 ? date.get(Calendar.MONTH) + 1 : "0" + (date.get(Calendar.MONTH) + 1))) + (date.get(Calendar.DAY_OF_MONTH) >= 10 ? date.get(Calendar.DAY_OF_MONTH) : "0" + date.get(Calendar.DAY_OF_MONTH)) + "_" + (date.get(Calendar.HOUR_OF_DAY) >= 10 ? date.get(Calendar.HOUR_OF_DAY) : "0" + date.get(Calendar.HOUR_OF_DAY)) + (date.get(Calendar.MINUTE) >= 10 ? date.get(Calendar.MINUTE) : "0" + date.get(Calendar.MINUTE)) + ".apk";
                            def fileName = "Android_${defaultConfig.versionName}_${defaultConfig.versionCode}_${PRODUCT_FLAVORS}" + timeStr;
                            def outDirectory = BUILD_PATH_JENKINS + "\\${defaultConfig.versionName}";
                            output.outputFile = new File(outDirectory, fileName)
                        }
                    }
                }
            }

现在用jenkins构建项目之后,apk会输出到指定的目录,然后我们再利用svn命令行来上传apk包。

2、安装svn命令行工具

链接:https://www.visualsvn.com/files/Apache-Subversion-1.9.7.zip

下载后直接解压,然后将其下面的bin目录添加到环境变量path中,打开命令行,输入svn help,如果命令生效则说明配置成功。

3、配置jenkins执行svn cmd命令上传apk包

保存配置,执行构建任务,即可自动上传apk包。


猜你喜欢

转载自blog.csdn.net/xiao_nian/article/details/79493139