Liquibase 4.30.0 Release Notes

Liquibase 4.30.0 is a major release. Liquibase 4.30.0 contains new capabilities and notable enhancements for Liquibase Open Source and Liquibase Pro users including flow enhancements, validation improvements, clearer error messaging for thrown exceptions, the addition of Anonymous Analytics, and deprecation of the MacOS .dmg installer in favor of installation via Homebrew.

See GitHub formatted release notes for more information. Full changelog: 4.29.2–4.30.0 (November 5, 2024)

Notable Changes

Liquibase Pro

Flow Enhancements: Detect pending changesets, and variable-variables

  • There are two exciting Flow enhancements: the ability to condition action on presence of pending changesets, and the ability to use a global variable inside other global or stage variables, enabling variable-variables within flows.
  • Learn more: Liquibase Flow Files

Liquibase Open Source and Liquibase Pro

Anonymous Analytics

  • Liquibase can now gather anonymous usage analytics when commands are run. No user-specific data will be gathered.
  • For Liquibase OSS users, this functionality is enabled by default, but can be opted-out of before any data is sent. For Liquibase Pro users, this is disabled by default with the ability to opt-in. You can enable or disable sending analytics with the --analytics-enabled property.
  • Gathering anonymous usage analytics allows us to better understand how Liquibase is actually being used by a very wide, diverse set of millions of users.
  • Learn more: Anonymous Analytics

Usability Improvements

  • Avoid ignoring caught exceptions, and instead return the exception and append the reason for better debugging.
  • When using failOnError=false, changesets that failed will now show up in the default output.
  • When using STRICT mode, update-to-tag will now throw an error when there is no tag specified or the tag specified does not exist.
  • Added a Customizer that allows discovery of changesets that are not known to an application. This can be used to prevent an application's startup when discovering new, unexpected changesets before an update is made.

Deprecated: MacOS .dmg installer

  • The MacOS dmg installer no longer ships with release artifacts. Please use the tar.gz or .zip release artifacts, or install via homebrew by running brew install liquibase

Liquibase Pro Changelog

New Features

  • DAT-18202 Implement wildcard check name argument for enable/disable in #2000 by @wwillard7800
  • DAT-17058: Add analytics in #1995 by @liquibot
  • DAT-17568 Added exit command action in #1689 by @wwillard7800
  • DAT-18689: Add extra information to failed changesets summary in #1996 by @filipelautert
  • DAT-18114 Added more logging for formatted SQL parsing in #1994 by @wwillard7800
  • DAT-18455 Add SQL file path to policy checks output in #1944 by @wwillard7800

Changes

  • DAT-17581 Exit with a non-zero if the changelog did not validate in #1870 by @wwillard7800
  • DAT-18540 Create new ReportWriter.open(String path) method that default to no-op in #1962 by @wwillard7800
  • DAT-18092: Use xdg-open to open reports in browser on linux operating systems in #1948 by @abrackx
  • DAT-18531 Clear out DBCL fast check cache before each Flow action in #1933 by @wwillard7800
  • DAT-18362 Handle comments when parsing include/includeAll statements in #1959 by @wwillard7800
  • DAT-18463 Implement a class to be used to capture the start/end positions of a regex check for line number output in #1979 by @wwillard7800
  • DAT-18869: Obfuscate IO arguments in #1999 by @abrackx

Bug Fixes

  • DAT-18819: Fix dropall behavior with snowflake in #1987 by @abrackx
  • DAT-18517 Handle expansion of variables when default values are involved in #1969 by @wwillard7800
  • DAT-18327: improve startup performance in #1972 by @StevenMassaro
  • Fix tests to use new CommandFactory.reset() method in #1952 by @wwillard7800

Security, Driver and Other Updates

  • (#1973) Bump com.fasterxml.jackson.module:jackson-module-jaxb-annotations from 2.17.2 to 2.18.0 by dependabot
  • (#1974) Bump com.fasterxml.jackson.core:jackson-annotations from 2.17.2 to 2.18.0 by dependabot
  • (#1976) Bump com.fasterxml.jackson.core:jackson-databind from 2.17.2 to 2.18.0 by dependabot
  • (#1975) Bump com.fasterxml.jackson.core:jackson-core from 2.17.2 to 2.18.0 by dependabot
  • (#1988) Bump org.apache.maven.plugins:maven-failsafe-plugin from 2.22.2 to 3.5.1 by dependabot
  • (#1991) Bump org.apache.maven.plugins:maven-surefire-plugin from 2.22.2 to 3.5.1 by dependabot
  • (#2003) Bump org.junit.vintage:junit-vintage-engine from 5.10.3 to 5.11.3 by dependabot
  • (#2002) Bump org.junit:junit-bom from 5.10.3 to 5.11.3 by dependabot
  • (#1963) Bump com.networknt:json-schema-validator from 1.5.0 to 1.5.2 by dependabot
  • (#1947) Bump org.yaml:snakeyaml from 2.2 to 2.3 by dependabot
  • (#1984) Bump org.codehaus.gmavenplus:gmavenplus-plugin from 1.13.1 to 4.0.1 by dependabot
  • (#2005) Bump org.nanohttpd:nanohttpd from 2.2.0 to 2.3.1 by dependabot

Liquibase Open Source and Liquibase Pro Changelog

New Features

  • (#6414) When using failOnError=false, changesets that failed will now show up in the default output. Thanks, @filipelautert
  • (#6413) Ensure all failed changesets show in the exceptionChangesets. Previously, output summaries did not include changesets that failed when running failOnError=false (DAT-18689). Thanks, @filipelautert
  • (#6169) When using STRICT mode, update-to-tag will now throw an error when there is no tag specified or the tag specified does not exist. Thanks, @MalloD12
  • (#6410) Modified clob handling in loadData by checking the string passed to a CLOB type column. Thanks, @tati-qalified
    • By default, this value will be interpreted as a path. If the file at that path exists, the file's contents will be inserted into the column. If not, the passed value will be inserted as-is.
  • (#6067) Added additional modes for duplicateFileMode. Thanks, @k4pran
    • INFO - Logs when duplicate changelog files are found at the INFO level
    • DEBUG - Logs when duplicate changelog files are found at the FINE level
    • SILENT - Does not log when duplicate changelog files are detected
  • (#6432) Added a Customizer that allows discovery of changesets that are not known to an application. This can be used to prevent an application's startup when discovering new, unexpected changesets before an update is made. Thanks, @raphw
  • (#6288) Avoid ignoring caught exceptions, and instead return the exception and append the reason for better debugging. Thanks, @asolntsev
  • (#6265) Enhanced include and includeAll to support logicalFilePath (DAT-18350). Thanks, @wwillard7800
  • (#6300) Added method to reset command definitions cache in CommandFactory for testing. Thanks, @wwillard7800
  • (#6280) Undeprecated StringUtil class (DAT-18538). Thanks, @MalloD12
  • (#5223) Improved empty check style by using isEmpty String method. Thanks, @MalloD12

BigQuery

  • (#6294) Suppress UnsupportedClassVersionErrors for Bigquery at info level (DAT-18534). Thanks, @filipelautert

Databricks

  • (#6263) Fix generated column value for Databricks (DAT-18148). Thanks, @filipelautert

Maven

  • (#6129) Support Hashicorp Vault settings in the Maven Plugin POM. Thanks, @wwillard7800

MSSQL

  • (#6138) Added support for include columns in indexes. Thanks, @stephenatwell

PostgreSQL

  • (#6402) Added pg_stat_statements and pg_stat_statements_info views to the list of system tables and views to prevent them from being dropped. Thank you, @rozenshteyn
  • (#6211) Updated PostgreSQL database major and minor versions. Thanks, @MalloD12

Bug Fixes

  • (#6266) Fix CustomTaskRollback rollback bug where it was being called twice. Thanks, @momosetkn
  • (#6205) Removed usage of the deprecated isEmpty() method. Thanks, @anton-erofeev
  • (#6366) Improve startup performance (DAT-18327). Thanks, @StevenMassaro
  • (#6407) Added filterable flag to ChangeLogParameter class (DAT-18811). Thanks, @abrackx
    • This enables users to use label filters such as @some-filter and still have values replaced from global changelog parameters like environment variables.
  • (#6416) When determining the schema name make sure a value was found (DAT-18673). Thanks, @abrackx
  • (#6418) Fix issue where context filters with @ symbols were not being executed properly (DAT-18843). Thanks, @abrackx
  • (#6406) Test assertion code modification. (DAT-17568). Thanks, @wwillard7800
  • (#6429) Check that getPriority method is correct for snapshot generators (DAT-18730). Thanks, @StevenMassaro
  • (#6417) Revert "Remove unneeded inclusion of commons-io in liquibase-core pom.xml". Thanks, @catull
  • (#6385) Do not check for nested database objects when using foreignKeyConstraintExists precondition (DAT-18624). Thanks, @abrackx
  • (#5894) Do not strip "classpath:" when normalizing the path. Thanks, @andrus
  • (#6359) Fix issue where change set with blank ID was allowed to run (DAT-18687). Thanks, @wwillard7800
  • (#6109) Fix classpath loading and incorrect configuration for addForeignKeyConstraint (DAT-18191 and DAT-18192). Thanks, @filipelautert
  • (#6287) Fix NPE when default value is null. Thanks, @asolntsev
  • (#6330) Unhide tag parameter for UpdateTestingRollback command (DAT-18563). Thanks, @MalloD12
  • (#6375) Initialize member variable in method to fix tests. Thanks, @wwillard7800
  • (#6358) Make global argument definitions static so that they are visible across all threads. Thanks, @StevenMassaro
  • (#6309) Fix Locale test. Thanks, @filipelautert
  • (#6463) Fix flakey test (DAT-18921). Thanks, @abrackx
  • (#6165) fix splitting SQL statements containing @begin or #begin. Thanks, @chrstnbrn
    • @begin is now returned as one token instead of two tokens (@ and begin). Same for #begin. This way the logic in processMultiLineSQL that looks for BEGIN does not apply to it and SQL containing @begin or #begin is correctly split into multiple statements.
  • (#4668) Expanded variables in the --sql argument to executeSql so that variables can be substituted in execute-sql --sql-file command. Thanks, @wwillard7800
  • (#6222) Fix: Handle command arguments static behavior. Thanks, @filipelautert
    • Liquibase CLI programmatically can now be called multiple times from different threads.
  • (#6286) Append the cause of the problem to thrown exception for better debugging. Thanks, @asolntsev
  • (#6187) Update JdbcDatabaseSnapshot.java. Thanks, @bmoers
  • (#6409) Added more logging (DAT-18114). Thanks, @wwillard7800

MariaDB

  • (#6241) Verify existence of the lock table to remove 'table does not exist' error messages. Thanks, @wwillard7800

Maven

  • (#6339) Added filter to the command scope so include/excludeObjects parameters get properly applied. Thanks, @Evan-Christensen!
  • (#6332) Updated project variables used in Maven configuration to reduce build warnings. Thanks, @catull!

MySQL

  • (#6128) 'MANUAL' MySQL reserved word added. Thanks, @MalloD12

Oracle

  • (#6305) Allow generateChangelog to run against Oracle databases with blank schema names (DAT-18199). Thanks, @wwillard7800

PostgreSQL

  • (#6350) allow replaceIfExists in Postgres procedures (DAT-18495). Thanks, @StevenMassaro

SQLite

  • (#6341) Fix sqlite hsqldb and environment variable tests (DAT-18646). Thanks, @abrackx

Snowflake

  • (#6391) Handle Snowflake add NOT NULL constraint (DAT-18798). Thanks, @wwillard7800
  • (#6308) Handle offline connection for Snowflake during diff (DAT-18652). Thanks, @wwillard7800

Spring

  • (#6345) When using default schema for MultiTenantSpringLiquibase the log level is now info instead of warning. Thanks, @deblockt
  • (#6261) Fix: do not throw an unchecked exception for SpringBoot. Thanks, @filipelautert

Security, Driver and Other Updates

  • (#6457) Update jreBundle to latest in install4j @abrackx
  • (#6377) Bump org.testcontainers:testcontainers-bom from 1.20.1 to 1.20.2 @dependabot
  • (#6443) Bump org.junit.platform:junit-platform-suite from 1.11.0 to 1.11.3 @dependabot
  • (#6384) Bump org.apache.maven.plugins:maven-javadoc-plugin from 3.10.0 to 3.10.1 @dependabot
  • (#6387) Bump org.codehaus.gmavenplus:gmavenplus-plugin from 3.0.2 to 4.0.1 @dependabot
  • (#6400) Bump org.apache.maven.plugins:maven-surefire-plugin from 3.5.0 to 3.5.1 @dependabot
  • (#6445) Bump org.junit.jupiter:junit-jupiter from 5.11.0 to 5.11.3 @dependabot
  • (#6408) Bump actions/cache from 4.0.2 to 4.1.1 @dependabot
  • (#6444) Bump junit-jupiter.version from 5.11.0 to 5.11.3 @dependabot
  • (#6401) Bump org.apache.maven.plugins:maven-failsafe-plugin from 3.5.0 to 3.5.1 @dependabot
  • (#6399) Bump codex-/return-dispatch from 1 to 2 @dependabot
  • (#6368) Bump org.xerial:sqlite-jdbc from 3.46.1.0 to 3.46.1.3 @dependabot
  • (#6319) Bump groovy.version from 4.0.22 to 4.0.23 @dependabot
  • (#6337) Bump commons-io:commons-io from 2.16.1 to 2.17.0 @dependabot
  • (#6290) Bump org.yaml:snakeyaml from 2.2 to 2.3 @dependabot
  • (#6274) Bump org.jboss.weld.se:weld-se-core from 5.1.2.Final to 5.1.3.Final @dependabot
  • (#6276) Bump org.apache.maven.plugins:maven-surefire-plugin from 3.3.1 to 3.5.0 @dependabot
  • (#6275) Bump org.apache.maven.plugins:maven-failsafe-plugin from 3.3.1 to 3.5.0 @dependabot
  • (#6273) Bump org.apache.maven.plugins:maven-plugin-plugin from 3.13.1 to 3.15.0 @dependabot
  • (#6284) Bump actions/setup-python from 5.1.1 to 5.2.0 @dependabot
  • (#6282) Bump ant.version from 1.10.14 to 1.10.15 @dependabot
  • (#6283) Bump org.apache.commons:commons-lang3 from 3.16.0 to 3.17.0 @dependabot
  • (#6272) Bump org.apache.maven.plugins:maven-javadoc-plugin from 3.8.0 to 3.10.0 @dependabot
  • (#6247) Bump com.microsoft.sqlserver:mssql-jdbc from 12.6.1.jre8 to 12.8.1.jre8 @dependabot
  • (#6246) Bump org.postgresql:postgresql from 42.7.3 to 42.7.4 @dependabot
  • (#6221) Bump org.xerial:sqlite-jdbc from 3.46.0.0 to 3.46.1.0 @dependabot
  • (#6220) Bump org.apache.maven.plugins:maven-install-plugin from 3.1.2 to 3.1.3 @dependabot
  • (#6219) Bump org.apache.maven.plugins:maven-deploy-plugin from 3.1.2 to 3.1.3 @dependabot
  • (#6213) Bump targetMavenVersion from 3.9.8 to 3.9.9 @dependabot
  • (#6202) Bump org.junit.jupiter:junit-jupiter from 5.10.3 to 5.11.0 @dependabot
  • (#6201) Bump org.junit.platform:junit-platform-suite from 1.10.3 to 1.11.0 @dependabot
  • (#6200) Bump spring.version from 5.3.37 to 5.3.39 @dependabot
  • (#6245) Bump actions/delete-package-versions from 3 to 5 @dependabot
  • (#6199) Bump junit-jupiter.version from 5.10.3 to 5.11.0 @dependabot