Flyway with Jenkins - 无法解析位置

Posted

技术标签:

【中文标题】Flyway with Jenkins - 无法解析位置【英文标题】:Flyway with Jenkins - Unable to resolve location 【发布时间】:2019-06-16 23:10:10 【问题描述】:

我正在尝试通过在其中一个阶段运行 shell 命令将 db 迁移与 ci/cd 管道中的Flyway 集成。 (由于我不允许向管道添加任何新插件,所以不能使用 Flyway 插件)

我试过这样:

    stage('migrate-sql') 
      steps 
        sh """
          docker run --rm \
          -v /GetShorty/Apis/Sql:/flyway/sql \
          boxfuse/flyway:5.2.4 \
          -url=jdbc:postgresql://****:5432/**** \
          -user=**** \
          -password=**** \
          -baselineOnMigrate=false \
          -locations=/GetShorty/Apis/Sql \
          -connectRetries=60 \
          migrate
        """
      
    

但没有应用迁移,因为它似乎找不到迁移文件夹

WARNING: Unable to resolve location /GetShorty/Apis/Sql

Successfully validated 0 migrations (execution time 00:00.378s)

Current version of schema "public": << Empty Schema >>

Schema "public" is up to date. No migration necessary.

考虑如下投影结构:

知道这里可能出了什么问题吗?

【问题讨论】:

【参考方案1】:

docker 卷设置正在将主机上的/GetShorty/Apis/Sql 目录挂载到容器内的/flyway/sql 目录:

-v /GetShorty/Apis/Sql:/flyway/sql

Flyway 在容器内运行,因此位置标志需要是里面的目录:

-locations=/flyway/sql

【讨论】:

我一整天都意识到了这个问题,并且已经做出了改变。奇怪的是,如果我在本地运行 docker 命令,它会应用迁移,但如果它是通过 jenkins 运行的,则不会【参考方案2】:

偶然发现这个issue 我意识到我面临着类似的问题。

我设法解决它的方法是在名为flyway 的根项目中创建一个单独的文件夹,其中包含一个包含所有迁移的sql 文件夹和以下Dockerfile

FROM boxfuse/flyway:5.2.4

COPY ./sql ./sql

回到 jenkins 文件,我添加了一个新步骤来构建 docker 映像:

  DOCKER_IMAGE_FLYWAY = "flyway"

  stages 
    stage('build docker images') 
      steps 
        script 
          dockerImage_flyway = docker.build("$DOCKER_REGISTRY/$DOCKER_PROJECT/$DOCKER_IMAGE_FLYWAY:$env.BUILD_NUMBER", "flyway")
        
      
    

并修改迁移阶段以使用该图像

stage('migrate-sql') 
      steps 
        sh """
            docker run --rm \
            "$DOCKER_REGISTRY/$DOCKER_PROJECT/$DOCKER_IMAGE_FLYWAY:$env.BUILD_NUMBER" \
            -url=jdbc:postgresql://****:5432/**** \
            -user=**** \
            -password=**** \
            -baselineOnMigrate=false \
            -schemas=**** \
            -connectRetries=60 \
            migrate
          """
      
    

现在就像一个魅力。

【讨论】:

以上是关于Flyway with Jenkins - 无法解析位置的主要内容,如果未能解决你的问题,请参考以下文章

使用 Docker 和 Jenkins 自动化 Flyway 迁移

使用 Jenkins 将 Flyway 集成到现有数据库中

ORA-01017: Flyway 在 Jenkins 上抛出的用户名/密码无效

Heroku Postgres 升级后 Flyway 无法连接到数据库

flyway with spring boot and gradle--org.flywaydb.core.Flyway: 方法 <init>()V not found

如何使用 Flyway 从 DB Schema 导出或导入数据