You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins Shell执行Flyway迁移未运行全部版本文件问题求助

Jenkins执行Flyway迁移遗漏版本文件的排查与解决

问题描述

通过Jenkins流水线执行Flyway数据库迁移时,多个版本文件被跳过,导致后续重复迁移因依赖字段缺失报错。手动在Jenkins节点执行相同命令时,所有版本文件均正常运行。

执行命令

Jenkins中使用的Shell命令:

$(${FLYWAY_PATH} migrate -url=jdbc:postgresql://${RDS_HOST}/${RDS_DB} -user=deployer -password=${DEPLOYER_INFO} -table=${FLYWAY_TABLE} -locations=filesystem:./${FLYWAY_SOURCE} -createSchemas=true -baselineOnMigrate=true -schemas=${FLYWAY_SCHEMA} -placeholders.db_schema=${FLYWAY_SCHEMA} -placeholders.db_user_pw=${FLYWAY_PLACEHOLDER} -placeholders.db_create_named_user=${FLYWAY_CREATE_USERS} -placeholders.deployer_pwd=${DEPLOYER_INFO} -validateMigrationNaming=true)

实际执行示例:

/usr/local/bin/flyway migrate -url=jdbc:postgresql://vbs.us-east-1.rds.amazonaws.com/finalp -user=deployer -password=Tqj -table=flyway_schema_history -locations=filesystem:./files/schema -createSchemas=true -baselineOnMigrate=true -schemas=_194_jenkins_beta -placeholders.db_schema=_194_jenkins_beta -placeholders.db_user_pw=3HVB -placeholders.db_create_named_user=true -placeholders.deployer_pwd=vTqj

异常现象

  • 手动执行:所有版本文件依次运行,包括001.01.01到001.02.01的版本及重复迁移文件
  • Jenkins执行:仅运行001.01.00版本和重复迁移文件,跳过中间多个版本,导致重复迁移因字段缺失报错:
    Caused by: Migration R__50_group_rules.sql failed
    SQL State  : 42703
    Error Code : 0
    Message    : ERROR: column f.last_alert_groups does not exist
    

已知信息

  1. Jenkins执行的命令与手动执行完全一致,手动执行正常
  2. 两者工作路径相同,文件资源完全一致
  3. 迁移文件分布:001.01.00在./files/schema/scripts,其余版本在./files/schema/tables
  4. 无法使用Jenkins Flyway插件

可能原因分析

  1. Flyway版本差异:手动执行与Jenkins节点使用的Flyway版本不一致,早期Flyway版本默认不会递归扫描指定目录的子目录,导致仅读取scripts目录下的文件,遗漏tables目录。
  2. 目录权限问题:Jenkins执行用户对tables目录无读取权限,无法扫描到其中的迁移文件。
  3. Flyway历史表异常:数据库中flyway_schema_history表存在错误记录,标记未执行的版本为已完成,导致Flyway跳过这些版本。
  4. 路径解析差异:Jenkins环境中相对路径的解析与手动执行存在细微差异,导致Flyway无法正确定位子目录。

解决办法

1. 统一Flyway版本

对比手动执行和Jenkins节点的Flyway版本,确保两者一致:

  • 手动执行:flyway -v查看版本
  • Jenkins流水线中添加步骤:
    ${FLYWAY_PATH} -v
    

若版本不一致,将Jenkins节点的Flyway升级至与手动执行相同的版本。

2. 显式指定所有迁移文件目录

修改-locations参数,明确包含所有存放迁移文件的子目录,避免依赖递归扫描:

-locations=filesystem:./files/schema/scripts,filesystem:./files/schema/tables

如果使用的Flyway版本支持通配符(Flyway 6.0+),也可以用:

-locations=filesystem:./files/schema/**

3. 验证Jenkins用户的目录权限

在Jenkins流水线中添加权限检查步骤,确认所有迁移文件可被读取:

# 查看目录权限
ls -ld ./files/schema/scripts ./files/schema/tables
# 列出所有迁移文件
find ./files/schema -name "*.sql"

若存在权限问题,调整目录或文件的权限,确保Jenkins执行用户(通常为jenkins)有读权限。

4. 检查并修复Flyway历史表

登录数据库,查看flyway_schema_history表,确认是否存在错误标记为SUCCESS的版本记录:

SELECT version, description, type, status FROM flyway_schema_history WHERE schema_version = '_194_jenkins_beta';

若存在未实际执行但标记为成功的版本,删除对应记录后重新执行迁移(操作前请备份数据)。

5. 开启Flyway调试日志

在命令中添加-X参数开启调试模式,查看Flyway的文件扫描过程:

${FLYWAY_PATH} migrate -X -url=jdbc:postgresql://${RDS_HOST}/${RDS_DB} ...(其余参数)

从日志中可以看到Flyway检测到的所有迁移文件,定位是否存在扫描遗漏的情况。


内容的提问来源于stack exchange,提问作者Juan Luna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 20:17:55