diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/constant/ShuiMuUrlConstant.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/constant/ShuiMuUrlConstant.java index 136dedc7..c00a6895 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/constant/ShuiMuUrlConstant.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/constant/ShuiMuUrlConstant.java @@ -13,6 +13,7 @@ public class ShuiMuUrlConstant { public static final String getProjectVersion = "/api/project/code/getProjectVersion"; public static final String buildAndSaveConfig = "/api/driverGeneration/buildAndSaveConfig"; public static final String getProjectById = "/api/project/"; + public static final String getProjectResource = "/api/project/getProjectResource"; public static final String uploadWfuzzJson = "/api/project/code/uploadWfuzzJson"; public static final String executeAllEntrypointsTest ="/api/driverGeneration/executeAllEntrypointsTest"; } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/shuimu/ShuiMuProjectResourceResp.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/shuimu/ShuiMuProjectResourceResp.java new file mode 100644 index 00000000..f8dd05a2 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/shuimu/ShuiMuProjectResourceResp.java @@ -0,0 +1,16 @@ +package cd.casic.ci.process.dto.resp.shuimu; + +import lombok.Data; + +@Data +public class ShuiMuProjectResourceResp { + private Integer projectId; + private Integer workspaceResource; + private Integer buildResource; + private Integer testResource; + private Integer queueResource; + private Integer finishResource; + private Integer problemCount; + private Double coverage; + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/shuimu/ShuiMuWorker.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/shuimu/ShuiMuWorker.java index eedc5da1..d726d489 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/shuimu/ShuiMuWorker.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/shuimu/ShuiMuWorker.java @@ -1,12 +1,14 @@ package cd.casic.ci.process.engine.worker.shuimu; import cd.casic.ci.process.common.WorkAtom; +import cd.casic.ci.process.dto.resp.shuimu.ShuiMuProjectResourceResp; import cd.casic.ci.process.engine.constant.ShuiMuConstant; 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.SshWorker; import cd.casic.ci.process.process.dataObject.task.PipTask; import cd.casic.ci.process.process.service.shuimu.ShuiMuService; +import com.alibaba.fastjson.JSON; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; @@ -27,5 +29,15 @@ public class ShuiMuWorker extends BaseWorker { String projectId = (String)taskProperties.get(ShuiMuConstant.SHUI_MU_PROJECT_ID_KEY); Integer fuzzMinutes = Integer.parseInt(String.valueOf(taskProperties.get(ShuiMuConstant.SHUI_MU_FUZZ_MINUTES))); shuiMuService.executeAllEntrypointsTest(projectId,fuzzMinutes); + append(context,"水木模糊测试开始执行"); + while (true){ + ShuiMuProjectResourceResp projectResource = shuiMuService.getProjectResource(projectId); + append(context,"当前执行情况:"); + append(context, JSON.toJSONString(projectResource)); + if (projectResource.getTestResource()==0) { + append(context,"水木模糊测试执行完毕"); + break; + } + } } } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/shuimu/ShuiMuService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/shuimu/ShuiMuService.java index d7d09557..a4f46784 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/shuimu/ShuiMuService.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/shuimu/ShuiMuService.java @@ -4,6 +4,7 @@ import cd.casic.ci.process.dto.req.shuimu.ShuiMuBuildAndSaveReq; import cd.casic.ci.process.dto.req.shuimu.ShuiMuProjectCreateReq; import cd.casic.ci.process.dto.req.shuimu.ShuiMuUpdateWFuzzJsonReq; import cd.casic.ci.process.dto.resp.shuimu.ShuiMuProjectInfoResp; +import cd.casic.ci.process.dto.resp.shuimu.ShuiMuProjectResourceResp; import cd.casic.ci.process.dto.resp.shuimu.ShuiMuProjectVersionResp; import java.util.List; @@ -30,4 +31,5 @@ public interface ShuiMuService { void buildAndSaveConfig(ShuiMuBuildAndSaveReq req); void uploadWfuzzJson(ShuiMuUpdateWFuzzJsonReq req); void executeAllEntrypointsTest(String projectId,Integer fuzzMinutes); + ShuiMuProjectResourceResp getProjectResource (String projectId); } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/shuimu/impl/ShuiMuServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/shuimu/impl/ShuiMuServiceImpl.java index 776d1074..a2e44e1c 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/shuimu/impl/ShuiMuServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/shuimu/impl/ShuiMuServiceImpl.java @@ -4,6 +4,7 @@ import cd.casic.ci.process.dto.req.shuimu.ShuiMuBuildAndSaveReq; import cd.casic.ci.process.dto.req.shuimu.ShuiMuProjectCreateReq; import cd.casic.ci.process.dto.req.shuimu.ShuiMuUpdateWFuzzJsonReq; import cd.casic.ci.process.dto.resp.shuimu.ShuiMuProjectInfoResp; +import cd.casic.ci.process.dto.resp.shuimu.ShuiMuProjectResourceResp; import cd.casic.ci.process.dto.resp.shuimu.ShuiMuProjectVersionResp; import cd.casic.ci.process.dto.resp.shuimu.ShuiMuTokenResp; import cd.casic.ci.process.engine.manager.RunContextManager; @@ -31,6 +32,8 @@ import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; import java.io.*; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.*; import static cd.casic.ci.process.constant.ShuiMuUrlConstant.*; @@ -191,7 +194,9 @@ public class ShuiMuServiceImpl implements ShuiMuService { body.add("projectId",req.getProjectId()); body.add("env",req.getEnv()); body.add("fileName",req.getFileName()); - HttpEntity> entity = new HttpEntity<>(body,getHeaders()); + HttpHeaders headers = getHeaders(); + headers.setContentType(MediaType.MULTIPART_FORM_DATA); + HttpEntity> entity = new HttpEntity<>(body, headers); ResponseEntity exchange = restTemplate.exchange(shuiMuProperties.getBaseUrl() + buildAndSaveConfig, HttpMethod.POST, entity, String.class, new HashMap<>()); if (exchange.getStatusCode().isError()) { throw new ServiceException(GlobalErrorCodeConstants.PIPELINE_ERROR.getCode(),"保存并且构建失败"); @@ -207,16 +212,23 @@ public class ShuiMuServiceImpl implements ShuiMuService { restReq.put("product",projectInfo.getProduct()); restReq.put("language",projectInfo.getLanguage()); restReq.put("build",req.getBuild()); - ByteArrayOutputStream bis = new ByteArrayOutputStream(); + String tempDir = System.getProperty("java.io.tmpdir"); + + File tempFile = new File(tempDir,"wfuzz.json"); + + try { - ObjectOutputStream oos =new ObjectOutputStream(bis); - oos.writeObject(restReq); - File tempFile = File.createTempFile(UUID.randomUUID().toString().replaceAll("-", ""), ""); + FileOutputStream fos = new FileOutputStream(tempFile); + fos.write(JSON.toJSONString(restReq).getBytes()); + fos.flush(); + tempFile.setReadable(true,false); FileSystemResource resource = new FileSystemResource(tempFile); MultiValueMap body = new LinkedMultiValueMap<>(); body.add("projectId",req.getProjectId()); body.add("file",resource); - HttpEntity> entity = new HttpEntity<>(body,getHeaders()); + HttpHeaders headers = getHeaders(); + headers.setContentType(MediaType.MULTIPART_FORM_DATA); + HttpEntity> entity = new HttpEntity<>(body, headers); ResponseEntity exchange = restTemplate.exchange(shuiMuProperties.getBaseUrl() + uploadWfuzzJson, HttpMethod.POST, entity, String.class, new HashMap<>()); if (exchange.getStatusCode().isError()) { throw new ServiceException(GlobalErrorCodeConstants.PIPELINE_ERROR.getCode(),"更新配置文件失败"); @@ -230,6 +242,8 @@ public class ShuiMuServiceImpl implements ShuiMuService { ShuiMuProjectVersionResp.Repo repo = projectVersion.getRepo(); ShuiMuBuildAndSaveReq shuiMuBuildAndSaveReq = new ShuiMuBuildAndSaveReq(); BeanUtils.copyProperties(repo,shuiMuBuildAndSaveReq); + shuiMuBuildAndSaveReq.setProjectId(req.getProjectId()); + shuiMuBuildAndSaveReq.setFileName(repo.getFilename()); buildAndSaveConfig(shuiMuBuildAndSaveReq); } @@ -247,7 +261,24 @@ public class ShuiMuServiceImpl implements ShuiMuService { } } + @Override + public ShuiMuProjectResourceResp getProjectResource (String projectId) { + HttpEntity entity = new HttpEntity<>(null,getHeaders()); + String uriString = UriComponentsBuilder.fromUriString(shuiMuProperties.getBaseUrl() + getProjectResource ).queryParam("projectId",projectId) + .toUriString(); + ResponseEntity exchange = restTemplate.exchange(uriString, HttpMethod.GET, entity, String.class, new HashMap<>()); + if (exchange.getStatusCode().isError()) { + throw new ServiceException(GlobalErrorCodeConstants.PIPELINE_ERROR.getCode(),"获取项目执行信息失败"); + } + String data = JSON.parseObject(exchange.getBody()).getString("data"); + try { + List shuiMuProjectResourceResps = JSONArray.parseArray(data, ShuiMuProjectResourceResp.class); + return shuiMuProjectResourceResps.get(0); + } catch (Exception e){ + return null; + } + } private HttpHeaders getHeaders(){ HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON); diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/util/SftpUploadUtil.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/util/SftpUploadUtil.java index 5f4f9d83..0919463c 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/util/SftpUploadUtil.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/util/SftpUploadUtil.java @@ -7,6 +7,7 @@ import com.amazonaws.util.IOUtils; import com.jcraft.jsch.*; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; import org.springframework.util.ObjectUtils; import org.springframework.web.multipart.MultipartFile; @@ -14,7 +15,7 @@ import java.io.*; import java.util.*; import static com.fhs.common.utils.StringUtil.trim; - +@Slf4j public class SftpUploadUtil { private static final int DEFAULT_SFTP_PORT = 22; @@ -584,8 +585,10 @@ public class SftpUploadUtil { // 获取远程文件名和目录 String remoteDir = remoteFilePath.substring(0, remoteFilePath.lastIndexOf('/')); String fileName = remoteFilePath.substring(remoteFilePath.lastIndexOf('/') + 1); - + String chmodDir = remoteFilePath.substring(0, remoteFilePath.indexOf("default")); + log.info("分配权限路径,{}",chmodDir); // 切换目录并列出内容用于调试 + sudoChmodORwx(session,chmodDir,password); try { channelSftp.cd(remoteDir); } catch (SftpException e) { @@ -1471,7 +1474,41 @@ public class SftpUploadUtil { } + public static void sudoChmodORwx(Session session, String remotePath, String sudoPassword) throws Exception { + String command = "sudo -S chmod -R o+rwx " + remotePath; + ChannelExec channelExec = (ChannelExec) session.openChannel("exec"); + channelExec.setCommand(command); + OutputStream out = channelExec.getOutputStream(); + InputStream in = channelExec.getInputStream(); + channelExec.setErrStream(System.err); + + channelExec.connect(); + + // 写入sudo密码 + out.write((sudoPassword + "\n").getBytes()); + out.flush(); + + // 读取命令输出 + BufferedReader reader = new BufferedReader(new InputStreamReader(in)); + String line; + while ((line = reader.readLine()) != null) { + System.out.println(line); + } + + // 等待命令执行完成 + while (!channelExec.isClosed()) { + Thread.sleep(100); + } + int exitStatus = channelExec.getExitStatus(); + channelExec.disconnect(); + + if (exitStatus != 0) { + throw new RuntimeException("sudo chmod 执行失败,退出码: " + exitStatus); + } else { + System.out.println("sudo chmod -R o+rwx 执行成功!"); + } + } private static boolean thisDirectory(ChannelSftp channelSftp, String fullPath) { try { SftpATTRS attrs = channelSftp.lstat(fullPath); diff --git a/ops-server/src/test/java/cd/casic/server/SSETest.java b/ops-server/src/test/java/cd/casic/server/SSETest.java index f23366a5..8fb97074 100644 --- a/ops-server/src/test/java/cd/casic/server/SSETest.java +++ b/ops-server/src/test/java/cd/casic/server/SSETest.java @@ -2,10 +2,19 @@ package cd.casic.server; import cd.casic.ci.process.engine.manager.LoggerManager; import jakarta.annotation.Resource; +import org.apache.hc.client5.http.classic.methods.HttpGet; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.core5.http.HttpResponse; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + @SpringBootTest(classes = {OpsServerApplication.class}) @ActiveProfiles("local") public class SSETest { @@ -15,5 +24,22 @@ public class SSETest { public void subscribe(){ loggerManager.subscribe("716299524330622976",null); } + @Test + public void shuimuSSE() throws IOException { + try (CloseableHttpClient client = HttpClients.createDefault()) { + HttpGet request = new HttpGet("http://175.6.27.155:10200/api/driverGeneration/progress?uuid=6"); + request.addHeader("Accept", "text/event-stream"); + request.addHeader("Authorization", "Bearer xj76K1VJBMrKnCXAzTdPJUCp4B4"); + + try (CloseableHttpResponse response = client.execute(request)) { + BufferedReader reader = new BufferedReader( + new InputStreamReader(response.getEntity().getContent(), "UTF-8")); + String line; + while ((line = reader.readLine()) != null) { + System.out.println("收到: " + line); + } + } + } + } } diff --git a/ops-server/src/test/java/cd/casic/server/SftpTest.java b/ops-server/src/test/java/cd/casic/server/SftpTest.java index bfd0e7f9..c74c4b5c 100644 --- a/ops-server/src/test/java/cd/casic/server/SftpTest.java +++ b/ops-server/src/test/java/cd/casic/server/SftpTest.java @@ -37,7 +37,7 @@ public class SftpTest { } @Test public void ssh(){ - System.out.println(CryptogramUtil.doDecrypt("cf917c4ff8463a54df75120e2ff802e8")); + System.out.println(CryptogramUtil.doDecrypt("b44a50e0cfb98f81c8c003330780c835923c2e5caa1738d61e27ee541be54e2e")); } @Test public void getFileList(){ @@ -68,4 +68,8 @@ public class SftpTest { e.printStackTrace(); } } + @Test + public void test00(){ + System.out.println("{\"code\":0,\"message\":\"OK\",\"data\":\"锟斤拷\\u0000\\u0005t\\u0000锟絳\\\"product\\\":\\\"code\\\",\\\"build\\\":\\\"{\\\\\\\"helper\\\\\\\":\\\\\\\"jar-analyzer\\\\\\\",\\\\\\\"config\\\\\\\":{\\\\\\\"root\\\\\\\":\\\\\\\"./test-1.0.jar\\\\\\\"}}\\\",\\\"project\\\":\\\"搴旂敤妫€娴媉76ce2c9dab224d8cbc79821bcc85b61b\\\",\\\"language\\\":\\\"java\\\"}\"}"); + } }