From f6ba0783c2d16acd619fa7c1e6cd4f65bcfae92c Mon Sep 17 00:00:00 2001 From: tjq Date: Sun, 17 May 2020 14:49:10 +0800 Subject: [PATCH] [dev] use git4j and maven-invoker to compile container --- .../kfcfans/oms/common/model/GitRepoInfo.java | 21 ++++ oh-my-scheduler-server/pom.xml | 19 +++- .../oms/server/akka/actors/ServerActor.java | 7 +- .../core/model/ContainerInfoDO.java | 3 + .../repository/ContainerInfoRepository.java | 3 +- .../oms/server/service/ContainerService.java | 93 +++++++++++++++++- .../main/resources/oms-template-origin.zip | Bin 10397 -> 10620 bytes 7 files changed, 139 insertions(+), 7 deletions(-) create mode 100644 oh-my-scheduler-common/src/main/java/com/github/kfcfans/oms/common/model/GitRepoInfo.java 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 7807a190a7831dd6a82bb9ef64db06040ab7c9cb..037d1c540516c23a7bc81259e0a98519f77ce9a9 100644 GIT binary patch delta 2012 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 Uj#db`z}EuAI}!{SGt@uDf2tn7Q~&?~