从 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 构建。
迁移方法计划是:
创建 gradle 个模块并将大部分代码移入其中。
让 grails 执行 gradle 构建
Gradle将每个模块的构建结果放入/lib目录
Grails 在 class 路径上找到它们并使用它们
我没有在 BuildConfig.groovy
中指定依赖项,我只是在 grails 代码中使用了 classes 并且在编译阶段一切都在那里应用程序启动。
这在本地非常有效。我可以从源代码管理中重新检出项目开始,执行 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 its
lib/` 目录。
这不适用于 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] ^
这是我试过的方法:
我已经选中了 Jenkins 的复选框,以便将 --refresh-dependencies
标志添加到所有构建周期命令
lib/
目录中还有 3 个其他 jar,已签入 git 源代码管理。 Grails 可以毫无问题地找到它们。
我在 gradle 模块构建的末尾添加了一个打印语句来告诉我 /lib
目录中有什么,并且我都依赖 gradle 正在生成,并且已将其签入源代码管理。它们似乎在那里并且路径与预期的工作区路径匹配。
有什么想法吗?希望地球上有人处理过类似的问题
我们解决了这个问题。由于 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 而爆炸。
然而,模块化构建的好处,尤其是它已经为代码组织带来的纪律,以及知道我们应用程序代码的很大一部分是框架不可知的舒适性,这些不便是值得的。
希望这对其他人有帮助。
我有一个大型项目,我正在帮助迁移到 Grails 3 和 Gradle 从 Grails 2.5。在短期内,我们正在将大部分业务代码转移到与框架无关的 gradle 模块中,然后将它们导入 grails 2.5,最终计划转移到完全 grails-3 构建。
迁移方法计划是:
创建 gradle 个模块并将大部分代码移入其中。
让 grails 执行 gradle 构建
Gradle将每个模块的构建结果放入/lib目录
Grails 在 class 路径上找到它们并使用它们
我没有在
BuildConfig.groovy
中指定依赖项,我只是在 grails 代码中使用了 classes 并且在编译阶段一切都在那里应用程序启动。
这在本地非常有效。我可以从源代码管理中重新检出项目开始,执行 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 its
lib/` 目录。
这不适用于 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] ^
这是我试过的方法:
我已经选中了 Jenkins 的复选框,以便将
--refresh-dependencies
标志添加到所有构建周期命令lib/
目录中还有 3 个其他 jar,已签入 git 源代码管理。 Grails 可以毫无问题地找到它们。我在 gradle 模块构建的末尾添加了一个打印语句来告诉我
/lib
目录中有什么,并且我都依赖 gradle 正在生成,并且已将其签入源代码管理。它们似乎在那里并且路径与预期的工作区路径匹配。
有什么想法吗?希望地球上有人处理过类似的问题
我们解决了这个问题。由于 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 而爆炸。
然而,模块化构建的好处,尤其是它已经为代码组织带来的纪律,以及知道我们应用程序代码的很大一部分是框架不可知的舒适性,这些不便是值得的。
希望这对其他人有帮助。