jenkins - Jenkins Job DSL:当作业太多且作业完成太快时出现 ConcurrentModificationException
问题描述
我有一个 Jenkins 压力测试来确定我的节点上可以处理多少个执行程序:
// Jenkinsfile
int MAX_JOBS
static String jobTemplate(String name, int i) {
return """
job('$name') {
steps {
shell "/bin/bash /script/for/pressure/tests"
}
}
"""
}
def parallelledStages(int maxJobs) {
def stagesMap = [:]
for (int i = 0; i < maxJobs; i ++) {
def name = "test$i"
def stageStep = {
jobDsl scriptText: jobTemplate(name, i), sandbox: true
build name
}
stagesMap[name] = stageStep
}
return stagesMap
}
pipeline {
agent {
label "pressure_test"
}
stages {
stage("Init variables") {
steps {
script {
MAX_JOBS = 100
}
}
}
stage("Create and start jobs") {
steps {
script {
parallel parallelledStages(MAX_JOBS)
}
}
}
}
}
但实际上,当压力脚本完成太快(我认为不到 30 秒)时,一些子作业根本无法启动,并抛出以下错误:
Processing provided DSL script
java.util.ConcurrentModificationException
at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:719)
at java.util.LinkedHashMap$LinkedKeyIterator.next(LinkedHashMap.java:742)
at java.util.AbstractCollection.addAll(AbstractCollection.java:343)
at java.util.TreeSet.addAll(TreeSet.java:312)
at java.util.TreeSet.<init>(TreeSet.java:160)
at javaposse.jobdsl.plugin.actions.GeneratedObjectsRunAction.getModifiedObjects(GeneratedObjectsRunAction.java:47)
at javaposse.jobdsl.plugin.ExecuteDslScripts.perform(ExecuteDslScripts.java:364)
at jenkins.tasks.SimpleBuildStep.perform(SimpleBuildStep.java:112)
at sun.reflect.GeneratedMethodAccessor462.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.jenkinsci.plugins.workflow.steps.CoreStep$Execution.run(CoreStep.java:92)
at org.jenkinsci.plugins.workflow.steps.CoreStep$Execution.run(CoreStep.java:70)
at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:47)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
种子作业最终会抛出错误:
hudson.AbortException
at javaposse.jobdsl.plugin.ExecuteDslScripts.perform(ExecuteDslScripts.java:374)
at jenkins.tasks.SimpleBuildStep.perform(SimpleBuildStep.java:112)
Also: hudson.AbortException
at javaposse.jobdsl.plugin.ExecuteDslScripts.perform(ExecuteDslScripts.java:374)
at jenkins.tasks.SimpleBuildStep.perform(SimpleBuildStep.java:112)
Caused: java.lang.reflect.InvocationTargetException
Also: hudson.AbortException
at javaposse.jobdsl.plugin.ExecuteDslScripts.perform(ExecuteDslScripts.java:374)
at jenkins.tasks.SimpleBuildStep.perform(SimpleBuildStep.java:112)
Caused: java.lang.reflect.InvocationTargetException
Also: hudson.AbortException
at javaposse.jobdsl.plugin.ExecuteDslScripts.perform(ExecuteDslScripts.java:374)
at jenkins.tasks.SimpleBuildStep.perform(SimpleBuildStep.java:112)
Caused: java.lang.reflect.InvocationTargetException
Caused: java.lang.reflect.InvocationTargetException
at sun.reflect.GeneratedMethodAccessor462.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.jenkinsci.plugins.workflow.steps.CoreStep$Execution.run(CoreStep.java:92)
at org.jenkinsci.plugins.workflow.steps.CoreStep$Execution.run(CoreStep.java:70)
at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:47)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Finished: FAILURE
所以只是想知道:
- 操作员有什么问题
parallel
吗?也许一些 HashMap 应该被锁定? - 我该如何处理这个问题?
解决方案
推荐阅读
- tensorflow - TensorFlow 中的二阶方法
- php - 错误的 url 永无止境的请求 curl php
- php - 通过具有特定条件的 SQL 填充下拉列表
- javascript - 有没有一种更简单(并且仍然有效)的方法来通过最近邻重采样来放大画布渲染?
- c++ - 向量中的内存重新分配
- google-maps-api-3 - Google Place API 的类型过滤器
- docker - 二进制文件不保存在 dockerfile
- laravel - 如何在 laravel 上将文件添加到磁盘?
- python - Pandas:获取跨越多年的 Dateranges 的每年计数
- jquery - Rails 5 / jQuery:点击触摸启动事件不起作用