4
votes

I'm having hard problems with a Jenkinsfile with a Pipeline.

I have a master Jenkins which runs in a docker container and other Jenkins slaves, which are also docker containers and some are Virtual Machines (e.g., Windows 10).

I perform the code checkout from Git in the master as first stage and for the further stages.

A Stage name 'Build' performs the generation of maven artifacts. I use one docker image to build my project (based on Maven and Java 9) without sharing any volume across host and container. I pass the source code using the stash / unstash functions.I'm using also the maven-pipeline plugin and the option withMaven(mavenLocalRepo: '')

I'd like to share what I've built on one agent to other agents in a Test stage, but it looks like at this point, stashing of repository is not working (it says: 'no file to stash') and I cannot deploy to a central maven repository (I use Nexus), because there are many concurrent builds possible and the deploy could not be safe.

How can I solve this issue?

Example of pipeline:

pipeline{
  agent none
  stages{
    stage('Checkout Repository'){ 
      agent { node { label 'master' } }
      steps{
        checkout scm 
        stash includes: 'project/', name 'project'
      }
    }
    stage('Build'){
      agent { node { label 'docker-app-builder' } }
      steps{
        unstash "project"
        withMaven(mavenLocalRepo: ".repository"){ sh 'mvn clean install' }
        stash includes: ".repository", name "repository"
      }
    }
  }
  stage("Test){
    steps{
      parallel "docker slave": {
        node("docker-app-tester"){
          unstash "repository"
          unstash "project"
          withMaven(mavenLocalRepo: ".repository"){ ... }                
        }
      },
      "Windows Slave": {
         node("windows-tester"){
          unstash "repository"
          unstash "project"
          withMaven(mavenLocalRepo: ".repository"){ ... }                
        }
      }
    }
 }
}
1
I don't understand this sentence: and I cannot deploy to a central maven repository (I use Nexus), because there are many concurrent builds possible and the deploy could not be safe.... Why can't you deploy to your nexus? What is the problem here?khmarbaise
@khmarbaise if more than one person triggers the build pipeline at almost the same time and one is faster than another, with which deployed artifact is the test running?madduci

1 Answers

3
votes

I've found the problem:

the stash command, in case you want to import the full content from a folder, should be invoked with the path including the slash (/) symbol at the end of the path, otherwise it's interpreted as file and it doesn't import anything.

For instance,

Valid Form:

stash includes: ".repository/", name "repository"

Invalid Form (stash fails):

stash includes: ".repository", name "repository"