【问题标题】:Grails tests launched from Jenkins grails plugin doesn't pick up jars generated by gradle build从 Jenkins grails 插件启动的 Grails 测试不会获取 gradle build 生成的 jars
【发布时间】:2018-07-19 03:01:30
【问题描述】:

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

迁移方法计划是:

  • 创建 gradle 模块并将大部分代码移动到这些模块中。

  • 让 grails 执行 gradle 构建

  • Gradle 将每个模块的构建结果放到 /lib 目录中

  • Grails 在类路径中找到它们并使用它们

  • 我没有在 BuildConfig.groovy 中指定依赖项,我只是使用 grails 代码中的类,结果在应用程序启动的编译阶段一切都在那里。

这在本地非常有效。我可以从源代码管理中重新检出项目,执行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)类:

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

这是我尝试过的:

  • 我已选中 Jenkins 复选框以将 --refresh-dependencies 标志添加到所有构建周期命令

  • lib/ 目录中还有 3 个其他 jar,已签入 git 源代码控制。 Grails 会找到那些没有问题的。

  • 我在 gradle 模块构建的末尾添加了一条打印语句,以告诉我 /lib 目录中的内容,并且我同时生成了 gradle 依赖项和已签入源代码控制的依赖项。它们似乎在那里,并且路径与预期的工作区路径相匹配。

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

【问题讨论】:

    标签: java jenkins gradle grails groovy


    【解决方案1】:

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

    考虑到从干净拉动 git repo 开始的要求,执行单个 grails 命令来构建 gradle 模块并拉入依赖项,我们的解决方案是使用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 在运行时将它们放在类路径中。未能在 BuildConfig.groovy 中添加依赖项不会引发编译时错误,但会在运行时因没有类定义而崩溃。

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

    希望这对其他人有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-05
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多