在我的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'
}
}
}
答案 0 :(得分:0)
jenkins documentation中的解决方法如下:
sh 'while ! mysqladmin ping -hdb --silent; do sleep 1; done'
这应该很容易适应。但是仍然不是一个很好的解决方案。