github操作,跨作业拆分gradle调用

bq3bfh9z  于 2023-01-09  发布在  Git
关注(0)|答案(1)|浏览(145)

在我的github actions jobs中,我希望有n个jobs。

  • 作业1将运行gradle assembleDebug
  • job 2到job n将运行gradle connectedCheck。每个job之间的区别在于在android模拟器上使用的映像(每个都有不同的android API)

这个想法是在job1中构建项目,而job2到jobn将重用job1中已经构建的内容,并且只构建测试(由connectedCheck运行的任务进行),这是为了避免在job2到jobn中从头构建所有内容。
我已经:

  • app/buildapp/.cxx文件保存到job1的github缓存中
  • 将作业2中缓存还原到作业n。

在再次运行gradle之前,我尝试对app/buildapp/.cxx中的文件执行touch操作(这样我就可以确定这些文件都比源文件旧)。
但这仍然无法节省构建时间,换句话说,系统仍然会重新构建所有内容,gradle会再次运行在job1中完成的任务。
你知道如何做到这一点吗?

zwghvu4y

zwghvu4y1#

我发现:

  • touch没有用
  • 源文件在所有作业中必须有相同的时间戳。如果github通过git checkout 获取repo,文件将有 checkout 时间的时间戳。因此,为了始终有相同的时间戳,您可以使用git-restore-mtime。有一个github操作chetan/git-restore-mtime-action@v1用于它。
  • 我还必须添加$PROJECT_DIR/.gradle目录。

除此之外,通过运行:

  • -i选项的gradle
  • -d explain -v选项的ninja

我发现:

  • 除了app/build/之外,我在其他地方也有其他的build/目录,通常是在我使用的一些库中,例如additional_lib/my_lib/build/
  • 此文件也是必需的:~/.android/debug.keystore
  • ANDROID_SDK_ROOT/ndk/<version>ANDROID_SDK_ROOT/cmake/<version>中的文件和目录在作业之间必须具有相同的时间戳。

因此,在工作中,您必须:

  • 确保源文件在所有作业中具有相同的时间戳
  • 将读取深度设置为0
- name: checkout
    uses: actions/checkout@v3
    with:
      fetch-depth: 0
- name: restore timestamps
    uses: chetan/git-restore-mtime-action@v1
  • 请确保这些目录中的文件在作业之间具有相同的时间戳。
  • 安卓软件开发工具包根目录/ndk/
  • 安卓软件开发工具包根目录/cmake/
  • 缓存这些文件夹:
  • .分级/
  • 应用程序/构建/
  • 应用程序/. cxx/
  • 附加库/我的库/构建/
  • ~/. gradle/
  • ~/. android/调试密钥库

注意:我还在缓存中添加了~/. gradle,但这可能不是强制性的

相关问题