从 Jenkins grails 插件启动的 Grails 测试不会获取由 gradle build 生成的 jar

Grails tests launched from Jenkins grails plugin doesn't pick up jars generated by gradle build

我有一个大型项目,我正在帮助迁移到 Grails 3 和 Gradle 从 Grails 2.5。在短期内,我们正在将大部分业务代码转移到与框架无关的 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-dependenciesis a magic grails voodoo that tells grails that it might find some classes it needs in itslib/` 目录。

这不适用于 Jenkins。我正在使用 Jenkins Gradle 插件。 Jenkins 无法解决我的(单身,POC)class:

   [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]    ^

这是我试过的方法:

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

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

考虑到从 git 回购的干净拉入开始的要求,执行一个构建 gradle 模块并引入依赖项的 grails 命令,我们的解决方案是使用gradlew shell 首先构建 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 在运行时将它们放在 class 路径上。未能在 BuildConfig.groovy 中添加依赖项不会引发编译时错误,但会在运行时因没有 class def 而爆炸。

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

希望这对其他人有帮助。