在进入Jenkins的下一个阶段之前,如何等待Docker容器中的MySQL数据库迁移完成

时间:2019-05-24 06:52:57

标签: docker jenkins

在我的Jenkins文件中,我的管道有几个阶段。在其中一个阶段中,我使用Docker来启动MySQL数据库,然后运行一些数据库迁移以设置数据库表和一些种子数据。在接下来的Jenkins阶段,我进行了一些单元测试,这些测试需要与数据库进行通信,并且所有单元测试都在Docker外部进行。问题在于Jenkins阶段在迁移在上一个阶段完成之前开始,因此单元测试将失败,因为数据库表尚未准备就绪。

我尝试的是让代码执行等待一定的时间,直到迁移完成。但是等待时间是硬编码的,我认为这是不灵活的,如果迁移花费的时间超过等待时间,则会导致管道失败。

请在下面找到我当前的代码:

stage('Bring up MySQL Docker') {
   steps {
      sh 'pwd'
      sh 'sudo npm run playpen-stop'
      // this starts a docker container to spin up a MySQL database and run migraions
      sh 'sudo npm run playpen-start'
   }
}

stage('Unit testing backend/products') {
   when {
      expression { GIT_CHANGES.contains('backend/products') == true }
   }
   steps {
      dir ('backend/products') {
         sh 'pwd'
         //todo: this is a hack to wait until migrations are complete
         sh 'sleep 40'
         //todo: hack to fix permissioning issues
         sh 'sudo rm -rf node_modules/'
         sh 'sudo DOTENV=.env.playpen npm run test'
       }
     }
  }

1 个答案:

答案 0 :(得分:0)

jenkins documentation中的解决方法如下:

 sh 'while ! mysqladmin ping -hdb --silent; do sleep 1; done'

这应该很容易适应。但是仍然不是一个很好的解决方案。