diff --git a/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/DockerController.java b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/DockerController.java new file mode 100644 index 00000000..899a3c59 --- /dev/null +++ b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/DockerController.java @@ -0,0 +1,26 @@ +package cd.casic.ci.api; + +import cd.casic.ci.process.process.service.docker.DockerService; +import cd.casic.framework.commons.pojo.CommonResult; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/docker") +public class DockerController { + @Resource + private DockerService dockerService; + @GetMapping("/imageNameListByResourceDetailId/{resourceDetailId}") + public CommonResult> imageList(@PathVariable String resourceDetailId){ + return CommonResult.success(dockerService.imageNameList(resourceDetailId)); + } + @GetMapping("/imageListByResourceId/{resourceId}") + public CommonResult> imageListByResourceId(@PathVariable String resourceId){ + return CommonResult.success(dockerService.imageListByResourceId(resourceId)); + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/constant/AFLSlotCompileConstant.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/constant/AFLSlotCompileConstant.java index 16dd42d8..6d158047 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/constant/AFLSlotCompileConstant.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/constant/AFLSlotCompileConstant.java @@ -2,5 +2,6 @@ package cd.casic.ci.process.engine.constant; public class AFLSlotCompileConstant { public static final String MANAGER_ID = "managerId"; + public static final String IMAGE_NAME = "imageName"; public static final String COMMAND_SCRIPT ="buildScript"; } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/afl/AFLSlotCompileWorker.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/afl/AFLSlotCompileWorker.java index 53f0ec25..45d72501 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/afl/AFLSlotCompileWorker.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/afl/AFLSlotCompileWorker.java @@ -41,11 +41,12 @@ public class AFLSlotCompileWorker extends DockerWorker { globalVariables.put(PipelineGlobalVariableConstant.AFL_DOCKER_WORK_DIR_KEY,workDir); } Map taskProperties = task.getTaskProperties(); - String managerId = taskProperties.get(AFLSlotCompileConstant.MANAGER_ID) instanceof String ? ((String) taskProperties.get("managerId")) : null; + String managerId = taskProperties.get(AFLSlotCompileConstant.MANAGER_ID) instanceof String ? ((String) taskProperties.get(AFLSlotCompileConstant.MANAGER_ID)) : null; // ssh 上传目标文件 ResourceFindResp resourceById = resourceManagerService.findResourceById(managerId); String machineId = resourceById.getMachineId(); String dockerId = resourceById.getDockerId(); + String imageName = taskProperties.get(AFLSlotCompileConstant.IMAGE_NAME) instanceof String ? ((String) taskProperties.get(AFLSlotCompileConstant.IMAGE_NAME)) : null; if (StringUtils.isEmpty(machineId)||StringUtils.isEmpty(dockerId)) { append(context,"该资源不支持docker或者ssh"); } @@ -81,7 +82,7 @@ public class AFLSlotCompileWorker extends DockerWorker { toBadEnding(); } // 执行预设命令 ,进入目录 - String allCommand = "docker run -v "+ PipelineGlobalVariableConstant.AFL_VOLUME_WORK_DIR_PREFIX +":"+PipelineGlobalVariableConstant.AFL_DOCKER_BASE_DIR+" -it aflplusplus bash\n" + + String allCommand = "docker run -v "+ PipelineGlobalVariableConstant.AFL_VOLUME_WORK_DIR_PREFIX +":"+PipelineGlobalVariableConstant.AFL_DOCKER_BASE_DIR+" -it "+imageName+" bash\n" + "cd "+PipelineGlobalVariableConstant.AFL_DOCKER_BASE_DIR+"\n"+// 进入到容器中的卷挂载目录 "mkdir -p "+workDir+"\n"+ "cd "+workDir+"\n"; diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/docker/DockerService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/docker/DockerService.java new file mode 100644 index 00000000..4ef03d27 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/docker/DockerService.java @@ -0,0 +1,10 @@ +package cd.casic.ci.process.process.service.docker; + +import org.springframework.web.bind.annotation.PathVariable; + +import java.util.List; + +public interface DockerService { + List imageNameList(String resourceDetailId); + List imageListByResourceId( String resourceId); +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/docker/impl/DockerServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/docker/impl/DockerServiceImpl.java new file mode 100644 index 00000000..fe5b61d2 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/docker/impl/DockerServiceImpl.java @@ -0,0 +1,86 @@ +package cd.casic.ci.process.process.service.docker.impl; + +import cd.casic.ci.process.dto.req.resource.ResourceQueryReq; +import cd.casic.ci.process.dto.resp.resource.ResourceFindResp; +import cd.casic.ci.process.dto.resp.taskResource.TaskResourceFindResp; +import cd.casic.ci.process.process.service.docker.DockerService; +import cd.casic.ci.process.process.service.resource.ResourceManagerService; +import cd.casic.framework.commons.exception.ServiceException; +import cd.casic.framework.commons.exception.enums.GlobalErrorCodeConstants; +import cd.casic.module.execute.docker.dataobject.dto.DockerEndpointDo; +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.model.Image; +import com.github.dockerjava.core.DockerClientBuilder; +import com.github.dockerjava.httpclient5.ApacheDockerHttpClient; +import jakarta.annotation.Resource; +import org.assertj.core.util.Lists; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import static java.lang.String.format; +@Service +public class DockerServiceImpl implements DockerService { + @Resource + private ResourceManagerService resourceManagerService; + @Override + public List imageNameList(String resourceDetailId) { + ResourceQueryReq req = new ResourceQueryReq(); + req.setType("docker"); + req.setId(resourceDetailId); + TaskResourceFindResp resourceListByType = resourceManagerService.findResourceListByType(req); + List dockerEndpointList = resourceListByType.getDockerEndpointList(); + if (CollectionUtils.isEmpty(dockerEndpointList)) { + return new ArrayList<>(); + } + DockerEndpointDo dockerInfo = dockerEndpointList.get(0); + + URI uri = null; + try { + uri = new URI(format("tcp://%s:%s", dockerInfo.getHost(), dockerInfo.getPort())); + } catch (URISyntaxException e) { + throw new ServiceException(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR); + } + + ApacheDockerHttpClient httpClient = new ApacheDockerHttpClient.Builder().dockerHost(uri).build(); + DockerClient build = DockerClientBuilder.getInstance().withDockerHttpClient(httpClient).build(); + List exec = build.listImagesCmd().exec(); + List res = new LinkedList<>(); + for (Image image : exec) { + String[] repoTags = image.getRepoTags(); + if (image.getRepoTags() != null && repoTags.length > 0) { + res.add(repoTags[0]); + } + } + return res; + } + + @Override + public List imageListByResourceId(String resourceId) { + ResourceFindResp resourceById = resourceManagerService.findResourceById(resourceId); + DockerEndpointDo dockerInfo = resourceById.getDockerEndpoint(); + URI uri = null; + try { + uri = new URI(format("tcp://%s:%s", dockerInfo.getHost(), dockerInfo.getPort())); + } catch (URISyntaxException e) { + throw new ServiceException(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR); + } + + ApacheDockerHttpClient httpClient = new ApacheDockerHttpClient.Builder().dockerHost(uri).build(); + DockerClient build = DockerClientBuilder.getInstance().withDockerHttpClient(httpClient).build(); + List exec = build.listImagesCmd().exec(); + List res = new LinkedList<>(); + for (Image image : exec) { + String[] repoTags = image.getRepoTags(); + if (image.getRepoTags() != null && repoTags.length > 0) { + res.add(repoTags[0]); + } + } + return res; + } +} diff --git a/ops-server/src/test/java/cd/casic/server/DockerTest.java b/ops-server/src/test/java/cd/casic/server/DockerTest.java index c6079a73..741afdec 100644 --- a/ops-server/src/test/java/cd/casic/server/DockerTest.java +++ b/ops-server/src/test/java/cd/casic/server/DockerTest.java @@ -5,6 +5,7 @@ import com.github.dockerjava.api.command.ExecCreateCmdResponse; import com.github.dockerjava.api.model.Bind; import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.api.model.HostConfig; +import com.github.dockerjava.api.model.Image; import com.github.dockerjava.core.DockerClientBuilder; import com.github.dockerjava.httpclient5.ApacheDockerHttpClient; import org.apache.commons.lang3.StringUtils; @@ -15,7 +16,11 @@ import org.springframework.test.context.ActiveProfiles; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; +import java.util.List; import java.util.concurrent.TimeUnit; + +import static java.lang.String.format; + @SpringBootTest(classes = {OpsServerApplication.class}) @ActiveProfiles("local") public class DockerTest { @@ -192,5 +197,26 @@ public class DockerTest { System.err.println("---------------------------"); } } + @Test + public void imageList() throws URISyntaxException { + URI uri = new URI(format("tcp://%s:%s", "175.6.27.228", "22375")); + + ApacheDockerHttpClient httpClient = new ApacheDockerHttpClient.Builder().dockerHost(uri).build(); + DockerClient build = DockerClientBuilder.getInstance().withDockerHttpClient(httpClient).build(); + List exec = build.listImagesCmd().exec(); + for (Image image : exec) { + String[] repoTags = image.getRepoTags(); + if (repoTags ==null) { + System.out.println("虚悬镜像"); + } else if (repoTags.length>1){ + System.out.println("多标签1镜像"); + } else { + System.out.println(""); + } + + } + System.out.println(exec); + + } }