0

我的要求是从 Jenkins 构建服务器调用一些处理,以确定自上次构建以来域模型是否已更改。我得出的结论是,前进的方向是编写一个脚本,该脚本将从 db-migration 插件中调用一系列现有脚本。然后我可以在调用 test-app 和 war 的步骤中调用它。

我查看了 Grails 文档和一些 db-migration 脚本,我发现我被困住了——不知道从哪里开始尝试。如果有人能指出任何合适的来源,我将不胜感激。顺便说一句,我对 Grails 有点生疏。两年前开始通过概念验证项目自学,持续了 6 个月。然后又回到了 Eclipse 富客户端工作。这可能是我的问题的一部分,尽管我从不参与脚本。

我在 Jenkins evt 中需要做的一件事是掌握当前用于构建的 SVN 修订号。欢迎提出建议。

问候,约翰

4

1 回答 1

1

通过运行创建一个新脚本grails create-script scriptname。数据库迁移插件脚本配置为易于重用。里面有很多共享代码_DatabaseMigrationCommon.groovy,每个脚本都定义了一个具有唯一名称的目标。因此,您可以导入共享脚本或任何独立脚本(或多个脚本)并像调用方法一样调用目标。

默认情况下,通过create-script“导入”脚本生成的_GrailsInit脚本includeTargets << grailsScript("_GrailsInit"),您也可以这样做,利用指向已安装插件目录的魔法变量:

includeTargets << new File("$databaseMigrationPluginDir/scripts/DbmGenerateChangelog.groovy")

如果您这样做,您可以删除 _GrailsInit 的包含,因为它已经包含在内,但如果您不这样做,那很好,因为 Grails 只包含一次文件。

然后你可以定义你的目标并调用任何插件的目标。目标不能接受参数,但您可以将数据添加到argsMap(这是 Grails 从解析的命令行参数创建的映射)以模拟用户指定的参数。请注意,传递给脚本的任何参数都将被数据库迁移插件的脚本看到,因为它们使用相同的argsMap.

dbm-generate-changelog这是一个示例脚本,它的作用与之前和之后的消息相同,但添加了一条消息:

includeTargets << new File("$databaseMigrationPluginDir/scripts/DbmGenerateChangelog.groovy")

target(foo: "Just calls dbmGenerateChangelog") {
   println 'before'
   dbmGenerateChangelog()
   println 'after'
}

setDefaultTarget foo

请注意,我将目标从重命名为mainto,foo因此它是唯一的,以防您想从另一个脚本中调用它。

作为使用 args 的示例,下面是一个修改后的版本,如果没有提供,则指定默认的更改日志名称:

println 'before'
if (!argsMap.params) {
   argsMap.params = ['foo2.groovy']
}
dbmGenerateChangelog()
println 'after'

编辑:这是一个更完整的示例,它将 dbm-gorm-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
于 2013-01-10T20:43:45.010 回答