Reuse block string without processing it on the fly

Viewed 27

I have a block of code that work fine at the moment. But reuse that code is a little ugly.

pipeline {
    agent any
    stages {
        stage('Stage 1') {
            steps {
                script {
                    withCredentials([
                        gitUsernamePassword(credentialsId: 'jenkins-credentials', gitToolName: 'Default', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD')
                    ]) {
                        sh '''#!/bin/bash
                        export GIT_USERNAME=${GIT_USERNAME};
                        export GIT_PASSWORD=${GIT_PASSWORD};
                        export PROYECT_DIRECTORY=${PROYECT_DIRECTORY};
                        export CHECKOUT_POINT=${CHECKOUT_POINT};
                        export GIT_HTTPS_REPO_DEPLOY=${GIT_HTTPS_REPO_DEPLOY};
                        export MARIADB_HOSTNAME=${MARIADB_HOSTNAME};

                        ./scripts/awesome_script.sh
                        '''
                    }
                }
            }
        }
    }
}

The problem is when I apply if statements to use diferents scripts bash inside sh() block. The script ./scripts/awesome _script.sh need that variables exported. Therefore the code looks like this.

script {
                    withCredentials([
                        gitUsernamePassword(credentialsId: 'jenkins-credentials', gitToolName: 'Default', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD')
                    ]) {
                        sh '''#!/bin/bash
                        export GIT_USERNAME=${GIT_USERNAME};
                        export GIT_PASSWORD=${GIT_PASSWORD};
                        export PROYECT_DIRECTORY=${PROYECT_DIRECTORY};
                        export CHECKOUT_POINT=${CHECKOUT_POINT};
                        export GIT_HTTPS_REPO_DEPLOY=${GIT_HTTPS_REPO_DEPLOY};
                        export MARIADB_HOSTNAME=${MARIADB_HOSTNAME};

                        ./scripts/awesome_script.sh
                        '''
                        if(env.APP_ENV == 'testing'){
                            sh '''#!/bin/bash
                            export GIT_USERNAME=${GIT_USERNAME};
                            export GIT_PASSWORD=${GIT_PASSWORD};
                            export PROYECT_DIRECTORY=${PROYECT_DIRECTORY};
                            export CHECKOUT_POINT=${CHECKOUT_POINT};
                            export GIT_HTTPS_REPO_DEPLOY=${GIT_HTTPS_REPO_DEPLOY};
                            export MARIADB_HOSTNAME=${MARIADB_HOSTNAME};

                            ./scripts/awesome_script_2.sh
                            '''
                        }
                    }
                }

Very ugly, right ? :/ :(

What I am looking is something similar like to this, but with correct syntax:

script {
                    env.STRING_BLOCK_WITHOUT_PROCESSING = '''
                        export GIT_USERNAME=${GIT_USERNAME};
                        export GIT_PASSWORD=${GIT_PASSWORD};
                        export PROYECT_DIRECTORY=${PROYECT_DIRECTORY};
                        export CHECKOUT_POINT=${CHECKOUT_POINT};
                        export GIT_HTTPS_REPO_DEPLOY=${GIT_HTTPS_REPO_DEPLOY};
                        export MARIADB_HOSTNAME=${MARIADB_HOSTNAME};
                    ''';
                    
                    withCredentials([
                        gitUsernamePassword(credentialsId: 'jenkins-credentials', gitToolName: 'Default', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD')
                    ]) {
                        sh '''#!/bin/bash
                        ${STRING_BLOCK_WITHOUT_PROCESSING}

                        ./scripts/awesome_script.sh
                        '''
                        if(env.APP_ENV == 'testing'){
                            sh '''#!/bin/bash
                            ${STRING_BLOCK_WITHOUT_PROCESSING}
                            
                            ./scripts/awesome_script_2.sh
                            '''
                        }
                    }
                }

Thanks for all help you can give me. <3

1 Answers

How about something like the one below. You can wrap the withEnv block with the withCredentials block if you want.

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                script {
                    def CHECKOUT_POINT="checkpoint"
                    def PROYECT_DIRECTORY = "directoryyy"
                    def env = "prod"
                    
                    withEnv(["PROYECT_DIRECTORY=${PROYECT_DIRECTORY}", "CHECKOUT_POINT=${CHECKOUT_POINT}"]) {
                        if(env == "test") {
                            sh'''
                                echo DIR is $PROYECT_DIRECTORY
                                echo Checkpoint is $CHECKOUT_POINT
                            '''
                        } else { 
                            sh'''
                                echo DIR is $PROYECT_DIRECTORY
                                echo Checkpoint is $CHECKOUT_POINT
                            '''
                        }
                    }
                }
            }
        }
    }
}
Related