问题描述
1、2021年9月17日,研发人员反馈,jenkins上Android构建job运行时结果总是不正确,jenkins上配置了很多task,第一个task是清理task,第二个task会生成一个jar文件,第三个task会调用第二个task的jar文件作为输入,混淆产生一个新jar文件,后面就不列举了。
目前问题是,第三个task执行的时候说找不到第二个task产生的jar文件,所以报错。
2、2024年1月25日,再次出现类似的问题,gradle在执行一个打包任务的时候,有个打包task要依赖于前一个task输出的jar包作为输入,生成新的jar。jenkins下载代码是正确的,但是打包结果始终不正确,前一个task输出的jar包是正确的,但是新的jar包打出来的结果始终是旧的,不能包含最新的代码。
问题1排查
1. 只保留第一个清理task和第二个task,检查输出目录,结果是正确的。 加入第三个任务以后,错误是一样的,还是找不到第二个task产生的jar文件。
2. 排查代码,第二个task在调用的时候,依赖于build 任务; 第三个task没有依赖的build任务。除此之外,逻辑上没有任何错误。 且此job以前运行正常。
3. 排查jenkins 的console,除了出错信息,只有第三个job运行的日志信息,感觉就像第二个任务没有执行一样。
4. 查看其他运行成功的Android job, 很多也只有2个task,不具有参考性。 也有一个很多task的job,运行也是正常的,检查发现,这些task中每一个都显示定义了job依赖于clear和build任务。 猜测,是不是跟build有关。
5. 恰好另一个研发同事说,我以前给他解决过类似的问题,就是在调用之前,先执行build操作,整个job就正常了。 至于原因是什么,我一点印象也没了。
问题2排查
检查build.gradle配置文件,没有发现问题,突然想到问题1的解决方案,按照问题1的解决方案尝试了一下,问题直接解决了。
cd ${WORKSPACE}/sps
/usr/local/gradle-6.5/bin/gradle build
问题解决
在调用gradle插件前,执行“gradle build”命令:
#!/bin/bash
cd ${WORKSPACE}/corecomponent
/usr/local/gradle-6.5/bin/gradle build
问题解决,特此记之。
原因可能分析
1、猜测jenkins的gradle插件,在某些特殊情况下,不能保证多个task的时序,导致打包结果不正确。
2、也可能gradle SDK,编译的时候不能正确清理缓存,导致打包结果不正确。
总之一句话,解决方法就是到对应的真实的build.gradle配置文件所在的工作区,先执行一下build,再调用gradle插件来执行任务即可。