Liquibase校验和验证在通过Jenkins运行时失败,但不是从终端运行



我正在从Linux(Centos(终端运行以下命令

mvn --settings /home/centos/.m2/jenkins/liquibase-settings.xml -e resources:resources -Pdev -Dliquibase.promptOnNonLocalDatabase=false -Dliquibase.defaultSchemaName=MYDEV_SCHEMA liquibase:updateSQL liquibase:update -Dsettings.security=/home/centos/.m2/jenkins/liquibase-security-settings.xml -Dfile.encoding=UTF-8

一切都很顺利。

同样的事情,当我运行通过詹金斯,得到下面,

[ERROR] Failed to execute goal org.liquibase:liquibase-maven-plugin:4.2.0:updateSQL (default-cli) on project project-db: 
[ERROR] Error setting up or running Liquibase:
[ERROR] Validation Failed:
[ERROR]      16 change sets check sum
[ERROR]           db/changelog/ABCD.xml::1234-23::User1 was: 8:67913d9505606eeaaa4998fd594a8ccf but is now: 8:9d985650b579319df50f30732d66909c
[ERROR]           db/changelog/ABCD.xml::1234-78::User1 was: 8:3b3babd5d0712f846402af13ede528f7 but is now: 8:0214bf10acfd160fc6f7d709edab2f2e
[ERROR]           db/changelog/ABCD.xml::1234-142::User1 was: 8:5e3c8fc77fc87f0e9740c0bff717f579 but is now: 8:53094dd8c32ec71b8d76fdd71009c548
[ERROR]           db/changelog/ABCD.xml::1234-200::User1 was: 8:c40ec5c77f7b10961ee550edd756f51f but is now: 8:9bef09eb0681f7ea7bf827b6ac136433
[ERROR]           db/changelog/ABCD.xml::1234-923::User1 was: 8:747cbcbda155679dd2fc1bfcc40991c4 but is now: 8:68c8046c220b8d2eb46ed3ac07ebc2a2
[ERROR]           db/changelog/ABCD.xml::1234-952::User1 was: 8:ecaad2afacf6c61f18e08cb3e235292a but is now: 8:0f7f9087de5cc2e62a96a86988d07a9d
[ERROR]           db/changelog/ABCD.xml::1234-955::User1 was: 8:3ddd6fd25fb4a68accf50190b3ab6738 but is now: 8:8ebed2810bad45ace402f99a957a2c5a
[ERROR]           db/changelog/ABCD.xml::1234-957::User1 was: 8:cc6144775a784d10bc4523dccae02c2e but is now: 8:f0fb84fb3a677e760b5bbad3149e8a17
[ERROR]           db/changelog/ABCD.xml::1234-958::User1 was: 8:b0c71a212949df4863ce622e61315cee but is now: 8:9c6ea7b8f8cb3f6e65871085527fa4c5
[ERROR]           db/changelog/ABCD.xml::1234-960::User1 was: 8:b0966c55100b0a2daae7dd34b7d1849f but is now: 8:5db8b313d34612e1a0035caa73bfae2d
[ERROR]           db/changelog/ABCD.xml::1234-961::User1 was: 8:3e3b96c656362b5bed959428772efbdf but is now: 8:622c3530660fa51cfb806cc454736a8e
[ERROR]           db/changelog/ABCD.xml::1234-964::User1 was: 8:50e079098e7d2be9e1299d68717af265 but is now: 8:13ab1763f5f21e80dc5f7aa714916f01
[ERROR]           db/changelog/ABCD.xml::1234-971::User1 was: 8:fe000258281e834309f9454077e4935d but is now: 8:b238dad4489c9683a3e362820a0ba715
[ERROR]           db/changelog/ABCD.xml::1234-974::User1 was: 8:578a1f3510ac700373b40d83ffbfcdde but is now: 8:3eeb6e61dec24eac4148a6c66033e125
[ERROR]           db/changelog/ABCD.xml::100000011::User1 was: 8:5d0882f8413b6d1063ab023e7c4ec917 but is now: 8:e019e12a40add4536a128ba7b9b06f69
[ERROR]           db/changerequest/ABCD/ABCD.1_Base.xml::ABCD1-100000211::User1 was: 8:9ea4f4f4b5a2db0d1c7e439887e9129c but is now: 8:ebe390648144994233ecd6101e04380c
[ERROR] -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.liquibase:liquibase-maven-plugin:4.2.0:updateSQL (default-cli) on project project-db: 

我的詹金斯密码,

dir("${liquibase_working_dir}"){
configFileProvider([
configFile(fileId: 'liquibase-settings.xml', variable: 'LIQUIBASE_SETTINGS'),
configFile(fileId: 'liquibase-security-settings.xml', variable: 'LIQUIBASE_SECURITY_SETTINGS'),
]) {
withMaven(maven:'maven', mavenSettingsFilePath: "${LIQUIBASE_SETTINGS}") {
sh "mvn -e resources:resources liquibase:updateSQL liquibase:update -P${env_lowercase} "-Dsettings.security=${LIQUIBASE_SECURITY_SETTINGS}" -Dliquibase.promptOnNonLocalDatabase=false -Dliquibase.defaultSchemaName=${schema} -Dfile.encoding=UTF-8"
}
}
sh "cp target/liquibase/migrate.sql target/liquibase/${env_lowercase}-${currentBuild.number}-${schema}-updates.sql"
}

我错过了一个重要的点,没有对liquibase存储库的承诺。

当Liquibase到达变更集时,它会为其计算校验和,并将其存储在DATABASECHANGELOG表中。存储Liquibase校验和的值是为了知道变更集自运行以来是否已被修改。

如果变更集在运行后发生了更改,Liquibase将退出迁移,并显示类似Validation failed: change set check sums <changeset identifer> was: <old checksum> but is now: <newchecksum>的错误消息。这是因为Liquibase无法识别更改的内容,并且数据库的状态可能与更改日志预期的状态不同。

要在变更集中进行有效更改时忽略此错误,有以下选项:

1.clearCheckSums:clearCheckSums清除所有校验和,并使DATABASECHANGELOG表的MD5SUM列无效,以便在下次数据库更新时重新计算。已部署的变更集将重新计算其校验和,并且将部署挂起的变更集。有关此方法的更多详细信息,请访问此链接

2.runOnChange属性:runOnChange属性在第一次看到更改时以及每次修改更改集时执行更改。有关此方法的更多详细信息,请访问此链接

3.runAlways属性:在每次运行时执行变更集,即使它以前运行过。若要使用此选项,请在变更集中设置属性runAlways = true。示例如下:

<changeSet id="liquibase-0" author="liquibase" runAlways="true">
<sqlFile relativeToChangelogFile="true" path="db/file.sql"/>
</changeSet>

4.<validCheckSum>属性:向变更集添加元素。元素的文本内容应包含错误消息中的旧校验和。

5.手动更新DATABASECHANGELOG表:第一个选项是手动更新DATABASE CHANGELog表,以便具有相应id/author/filepath的行的校验和为空。对于已经部署变更集的所有环境,您都需要这样做。下次运行Liquibase update命令时,它会将校验和值更新为新的正确值。

干杯!!

最新更新