0

我在 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 存储库。

4

1 回答 1

1

当 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 表:第一种选择是手动更新DATABASECHANGELOG 表,使对应id/author/filepath 的行的校验和为空值。您需要对已部署变更集的所有环境执行此操作。下次运行 Liquibase 更新命令时,它会将校验和值更新为新的正确值。

干杯!!

于 2021-03-12T10:11:49.687 回答