jenkinsjenkins-pipelinejenkins-docker

Reuse agent (docker container) in Jenkins between multiple stages


I have a pipeline with multiple stages, and I want to reuse a docker container between only "n" number of stages, rather than all of them:

pipeline {
   agent none

   stages {
       stage('Install deps') {
            agent {
                docker { image 'node:10-alpine' }
            }

            steps {
                sh 'npm install'
            }
        }

       stage('Build, test, lint, etc') {
            agent {
                docker { image 'node:10-alpine' }
            }

            parallel {
                stage('Build') {
                    agent {
                        docker { image 'node:10-alpine' }
                    }

                    // This fails because it runs in a new container, and the node_modules created during the first installation are gone at this point
                    // How do I reuse the same container created in the install dep step?
                    steps {
                        sh 'npm run build'
                    }
                }

                stage('Test') {
                    agent {
                        docker { image 'node:10-alpine' }
                    }

                    steps {
                        sh 'npm run test'
                    }
                }
            }
        }


        // Later on, there is a deployment stage which MUST deploy using a specific node,
        // which is why "agent: none" is used in the first place

   }
}

Solution

  • You can use scripted pipelines, where you can put multiple stage steps inside a docker step, e.g.

    node {
      checkout scm
      docker.image('node:10-alpine').inside {
        stage('Build') {
           sh 'npm run build'
         }
         stage('Test') {
           sh 'npm run test'
         }
      }
    }
    

    (code untested)