sast worker 逻辑完善

This commit is contained in:
even 2025-06-17 16:09:32 +08:00
parent 9418ad8856
commit cc6d090327
9 changed files with 138 additions and 2 deletions

View File

@ -15,6 +15,7 @@ import com.alibaba.fastjson.JSONObject;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.Negative; import jakarta.validation.constraints.Negative;
import jakarta.ws.rs.Path;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -138,4 +139,9 @@ public class SastController {
sastService.reportDelete(reportId); sastService.reportDelete(reportId);
return CommonResult.success(); return CommonResult.success();
} }
@GetMapping("/getApplicationStatus/{applicationId}")
public CommonResult<SastApplicationStatusResp> getApplicationStatus(@PathVariable String applicationId){
SastApplicationStatusResp applicationStatus = sastService.getApplicationStatus(applicationId);
return CommonResult.success(applicationStatus);
}
} }

View File

@ -16,4 +16,5 @@ public class SastUrlConstant {
public static final String language = "/invoke/language"; public static final String language = "/invoke/language";
public static final String reportList = "/api/report/index/pageList"; public static final String reportList = "/api/report/index/pageList";
public static final String reportDelete = "/api/report/index"; public static final String reportDelete = "/api/report/index";
public static final String getApplicationStatus = "/invoke/application/getStatus/";
} }

View File

@ -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;
}

View File

@ -6,7 +6,7 @@ import java.util.List;
@Data @Data
public class SastLanguageResp { public class SastLanguageResp {
private String type; private String type;
private List<SastLanguageResp> languageInfos; private List<SastLanguageInfoResp> languageInfos;
@Data @Data
public static class SastLanguageInfoResp{ public static class SastLanguageInfoResp{
private String id; private String id;

View File

@ -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";
}

View File

@ -3,8 +3,11 @@ package cd.casic.ci.process.engine.worker;
import cd.casic.ci.process.common.WorkAtom; import cd.casic.ci.process.common.WorkAtom;
import cd.casic.ci.process.dto.req.sast.SastApplicationCreateReq; 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.SastApplicationCreateResp;
import cd.casic.ci.process.dto.resp.sast.SastApplicationEchoResp; 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.runContext.TaskRunContext;
import cd.casic.ci.process.engine.worker.base.BaseWorker; import cd.casic.ci.process.engine.worker.base.BaseWorker;
import cd.casic.ci.process.process.converter.SastConverter; import cd.casic.ci.process.process.converter.SastConverter;
@ -16,6 +19,14 @@ import com.alibaba.fastjson.JSON;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; 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; import java.util.List;
/** /**
@ -50,6 +61,54 @@ public class SastWorker extends BaseWorker {
SastApplicationCreateResp sastApplicationCreateResp = sastService.applicationCreate(sastApplicationCreateReq); SastApplicationCreateResp sastApplicationCreateResp = sastService.applicationCreate(sastApplicationCreateReq);
log.info("SAST启动任务返回值:{}",JSON.toJSONString(sastApplicationCreateResp)); log.info("SAST启动任务返回值:{}",JSON.toJSONString(sastApplicationCreateResp));
append(context,"启动任务完毕"); 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格式报告失败");
} }
} }
} }

View File

@ -29,4 +29,6 @@ public interface SastService {
public PageResult<SastReportResp> reportList(PageParam pageParam); public PageResult<SastReportResp> reportList(PageParam pageParam);
public void reportDelete(String reportId); public void reportDelete(String reportId);
public SastApplicationStatusResp getApplicationStatus(String applicationId);
} }

View File

@ -232,6 +232,15 @@ public class SastServiceImpl implements SastService {
System.out.println(uriString); System.out.println(uriString);
ResponseEntity<Void> exchange = restTemplate.exchange(uriString, HttpMethod.DELETE,entity, Void.class,new HashMap<>()); ResponseEntity<Void> exchange = restTemplate.exchange(uriString, HttpMethod.DELETE,entity, Void.class,new HashMap<>());
} }
@Override
public SastApplicationStatusResp getApplicationStatus(String applicationId){
HttpHeaders httpHeaders = getHeaders();
Map<String, String> entityMap = new HashMap<>();
HttpEntity<Map<String, String>> entity = new HttpEntity<>(entityMap,httpHeaders);
String uriString=sastProperties.getBaseUrl()+getApplicationStatus+applicationId;
ResponseEntity<SastApplicationStatusResp> exchange = restTemplate.exchange(uriString, HttpMethod.GET,entity, SastApplicationStatusResp.class,new HashMap<>());
return exchange.getBody();
}
private HttpHeaders getHeaders(){ private HttpHeaders getHeaders(){
HttpHeaders httpHeaders = new HttpHeaders(); HttpHeaders httpHeaders = new HttpHeaders();

View File

@ -18,6 +18,13 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ActiveProfiles;
import java.io.File; 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.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.BrokenBarrierException;
@ -98,7 +105,7 @@ public class SastTest {
@Test @Test
public void getIdentify(){ 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)); System.out.println(JSON.toJSONString(resp));
} }
@Test @Test
@ -137,4 +144,17 @@ public class SastTest {
public void reportDelete(){ public void reportDelete(){
sastService.reportDelete("4af3380a-de08-476b-b1bc-b86f8d2e1339"); 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);
}
}
} }