首页 > 解决方案 > 从 Jenkins grails 插件启动的 Grails 测试不会获取 gradle build 生成的 jars

问题描述

我有一个大型项目,我正在帮助从 Grails 2.5 迁移到 Grails 3 和 Gradle。在短期内,我们将大部分业务代码转移到与框架无关的 gradle 模块中,然后将它们导入 grails 2.5,最终计划转移到完全 grails-3 构建。

迁移方法计划是:

这在本地非常有效。我可以从源代码管理中重新签出项目,执行grails run-app --refresh-dependencies(或test-app), and see the result of my build. I've found that--refresh-dependencies is a magic grails voodoo that tells grails that it might find some classes it needs in itslib/` 目录。

这对詹金斯不起作用。我正在使用 Jenkins Gradle 插件。詹金斯无法解决我的(单,POC)类:

   [groovyc] /mnt/jenkins/workspace/Java8/Steps/MyApp-Grails-2.5.2-Java8-Pull-Request-Unit-Tests
    /src/groovy/com/myapp/package/SomeServiceWithADependency.groovy: 
    10: unable to resolve class com.myapp.module.util.MyUtil
   [groovyc]  @ line 10, column 1.
   [groovyc]    com.myapp.module.util.MyUtil
   [groovyc]    ^

这是我尝试过的:

有任何想法吗?希望地球上有人处理过类似的问题

标签: javajenkinsgradlegrailsgroovy

解决方案


我们解决了这个问题。由于 gradle 的缓存,构建在本地工作,并且由于 Jenkins 正在使用新的存储库而远程失败。

鉴于从 git repo 的干净拉取开始的要求,执行将构建 gradle 模块并拉入依赖项的单个 grails 命令,我们的解决方案是使用gradlewshell 脚本首先构建 gradle,如果 gradle 构建失败则失败:

(exec ./modules/gradlew -p modules build jar publishToMavenLocal);  gradlew_return_code=$?

if [ "$gradlew_return_code" -eq "0" ]; then
    echo "Gradle build task success!"
else
    echo "Gradle build task failed with return code $gradlew_return_code; aborting."
    exit -1
fi

缺点是:

  • 所有从事该项目的开发人员都必须使用./grailsw(而不是grails)来执行任何 grails 任务,并且所有 jenkins 构建都已相应地进行了修改。

  • 还必须添加任何模块内的任何传递依赖项,BuildConfig.groovy以便 grails 在运行时将它们放在类路径中。未能添加依赖项BuildConfig.groovy不会引发编译时错误,但会在运行时因没有类定义而崩溃。

然而,模块化构建的好处,尤其是它已经为代码组织带来的纪律,以及知道我们的应用程序代码的很大一部分与框架无关的舒适性,这些不便都是值得的。

希望这对其他人有帮助。


推荐阅读