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