我在Jenkins上运行了parallel cypress在同一个从机上,它工作了,
我想改变并行的阶段,这样每个阶段将在不同的从机上运行,我该怎么做呢?
例如:
在slave-1上运行"cypress tester A“。
在slave-2上运行"cypress tester B“。
在slave-3上运行"cypress tester C“。
这是我当前的Jenkinsfile:
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命令为:
cypress run --record --parallel --config videoUploadOnPasses=false --ci-build-id $BUILD_TAG发布于 2021-07-03 03:06:24
我能够通过在每个并行阶段中明确地定义agent来使其工作:
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 install和npm start & npx wait-on http://localhost:3000:
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,您可以这样尝试:
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
}
}
}你可以做很多变化,但希望这能让你入门。
https://stackoverflow.com/questions/64013383
复制相似问题