简体   繁体   中英

How to re-use pre process jenkins/groovy in each test

Im using the following code to run our voter , currently I've one target which is called Run Tests Which use exactly the same steps as the last (lint) , currently I duplicate it which I think is not a good solution , Is there is nice way to avoid this duplication and done it only once as per-requisite process ?

I need all the steps until the cd to the project

The only difference is one target I run

go test ...

and the second

go lint 

All steps before are equal

#!/usr/bin/env groovy

    try {
        parallel(
                'Run Tests': {
                    node {

                        //————————Here we start
                        checkout scm
                        def dockerImage = 'docker.company:50001/crt/deg:0.1.3-09’
                        setupPipelineEnvironment script: this, 
                        measureDuration(script: this, measurementName: 'build') {
                            executeDocker(dockerImage: dockerImage,  dockerWorkspace: '/go/src') {
                                sh """
                                mkdir -p /go/src/github.com/ftr/myGoProj
                                cp -R $WORKSPACE/* /go/src/github.com/ftr/MyGoProj
                                cd  /go/src/github.com/ftr/MyGoProj
                        //————————Here we finish and TEST
                                go test -v ./...                           
                                """
                            }
                        }
                    }
                },
                ‘Lint’: {
               node {
                        //————————Here we start
                        checkout scm
                        def dockerImage = 'docker.company:50001/crt/deg:0.1.3-09’
                        setupPipelineEnvironment script: this, 
                        measureDuration(script: this, measurementName: 'build') {
                            executeDocker(dockerImage: dockerImage,  dockerWorkspace: '/go/src') {
                                sh """
                                mkdir -p /go/src/github.com/ftr/myGoProj
                                cp -R $WORKSPACE/* /go/src/github.com/ftr/MyGoProj
                                cd  /go/src/github.com/ftr/MyGoProj
                        //————————Here we finish and LINT
                               go lint
                              """

                }
                }
        )
    }

        }
    }

You can use function and pass Go arguments:

try {
    parallel(
        'Run Tests': {
            node {
                checkout scm
                runTestsInDocker('test -v ./...')
            }
        },
        'Lint': {
            node {
                checkout scm
                runTestsInDocker('lint')
            }
        }
    )
}


def runTestsInDocker(goArgs) {
    def dockerImage = 'docker.company:50001/crt/deg:0.1.3-09'
    setupPipelineEnvironment script: this, 
    measureDuration(script: this, measurementName: 'build') {
        executeDocker(dockerImage: dockerImage,  dockerWorkspace: '/go/src') {
            sh """
            mkdir -p /go/src/github.com/ftr/myGoProj
            cp -R $WORKSPACE/* /go/src/github.com/ftr/MyGoProj
            cd  /go/src/github.com/ftr/MyGoProj
            go ${goArgs}                        
            """
        }
    }
}

Update

If some actions can be separated out of runTestsInDocker they probably should be.

For example setupPipelineEnvironment step. I don't know exact logic but maybe it can be run once before running test.

node {
    stage('setup') {
        setupPipelineEnvironment script: this
    }
    stage ('Tests') {
        parallel(
            'Run Tests': {
                node {
                    checkout scm
                    runTestsInDocker('test -v ./...')
                }
            },
            'Lint': {
                node {
                    checkout scm
                    runTestsInDocker('lint')
                }
            }
        )
    }
}


def runTestsInDocker(goArgs) {
    def dockerImage = 'docker.company:50001/crt/deg:0.1.3-09'
    measureDuration(script: this, measurementName: 'build') {
        executeDocker(dockerImage: dockerImage,  dockerWorkspace: '/go/src') {
            sh """
            mkdir -p /go/src/github.com/ftr/myGoProj
            cp -R $WORKSPACE/* /go/src/github.com/ftr/MyGoProj
            cd  /go/src/github.com/ftr/MyGoProj
            go ${goArgs}                        
            """
        }
    }
}

Note

If you are running parallel on remote agents you must remember that setup performed on master may be not aviailable on remote slave.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM