简体   繁体   中英

Jenkins Maven Pipeline

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.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM