Skip to content

ReuseNode – Co gdy o tym zapomnisz w JenkinsPipeline

Last updated on 12 maja 2021

Problem

Próbując dziś budować paczkę RPM (Red Hat Package Manager) z aplikacją – gdzie front-end w React jest uruchamiany z back-endu w Springu – potrzebowałem na wspólnym workspacie zbudować apke z node i jar’a Javowego z wykorzystaniem gotowych obrazów dockerowych. Case wyglądał tak:

stages { 
    stage('Build Fronte-End') {
        docker {
            image 'dockerImageWithNode'
            label 'docker'
        }
    }
    steps {
        script {
            sh """
                npm install
                npm run build
            """
        }
    }
}

stage('Build Backend') {
    agent {
        docker {
            image 'dockerImageWithJavaAndMaven'
            label 'docker'
            reuseNode true
        }
    }
    steps {
        configFileProvider([configFile(fileId: 'maven-setting', targetLocation: '.')]) {
            script {
                maven(command: "clean package ${env.MAVEN_ARGS} test")
                ...steps
            }
        }
    }

... 

Build Mavenowy powinien uruchamomić RPM skrypty i skopiować zbudowany front-end do tej samej lokacji co zbudowany jar. Tylko pojawił się problem:

--- maven-resources-plugin:3.1.0:copy-resources (copy-frontend-to-rpm) @ app ---
...
<strong>skip non existing resourceDirectory /your/app/location/frontend/build</strong>

Mój kolega zauważył, że node id etapu budowy frontendu (’Build Fronte-End’) był inny niż node id budowy backendu, co sugerowało, że maven nie widział plików .js, które miał przenieść do lokalizacji z jarem do spakowania w .rpm. To generowało błąd jak powyżej.

Rozwiązanie

Rozwiązaniem tego problemu było dodanie parametru „reuseNode true” do etapu tworzenia frontendu – mimo tego, że ten parametr znajdował się już na etapie budowy backendu!

stages { 
    stage('Build Fronte-End') {
        docker {
            image 'dockerImageWithNode'
            label 'docker'
            <strong>reuseNode true</strong>
        }
    }

reuseNode

A boolean, false by default. If true, run the container on the node specified at the top-level of the Pipeline, in the same workspace, rather than on a new node entirely.
This option is valid for docker and dockerfile, and only has an effect when used on an agent for an individual stage.

Jenkins Doc

Ze względu na ograniczenia w korporacji niestety nie miałem możliwości utworzenia obrazu dockerowego z nodem, jdk i mavenem. Stąd rozbicie na dwa kroki w pipeline Jenkinsowym.

Published inTechNotka