From 9bd66db9e9bc8a8e14114b66c0cf20428a6f2b89 Mon Sep 17 00:00:00 2001 From: even <827656971@qq.com> Date: Tue, 12 Aug 2025 18:07:57 +0800 Subject: [PATCH] =?UTF-8?q?aflCrashesAnalyzer=E4=BF=A1=E6=81=AF=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AflCrashesAnalyzerListResp.java | 33 ++++++++++++ .../impl/DefaultRunContextManager.java | 3 ++ .../process/engine/worker/afl/AFLWorker.java | 2 +- .../AflCrashesAnalyzerConverter.java | 16 ++++++ ...ao.java => AflCrashesAnalyzerInfoDao.java} | 4 +- ...sInfo.java => AflCrashesAnalyzerInfo.java} | 5 +- .../AflCrashesAnalyzerService.java | 4 ++ .../impl/AflCrashesAnalyzerServiceImpl.java | 49 +++++++++++++----- .../casic/server/AflCrashesAnalyzerTest.java | 50 +++++++++++++++++++ 9 files changed, 149 insertions(+), 17 deletions(-) create mode 100644 modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/aflCrashesAnalyzer/AflCrashesAnalyzerListResp.java create mode 100644 modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/converter/AflCrashesAnalyzerConverter.java rename modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dao/aflCrashAnalyzer/{AflAnalyzerCrashesInfoDao.java => AflCrashesAnalyzerInfoDao.java} (62%) rename modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/aflCrashAnalyzer/{AflAnalyzerCrashesInfo.java => AflCrashesAnalyzerInfo.java} (82%) create mode 100644 ops-server/src/test/java/cd/casic/server/AflCrashesAnalyzerTest.java diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/aflCrashesAnalyzer/AflCrashesAnalyzerListResp.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/aflCrashesAnalyzer/AflCrashesAnalyzerListResp.java new file mode 100644 index 00000000..7d61b0e3 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/aflCrashesAnalyzer/AflCrashesAnalyzerListResp.java @@ -0,0 +1,33 @@ +package cd.casic.ci.process.dto.resp.aflCrashesAnalyzer; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; + +@Data +public class AflCrashesAnalyzerListResp { + private String id; + private String crashName; + private String signId; + private String pipelineHistoryId; + private String pipelineId; + private String taskId; + /** + * 信号名称 + * */ + private String signalName; + /** + * 信号简析 + * */ + private String briefDesc; + /** + * 信号详解 + * */ + private String detailDesc; + /** + * 常见场景 + * */ + private String commonScenarios; +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/manager/impl/DefaultRunContextManager.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/manager/impl/DefaultRunContextManager.java index 867e3e08..3d54904e 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/manager/impl/DefaultRunContextManager.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/manager/impl/DefaultRunContextManager.java @@ -17,6 +17,7 @@ import cd.casic.ci.process.process.dataObject.base.PipBaseElement; import cd.casic.ci.process.process.dataObject.history.PipPipelineHisInstance; import cd.casic.ci.process.process.dataObject.pipeline.PipPipeline; import cd.casic.ci.process.process.service.pipeline.PipelineService; +import cd.casic.ci.process.util.snowflake.SnowflakeIdentifierGenerator; import cd.casic.framework.commons.exception.ServiceException; import cd.casic.framework.commons.exception.enums.GlobalErrorCodeConstants; import cd.casic.framework.security.core.LoginUser; @@ -52,6 +53,8 @@ public class DefaultRunContextManager implements RunContextManager { private PipelineService pipelineService; @Resource private PostHandlerManager postHandlerManager; + @Resource + private SnowflakeIdentifierGenerator idWork; @Override public Boolean stopPipeline(String pipelineId) { 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 840a8550..7eec585a 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 @@ -117,7 +117,7 @@ public class AFLWorker extends DockerWorker { } localVariables.put(DIYImageExecuteCommandConstant.STATUS_CODE, statusCode); afterTaskExecute(context); - afterPipelineExecute(context,pipeline,resourceById,allDir+"/aflCrash"); + afterPipelineExecute(context,pipeline,resourceById,AFL_VOLUME_WORK_DIR_PREFIX+File.separator + workDir+"/aflCrash"); } } private String cdSourceName(String fileName){ diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/converter/AflCrashesAnalyzerConverter.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/converter/AflCrashesAnalyzerConverter.java new file mode 100644 index 00000000..a4373669 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/converter/AflCrashesAnalyzerConverter.java @@ -0,0 +1,16 @@ +package cd.casic.ci.process.process.converter; + +import cd.casic.ci.process.dto.resp.aflCrashesAnalyzer.AflCrashesAnalyzerListResp; +import cd.casic.ci.process.process.dataObject.aflCrashAnalyzer.AflCrashesAnalyzerInfo; +import org.mapstruct.Mapper; +import org.mapstruct.NullValuePropertyMappingStrategy; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper(componentModel = "spring",nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE) +public interface AflCrashesAnalyzerConverter { + AflCrashesAnalyzerConverter INSTANCE = Mappers.getMapper(AflCrashesAnalyzerConverter.class); + AflCrashesAnalyzerListResp converter(AflCrashesAnalyzerInfo info); + List converter(List info); +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dao/aflCrashAnalyzer/AflAnalyzerCrashesInfoDao.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dao/aflCrashAnalyzer/AflCrashesAnalyzerInfoDao.java similarity index 62% rename from modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dao/aflCrashAnalyzer/AflAnalyzerCrashesInfoDao.java rename to modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dao/aflCrashAnalyzer/AflCrashesAnalyzerInfoDao.java index 7d354f0d..8dd96c92 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dao/aflCrashAnalyzer/AflAnalyzerCrashesInfoDao.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dao/aflCrashAnalyzer/AflCrashesAnalyzerInfoDao.java @@ -1,7 +1,7 @@ package cd.casic.ci.process.process.dao.aflCrashAnalyzer; -import cd.casic.ci.process.process.dataObject.aflCrashAnalyzer.AflAnalyzerCrashesInfo; +import cd.casic.ci.process.process.dataObject.aflCrashAnalyzer.AflCrashesAnalyzerInfo; import cd.casic.framework.mybatis.core.mapper.BaseMapperX; -public interface AflAnalyzerCrashesInfoDao extends BaseMapperX { +public interface AflCrashesAnalyzerInfoDao extends BaseMapperX { } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/aflCrashAnalyzer/AflAnalyzerCrashesInfo.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/aflCrashAnalyzer/AflCrashesAnalyzerInfo.java similarity index 82% rename from modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/aflCrashAnalyzer/AflAnalyzerCrashesInfo.java rename to modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/aflCrashAnalyzer/AflCrashesAnalyzerInfo.java index 80434ccd..2d76e851 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/aflCrashAnalyzer/AflAnalyzerCrashesInfo.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/aflCrashAnalyzer/AflCrashesAnalyzerInfo.java @@ -4,15 +4,16 @@ import cd.casic.framework.commons.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.ibatis.type.JdbcType; -import java.time.LocalDateTime; @EqualsAndHashCode(callSuper = true) @Data -public class AflAnalyzerCrashesInfo extends BaseDO { +@TableName("afl_crashes_analyzer_info") +public class AflCrashesAnalyzerInfo extends BaseDO { @TableId(type = IdType.ASSIGN_ID) private String id; private String crashName; diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflAnalyzer/AflCrashesAnalyzerService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflAnalyzer/AflCrashesAnalyzerService.java index 58a9d4c7..a1dfae75 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflAnalyzer/AflCrashesAnalyzerService.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflAnalyzer/AflCrashesAnalyzerService.java @@ -1,7 +1,11 @@ package cd.casic.ci.process.process.service.aflAnalyzer; +import cd.casic.ci.process.dto.resp.aflCrashesAnalyzer.AflCrashesAnalyzerListResp; import cd.casic.ci.process.dto.resp.resource.ResourceDetailResp; +import cd.casic.framework.commons.pojo.PageParam; +import cd.casic.framework.commons.pojo.PageResult; public interface AflCrashesAnalyzerService { + PageResult getCrashesPageList(PageParam page); public void saveCrashesByOutputPath(String outputPath, ResourceDetailResp resourceDetailResp, String pipelineId, String taskId, String pipelineHistoryId); } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflAnalyzer/impl/AflCrashesAnalyzerServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflAnalyzer/impl/AflCrashesAnalyzerServiceImpl.java index 9aaa4fdc..87bee1e3 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflAnalyzer/impl/AflCrashesAnalyzerServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflAnalyzer/impl/AflCrashesAnalyzerServiceImpl.java @@ -1,14 +1,19 @@ package cd.casic.ci.process.process.service.aflAnalyzer.impl; +import cd.casic.ci.process.dto.resp.aflCrashesAnalyzer.AflCrashesAnalyzerListResp; import cd.casic.ci.process.dto.resp.resource.ResourceDetailResp; -import cd.casic.ci.process.process.dao.aflCrashAnalyzer.AflAnalyzerCrashesInfoDao; +import cd.casic.ci.process.process.converter.AflCrashesAnalyzerConverter; +import cd.casic.ci.process.process.dao.aflCrashAnalyzer.AflCrashesAnalyzerInfoDao; import cd.casic.ci.process.process.dao.aflCrashAnalyzer.LinuxSignalsDao; -import cd.casic.ci.process.process.dataObject.aflCrashAnalyzer.AflAnalyzerCrashesInfo; +import cd.casic.ci.process.process.dataObject.aflCrashAnalyzer.AflCrashesAnalyzerInfo; import cd.casic.ci.process.process.dataObject.aflCrashAnalyzer.LinuxSignals; import cd.casic.ci.process.process.service.aflAnalyzer.AflCrashesAnalyzerService; +import cd.casic.framework.commons.pojo.PageParam; +import cd.casic.framework.commons.pojo.PageResult; import cd.casic.module.machine.dal.dataobject.MachineInfoDO; import cd.casic.module.machine.utils.CryptogramUtil; import com.amazonaws.util.IOUtils; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.jcraft.jsch.*; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; @@ -32,11 +37,30 @@ public class AflCrashesAnalyzerServiceImpl implements AflCrashesAnalyzerService @Resource private LinuxSignalsDao signalsMapper; @Resource - private AflAnalyzerCrashesInfoDao crashesInfoDao; + private AflCrashesAnalyzerInfoDao crashesInfoDao; + @Resource + private AflCrashesAnalyzerConverter converter; + public PageResult getCrashesPageList(PageParam page){ + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + PageResult infoPage = crashesInfoDao.selectPage(page, wrapper); + List linuxSignals = signalsMapper.selectList(); + Map signMap = linuxSignals.stream().collect(Collectors.toMap(LinuxSignals::getId, Function.identity())); + List list = infoPage.getList(); + List respList = converter.converter(list); + respList.forEach(item ->{ + LinuxSignals signal = signMap.get(item.getSignId()); + item.setBriefDesc(signal.getBriefDesc()); + item.setDetailDesc(signal.getDetailDesc()); + item.setSignalName(signal.getSignalName()); + item.setCommonScenarios(signal.getCommonScenarios()); + }); + return new PageResult(respList,infoPage.getTotal(), infoPage.getPageNum(), infoPage.getPageSize()); + } @Override public void saveCrashesByOutputPath(String outputPath, ResourceDetailResp resource, String pipelineId, String taskId, String pipelineHistoryId) { + log.info("afl-crash-analyzer信息入库开始执行:{},{},{},{}",outputPath,pipelineId,taskId,pipelineHistoryId); MachineInfoDO machineInfo = resource.getMachineInfo(); - List dbList= new LinkedList<>(); + List dbList= new LinkedList<>(); try { JSch jsch = new JSch(); Session session = jsch.getSession(machineInfo.getUsername(),machineInfo.getHostIp(), machineInfo.getSshPort()); @@ -48,7 +72,7 @@ public class AflCrashesAnalyzerServiceImpl implements AflCrashesAnalyzerService channel.connect(); ChannelSftp sftpChannel = (ChannelSftp) channel; - String fullOutputPath = outputPath + File.separator + "per-signal"; + String fullOutputPath = outputPath + "/per-signal"; Vector files = sftpChannel.ls(fullOutputPath); List linuxSignals = signalsMapper.selectList(); Map signCodeMap = linuxSignals.stream().collect(Collectors.toMap(LinuxSignals::getId, Function.identity())); @@ -62,14 +86,15 @@ public class AflCrashesAnalyzerServiceImpl implements AflCrashesAnalyzerService log.error("未识别信号类型"); continue; } - String crashesTypes = fullOutputPath + File.separator + sign.getId(); + String crashesTypes = fullOutputPath + "/" + sign.getId(); // 查找crashes 的分类下的crashes Vector crashes = sftpChannel.ls(crashesTypes); for (ChannelSftp.LsEntry crashe : crashes) { String crashFilename = crashe.getFilename(); if (!crashe.getAttrs().isDir()) { - InputStream crashesInputStream = ((ChannelSftp) channel).get(fullOutputPath + File.separator + crashFilename); - AflAnalyzerCrashesInfo crashesInfo = new AflAnalyzerCrashesInfo(); + System.out.println(crashesTypes + "/" + crashFilename); + InputStream crashesInputStream = ((ChannelSftp) channel).get(crashesTypes + "/"+ crashFilename); + AflCrashesAnalyzerInfo crashesInfo = new AflCrashesAnalyzerInfo(); crashesInfo.setCrashName(crashe.getFilename()); crashesInfo.setSignId(sign.getId()); crashesInfo.setPipelineHistoryId(pipelineHistoryId); @@ -84,7 +109,9 @@ public class AflCrashesAnalyzerServiceImpl implements AflCrashesAnalyzerService } } } - + if (!CollectionUtils.isEmpty(dbList)) { + crashesInfoDao.insertBatch(dbList); + } sftpChannel.disconnect(); session.disconnect(); } catch (JSchException | SftpException e) { @@ -92,8 +119,6 @@ public class AflCrashesAnalyzerServiceImpl implements AflCrashesAnalyzerService } catch (IOException e) { throw new RuntimeException(e); } - if (!CollectionUtils.isEmpty(dbList)) { - crashesInfoDao.insertBatch(dbList); - } + } } diff --git a/ops-server/src/test/java/cd/casic/server/AflCrashesAnalyzerTest.java b/ops-server/src/test/java/cd/casic/server/AflCrashesAnalyzerTest.java new file mode 100644 index 00000000..2ec6f5cb --- /dev/null +++ b/ops-server/src/test/java/cd/casic/server/AflCrashesAnalyzerTest.java @@ -0,0 +1,50 @@ +package cd.casic.server; + +import cd.casic.ci.commons.properties.TargetFileUploadProperties; +import cd.casic.ci.process.dto.resp.aflCrashesAnalyzer.AflCrashesAnalyzerListResp; +import cd.casic.ci.process.dto.resp.resource.ResourceDetailResp; +import cd.casic.ci.process.process.dataObject.history.PipPipelineHisInstance; +import cd.casic.ci.process.process.dataObject.resource.PipResourceManager; +import cd.casic.ci.process.process.service.aflAnalyzer.AflCrashesAnalyzerService; +import cd.casic.ci.process.process.service.history.PipelineHistoryService; +import cd.casic.ci.process.process.service.resource.ResourceManagerService; +import cd.casic.framework.commons.pojo.PageParam; +import cd.casic.framework.commons.pojo.PageResult; +import com.jcraft.jsch.*; +import jakarta.annotation.Resource; +import org.apache.commons.io.IOUtils; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.web.WebAppConfiguration; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.InputStream; +import java.util.Properties; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +@SpringBootTest(classes = {OpsServerApplication.class}) +@ActiveProfiles("local") +@WebAppConfiguration +public class AflCrashesAnalyzerTest { + @Resource + AflCrashesAnalyzerService crashesAnalyzerService; + @Resource + PipelineHistoryService historyService; + @Resource + ResourceManagerService resourceManagerService; + @Test + public void test01(){ + PipPipelineHisInstance byId = historyService.getById("743101099321462784"); + System.out.println(byId); + ResourceDetailResp resource = resourceManagerService.findResourceDetailById("735516490182299648"); + crashesAnalyzerService.saveCrashesByOutputPath("/home/casic/706/yunqi/PIP_"+byId.getPipelineId()+"/aflCrash",resource,byId.getPipelineId(),"738805555593875459",byId.getId()); + } + @Test + public void test02(){ + PageResult crashesPageList = crashesAnalyzerService.getCrashesPageList(new PageParam()); + System.out.println(crashesPageList); + } +}