微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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

一切顺利。

当我通过 Jenkins 运行时,同样的事情,在下面,

[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 列无效,以便在下一次数据库更新时重新计算它们。已部署的变更集将重新计算其校验和,待定变更集将被重新计算部署。有关此方法的更多详细信息,请访问 this link

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

3. runAlways 属性: 在每次运行时执行变更集,即使它之前已经运行过。要使用它,请在您的变更集中设置属性 runAlways = true。示例如下:

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

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

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

干杯!!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。