Flutter基于Github Actions+Fastlane搭建CI/CD时执行lane报找不到gradlew错误
「Couldn't find gradlew at path」报错的排查与修复
这个报错是Fastlane配合Flutter做CI/CD时的高频问题,结合你当前的项目结构、Fastlane配置和GitHub Actions工作流配置,触发原因和修复方案非常明确:
核心触发原因
- Fastlane内置的gradle插件,默认从执行Fastlane命令的当前工作目录下查找gradlew可执行文件。你把Fastlane放在
android/子目录下,配置里没有显式指定gradlew路径,会直接触发查找逻辑的路径错位 - Linux类CI环境下,git检出代码时默认不会保留gradlew的可执行权限,Fastlane的插件在查找时会因为权限不足直接判定文件不存在
- 工作流里存在重复的冗余配置:两次checkout代码、重复的构建逻辑,进一步放大了路径查找的偏差
逐步骤修复方案
- 给CI环境下的gradlew补执行权限
所有Linux CI环境默认都不会自动给gradlew加可执行位,必须在执行Fastlane之前加一行配置:
不配置这一步,不管是Fastlane还是原生Gradle命令,都会直接报文件不存在的错误。chmod +x android/gradlew - 在Fastfile的gradle任务配置里显式指定gradlew路径
因为Fastlane的执行目录是android/,直接把gradlew的相对路径写进gradle任务的参数里,就能绕开插件的默认查找逻辑:gradle( task: "clean", gradlew_path: "./gradlew" ) gradle( task: "bundle", build_type: 'Release', gradlew_path: "./gradlew" ) - 精简GitHub Actions deploy任务的冗余配置
你当前的deploy步骤里,第二次重复的actions/checkout@v2、重复执行的flutter build appbundle都是多余的:- 删掉重复的checkout配置
- 删掉Fastlane里重复的gradle clean、bundle任务——你已经在Actions层完成了aab产物构建,Fastlane只需要负责把已有的aab上传到Play Store即可,不需要二次构建。简化后的lane配置如下:
lane :closed_beta do upload_to_play_store( track: 'Closed beta', aab: '../build/app/outputs/bundle/release/app-release.aab', skip_upload_metadata: true, skip_upload_images: true, skip_upload_screenshots: true, release_status: "draft", version_code: flutter_version()["version_code"], ) end
- 修正错误的文件检查命令
你现在写的Check file existence步骤,只是把find命令当字符串打印出来,根本不会实际执行查找,改成可直接验证路径的命令:
执行后就能直接看到CI环境下gradlew的实际路径和权限状态,方便排查问题。find . -name "gradlew" -ls
避坑提醒
- 注意:fastlane-action的
subdirectory: android参数,会把执行Fastlane的工作目录切换到项目根下的android/文件夹,Fastfile里所有的相对路径,都是基于这个目录计算的,不是基于项目根目录 - 删掉Fastfile开头的
update_fastlane配置,CI环境下每次执行都自动升级Fastlane,会因为版本迭代出现未预期的插件API变更,导致构建失败 - 你当前配置的Java 12.x版本和Flutter 1.22.5的Android构建流程不兼容,后续如果出现Gradle版本适配报错,需要把Java版本调整为11.x
- 尽量不要在Fastlane里重复做已经在CI层完成的构建任务,Flutter生成的aab产物路径是固定的,直接读取产物上传即可,能节省近一半的CI执行时间
内容的提问来源于stack exchange,提问作者Enzo Lizama
相关产品推荐
相关产品推荐

