首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不同的代理上运行Jenkins parallel cypress?

如何在不同的代理上运行Jenkins parallel cypress?
EN

Stack Overflow用户
提问于 2020-09-22 23:54:09
回答 1查看 1.2K关注 0票数 4

我在Jenkins上运行了parallel cypress在同一个从机上,它工作了,

我想改变并行的阶段,这样每个阶段将在不同的从机上运行,我该怎么做呢?

例如:

在slave-1上运行"cypress tester A“。

在slave-2上运行"cypress tester B“。

在slave-3上运行"cypress tester C“。

这是我当前的Jenkinsfile:

代码语言:javascript
复制
pipeline {
options {
    timeout(time: 15, unit: 'MINUTES')
}
agent {
    docker {
        image 'cypress/base:12.18.2'
        label 'slave-1'
    }
}
parameters {
    string(defaultValue: 'master', description: 'Branch name', name: 'branchName')
}

stages {
    stage('build') {
        steps {
            echo 'Running build...'
            sh 'npm ci'
            sh 'npm run cy:verify'
        }
    }

    stage('cypress parallel tests') {
        environment {
            CYPRESS_RECORD_KEY = 'MY_CYPRESS_RECORD_KEY'
            CYPRESS_trashAssetsBeforeRuns = 'false'
        }
        parallel {
            stage('cypress tester A') {
                steps {
                    echo "Running build ${env.BUILD_ID}"
                    sh "npm run cypress:run"
                }
            }
            stage('cypress tester B') {
                steps {
                    echo "Running build ${env.BUILD_ID}"
                    sh "npm run cypress:run"
                }
            }
            stage('cypress tester C') {
                steps {
                    echo "Running build ${env.BUILD_ID}"
                    sh "npm run cypress:run"
                }
            }
        }

    }
}

post {
    always {
        cleanWs(deleteDirs: true)
        echo 'Tests are finished'
    }
}

}

cypress:run命令为:

代码语言:javascript
复制
cypress run --record --parallel --config videoUploadOnPasses=false --ci-build-id $BUILD_TAG
EN

回答 1

Stack Overflow用户

发布于 2021-07-03 03:06:24

我能够通过在每个并行阶段中明确地定义agent来使其工作:

代码语言:javascript
复制
parallel {
    stage('cypress tester A') {
        agent {
            node: {
                label "slave-1"
            }
        }
        steps {
            echo "Running build ${env.BUILD_ID}"
            sh "npm run cypress:run"
        }
    }
    stage('cypress tester B') {
        agent {
            node: {
                label "slave-2"
            }
        }
        steps {
            echo "Running build ${env.BUILD_ID}"
            sh "npm run cypress:run"
        }
    }
    stage('cypress tester C') {
        agent {
            node: {
                label "slave-3"
            }
        }
        steps {
            echo "Running build ${env.BUILD_ID}"
            sh "npm run cypress:run"
        }
    }
}

然而,我发现的一个缺点是,现在你在每个单独的节点/虚拟机上运行cypress,cypress需要知道在哪里可以找到你的应用程序的运行实例。Cypress在baseUrl上查看cypress.json,看看在哪里可以找到你的应用程序。使用本地主机地址进行开发是很常见的,这意味着在slave-1上运行cypress将查找在slave-1的本地主机上运行的应用程序-但没有一个,所以它将失败。

为了简单起见,我只是在每个节点中执行了一个npm installnpm start & npx wait-on http://localhost:3000

代码语言:javascript
复制
stage('cypress tester A') {
    agent {
        node: {
            label "slave-1"
        }
    }
    steps {
        echo "Running build ${env.BUILD_ID}"
        sh "npm install --silent"
        sh "npm start & npx wait-on http://localhost:3000"
        sh "npm run cypress:run"
    }
}

这显然效率不高,因为您必须在每个节点上安装和运行应用程序。但是,您可以在专用节点(比如slave-0)上设置前一个阶段来安装和服务您的项目,并使用它。在你的Jenkinsfile中,你需要知道那个slave-0的IP,或者你可以get it dynamically within your Jenkinsfile。然后,不是在slave-1、slave-2和slave- 3上安装和运行你的项目,而是只在slave-0上安装和运行它,并使用CYPRESS_BASE_URL环境变量来告诉cypress在哪里可以找到你的应用程序的运行实例。如果slave-0的IP是2222.2222.2222.2222,您可以这样尝试:

代码语言:javascript
复制
pipeline {
    stage ('Serve your project'){
       agent {
           label 'slave-0'
       }
       steps {
           sh 'npm install --silent'
           sh 'npm start & npx wait-on http://localhost:3000'
       }
    }
    stage('Cypress'){
        environment {
            CYPRESS_BASE_URL=2222.2222.2222.2222:3000
            // other env vars
        }
        parallel {
            stage {
               agent {
                   label 'slave-1'
               }
               steps {
                   echo "Running build ${env.BUILD_ID}"
                   sh "npm run cypress:run"
               }
            }
            // more parallel stages
        }
    }
}

你可以做很多变化,但希望这能让你入门。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64013383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档