diff --git a/oh-my-scheduler-common/src/main/java/com/github/kfcfans/oms/common/model/GitRepoInfo.java b/oh-my-scheduler-common/src/main/java/com/github/kfcfans/oms/common/model/GitRepoInfo.java new file mode 100644 index 00000000..7091391c --- /dev/null +++ b/oh-my-scheduler-common/src/main/java/com/github/kfcfans/oms/common/model/GitRepoInfo.java @@ -0,0 +1,21 @@ +package com.github.kfcfans.oms.common.model; + +import lombok.Data; + +/** + * Git代码库信息 + * + * @author tjq + * @since 2020/5/17 + */ +@Data +public class GitRepoInfo { + // 仓库地址 + private String repo; + // 分支名称 + private String branch; + // 用户名 + private String username; + // 密码 + private String password; +} diff --git a/oh-my-scheduler-server/pom.xml b/oh-my-scheduler-server/pom.xml index 48dc9363..1c8fc31f 100644 --- a/oh-my-scheduler-server/pom.xml +++ b/oh-my-scheduler-server/pom.xml @@ -20,6 +20,8 @@ 8.0.19 1.4.200 2.5.2 + 5.7.0.202003110725-r + 3.0.1 true @@ -75,13 +77,28 @@ test - + net.lingala.zip4j zip4j ${zip4j.version} + + + org.eclipse.jgit + org.eclipse.jgit + ${jgit.version} + + + + + org.apache.maven.shared + maven-invoker + ${mvn.invoker.version} + + + io.springfox diff --git a/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/akka/actors/ServerActor.java b/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/akka/actors/ServerActor.java index b2f1ed7e..b9219be2 100644 --- a/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/akka/actors/ServerActor.java +++ b/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/akka/actors/ServerActor.java @@ -20,6 +20,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.core.env.Environment; +import java.util.Optional; + /** * 处理 Worker 请求 * @@ -85,10 +87,11 @@ public class ServerActor extends AbstractActor { Environment environment = SpringUtils.getBean(Environment.class); String port = environment.getProperty("local.server.port"); - ContainerInfoDO containerInfo = containerInfoRepository.findByContainerName(req.getContainerName()); + Optional containerInfoOpt = containerInfoRepository.findByContainerName(req.getContainerName()); AskResponse askResponse = new AskResponse(); askResponse.setSuccess(false); - if (containerInfo != null) { + if (containerInfoOpt.isPresent()) { + ContainerInfoDO containerInfo = containerInfoOpt.get(); askResponse.setSuccess(true); ServerDeployContainerRequest dpReq = new ServerDeployContainerRequest(); diff --git a/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/persistence/core/model/ContainerInfoDO.java b/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/persistence/core/model/ContainerInfoDO.java index 3ebb48c3..f7991f43 100644 --- a/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/persistence/core/model/ContainerInfoDO.java +++ b/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/persistence/core/model/ContainerInfoDO.java @@ -36,6 +36,9 @@ public class ContainerInfoDO { // 状态,枚举值为 ContainerStatus private Integer status; + // 上一次部署时间 + private Date lastDeployTime; + private Date gmtCreate; private Date gmtModified; } diff --git a/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/persistence/core/repository/ContainerInfoRepository.java b/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/persistence/core/repository/ContainerInfoRepository.java index 13b1fcf3..65490133 100644 --- a/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/persistence/core/repository/ContainerInfoRepository.java +++ b/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/persistence/core/repository/ContainerInfoRepository.java @@ -4,6 +4,7 @@ import com.github.kfcfans.oms.server.persistence.core.model.ContainerInfoDO; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; +import java.util.Optional; /** * 容器信息 数据操作层 @@ -15,6 +16,6 @@ public interface ContainerInfoRepository extends JpaRepository findByAppId(Long appId); - ContainerInfoDO findByContainerName(String containerName); + Optional findByContainerName(String containerName); } diff --git a/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/service/ContainerService.java b/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/service/ContainerService.java index ff1ff849..6cfda610 100644 --- a/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/service/ContainerService.java +++ b/oh-my-scheduler-server/src/main/java/com/github/kfcfans/oms/server/service/ContainerService.java @@ -1,15 +1,34 @@ package com.github.kfcfans.oms.server.service; +import com.github.kfcfans.oms.common.model.GitRepoInfo; import com.github.kfcfans.oms.common.utils.CommonUtils; +import com.github.kfcfans.oms.common.utils.JsonUtils; +import com.github.kfcfans.oms.server.common.constans.ContainerSourceType; import com.github.kfcfans.oms.server.common.utils.OmsFileUtils; +import com.github.kfcfans.oms.server.persistence.core.model.ContainerInfoDO; +import com.github.kfcfans.oms.server.persistence.core.repository.ContainerInfoRepository; +import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; +import org.apache.commons.io.filefilter.FileFilterUtils; +import org.apache.commons.io.filefilter.IOFileFilter; +import org.apache.maven.shared.invoker.*; +import org.eclipse.jgit.api.CloneCommand; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.transport.CredentialsProvider; +import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.gridfs.GridFsResource; import org.springframework.data.mongodb.gridfs.GridFsTemplate; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; +import javax.annotation.Resource; import java.io.File; +import java.io.FilenameFilter; +import java.util.Collection; +import java.util.Optional; /** * 容器服务 @@ -21,6 +40,9 @@ import java.io.File; @Service public class ContainerService { + @Resource + private ContainerInfoRepository containerInfoRepository; + private GridFsTemplate gridFsTemplate; /** @@ -37,12 +59,28 @@ public class ContainerService { return jarFile; } if (gridFsTemplate != null) { - downloadJarFromMongoDB(genContainerJarName(md5), jarFile); + downloadJarFromGridFS(genContainerJarName(md5), jarFile); } return jarFile; } - private void downloadJarFromMongoDB(String mongoFileName, File targetFile) { + /** + * 部署容器 + * @param containerName 容器名称 + */ + public void deploy(String containerName) throws Exception { + Optional containerInfoOpt = containerInfoRepository.findByContainerName(containerName); + ContainerInfoDO container = containerInfoOpt.orElseThrow(() -> new IllegalArgumentException("can't find container by name: "+ containerName)); + + // 获取Jar,Git需要先 clone成Jar计算MD5,JarFile则直接下载 + ContainerSourceType sourceType = ContainerSourceType.of(container.getSourceType()); + if (sourceType == ContainerSourceType.Git) { + + + } + } + + private void downloadJarFromGridFS(String mongoFileName, File targetFile) { synchronized (mongoFileName.intern()) { if (targetFile.exists()) { return; @@ -61,7 +99,6 @@ public class ContainerService { } } - private static String genContainerJarName(String md5) { return String.format("oms-container-%s.jar", md5); } @@ -70,4 +107,54 @@ public class ContainerService { public void setGridFsTemplate(GridFsTemplate gridFsTemplate) { this.gridFsTemplate = gridFsTemplate; } + + public static void main(String[] args) throws Exception { + + String gitRepoInfoStr = "{\"repo\":\"https://gitee.com/KFCFans/OhMyScheduler-Container-Template.git\",\"branch\":\"master\"}"; + + String workerDirStr = OmsFileUtils.genTemporaryPath(); + File workerDir = new File(workerDirStr); + FileUtils.forceMkdir(workerDir); + + // git clone + GitRepoInfo gitRepoInfo = JsonUtils.parseObject(gitRepoInfoStr, GitRepoInfo.class); + + CloneCommand cloneCommand = Git.cloneRepository() + .setDirectory(workerDir) + .setURI(gitRepoInfo.getRepo()) + .setBranch(gitRepoInfo.getBranch()); + if (!StringUtils.isEmpty(gitRepoInfo.getUsername())) { + CredentialsProvider credentialsProvider = new UsernamePasswordCredentialsProvider(gitRepoInfo.getUsername(), gitRepoInfo.getPassword()); + cloneCommand.setCredentialsProvider(credentialsProvider); + } + cloneCommand.call(); + + // mvn clean package -DskipTests -U + Invoker mvnInvoker = new DefaultInvoker(); + InvocationRequest ivkReq = new DefaultInvocationRequest(); + ivkReq.setGoals(Lists.newArrayList("clean", "package", "-DskipTests", "-U")); + ivkReq.setBaseDirectory(workerDir); + ivkReq.setOutputHandler(line -> { + System.out.println(line); + }); + + InvocationResult mvnResult = mvnInvoker.execute(ivkReq); + if (mvnResult.getExitCode() != 0) { + // TODO:输出失败信息 + return; + } + + String targetDirStr = workerDirStr + "/target"; + File targetDir = new File(targetDirStr); + IOFileFilter fileFilter = FileFilterUtils.asFileFilter((dir, name) -> name.endsWith("jar-with-dependencies.jar")); + Collection jarFile = FileUtils.listFiles(targetDir, fileFilter, null); + + if (CollectionUtils.isEmpty(jarFile)) { + // TODO:输出失败信息 + return; + } + + File jarWithDependency = jarFile.iterator().next(); + + } } diff --git a/oh-my-scheduler-server/src/main/resources/oms-template-origin.zip b/oh-my-scheduler-server/src/main/resources/oms-template-origin.zip index 7807a190..037d1c54 100644 Binary files a/oh-my-scheduler-server/src/main/resources/oms-template-origin.zip and b/oh-my-scheduler-server/src/main/resources/oms-template-origin.zip differ