I am implementing a build system for PHP and need to execute a Build step , which needs repository checkout and run composer. Now this is working fine inside the docker container. As the next stage, I need to run automated test cased written in PHPUnit, which needs MySQL, Redis and Elasticsearch installation. Currently I am using CircleCI for the build process and there it is just a matter of pulling different docker images and executing migrations. I am trying to the same in Jenkins, but as soon as I am out of the MySQL stage, the docker container has been removed and so there is no point in running migrations.
How can I run the MySQL sever persitantly so that all the scripts will be executed there ?
Or the better approach is to build a Docker container with MySQL, Redis and Elasticsearch and then run all the steps there ?
My current Jenkins file looks like the following
pipeline {
agent any
stages {
stage('Build') {
agent {
docker {
image 'cutomname/application:7.1'
args '-u root:root'
}
}
steps {
checkout([
$class: 'GitSCM',
branches: [[name: '*/master']],
doGenerateSubmoduleConfigurations: false,
extensions: [],
submoduleCfg: [],
userRemoteConfigs: [
[credentialsId: 'token', url: 'g...@github.com:MyCutstomOrg/repository.git']]
])
sh 'yum install -y sudo'
sh 'cp -f .env.circleci .env'
sh 'chmod 755 ./build/database-migrations.sh'
sh 'chmod a+rw -R storage'
sh 'composer install --prefer-dist --no-interaction --no-progress'
sh 'sudo npm install --progress=false'
}
}
stage('Starting MySQL') {
agent {
docker {
image 'mysql:5.6'
}
}
environment {
MYSQL_ALLOW_EMPTY_PASSWORD='yes'
}
steps {
sh 'echo MySQL server started successfully'
}
}
stage('Database Migration') {
steps {
sh './build/database-migrations.sh'
}
}
}
}