diff --git a/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/api/DockerImageController.java b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/api/DockerImageController.java index 290ad6b7..6c2e43e3 100644 --- a/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/api/DockerImageController.java +++ b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/api/DockerImageController.java @@ -1,9 +1,20 @@ package cd.casic.module.execute.docker.api; +import cd.casic.framework.commons.pojo.CommonResult; +import cd.casic.framework.commons.pojo.PageResult; +import cd.casic.module.execute.docker.dataobject.dto.DockerImageDo; +import cd.casic.module.execute.docker.dataobject.model.DockerImage; +import cd.casic.module.execute.docker.dataobject.vo.DockerImagePageReqVO; +import cd.casic.module.execute.docker.service.IImageService; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import static cd.casic.framework.commons.pojo.CommonResult.success; /** * @description: TODO @@ -14,7 +25,26 @@ import org.springframework.web.bind.annotation.RestController; @Tag(name = "docker管理 - 镜像管理") @RequiredArgsConstructor @RestController +@Validated @RequestMapping("/api/images") public class DockerImageController { + + @Resource + private IImageService imageService; + + @PostMapping("/localUpload") + @Operation(summary = "镜像上传") + @PreAuthorize("@ss.hasPermission('docker:images:localUpload')") + public CommonResult localImageUpload(@RequestBody DockerImage dockerImage) { + return success(imageService.localImageUpload(dockerImage)); + } + + @GetMapping("/page") + @Operation(summary = "本地镜像分页") + @PreAuthorize("@ss.hasPermission('docker:images:query')") + public CommonResult> getLocalImagePage(@Valid DockerImagePageReqVO pageVO) { + return success(imageService.getLocalImagePage(pageVO)); + } + } diff --git a/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dao/DockerImageDao.java b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dao/DockerImageDao.java new file mode 100644 index 00000000..8e1ca9bd --- /dev/null +++ b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dao/DockerImageDao.java @@ -0,0 +1,10 @@ +package cd.casic.module.execute.docker.dao; + +import cd.casic.framework.mybatis.core.mapper.BaseMapperX; +import cd.casic.module.execute.docker.dataobject.dto.DockerImageDo; +import org.apache.ibatis.annotations.Mapper; + + +@Mapper +public interface DockerImageDao extends BaseMapperX { +} diff --git a/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/convert/DockerImageConvert.java b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/convert/DockerImageConvert.java new file mode 100644 index 00000000..ee288638 --- /dev/null +++ b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/convert/DockerImageConvert.java @@ -0,0 +1,20 @@ +package cd.casic.module.execute.docker.dataobject.convert; + +import cd.casic.module.execute.docker.dataobject.dto.DockerImageDo; +import cd.casic.module.execute.docker.dataobject.model.DockerImage; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * + * @author Yuru Pu + * @version 1.0 + * @since 2025/7/23 17:16 + */ +@Mapper(componentModel = "spring") +public interface DockerImageConvert { + DockerImageConvert INSTANCE = Mappers.getMapper(DockerImageConvert.class); + + DockerImageDo convert(DockerImage dockerImage); + +} diff --git a/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/dto/DockerImageDo.java b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/dto/DockerImageDo.java new file mode 100644 index 00000000..093a0a9b --- /dev/null +++ b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/dto/DockerImageDo.java @@ -0,0 +1,61 @@ +package cd.casic.module.execute.docker.dataobject.dto; + +import cd.casic.framework.commons.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 本地镜像 + * + * @author Yuru Pu + * @version 1.0 + * @since 2025/7/23 16:22 + */ +@TableName("pipeline_image") +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class DockerImageDo extends BaseDO { + + @TableId(type = IdType.ASSIGN_ID) + private String id; + + private String name; + + /** + * 文件大小 + */ + private Integer size; + + /** + * 文件版本 + */ + private String version; + + /** + * 用途 + */ + private String purpose; + + /** + * 地址路径 + */ + private String path; + + /** + * 描述 + */ + private String description; + + /** + * 状态 0 可用 + */ + private Boolean state; + + + +} diff --git a/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/model/DockerImage.java b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/model/DockerImage.java new file mode 100644 index 00000000..02363a2c --- /dev/null +++ b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/model/DockerImage.java @@ -0,0 +1,54 @@ +package cd.casic.module.execute.docker.dataobject.model; + +import cd.casic.framework.commons.dataobject.BaseDO; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 本地镜像 + * + * @author Yuru Pu + * @version 1.0 + * @since 2025/7/23 16:22 + */ +@Data +@Accessors(chain = true) +public class DockerImage extends BaseDO { + + private String id; + + private String name; + + /** + * 文件大小 + */ + private Integer size; + + /** + * 文件版本 + */ + private String version; + + /** + * 用途 + */ + private String purpose; + + /** + * 地址路径 + */ + private String path; + + /** + * 描述 + */ + private String description; + + /** + * 状态 1 可用 + */ + private Boolean state; + + + +} diff --git a/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/vo/DockerImagePageReqVO.java b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/vo/DockerImagePageReqVO.java new file mode 100644 index 00000000..eca8cf78 --- /dev/null +++ b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/dataobject/vo/DockerImagePageReqVO.java @@ -0,0 +1,14 @@ +package cd.casic.module.execute.docker.dataobject.vo; + +import cd.casic.framework.commons.pojo.PageParam; +import lombok.Data; + +/** + * @author: Paul + * @create: 2025-07-24 13:49 + */ +@Data +public class DockerImagePageReqVO extends PageParam { + + private String name; +} diff --git a/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/service/IImageService.java b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/service/IImageService.java index e6c774e0..3486116a 100644 --- a/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/service/IImageService.java +++ b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/service/IImageService.java @@ -1,5 +1,9 @@ package cd.casic.module.execute.docker.service; +import cd.casic.framework.commons.pojo.PageResult; +import cd.casic.module.execute.docker.dataobject.dto.DockerImageDo; +import cd.casic.module.execute.docker.dataobject.model.DockerImage; +import cd.casic.module.execute.docker.dataobject.vo.DockerImagePageReqVO; import com.github.dockerjava.api.command.InspectImageResponse; import com.github.dockerjava.api.model.Image; import jakarta.annotation.Nonnull; @@ -102,4 +106,7 @@ public interface IImageService { */ Boolean pushImage(@Nonnull String clientId, String imageId); + int localImageUpload(DockerImage dockerImage); + + PageResult getLocalImagePage(DockerImagePageReqVO pageVO); } diff --git a/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/service/impl/ImageService.java b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/service/impl/ImageService.java index dd65aa15..c34d787d 100644 --- a/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/service/impl/ImageService.java +++ b/modules/module-ci-execute/src/main/java/cd/casic/module/execute/docker/service/impl/ImageService.java @@ -1,6 +1,13 @@ package cd.casic.module.execute.docker.service.impl; +import cd.casic.framework.commons.pojo.PageResult; +import cd.casic.framework.mybatis.core.query.LambdaQueryWrapperX; import cd.casic.module.execute.docker.DockerClientFactory; +import cd.casic.module.execute.docker.dao.DockerImageDao; +import cd.casic.module.execute.docker.dataobject.convert.DockerImageConvert; +import cd.casic.module.execute.docker.dataobject.dto.DockerImageDo; +import cd.casic.module.execute.docker.dataobject.model.DockerImage; +import cd.casic.module.execute.docker.dataobject.vo.DockerImagePageReqVO; import cd.casic.module.execute.docker.service.IImageService; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; @@ -11,11 +18,12 @@ import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.Image; import com.github.dockerjava.api.model.PruneType; import jakarta.annotation.Nonnull; +import jakarta.annotation.Resource; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; - +import org.springframework.transaction.annotation.Transactional; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -35,6 +43,9 @@ public class ImageService implements IImageService { private final DockerClientFactory dockerClientFactory; + @Resource + private DockerImageDao dockerImageDao; + @Override public List list(@Nonnull String clientId) { DockerClient dockerClient = dockerClientFactory.getdockerClient(clientId); @@ -130,4 +141,16 @@ public class ImageService implements IImageService { } return true; } + @Transactional(rollbackFor = Exception.class) + @Override + public int localImageUpload(DockerImage dockerImage) { + return dockerImageDao.insert(DockerImageConvert.INSTANCE.convert(dockerImage)); + } + + @Override + public PageResult getLocalImagePage(DockerImagePageReqVO pageVO) { + LambdaQueryWrapperX queryWrapperX = new LambdaQueryWrapperX<>(); + PageResult page = dockerImageDao.selectPage(pageVO, queryWrapperX.likeIfPresent(DockerImageDo::getName, pageVO.getName()).orderByDesc(DockerImageDo::getCreateTime)); + return page; + } }