T code
T code

Reputation: 447

Run Jenkins stage on different nodes

I have the following Jenkinsfile of a multibranch pipeline architecture

#!/usr/bin/groovy

pipeline {
    agent {
        node {
            label 'ubuntu'
            customWorkspace "/src/$BUILD_NUMBER"
        }
    }
    environment {
        SRC_DIR = "$WORKSPACE"
        BUILD_DIR="/build/$BUILD_NUMBER"
    }

    stages {
        stage('Build') {
            steps {
                dir(BUILD_DIR) {
                    sh '$SRC_DIR/build.sh'
                }
            }
        }

        stage('Test') {
            steps {
                dir(BUILD_DIR) {
                   sh '$SRC_DIR/test.sh'
                }
            }
        }
    }
}

I am trying to run the 'Build' stage on Ubuntu and Red Hat nodes in parallel, and the 'Test' stage on the Ubuntu node only.

Can anybody help me in specifying how to choose which stage are run on which nodes. I found few solutions online but they recommended rewriting the build stage twice: once for the Red Hat node and the other for the Ubuntu node. Isn't there a way to do this without code duplication ?

Thank you very much

Upvotes: 7

Views: 17361

Answers (2)

Bobby
Bobby

Reputation: 166

A bit late to the party, but still ... You can use script {} so you can create the label you need. Something like this:

stage('Build') {
    steps {
        script {
            dev label = 'RHEL'
            if (env.ENV == 'ubuntu') {
                label = 'Ubuntu'
            }
            node("${label}") {
                dir(BUILD_DIR) {
                    sh '$SRC_DIR/build.sh'
                }
            }
        }
    }
}

Upvotes: 0

Surendra Deshpande
Surendra Deshpande

Reputation: 428

Sure, you would want to label your slave nodes somehow. Basically configure all the node on Jenkins and give them meaningful names.

  stage('Build') {
   steps {
     node('os_linux') {
       sh './build.sh' 
     }
     node('os_redhat') {
       sh './build.sh' 
   }
  }

This will run the tasks in serial, and Jenkinsfile syntax also supports executing commands in parallel on different nodes.

Thanks,

Upvotes: 9

Related Questions