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
已知信息
- Jenkins执行的命令与手动执行完全一致,手动执行正常
- 两者工作路径相同,文件资源完全一致
- 迁移文件分布:
001.01.00在./files/schema/scripts,其余版本在./files/schema/tables - 无法使用Jenkins Flyway插件
可能原因分析
- Flyway版本差异:手动执行与Jenkins节点使用的Flyway版本不一致,早期Flyway版本默认不会递归扫描指定目录的子目录,导致仅读取
scripts目录下的文件,遗漏tables目录。 - 目录权限问题:Jenkins执行用户对
tables目录无读取权限,无法扫描到其中的迁移文件。 - Flyway历史表异常:数据库中
flyway_schema_history表存在错误记录,标记未执行的版本为已完成,导致Flyway跳过这些版本。 - 路径解析差异: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
相关产品推荐
相关产品推荐

