java - 从 Jenkins grails 插件启动的 Grails 测试不会获取 gradle build 生成的 jars
问题描述
我有一个大型项目,我正在帮助从 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-dependencies is a magic grails voodoo that tells grails that it might find some classes it needs in its
lib/` 目录。
这对詹金斯不起作用。我正在使用 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] ^
这是我尝试过的:
我已经检查了 Jenkins 的复选框以将
--refresh-dependencies
标志添加到所有构建周期命令目录中还有 3 个其他 jar
lib/
,已签入 git 源代码控制。Grails 可以找到没有问题的那些。我在 gradle 模块构建的末尾添加了一条打印语句,以告诉我
/lib
目录中有什么,并且我同时生成了 gradle 依赖项和已签入源代码控制的依赖项。它们似乎在那里,并且路径与预期的工作空间路径相匹配。
有任何想法吗?希望地球上有人处理过类似的问题
解决方案
我们解决了这个问题。由于 gradle 的缓存,构建在本地工作,并且由于 Jenkins 正在使用新的存储库而远程失败。
鉴于从 git repo 的干净拉取开始的要求,执行将构建 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 在运行时将它们放在类路径中。未能添加依赖项BuildConfig.groovy
不会引发编译时错误,但会在运行时因没有类定义而崩溃。
然而,模块化构建的好处,尤其是它已经为代码组织带来的纪律,以及知道我们的应用程序代码的很大一部分与框架无关的舒适性,这些不便都是值得的。
希望这对其他人有帮助。
推荐阅读
- python - PyCharm venv 失败:'没有这样的选项:--build-dir'
- python - python中的TPOT错误无法使用具有不同长度的切片索引器进行设置
- pip - 使用 pip 降级或安装早期版本的软件包
- c++ - 为什么即使我放了一个 break 语句,我的程序也会一直循环
- javascript - 设备显示未定义
- laravel - 如何在 laravel Eloquent 中忽略大小写和空格
- r - 功能...故障(malcoder!),包括group_by和export
- android - 此 Android 代码按什么顺序运行?
- python-3.x - 在几秒钟内获得大量数字以达到平均值、最大值和最小值时,如何转换为日期时间格式?
- express - 使用 express 设置服务器