From ea35ed1f0bbde61682f6fd1aa7b39b5967a497fe Mon Sep 17 00:00:00 2001 From: zyj <2660555181@qq.com> Date: Wed, 4 Jun 2025 14:19:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=BA=E5=99=A8=E7=AE=A1=E7=90=86=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=A0=BC=E5=BC=8F=E5=8C=96=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MachineEnvController.java | 5 +- .../controller/MachineInfoController.java | 16 ++--- .../controller/MachineProxyController.java | 17 ++--- .../controller/SecretKeyController.java | 17 ++--- .../module/machine/dto/MachineProxyDTO.java | 3 +- .../cd/casic/module/machine/dto/PageDto.java | 2 +- .../module/machine/entity/MachineInfo.java | 2 +- .../module/machine/entity/MachineProxy.java | 5 +- .../machine/enums/MachineProxyStatus.java | 10 +-- .../machine/enums/MachineProxyType.java | 6 +- .../machine/enums/RequestExceptionEnum.java | 4 +- .../machine/handler/ConnectionSession.java | 60 ++++++++-------- .../machine/service/MachineEnvService.java | 2 + .../machine/service/MachineInfoService.java | 19 +++-- .../machine/service/MachineProxyService.java | 5 +- .../machine/service/SecretKeyService.java | 2 +- .../service/impl/MachineEnvServiceImpl.java | 32 ++++----- .../service/impl/MachineProxyServiceImpl.java | 69 ++++++++----------- .../service/impl/MachineinfoServiceImpl.java | 27 ++++---- .../service/impl/SecretKeyServiceImpl.java | 21 +++--- .../module/machine/utils/AliOssUtil.java | 28 ++++---- 21 files changed, 177 insertions(+), 175 deletions(-) diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/MachineEnvController.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/MachineEnvController.java index d068ee04..0a60b328 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/MachineEnvController.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/MachineEnvController.java @@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; + import java.util.List; import static cd.casic.framework.commons.pojo.CommonResult.success; @@ -51,7 +52,7 @@ public class MachineEnvController { @DeleteMapping("/deleteList") @Operation(summary = "批量删除机器环境变量") - public CommonResult deleteList(@RequestParam String ids){ + public CommonResult deleteList(@RequestParam String ids) { machineEnvService.deleteList(ids); return success(true); } @@ -64,7 +65,7 @@ public class MachineEnvController { @PostMapping("/list") - @Operation(summary ="获取环境变量列表") + @Operation(summary = "获取环境变量列表") public CommonResult list(@RequestBody MachineEnvDTO machineEnvDTO) { return success(machineEnvService.listEnv(machineEnvDTO)); } diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/MachineInfoController.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/MachineInfoController.java index ef4d7595..a77e1025 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/MachineInfoController.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/MachineInfoController.java @@ -103,8 +103,8 @@ public class MachineInfoController { @PostMapping("/execute/{sessionId}") @Operation(summary = "执行远程命令") public CommonResult executeCommand( - @PathVariable String sessionId, - @RequestBody String command) { + @PathVariable String sessionId, + @RequestBody String command) { return success(machineInfoService.executeCommand(sessionId, command)); } @@ -112,18 +112,18 @@ public class MachineInfoController { @PostMapping("/upload/{sessionId}") @Operation(summary = "上传文件到远程机器") public CommonResult uploadFile( - @PathVariable String sessionId, - @RequestParam String localFilePath, - @RequestParam String remoteFilePath) { + @PathVariable String sessionId, + @RequestParam String localFilePath, + @RequestParam String remoteFilePath) { return success(machineInfoService.uploadFile(sessionId, localFilePath, remoteFilePath)); } @PostMapping("/download/{sessionId}") @Operation(summary = "从远程机器下载文件") public CommonResult downloadFile( - @PathVariable String sessionId, - @RequestParam String remoteFilePath, - @RequestParam String localFilePath) { + @PathVariable String sessionId, + @RequestParam String remoteFilePath, + @RequestParam String localFilePath) { return success(machineInfoService.downloadFile(sessionId, remoteFilePath, localFilePath)); } } diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/MachineProxyController.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/MachineProxyController.java index 5bf9cf08..fa573046 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/MachineProxyController.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/MachineProxyController.java @@ -27,42 +27,43 @@ public class MachineProxyController { private MachineProxyService machineProxyService; @PostMapping("/register") - @Operation(summary ="注册新的机器代理") + @Operation(summary = "注册新的机器代理") public CommonResult register(@RequestBody MachineProxyDTO machineProxyDTO) { machineProxyService.register(machineProxyDTO); return success(true); } @PostMapping("/list") - @Operation(summary ="获取代理列表") - public CommonResult list(MachineProxyDTO machineProxyDTO) { + @Operation(summary = "获取代理列表") + public CommonResult list(@RequestBody MachineProxyDTO machineProxyDTO) { return success(machineProxyService.list(machineProxyDTO)); } @PutMapping("/updateStatus") - @Operation(summary ="更新代理状态") + @Operation(summary = "更新代理状态") public CommonResult updateStatus(@RequestBody MachineProxyDTO machineProxyDTO) { machineProxyService.updateStatus(machineProxyDTO); return success(true); } @GetMapping("/statistics/status") - @Operation(summary ="获取所有代理的状态统计") + @Operation(summary = "获取所有代理的状态统计") public CommonResult getStatusStatistics() { return success(machineProxyService.getStatusStatistics()); } @PutMapping("/update") - @Operation(summary ="更新代理信息") + @Operation(summary = "更新代理信息") public CommonResult updateConfig(@RequestBody MachineProxyDTO machineProxyDTO) { machineProxyService.update(machineProxyDTO); return success(true); } @DeleteMapping("/batch") - @Operation(summary ="批量删除代理") + @Operation(summary = "批量删除代理") public CommonResult deleteBatch(@RequestParam String ids) { - return success(machineProxyService.delete(ids)); + machineProxyService.delete(ids); + return success(true); } } diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/SecretKeyController.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/SecretKeyController.java index ba8f98f4..68a2bc7d 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/SecretKeyController.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/SecretKeyController.java @@ -1,4 +1,5 @@ package cd.casic.module.machine.controller; + import cd.casic.framework.commons.pojo.CommonResult; import cd.casic.module.machine.entity.SecretKey; import cd.casic.module.machine.service.SecretKeyService; @@ -23,51 +24,51 @@ import static cd.casic.framework.commons.pojo.CommonResult.success; @RestController @RequestMapping("/api/secretKey") -@Tag(name = "密钥管理") +@Tag(name = "密钥管理") public class SecretKeyController { @Resource private SecretKeyService secretKeyService; @PostMapping(value = "/add", consumes = "multipart/form-data") - @Operation(summary ="新增密钥") + @Operation(summary = "新增密钥") public CommonResult add(@RequestBody SecretKeyDto secretKeyDto, @RequestPart("file") MultipartFile file) { return success(secretKeyService.addSecretKey(secretKeyDto, file)); } @PutMapping("/bindingMachine") - @Operation(summary ="绑定机器") + @Operation(summary = "绑定机器") public CommonResult bindingMachine(@RequestBody SecretKeyDto secretKeyDto) { secretKeyService.bindingMachine(secretKeyDto); return success(true); } @PutMapping("/update") - @Operation(summary ="编辑密钥信息") + @Operation(summary = "编辑密钥信息") public CommonResult update(@RequestBody SecretKeyDto secretKeyDto, @RequestPart(value = "file", required = false) MultipartFile file) { return success(secretKeyService.updateSecretKey(secretKeyDto, file)); } @DeleteMapping("/delete") - @Operation(summary ="删除密钥") + @Operation(summary = "删除密钥") public CommonResult delete(@RequestParam Long secretKeyId) { return success(secretKeyService.deleteSecretKey(secretKeyId)); } @DeleteMapping("/deleteList") - @Operation(summary ="批量删除密钥") + @Operation(summary = "批量删除密钥") public CommonResult deleteList(@RequestParam String secretKeyIds) { return success(secretKeyService.deleteList(secretKeyIds)); } @PostMapping("/list") - @Operation(summary ="获取密钥信息列表") + @Operation(summary = "获取密钥信息列表") public CommonResult> list(@RequestBody SecretKeyDto secretKeyDto) { return success(secretKeyService.listSecretKey(secretKeyDto)); } @GetMapping("/downloadSecretKeyFile") - @Operation(summary ="下载密钥文件") + @Operation(summary = "下载密钥文件") public CommonResult downloadSecretKeyFile(@RequestParam("secretKeyId") Long secretKeyId) { return success(secretKeyService.downloadSecretKeyFile(secretKeyId).getBody()); } diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dto/MachineProxyDTO.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dto/MachineProxyDTO.java index 6370edff..f8d78c27 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dto/MachineProxyDTO.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dto/MachineProxyDTO.java @@ -1,4 +1,5 @@ package cd.casic.module.machine.dto; + import cd.casic.module.machine.enums.MachineProxyStatus; import lombok.*; @@ -40,6 +41,6 @@ public class MachineProxyDTO extends PageDto implements Serializable { // 假设5分钟内有心跳为在线 long fiveMinutes = 5 * 60 * 1000; return Objects.equals(MachineProxyStatus.ONLINE.getMessage(), status) && - System.currentTimeMillis() - lastHeartbeatTime.getTime() < fiveMinutes; + System.currentTimeMillis() - lastHeartbeatTime.getTime() < fiveMinutes; } } diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dto/PageDto.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dto/PageDto.java index 9940d98d..219fb4f8 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dto/PageDto.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dto/PageDto.java @@ -3,7 +3,7 @@ package cd.casic.module.machine.dto; import lombok.Data; @Data -public class PageDto{ +public class PageDto { private int pageIndex = 1; private int pageSize = 10; diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/entity/MachineInfo.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/entity/MachineInfo.java index 6843dbc4..8aa53f56 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/entity/MachineInfo.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/entity/MachineInfo.java @@ -15,7 +15,7 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @NoArgsConstructor @TableName(value = "machine_info") -public class MachineInfo extends BaseEntity{ +public class MachineInfo extends BaseEntity { @TableField(value = "name") private String name; diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/entity/MachineProxy.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/entity/MachineProxy.java index ef3f80a4..f17e251a 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/entity/MachineProxy.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/entity/MachineProxy.java @@ -1,4 +1,6 @@ package cd.casic.module.machine.entity; + +import cd.casic.module.machine.enums.MachineProxyStatus; import com.baomidou.mybatisplus.annotation.*; import cd.casic.module.machine.enums.MachineInfoStatus; import cd.casic.module.machine.enums.MachineProxyType; @@ -45,7 +47,7 @@ public class MachineProxy extends BaseEntity implements Serializable { * 代理状态 (online, offline, installing, updating, error) */ @TableField(exist = false) - private MachineInfoStatus status; + private MachineProxyStatus status; @TableField(value = "status_code") private int statusCode; @@ -67,5 +69,4 @@ public class MachineProxy extends BaseEntity implements Serializable { private String description; - } diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/enums/MachineProxyStatus.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/enums/MachineProxyStatus.java index 7478e959..dc7acd77 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/enums/MachineProxyStatus.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/enums/MachineProxyStatus.java @@ -10,11 +10,11 @@ public enum MachineProxyStatus implements CodeEnum { /** * 代理状态 (online, offline, installing, updating, error) */ - ONLINE(1,"online"), - OFFLINE(2,"offline"), - INSTALLING(3,"installing"), - UPDATING(4,"updating"), - ERROR(5,"error"); + ONLINE(1, "online"), + OFFLINE(2, "offline"), + INSTALLING(3, "installing"), + UPDATING(4, "updating"), + ERROR(5, "error"); private final int code; diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/enums/MachineProxyType.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/enums/MachineProxyType.java index b6de6358..9cba5df2 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/enums/MachineProxyType.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/enums/MachineProxyType.java @@ -7,9 +7,9 @@ import lombok.Getter; @Getter @AllArgsConstructor public enum MachineProxyType implements CodeEnum { - HTTP(1,"http"), - SOCKS4(2,"socks4"), - SOCKS5(3,"socks5"); + HTTP(1, "http"), + SOCKS4(2, "socks4"), + SOCKS5(3, "socks5"); private final int code; diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/enums/RequestExceptionEnum.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/enums/RequestExceptionEnum.java index 6f01b6f2..17fb4901 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/enums/RequestExceptionEnum.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/enums/RequestExceptionEnum.java @@ -7,8 +7,8 @@ import lombok.Getter; @Getter @AllArgsConstructor public enum RequestExceptionEnum implements CodeEnum { - REQUEST_TYPE_NOT_JSON(1,"传递参数格式错误,请使用json格式"), - REQUEST_JSON_ERROR(2,"json格式错误"), + REQUEST_TYPE_NOT_JSON(1, "传递参数格式错误,请使用json格式"), + REQUEST_JSON_ERROR(2, "json格式错误"), REQUEST_METHOD_NOT_POST(3, "不支持该请求方法,请求方法应为POST"), REQUEST_METHOD_NOT_GET(4, "不支持该请求方法,请求方法应为GET"), PARAM_ERROR(5, "参数错误"); diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/handler/ConnectionSession.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/handler/ConnectionSession.java index ddfa59d4..0d52f459 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/handler/ConnectionSession.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/handler/ConnectionSession.java @@ -62,13 +62,13 @@ public class ConnectionSession implements AutoCloseable { doConnect(); status = ConnectionStatus.CONNECTED; log.info("SSH connection established successfully to {} (attempt {}/{})", - machineInfo.getHostIp(), attempt, RETRY_COUNT); + machineInfo.getHostIp(), attempt, RETRY_COUNT); return; } catch (JSchException e) { lastException = e; status = ConnectionStatus.CONNECTION_ERROR; log.error("SSH connection attempt {}/{} failed: {}", - attempt, RETRY_COUNT, e.getMessage()); + attempt, RETRY_COUNT, e.getMessage()); // 认证失败直接退出,无需重试 if (e.getMessage().contains("Auth fail")) { @@ -105,9 +105,9 @@ public class ConnectionSession implements AutoCloseable { // 创建SSH会话 sshSession = jsch.getSession( - machineInfo.getUsername(), - machineInfo.getHostIp(), - machineInfo.getSshPort() != null ? machineInfo.getSshPort() : 22 + machineInfo.getUsername(), + machineInfo.getHostIp(), + machineInfo.getSshPort() != null ? machineInfo.getSshPort() : 22 ); // 配置连接参数 @@ -120,7 +120,7 @@ public class ConnectionSession implements AutoCloseable { /** * 配置认证方式(密码或密钥) */ - private void configureAuthentication(JSch jsch) throws JSchException{ + private void configureAuthentication(JSch jsch) throws JSchException { if (machineInfo.getAuthenticationType() == AuthenticationType.SECRET_KEY) { // 密钥认证 if (machineInfo.getSecretKeyId() == null) { @@ -134,10 +134,10 @@ public class ConnectionSession implements AutoCloseable { // 加载私钥(支持密码短语,可从配置中获取) jsch.addIdentity( - machineInfo.getName(), - privateKeyContent.getBytes(StandardCharsets.UTF_8), - null, - null // 密码短语,可为null + machineInfo.getName(), + privateKeyContent.getBytes(StandardCharsets.UTF_8), + null, + null // 密码短语,可为null ); } else if (machineInfo.getAuthenticationType() == AuthenticationType.PASSWORD) { // 密码认证 @@ -158,7 +158,7 @@ public class ConnectionSession implements AutoCloseable { // 安全增强:默认验证主机密钥 if (isTrustedEnvironment()) { log.warn("Running in trusted environment - disabling strict host key checking for {}", - machineInfo.getHostIp()); + machineInfo.getHostIp()); config.put("StrictHostKeyChecking", "no"); } else { config.put("StrictHostKeyChecking", "yes"); @@ -261,7 +261,7 @@ public class ConnectionSession implements AutoCloseable { // 使用线程中断机制实现超时控制 Thread readerThread = new Thread(() -> { - int bytesRead ; + int bytesRead; try { while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); @@ -349,10 +349,10 @@ public class ConnectionSession implements AutoCloseable { // 使用更健壮的上传方式 channel.put( - new FileInputStream(localFile), - remoteFilePath, - new ProgressMonitorAdapter(localFile.length()), - ChannelSftp.OVERWRITE + new FileInputStream(localFile), + remoteFilePath, + new ProgressMonitorAdapter(localFile.length()), + ChannelSftp.OVERWRITE ); uploadSuccess = true; @@ -361,7 +361,7 @@ public class ConnectionSession implements AutoCloseable { } catch (SftpException e) { log.error("SFTP error during file upload ({} -> {}): {}", - localFilePath, remoteFilePath, e.getMessage(), e); + localFilePath, remoteFilePath, e.getMessage(), e); throw new IOException("SFTP error: " + e.getMessage(), e); } catch (FileNotFoundException e) { log.error("Local file not found during upload: {}", localFilePath, e); @@ -418,16 +418,16 @@ public class ConnectionSession implements AutoCloseable { // 执行下载并监控进度 channel.get( - remoteFilePath, - new FileOutputStream(tempFile).toString(), - new ProgressMonitorAdapter(fileSize), - ChannelSftp.OVERWRITE + remoteFilePath, + new FileOutputStream(tempFile).toString(), + new ProgressMonitorAdapter(fileSize), + ChannelSftp.OVERWRITE ); // 验证下载完整性 if (tempFile.length() != fileSize) { throw new IOException("Download incomplete: expected " + fileSize + - " bytes, but got " + tempFile.length() + " bytes"); + " bytes, but got " + tempFile.length() + " bytes"); } // 重命名临时文件为目标文件(原子操作) @@ -441,7 +441,7 @@ public class ConnectionSession implements AutoCloseable { } catch (SftpException e) { log.error("SFTP error during file download ({} -> {}): {}", - remoteFilePath, localFilePath, e.getMessage(), e); + remoteFilePath, localFilePath, e.getMessage(), e); if (e.id == ChannelSftp.SSH_FX_NO_SUCH_FILE) { throw new FileNotFoundException("Remote file not found: " + remoteFilePath); } @@ -482,11 +482,13 @@ public class ConnectionSession implements AutoCloseable { log.debug("Created remote directory: {}", directory); } } + // 获取路径的父目录 private String getParentDirectory(String path) { int lastSlash = path.lastIndexOf('/'); return lastSlash > 0 ? path.substring(0, lastSlash) : ""; } + // 断开SFTP通道 private void disconnectChannel(Channel channel) { if (channel != null && channel.isConnected()) { @@ -513,6 +515,7 @@ public class ConnectionSession implements AutoCloseable { disconnectChannel(channel); } } + // 增强的进度监控器 private static class ProgressMonitorAdapter implements SftpProgressMonitor { private final long totalBytes; @@ -538,7 +541,7 @@ public class ConnectionSession implements AutoCloseable { String speedStr = formatTransferSpeed(speed); log.debug("Upload progress: {}% ({}/{} bytes, {})", - progress, bytesWritten, totalBytes, speedStr); + progress, bytesWritten, totalBytes, speedStr); lastProgress = progress; } @@ -552,7 +555,7 @@ public class ConnectionSession implements AutoCloseable { String speedStr = formatTransferSpeed(speed); log.info("Upload completed: {} bytes in {} ms (avg speed: {})", - totalBytes, elapsedTime, speedStr); + totalBytes, elapsedTime, speedStr); } @Override @@ -575,13 +578,12 @@ public class ConnectionSession implements AutoCloseable { } - /** * 检查连接状态 */ public ConnectionStatus getStatus() { if (status == ConnectionStatus.CONNECTED && - (sshSession == null || !sshSession.isConnected())) { + (sshSession == null || !sshSession.isConnected())) { status = ConnectionStatus.DISCONNECTED; } return status; @@ -592,8 +594,8 @@ public class ConnectionSession implements AutoCloseable { */ public boolean isConnected() { return status == ConnectionStatus.CONNECTED && - sshSession != null && - sshSession.isConnected(); + sshSession != null && + sshSession.isConnected(); } diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/MachineEnvService.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/MachineEnvService.java index 14d79992..e71ad993 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/MachineEnvService.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/MachineEnvService.java @@ -16,6 +16,7 @@ public interface MachineEnvService extends IService { * 创建或更新机器的环境变量(一对一关系) */ boolean add(MachineEnvDTO machineEnvDTO); + /** * 删除机器的环境变量 */ @@ -23,6 +24,7 @@ public interface MachineEnvService extends IService { /** * 获取机器的环境变量 + * * @param machineId 机器ID * @return 环境变量DTO */ diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/MachineInfoService.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/MachineInfoService.java index fa532b85..6da0e94b 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/MachineInfoService.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/MachineInfoService.java @@ -25,9 +25,9 @@ public interface MachineInfoService extends IService { void deleteMachineInfo(Long machineInfoId); - /** * 测试机器连接 + * * @param machineInfo 机器信息 * @return 连接是否成功 */ @@ -35,6 +35,7 @@ public interface MachineInfoService extends IService { /** * 获取机器连接状态 + * * @param machineName 机器名称 * @return 连接状态 */ @@ -42,12 +43,14 @@ public interface MachineInfoService extends IService { /** * 获取所有连接状态 + * * @return 机器名称到连接状态的映射 */ Map getAllConnectionStatus(); /** * 建立机器连接 + * * @param machineInfo 机器信息 * @return 连接会话ID */ @@ -55,6 +58,7 @@ public interface MachineInfoService extends IService { /** * 断开机器连接 + * * @param sessionId 会话ID * @return 操作结果 */ @@ -62,16 +66,18 @@ public interface MachineInfoService extends IService { /** * 执行远程命令 + * * @param sessionId 会话ID - * @param command 命令 + * @param command 命令 * @return 命令执行结果 */ String executeCommand(String sessionId, String command); /** * 上传文件到远程机器 - * @param sessionId 会话ID - * @param localFilePath 本地文件路径 + * + * @param sessionId 会话ID + * @param localFilePath 本地文件路径 * @param remoteFilePath 远程文件路径 * @return 操作结果 */ @@ -79,9 +85,10 @@ public interface MachineInfoService extends IService { /** * 从远程机器下载文件 - * @param sessionId 会话ID + * + * @param sessionId 会话ID * @param remoteFilePath 远程文件路径 - * @param localFilePath 本地文件路径 + * @param localFilePath 本地文件路径 * @return 操作结果 */ boolean downloadFile(String sessionId, String remoteFilePath, String localFilePath); diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/MachineProxyService.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/MachineProxyService.java index cc1bd2e5..48185546 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/MachineProxyService.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/MachineProxyService.java @@ -1,4 +1,5 @@ package cd.casic.module.machine.service; + import cd.casic.module.machine.dto.MachineProxyDTO; import cd.casic.module.machine.entity.MachineProxy; import cd.casic.module.machine.utils.PageResult; @@ -22,7 +23,6 @@ public interface MachineProxyService extends IService { boolean updateStatus(MachineProxyDTO machineProxyDTO); - /** * 获取所有代理的状态统计 * @@ -38,9 +38,10 @@ public interface MachineProxyService extends IService { /** * 批量删除代理 + * * @param proxyIds 代理ID列表 */ - String delete(String proxyIds); + void delete(String proxyIds); PageResult list(MachineProxyDTO machineProxyDTO); } diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/SecretKeyService.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/SecretKeyService.java index 5a6d2da3..95747cc7 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/SecretKeyService.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/SecretKeyService.java @@ -15,7 +15,7 @@ public interface SecretKeyService extends IService { void bindingMachine(SecretKeyDto secretKeyDto); - boolean updateSecretKey(SecretKeyDto secretKeyDto,MultipartFile file); + boolean updateSecretKey(SecretKeyDto secretKeyDto, MultipartFile file); boolean deleteSecretKey(Long secretKeyId); diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/impl/MachineEnvServiceImpl.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/impl/MachineEnvServiceImpl.java index f5dd8f70..fe0d14e8 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/impl/MachineEnvServiceImpl.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/impl/MachineEnvServiceImpl.java @@ -1,4 +1,5 @@ package cd.casic.module.machine.service.impl; + import cd.casic.module.machine.dto.MachineEnvDTO; import cd.casic.module.machine.entity.MachineEnv; import cd.casic.module.machine.exception.ServiceException; @@ -32,13 +33,13 @@ public class MachineEnvServiceImpl extends ServiceImpl() - .eq(MachineEnv::getMachineId, machineId) + new LambdaQueryWrapper() + .eq(MachineEnv::getMachineId, machineId) ); return machineEnv != null ? convertToDTO(machineEnv) : null; @@ -115,17 +115,17 @@ public class MachineEnvServiceImpl extends ServiceImpl dtoList = page.getRecords().stream() - .map(this::convertToDTO) - .collect(Collectors.toList()); + .map(this::convertToDTO) + .collect(Collectors.toList()); // 构建分页结果 return PageResult.builder() - .pageNum(page.getCurrent()) - .pageSize(page.getSize()) - .total(page.getTotal()) - .pages(page.getPages()) - .list(dtoList) - .build(); + .pageNum(page.getCurrent()) + .pageSize(page.getSize()) + .total(page.getTotal()) + .pages(page.getPages()) + .list(dtoList) + .build(); } @Override @@ -141,7 +141,7 @@ public class MachineEnvServiceImpl extends ServiceImpl getStatusStatistics() { List proxyList = list(); @@ -72,35 +73,34 @@ public class MachineProxyServiceImpl extends ServiceImpl EnumUtils.getEnumByCode(proxy.getStatusCode(), MachineProxyStatus.class).getMessage()) - .collect(Collectors.groupingBy( - Function.identity(), - Collectors.counting() // 统计每个分组的元素数量 - )); + .map(proxy -> EnumUtils.getEnumByCode(proxy.getStatusCode(), MachineProxyStatus.class).getMessage()) + .collect(Collectors.groupingBy( + Function.identity(), + Collectors.counting() // 统计每个分组的元素数量 + )); } @Override public void update(MachineProxyDTO machineProxyDTO) { // 参数校验 if (machineProxyDTO == null) { - throw new ServiceException(ServiceException.MACHINE_PROXY_DTO_NULL,"MachineProxyDTO对象为空"); + throw new ServiceException(ServiceException.MACHINE_PROXY_DTO_NULL, "MachineProxyDTO对象为空"); } MachineProxy machineProxy = new MachineProxy(); BeanUtils.copyProperties(machineProxyDTO, machineProxy); - if (machineProxyDTO.getProxyType()!= null && !machineProxyDTO.getProxyType().isEmpty()){ + if (machineProxyDTO.getProxyType() != null && !machineProxyDTO.getProxyType().isEmpty()) { machineProxy.setProxyTypeCode(EnumUtils.getEnumByMessage(machineProxyDTO.getProxyType(), MachineProxyType.class).getCode()); } - if (machineProxyDTO.getStatus()!= null && !machineProxyDTO.getStatus().isEmpty()){ + if (machineProxyDTO.getStatus() != null && !machineProxyDTO.getStatus().isEmpty()) { machineProxy.setStatusCode(EnumUtils.getEnumByMessage(machineProxyDTO.getStatus(), MachineProxyStatus.class).getCode()); } this.updateById(machineProxy); } - @Override @Transactional(rollbackFor = Exception.class) - public String delete(String ids) { + public void delete(String ids) { List machineProxyIds = Arrays.stream(ids.split(",")) .map(String::trim) .filter(s -> !s.isEmpty()) @@ -108,28 +108,12 @@ public class MachineProxyServiceImpl extends ServiceImpl onlineProxies = list(new LambdaQueryWrapper() - .in(MachineProxy::getId, machineProxyIds) - .eq(MachineProxy::getStatusCode, MachineProxyStatus.ONLINE.getCode())); - - if (!CollectionUtils.isEmpty(onlineProxies)) { - List onlineIds = onlineProxies.stream() - .map(MachineProxy::getId) - .toList(); - - // 将 [10, 9] 转换为 "10, 9" - String idStr = onlineIds.toString().replaceAll("[\\[\\]]", ""); - return "以下代理处于在线状态,无法删除: " + idStr; - } - // 批量逻辑删除 remove(new LambdaQueryWrapper() - .in(MachineProxy::getId, machineProxyIds)); - return ""; + .in(MachineProxy::getId, machineProxyIds) + .ne(MachineProxy::getStatus, MachineProxyStatus.ONLINE.getCode())); } @Override @@ -144,15 +128,15 @@ public class MachineProxyServiceImpl extends ServiceImpl( - page.getCurrent(), - page.getSize(), - page.getTotal(), - page.getPages(), - machineProxyDtos + page.getCurrent(), + page.getSize(), + page.getTotal(), + page.getPages(), + machineProxyDtos ); } - private QueryWrapper getMachineProxyQueryWrapper(MachineProxyDTO machineProxyDTO){ + private QueryWrapper getMachineProxyQueryWrapper(MachineProxyDTO machineProxyDTO) { QueryWrapper queryWrapper = new QueryWrapper<>(); if (machineProxyDTO.getHostIp() != null && !machineProxyDTO.getHostIp().isEmpty()) { queryWrapper.like("host_ip", machineProxyDTO.getHostIp()); @@ -167,7 +151,10 @@ public class MachineProxyServiceImpl extends ServiceImpl implements MachineInfoService { - int ENABLE=1; - int UN_ENABLE=0; + int ENABLE = 1; + int UN_ENABLE = 0; @Resource private MachineInfoMapper machineInfoMapper; @@ -57,6 +57,7 @@ public class MachineinfoServiceImpl extends ServiceImpl 会话ID */ private final Map machineSessionMapping = new ConcurrentHashMap<>(); + @Override public boolean addMachineInfo(MachineInfoDto machineInfoDto) { if (machineInfoDto == null) { @@ -72,8 +73,8 @@ public class MachineinfoServiceImpl extends ServiceImpl updateWrapper = new UpdateWrapper<>(); - updateWrapper.eq("id", machineInfoDto.getId()).set("secret_key_id", machineInfoDto.getSecretKeyId()).set("authentication_type_code",2); + updateWrapper.eq("id", machineInfoDto.getId()).set("secret_key_id", machineInfoDto.getSecretKeyId()).set("authentication_type_code", 2); return this.update(updateWrapper); } @@ -147,7 +148,7 @@ public class MachineinfoServiceImpl extends ServiceImpl { - if (machineInfo.getStatusCode() == 1){ + if (machineInfo.getStatusCode() == 1) { this.removeById(machineInfo.getId()); } }); @@ -156,14 +157,14 @@ public class MachineinfoServiceImpl extends ServiceImpl getMachineInfoQueryWrapper(MachineInfoDto machineInfoDto) { QueryWrapper queryWrapper = new QueryWrapper<>(); - if (machineInfoDto.getStatus() != null && !machineInfoDto.getStatus().isEmpty()){ + if (machineInfoDto.getStatus() != null && !machineInfoDto.getStatus().isEmpty()) { queryWrapper.eq("status_code", EnumUtils.getEnumByMessage(machineInfoDto.getStatus(), MachineInfoStatus.class).getCode()); } if (machineInfoDto.getName() != null && !machineInfoDto.getName().isEmpty()) { @@ -182,11 +183,9 @@ public class MachineinfoServiceImpl extends ServiceImpl listSecretKey(SecretKeyDto secretKeyDto) { QueryWrapper queryWrapper = new QueryWrapper<>(); - if (secretKeyDto.getName() != null && !secretKeyDto.getName().isEmpty()){ + if (secretKeyDto.getName() != null && !secretKeyDto.getName().isEmpty()) { queryWrapper.like("name", secretKeyDto.getName()); } - if (secretKeyDto.getDescription() != null && !secretKeyDto.getDescription().isEmpty()){ + if (secretKeyDto.getDescription() != null && !secretKeyDto.getDescription().isEmpty()) { queryWrapper.like("description", secretKeyDto.getDescription()); } queryWrapper.orderByDesc("create_date"); Page page = secretServiceMapper.selectPage(new Page<>(secretKeyDto.getPageIndex(), secretKeyDto.getPageSize()), queryWrapper); - return new PageResult<>( + return new PageResult<>( page.getCurrent(), page.getSize(), page.getTotal(), @@ -127,15 +126,15 @@ public class SecretKeyServiceImpl extends ServiceImpl { try { for (SecretKey secretKey : secretKeys) { - if (secretKey.getFileName() != null && !secretKey.getFileName().isEmpty()){ + if (secretKey.getFileName() != null && !secretKey.getFileName().isEmpty()) { aliOssUtil.deleteFile(secretKey.getFileName()); } } } catch (Exception e) { logger.error("异步删除文件失败:{}", e.getMessage()); - throw new ServiceException(ServiceException.DELETE_FILE_FAIL,"异步删除文件失败:"+e.getMessage()); + throw new ServiceException(ServiceException.DELETE_FILE_FAIL, "异步删除文件失败:" + e.getMessage()); } }); - return secretServiceMapper.deleteBatchIds(secretKeyIds) > 0 ; + return secretServiceMapper.deleteBatchIds(secretKeyIds) > 0; } } diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/utils/AliOssUtil.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/utils/AliOssUtil.java index fc185e7e..4bf37ba1 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/utils/AliOssUtil.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/utils/AliOssUtil.java @@ -21,12 +21,12 @@ import java.nio.charset.StandardCharsets; @Component -public class AliOssUtil{ +public class AliOssUtil { -// @Autowired + // @Autowired private OSS ossClient; -// @Resource + // @Resource private AliYunConfig aliyunConfig; private static final Logger logger = LoggerFactory.getLogger(AliOssUtil.class); @@ -35,14 +35,14 @@ public class AliOssUtil{ try { String fileName = generateUniqueFileName(file.getName()); ossClient.putObject( - // 存储桶名称 - aliyunConfig.getBucketName(), - //对象键(Object Key),即文件在 OSS 中的完整路径和名称 - fileName, - //文件内容的输入流,用于读取待上传的文件数据。 - file.getInputStream(), - //文件的元数据信息,如内容类型(Content-Type)、缓存策略、文件大小等。 - null + // 存储桶名称 + aliyunConfig.getBucketName(), + //对象键(Object Key),即文件在 OSS 中的完整路径和名称 + fileName, + //文件内容的输入流,用于读取待上传的文件数据。 + file.getInputStream(), + //文件的元数据信息,如内容类型(Content-Type)、缓存策略、文件大小等。 + null ); return fileName; } catch (Exception e) { @@ -58,7 +58,7 @@ public class AliOssUtil{ // 处理文件名编码(防止中文乱码) String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8) - .replaceAll("\\+", "%20"); + .replaceAll("\\+", "%20"); // 设置响应头 HttpHeaders headers = new HttpHeaders(); @@ -67,8 +67,8 @@ public class AliOssUtil{ headers.setCacheControl("no-cache, no-store, must-revalidate"); return ResponseEntity.ok() - .headers(headers) - .body(new InputStreamResource(inputStream)); + .headers(headers) + .body(new InputStreamResource(inputStream)); } catch (Exception e) { logger.error("下载失败:{}", e.getMessage()); throw new ServiceException(ServiceException.DOWNLOAD_FILE_FAIL, "下载失败: " + e.getMessage());