From bacca232fecf217deaa0918b162c148d4ea63855 Mon Sep 17 00:00:00 2001 From: even <827656971@qq.com> Date: Wed, 25 Jun 2025 17:08:07 +0800 Subject: [PATCH] =?UTF-8?q?AFL=E7=9B=B8=E5=85=B3work=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worker/afl/AFLSlotCompileWorker.java | 5 +-- .../process/engine/worker/afl/AFLWorker.java | 25 ++++++++++----- .../engine/worker/base/DockerWorker.java | 31 +++++++++++++------ 3 files changed, 42 insertions(+), 19 deletions(-) diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/afl/AFLSlotCompileWorker.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/afl/AFLSlotCompileWorker.java index 9e8d9be5..a38475ad 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/afl/AFLSlotCompileWorker.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/afl/AFLSlotCompileWorker.java @@ -95,6 +95,7 @@ public class AFLSlotCompileWorker extends DockerWorker { String commandScript = commandScriptObj instanceof String ? ((String) commandScriptObj) : null; allCommand += commandScript+"\n"; log.info("AFL插装编译容器内执行的命令:{}",allCommand); + append(context,"AFL插装编译容器内执行的命令:"+allCommand); dockerRun(allCommand,dockerInfo,context); // 更新全局变量 // /test目录下当前流水线工作目录 @@ -112,12 +113,12 @@ public class AFLSlotCompileWorker extends DockerWorker { String suffix = fileName.substring(i + 1); if ("zip".equals(suffix)) { String cmd ="unzip -o "+fileName+"\n" + - "cd "+prefix; + "cd "+prefix+"\n"; return cmd; } if ("tar".equals(suffix)) { String cmd ="tar -zxvf "+fileName+"\n" + - "cd "+prefix; + "cd "+prefix+"\n"; return cmd; } return ""; diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/afl/AFLWorker.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/afl/AFLWorker.java index fd0c7023..be12310d 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/afl/AFLWorker.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/afl/AFLWorker.java @@ -58,23 +58,28 @@ public class AFLWorker extends DockerWorker { append(context,"当前机器不支持docker"); return; } - String output = workDir + PipelineGlobalVariableConstant.AFL_DOCKER_OUTPUT; + String output = workDir +File.separator+ PipelineGlobalVariableConstant.AFL_DOCKER_OUTPUT; // String volumeWorkDirPath = PipelineGlobalVariableConstant.AFL_VOLUME_WORK_DIR_PREFIX; PipPipeline pipeline = (PipPipeline) getContextManager().getContext(taskDef.getPipelineId()).getContextDef(); TargetVersion targetVersion = targetVersionService.getById(pipeline.getTargetVersionId()); String fileName = targetVersion.getFileName(); - - + append(context,"AFL 输出路径:"+output); + Object timeObj = taskProperties.get("runningTime"); + Double timeHours = Double.valueOf(String.valueOf(timeObj)); String commandScript = "docker run -v "+volumeWorkDirPath+":/test -it "+imageName+" bash\n" + - "cd " +PipelineGlobalVariableConstant.AFL_DOCKER_BASE_DIR+File.separator+workDir+ getSourceName(fileName) + - "mkdir -p "+PipelineGlobalVariableConstant.AFL_DOCKER_BASE_DIR+File.separator+workDir+File.separator+output+"\n" + - "afl-fuzz -i "+seedPath+" -o "+output+" "+commandEnd; + "cd " +PipelineGlobalVariableConstant.AFL_DOCKER_BASE_DIR+File.separator+workDir+ "\n"+ + getSourceName(fileName) + + "mkdir -p "+PipelineGlobalVariableConstant.AFL_DOCKER_BASE_DIR+File.separator+output+"\n" + + "afl-fuzz -i "+PipelineGlobalVariableConstant.AFL_DOCKER_BASE_DIR+File.separator+seedPath+" -o "+PipelineGlobalVariableConstant.AFL_DOCKER_BASE_DIR+File.separator+output+" "+commandEnd; try { //将节点的配置信息反编译成对象 log.info("AFL模糊测试执行脚本:{}",commandScript); + append(context,"AFL模糊测试执行脚本:"+commandScript); + Long runningTime = getRunningTime(timeHours); + append(context,"运行时间"+runningTime); // 获取docker 暂时先写固定值 - dockerRun(commandScript,resourceListByType.getDockerEndpointList().get(0),context); + dockerRun(commandScript,resourceListByType.getDockerEndpointList().get(0),context, runningTime); } catch (Exception e) { String errorMessage = "该节点配置信息为空,请先配置该节点信息" + "\r\n"; log.error("执行ssh失败:", e); @@ -91,4 +96,10 @@ public class AFLWorker extends DockerWorker { } return ""; } + public Long getRunningTime(Double runningTimeHours){ + if (runningTimeHours!=null && runningTimeHours >0) { + return (long)(runningTimeHours*60*60*1000); + } + return null; + } } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/base/DockerWorker.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/base/DockerWorker.java index e47648d7..c637820a 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/base/DockerWorker.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/base/DockerWorker.java @@ -7,6 +7,7 @@ import cd.casic.framework.commons.exception.enums.GlobalErrorCodeConstants; import cd.casic.module.execute.docker.dataobject.dto.DockerEndpointDo; import cd.casic.module.execute.docker.dataobject.model.DockerEndpoint; import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.async.ResultCallbackTemplate; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.ExecCreateCmdResponse; @@ -37,6 +38,10 @@ import static java.lang.String.format; @Slf4j public abstract class DockerWorker extends BaseWorker{ public void dockerRun(String command, DockerEndpointDo dockerEndpoint, BaseRunContext context){ + dockerRun(command,dockerEndpoint,context,null); + } + + public void dockerRun(String command, DockerEndpointDo dockerEndpoint, BaseRunContext context,Long timeOut){ // 第一行必须是docker run 命令 option 支持 -it -v String[] split = command.split("\n"); List commandLine = new ArrayList<>(Arrays.stream(split).filter(StringUtils::isNotBlank).toList()); @@ -86,26 +91,26 @@ public abstract class DockerWorker extends BaseWorker{ .withCmd(commandList).exec(); try { - client.execStartCmd(exec.getId()).exec(new ResultCallbackTemplate<>() { + ResultCallbackTemplate, Frame> execing = client.execStartCmd(exec.getId()).exec(new ResultCallbackTemplate<>() { @Override public void onStart(Closeable stream) { super.onStart(stream); - log.info("命令执行开始,容器id:{},执行id:{}",containerId,exec.getId()); - append(context,"命令执行开始,容器id:"+containerId); + log.info("命令执行开始,容器id:{},执行id:{}", containerId, exec.getId()); + append(context, "命令执行开始,容器id:" + containerId); } @Override public void onError(Throwable throwable) { super.onError(throwable); - log.error("命令执行出现错误,容器id:{},执行id:{},错误原因",containerId,exec.getId(),throwable); - append(context,"命令执行出现错误,容器id::"+containerId); + log.error("命令执行出现错误,容器id:{},执行id:{},错误原因", containerId, exec.getId(), throwable); + append(context, "命令执行出现错误,容器id::" + containerId); } @Override public void onComplete() { super.onComplete(); - log.info("命令执行完毕,容器id:{},执行id:{}",containerId,exec.getId()); - append(context,"命令执行完毕,容器id::"+containerId); + log.info("命令执行完毕,容器id:{},执行id:{}", containerId, exec.getId()); + append(context, "命令执行完毕,容器id::" + containerId); } @Override @@ -115,18 +120,24 @@ public abstract class DockerWorker extends BaseWorker{ case STDOUT: System.out.print(output); log.info("标准输出: {}", output.trim()); - append(context,"标准输出: ,容器id:"+containerId+" content"+output); + append(context, "标准输出: ,容器id:" + containerId + " content" + output); break; case STDERR: System.err.print(output); log.error("错误输出: {}", output.trim()); - append(context,"错误输出: ,容器id:"+containerId+" content"+output); + append(context, "错误输出: ,容器id:" + containerId + " content" + output); break; default: log.warn("未知流类型: {}", frame.getStreamType()); } } - }).awaitCompletion(); + }); + if (timeOut==null) { + execing.awaitCompletion(); + } else { + execing.awaitCompletion(timeOut,TimeUnit.MILLISECONDS); + } + } catch (InterruptedException e) { log.error("执行异常",e); append(context,"执行异常,容器id:"+containerId);