我的要求是从Jenkins构建服务器调用一些处理,以确定域模型自上次构建以来是否发生了更改。我得出的结论是,前进的方向是编写一个脚本,该脚本将从db迁移插件中调用一系列现有脚本。然后,我可以在调用test-app和war的步骤中调用它。
我查看了Grails文档,查看了一些db--迁移脚本,我发现我陷入了困境--不知道从哪里开始尝试。如果有人能告诉我任何合适的消息来源,我会非常感激的。顺便说一句,我在Grails有点生疏了。两年前通过“概念证明”项目开始自学,历时6个月。然后返回到Eclipse富客户端工作。这可能是我的问题的一部分,虽然我从来不参与脚本。
在Jenkins evt中,我需要的一件事是获取当前用于构建的SVN修订号。欢迎提出建议。
你好,约翰
发布于 2013-01-10 12:43:45
通过运行grails create-script scriptname
创建一个新脚本。数据库迁移插件脚本被配置为易于重用。_DatabaseMigrationCommon.groovy
中有很多共享代码,每个脚本都定义了一个具有唯一名称的目标。因此,您可以导入共享脚本或任何独立脚本(或多个脚本),并像调用方法一样调用目标。
默认情况下,create-script
生成的脚本通过includeTargets << grailsScript("_GrailsInit")
“导入”_GrailsInit
脚本,您也可以使用指向已安装插件目录的神奇变量进行相同的操作:
includeTargets << new File("$databaseMigrationPluginDir/scripts/DbmGenerateChangelog.groovy")
如果这样做,您可以删除_GrailsInit的包含,因为它已经包含了,但是如果没有,那就好了,因为Grails只包含了一次文件。
然后你可以定义你的目标,并调用任何插件的目标。目标不能接受参数,但是可以将数据添加到argsMap
(这是Grails从解析的命令行参数中创建的映射)来模拟用户指定的args。请注意,传递给您的脚本的任何arg都会被数据库迁移插件的脚本看到,因为它们使用相同的argsMap
。
下面是一个示例脚本,它只执行与dbm-generate-changelog
相同的操作,但是添加了一个前后消息:
includeTargets << new File("$databaseMigrationPluginDir/scripts/DbmGenerateChangelog.groovy")
target(foo: "Just calls dbmGenerateChangelog") {
println 'before'
dbmGenerateChangelog()
println 'after'
}
setDefaultTarget foo
请注意,我将目标从main
重命名为foo
,因此它是唯一的,以防您想要从另一个脚本调用它。
作为使用args的一个示例,下面是一个修改后的版本,如果没有提供,则指定默认的changelog名称:
println 'before'
if (!argsMap.params) {
argsMap.params = ['foo2.groovy']
}
dbmGenerateChangelog()
println 'after'
编辑:下面是一个更完整的示例,它将diff的输出捕获为字符串:
includeTargets << new File("$databaseMigrationPluginDir/scripts/_DatabaseMigrationCommon.groovy")
target(foo: "foo") {
depends dbmInit
def configuredSchema = config.grails.plugin.databasemigration.schema
String argSchema = argsMap.schema
String effectiveSchema = argSchema ?: configuredSchema ?: defaultSchema
def realDatabase
boolean add = false // booleanArg('add')
String filename = null // argsList[0]
try {
printMessage "Starting $hyphenatedScriptName"
ByteArrayOutputStream baos = new ByteArrayOutputStream()
def baosOut = new PrintStream(baos)
ScriptUtils.executeAndWrite filename, add, dsName, { PrintStream out ->
MigrationUtils.executeInSession(dsName) {
realDatabase = MigrationUtils.getDatabase(effectiveSchema, dsName)
def gormDatabase = ScriptUtils.createGormDatabase(dataSourceSuffix, config, appCtx, realDatabase, effectiveSchema)
ScriptUtils.createAndPrintFixedDiff(gormDatabase, realDatabase, realDatabase, appCtx, diffTypes, baosOut)
}
}
String xml = new String(baos.toString('UTF-8'))
def ChangelogXml2Groovy = classLoader.loadClass('grails.plugin.databasemigration.ChangelogXml2Groovy')
String groovy = ChangelogXml2Groovy.convert(xml)
// do something with the groovy or xml here
printMessage "Finished $hyphenatedScriptName"
}
catch (e) {
ScriptUtils.printStackTrace e
exit 1
}
finally {
ScriptUtils.closeConnection realDatabase
}
}
setDefaultTarget foo
https://stackoverflow.com/questions/14262375
复制相似问题