0
votes

I want to make a Jenkinsfile that will do tests and build my Spring boot Java application. The problem is that my tests require Postgres and RabbitMQ.

What I'm trying to do:

1) Setup Jenkins in docker

## Run Jenkins Docker : 
sudo docker run -d -p 8080:8080 -p 50000:50000 -v /home/jenkins:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -u root jenkins
Bash into docker container

## Bash into new docker container
docker exec -it {{ontainer_ID}} bash   

 ## Download an install docker as root
curl -sSL https://get.docker.com/ | sh
exit

2) Make pipeline to do it:

pipeline {
    agent {
        docker {
            image 'maven:3-alpine'
            args '-v /root/.m2:/root/.m2'
        }
    }
    stages {
        stage('Build') {
            steps {
                sh 'mvn -B -DskipTests clean package'
            }
        }
        stage('Test') {
            steps {
                    /* Run some tests which require PostgreSQL */
                    sh 'mvn test'
            }
            post {
                always {
                    junit 'target/surefire-reports/*.xml'
                }
            }
        }
    }
}

My goal to add postgres and rabbit to be launched on the phase right before tests. I found this https://jenkins.io/doc/book/pipeline/docker/ There is an example how to run additional docker images:

checkout scm
/*
 * In order to communicate with the MySQL server, this Pipeline explicitly
 * maps the port (`3306`) to a known port on the host machine.
 */
docker.image('mysql:5').withRun('-e "MYSQL_ROOT_PASSWORD=my-secret-pw" -p 3306:3306') { c ->
    /* Wait until mysql service is up */
    sh 'while ! mysqladmin ping -h0.0.0.0 --silent; do sleep 1; done'
    /* Run some tests which require MySQL */
    sh 'make check'
}

Looking for some expirienced devops who can help with my setup. Thanks.

1
Please be a bit more specific what the actual problem is..StephenKing
Thanks all, I made a new questions with more details stackoverflow.com/questions/49004884/…Sergey Dudik

1 Answers

1
votes

At the time of writing, declarative pipeline doesn't support such sidecar containers (as described in the docs. So what you found is correct for your problem.

The snippet you found is, however, for scripted pipeline. To use this within your declarative pipeline, you need to wrap it in a script step:

stage('Test') {
  steps {
    docker.image('postgres:9').withRun('<whatever perameters you need>') { c ->
      sh 'mvn test'
    }
  }
}

Of course, replace this with the postgres