From cc6d0903273496b93c7dd2765193acabfac7b47c Mon Sep 17 00:00:00 2001 From: even <827656971@qq.com> Date: Tue, 17 Jun 2025 16:09:32 +0800 Subject: [PATCH] =?UTF-8?q?sast=20worker=20=E9=80=BB=E8=BE=91=E5=AE=8C?= =?UTF-8?q?=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cd/casic/ci/api/SastController.java | 6 ++ .../ci/process/constant/SastUrlConstant.java | 1 + .../resp/sast/SastApplicationStatusResp.java | 27 +++++++++ .../dto/resp/sast/SastLanguageResp.java | 2 +- .../process/engine/constant/SastConstant.java | 12 ++++ .../ci/process/engine/worker/SastWorker.java | 59 +++++++++++++++++++ .../process/service/sast/SastService.java | 2 + .../service/sast/impl/SastServiceImpl.java | 9 +++ .../test/java/cd/casic/server/SastTest.java | 22 ++++++- 9 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/sast/SastApplicationStatusResp.java create mode 100644 modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/constant/SastConstant.java diff --git a/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/SastController.java b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/SastController.java index 8f68ea1d..d6a94dfa 100644 --- a/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/SastController.java +++ b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/SastController.java @@ -15,6 +15,7 @@ import com.alibaba.fastjson.JSONObject; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.Negative; +import jakarta.ws.rs.Path; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -138,4 +139,9 @@ public class SastController { sastService.reportDelete(reportId); return CommonResult.success(); } + @GetMapping("/getApplicationStatus/{applicationId}") + public CommonResult getApplicationStatus(@PathVariable String applicationId){ + SastApplicationStatusResp applicationStatus = sastService.getApplicationStatus(applicationId); + return CommonResult.success(applicationStatus); + } } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/constant/SastUrlConstant.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/constant/SastUrlConstant.java index 04219b28..333237fa 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/constant/SastUrlConstant.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/constant/SastUrlConstant.java @@ -16,4 +16,5 @@ public class SastUrlConstant { public static final String language = "/invoke/language"; public static final String reportList = "/api/report/index/pageList"; public static final String reportDelete = "/api/report/index"; + public static final String getApplicationStatus = "/invoke/application/getStatus/"; } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/sast/SastApplicationStatusResp.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/sast/SastApplicationStatusResp.java new file mode 100644 index 00000000..cb2dabe6 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/sast/SastApplicationStatusResp.java @@ -0,0 +1,27 @@ +package cd.casic.ci.process.dto.resp.sast; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class SastApplicationStatusResp { + + private String id; + private LocalDateTime createdTime; + private String createdBy; + private LocalDateTime updatedTime; + private String updatedBy; + private String fileId; + private String jobAddBy; + private String jobStatus; + private String checkStartTime; + private String checkEndTime; + private String codeQualityMetric; + private String engineType; + private Object progress; // 如果有具体结构可替换为对应类型 + private String type; + private String applicationId; + private boolean whetherUseDetection; + private String changeFilePath; +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/sast/SastLanguageResp.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/sast/SastLanguageResp.java index 2fe28be6..b0e2155b 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/sast/SastLanguageResp.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/sast/SastLanguageResp.java @@ -6,7 +6,7 @@ import java.util.List; @Data public class SastLanguageResp { private String type; - private List languageInfos; + private List languageInfos; @Data public static class SastLanguageInfoResp{ private String id; diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/constant/SastConstant.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/constant/SastConstant.java new file mode 100644 index 00000000..562e854d --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/constant/SastConstant.java @@ -0,0 +1,12 @@ +package cd.casic.ci.process.engine.constant; + +public class SastConstant { + public static final String JOB_DONE = "DONE"; + public static final String REPORT_JSON = "reportJSON"; + public static final String REPORT_URL = "reportUrl"; + public static final String REPORT_FORMAT_JSON="JSON"; + public static final String REPORT_FORMAT_PDF="PDF"; + public static final String REPORT_MODE ="DETAILS"; + public static final String REPORT_MODE_DETAILS ="DETAILS"; + public static final String REPORT_MODE_SUMMARY ="SUMMARY"; +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/SastWorker.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/SastWorker.java index 6e2252aa..863d34fc 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/SastWorker.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/SastWorker.java @@ -3,8 +3,11 @@ package cd.casic.ci.process.engine.worker; import cd.casic.ci.process.common.WorkAtom; import cd.casic.ci.process.dto.req.sast.SastApplicationCreateReq; +import cd.casic.ci.process.dto.req.sast.SastReportCreateReq; import cd.casic.ci.process.dto.resp.sast.SastApplicationCreateResp; import cd.casic.ci.process.dto.resp.sast.SastApplicationEchoResp; +import cd.casic.ci.process.dto.resp.sast.SastApplicationStatusResp; +import cd.casic.ci.process.engine.constant.SastConstant; import cd.casic.ci.process.engine.runContext.TaskRunContext; import cd.casic.ci.process.engine.worker.base.BaseWorker; import cd.casic.ci.process.process.converter.SastConverter; @@ -16,6 +19,14 @@ import com.alibaba.fastjson.JSON; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Collections; import java.util.List; /** @@ -50,6 +61,54 @@ public class SastWorker extends BaseWorker { SastApplicationCreateResp sastApplicationCreateResp = sastService.applicationCreate(sastApplicationCreateReq); log.info("SAST启动任务返回值:{}",JSON.toJSONString(sastApplicationCreateResp)); append(context,"启动任务完毕"); + // 检测状态是否完毕 + SastApplicationStatusResp applicationStatus = sastService.getApplicationStatus(applicationId); + while (!SastConstant.JOB_DONE.equals(applicationStatus.getJobStatus())) { + try { + Thread.sleep(1000L); + } catch (InterruptedException e) { + log.error("SAST WORKER线程中断"); + } + applicationStatus=sastService.getApplicationStatus(applicationId); + append(context,"当前SAST运行中,运行状态:"+applicationStatus.getJobStatus()); + } + String reportJSON = getReportJSON(applicationId, SastConstant.REPORT_MODE_DETAILS); + String reportUrl = getReportUrl(applicationId, SastConstant.REPORT_MODE_DETAILS); + task.getTaskProperties().put(SastConstant.REPORT_JSON,reportJSON); + task.getTaskProperties().put(SastConstant.REPORT_URL,reportUrl); + } + } + private String getReportJSON(String applicationId,String model){ + String reqJSON = "{\"mode\":\"DETAILS\",\"contacts\":\"admin@clouditera.com\",\"reportType\":\"APPLICATION\",\"format\":\"JSON\",\"projectId\":\"8a863857-bab3-40d9-a79a-2cb6617a9dd3\",\"applicationIds\":[\"9e3e55d6-6d28-4fd1-adc2-15b6cf0702db\"],\"bugLevels\":[\"DEADLY\",\"SEVERITY\",\"POOR_RISK\",\"LOW_RISK\"],\"audRiskLevels\":[\"WAITING\",\"IGNORE\",\"HIGH\",\"MEDIUM\",\"LOW\",\"NONE\"],\"applicationScope\":\"ALL\"}"; + SastReportCreateReq sastReportCreateReq = JSON.parseObject(reqJSON, SastReportCreateReq.class); + sastReportCreateReq.setMode(model); + sastReportCreateReq.setFormat(SastConstant.REPORT_FORMAT_JSON); + sastReportCreateReq.setApplicationIds(Collections.singletonList(applicationId)); + String jsonReportUrl = sastService.reportIndex(sastReportCreateReq); + return getJSONString(jsonReportUrl); + } + private String getReportUrl(String applicationId,String model){ + String reqJSON = "{\"mode\":\"DETAILS\",\"contacts\":\"admin@clouditera.com\",\"reportType\":\"APPLICATION\",\"format\":\"JSON\",\"projectId\":\"8a863857-bab3-40d9-a79a-2cb6617a9dd3\",\"applicationIds\":[\"9e3e55d6-6d28-4fd1-adc2-15b6cf0702db\"],\"bugLevels\":[\"DEADLY\",\"SEVERITY\",\"POOR_RISK\",\"LOW_RISK\"],\"audRiskLevels\":[\"WAITING\",\"IGNORE\",\"HIGH\",\"MEDIUM\",\"LOW\",\"NONE\"],\"applicationScope\":\"ALL\"}"; + SastReportCreateReq sastReportCreateReq = JSON.parseObject(reqJSON, SastReportCreateReq.class); + sastReportCreateReq.setMode(model); + sastReportCreateReq.setFormat(SastConstant.REPORT_FORMAT_PDF); + sastReportCreateReq.setApplicationIds(Collections.singletonList(applicationId)); + return sastService.reportIndex(sastReportCreateReq); + } + private String getJSONString(String reportId){ + String s = sastService.reportDownload(reportId); + URI uri = URI.create(s); + URL url = null; + try { + url = uri.toURL(); + } catch (MalformedURLException e) { + log.error("获取json格式报告失败"); + } + try (InputStream in = url.openStream()) { + byte[] bytes = in.readAllBytes(); + return new String(bytes, StandardCharsets.UTF_8); + } catch (IOException e) { + log.error("获取json格式报告失败"); } } } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sast/SastService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sast/SastService.java index 2dc09b17..681618c0 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sast/SastService.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sast/SastService.java @@ -29,4 +29,6 @@ public interface SastService { public PageResult reportList(PageParam pageParam); public void reportDelete(String reportId); + + public SastApplicationStatusResp getApplicationStatus(String applicationId); } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sast/impl/SastServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sast/impl/SastServiceImpl.java index b70b2d9f..dfb67efc 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sast/impl/SastServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sast/impl/SastServiceImpl.java @@ -232,6 +232,15 @@ public class SastServiceImpl implements SastService { System.out.println(uriString); ResponseEntity exchange = restTemplate.exchange(uriString, HttpMethod.DELETE,entity, Void.class,new HashMap<>()); } + @Override + public SastApplicationStatusResp getApplicationStatus(String applicationId){ + HttpHeaders httpHeaders = getHeaders(); + Map entityMap = new HashMap<>(); + HttpEntity> entity = new HttpEntity<>(entityMap,httpHeaders); + String uriString=sastProperties.getBaseUrl()+getApplicationStatus+applicationId; + ResponseEntity exchange = restTemplate.exchange(uriString, HttpMethod.GET,entity, SastApplicationStatusResp.class,new HashMap<>()); + return exchange.getBody(); + } private HttpHeaders getHeaders(){ HttpHeaders httpHeaders = new HttpHeaders(); diff --git a/ops-server/src/test/java/cd/casic/server/SastTest.java b/ops-server/src/test/java/cd/casic/server/SastTest.java index 482d31a8..1f949692 100644 --- a/ops-server/src/test/java/cd/casic/server/SastTest.java +++ b/ops-server/src/test/java/cd/casic/server/SastTest.java @@ -18,6 +18,13 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.test.context.ActiveProfiles; import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.concurrent.BrokenBarrierException; @@ -98,7 +105,7 @@ public class SastTest { @Test public void getIdentify(){ - SastIdentifiedLanguageTaskResp resp = sastService.getIdentifiedLanguageTaskStatus("ab8c8ff1-7c07-4787-9107-6624ba0ede02"); + SastIdentifiedLanguageTaskResp resp = sastService.getIdentifiedLanguageTaskStatus("2c18c2f4-2c31-41d7-8199-e08bb7b36378"); System.out.println(JSON.toJSONString(resp)); } @Test @@ -137,4 +144,17 @@ public class SastTest { public void reportDelete(){ sastService.reportDelete("4af3380a-de08-476b-b1bc-b86f8d2e1339"); } + @Test + public void reportDownload() throws MalformedURLException { + String s = sastService.reportDownload("3300b586-52d7-4a46-b656-e653a0b2a024"); + URI uri = URI.create(s); + URL url = uri.toURL(); + try (InputStream in = url.openStream()) { + byte[] bytes = in.readAllBytes(); + String s1 = new String(bytes, StandardCharsets.UTF_8); + System.out.println(s1); + } catch (IOException e) { + throw new RuntimeException(e); + } + } }