CircleCI报错./gradlew不存在 如何配置子目录Gradle任务执行
CircleCI 子目录运行Gradle任务配置方法
问题根因
触发./gradlew: No such file or directory报错的原因很简单:官方circleci/gradle@2.2.0 orb默认在仓库根目录查找Gradle wrapper启动脚本,你的Gradle项目存放在仓库子文件夹中,默认路径匹配不上就会执行失败。
最优配置方式
不用自己重写job逻辑,这个orb原生提供了working_directory参数,直接指定Gradle项目根目录的绝对路径就行。配置完成后,orb内置的代码校验、依赖缓存、测试执行、结果上报全流程都会自动在指定目录运行,不需要手动加cd命令切路径。
CircleCI拉取代码后默认的工作根路径是~/project,如果你的Gradle项目(就是直接存放gradlew、build.gradle、settings.gradle文件的那层目录)在仓库下的backend/service子文件夹,修改后的完整配置如下:
version: 2.1 orbs: gradle: circleci/gradle@2.2.0 workflows: checkout-build-test: jobs: - gradle/test: working_directory: ~/project/backend/service
如果后续要加构建、打包等其他Gradle任务,给对应orb任务传入相同参数即可,比如加构建任务:
workflows: checkout-build-test: jobs: - gradle/test: working_directory: ~/project/backend/service - gradle/build: working_directory: ~/project/backend/service tasks: clean build
路径校验方法
如果不确定路径填的对不对,可以临时加个前置步骤,打印当前路径和文件列表,能看到gradlew文件就说明路径正确:
- gradle/test: working_directory: ~/project/backend/service pre-steps: - run: pwd && ls -la
避坑提醒
- 别用
cd 子目录 && ./gradlew test这种手动切目录的写法,orb内置的wrapper合法性校验、依赖缓存步骤还是会在默认根目录跑,不仅依然可能报错,还会导致缓存不生效,构建速度变慢 working_directory必须填到Gradle项目根目录,也就是直接包含gradlew文件的层级,不要填到src/main/java这类源码子目录,不然还是找不到wrapper文件
内容的提问来源于stack exchange,提问作者Avraham Cohen
相关产品推荐
相关产品推荐

