0

私の要件は、Jenkins ビルド サーバーから何らかの処理を呼び出して、最後のビルド以降にドメイン モデルが変更されたかどうかを判断することです。私は、db-migration プラグインから一連の既存のスクリプトを呼び出すスクリプトを作成することが今後の方法であるという結論に達しました。次に、test-app と war を呼び出すステップでそれを呼び出すことができます。

Grails のドキュメントといくつかの db-migration スクリプトを調べましたが、行き詰まっていることがわかりました。どこから始めればよいかわかりません。誰かが適切な情報源を教えてくれたら本当にありがたいです。ところで、私は Grails に少し慣れていません。2 年前に、6 か月間続いた概念実証プロジェクトを通じて独学を始めました。その後、Eclipse リッチ クライアントの作業に戻りました。私はスクリプトに関与したことはありませんが、それは私の問題の一部かもしれません。

Jenkins evt で必要なことの 1 つは、ビルドに使用されている現在の SVN リビジョン番号を取得することです。提案を歓迎します。

よろしく、ジョン

4

1 に答える 1

1

を実行して新しいスクリプトを作成しますgrails create-script scriptname。データベース移行プラグイン スクリプトは、簡単に再利用できるように構成されています。には多くの共有コードが_DatabaseMigrationCommon.groovyあり、各スクリプトは一意の名前を持つ 1 つのターゲットを定義します。したがって、共有スクリプトまたは任意のスタンドアロン スクリプト (または複数のスクリプト) をインポートして、ターゲットをメソッドのように呼び出すことができます。

デフォルトでは、によって生成されたスクリプトはスクリプトを「create-scriptインポート」します。インストールされたプラグインのディレクトリを指す魔法の変数を利用して、同じことを行うことができます。_GrailsInitincludeTargets << grailsScript("_GrailsInit")

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

_GrailsInit は既にインクルードされているため、これを行うとインクルードを削除できますが、Grails はファイルを 1 回しかインクルードしないため、削除しなくても問題ありません。

次に、ターゲットを定義して、プラグインのターゲットを呼び出すことができます。ターゲットはパラメーターを受け入れることはできませんが、データを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

別のスクリプトからこれを呼び出す場合に備えて、ターゲットの名前を一意mainに変更したことに注意してください。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 に答える