0
votes

I am having a problem getting Liquibase changeset contexts to play nicely within my Grails application. I have a set of changesets that I would like to only run within a "test" context. However, they are executing every time. I think I have a configuration problem.

The Liquibase documentation states that you just have to add the context="test" attribute to your changeSet. For my proof of concept test I am going to create an insert of a Patient record that I want to insert on Test, but not in my local Development environment. My changeset has the context added:

<changeSet id="v1.1-garbage-1" author="Eric" context="test">
    <insert tableName="patient">
        [...]
    </insert>
</changeSet>

And then within my DataSource.groovy file I define my environments:

environments {
  development {
    dataSource {
        dbCreate = "create" 
        jndiName = "java:comp/env/jdbc/mydatabasename"
    }
  }
  test {
    dataSource {
        dbCreate = "create"
        url = "jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
    }
  }
[...]

So I have two environments, development and test. Then in my Config.groovy, I set up the Grails databasemigration plugin to only have the context "development" (for this proof of concept):

// Database Migration plugin
grails.plugin.databasemigration.updateOnStart = true
grails.plugin.databasemigration.updateOnStartFileNames = ['changelog.xml']
grails.plugin.databasemigration.autoMigrateScripts = ['RunApp', 'TestApp']
grails.plugin.databasemigration.changelogFileName = "changelog.xml"
grails.plugin.databasemigration.development.updateOnStartContexts = ['development']

In that final line, as I understand it, I am telling the databasemigration plugin to set the "development" contexts to 'development', thus when Liquibase executes, it should not run my changeset above, because it is defined within the 'test' context.

Yet when I run the application, my changeset is executed. What have I bungled or missed in the setup?

1

1 Answers

0
votes

My bet is that the last config line is not doing what you expect.

According to the "Multiple DataSource Example" section at http://grails-plugins.github.io/grails-database-migration/docs/manual/guide/3%20Configuration.html this syntax is used for multiple data sources. So, in your case the updateOnStartContexts parameter is going to be applied to a datasource named dataSource_development which you obviously don't have...

Can you try instead the following:

environments {
    development{
        grails.plugin.databasemigration.updateOnStartContexts = ['development']
    }
}