shell - 如何在每个测试中重复使用预处理 jenkins/groovy

标签 shell go jenkins groovy

我正在使用以下代码来运行我们的投票器,目前我有一个名为 Run Tests 的目标 它使用与 last (lint) 完全相同的步骤,目前我复制它,我认为这不是一个好的解决方案, 有没有什么好的方法可以避免这种重复并根据必要的过程只完成一次?

我需要所有的步骤,直到 cd 到项目

唯一的区别是我运行一个目标

go test ...

第二个

go lint 

之前的所有步骤都是相等的

#!/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
                              """

                }
                }
        )
    }

        }
    }

最佳答案

您可以使用函数并传递 Go 参数:

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}                        
            """
        }
    }
}

更新

如果某些操作可以从 runTestsInDocker 中分离出来,它们可能应该是。

例如setupPipelineEnvironment步骤。我不知道确切的逻辑,但也许它可以在运行测试之前运行一次。

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}                        
            """
        }
    }
}

注意

如果您在远程代理上并行运行,您必须记住在主服务器上执行的设置可能无法在远程从服务器上执行。

关于shell - 如何在每个测试中重复使用预处理 jenkins/groovy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53526996/

相关文章:

reactjs - 通过 ReactJs 代码运行 shell 命令

bash - 具有输入和管理权限的 Applescript 执行 Shell

windows - 窗口 shell 脚本返回码

jenkins - 如何使用 Jenkins 在本地自动部署 Play Framework (2.4) 应用程序?

linux - 为什么我在一个终端上得到 "Suspended (tty output)"而在其他终端上却没有?

http - 无法访问前端应用程序中的自定义响应 header

go - 在 Go slice 中,为什么 s[lo :hi] end at element hi-1?

json - 如何使用 gin gonic 在 Go 中上传多部分文件和 json?

jenkins - 如何检测 Jenkins 声明式管道中哪个并行阶段失败?

jenkins 管道在不同阶段使用不同的节点