diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..3d16134
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,14 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+/vcs.xml
+/compiler.xml
+/encodings.xml
+/jarRepositories.xml
+/misc.xml
+/uiDesigner.xml
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..c4410ba
--- /dev/null
+++ b/README.md
@@ -0,0 +1,8 @@
+# 启动参数
+````
+-DNACOS_CONFIG_SERVER=192.168.105.1:8848
+-DTENANT_CODE=longi
+-DDEPLOY_ENV=deploy-ease-dev
+-DNACOS_USER=nacos
+-DNACOS_PWD=nacos
+````
\ No newline at end of file
diff --git a/deploy-ease-api/pom.xml b/deploy-ease-api/pom.xml
new file mode 100644
index 0000000..057e9cc
--- /dev/null
+++ b/deploy-ease-api/pom.xml
@@ -0,0 +1,27 @@
+
+
+ 4.0.0
+ deploy-ease-api
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.projectlombok
+ lombok
+ provided
+
+
+
+
+
+ com.qc.soft
+ deploy-ease
+ 1.0-SNAPSHOT
+
+
+
\ No newline at end of file
diff --git a/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/controller/IDictionaryController.java b/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/controller/IDictionaryController.java
new file mode 100644
index 0000000..506509f
--- /dev/null
+++ b/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/controller/IDictionaryController.java
@@ -0,0 +1,21 @@
+package com.qc.soft.deploy.ease.api.controller;
+
+import com.qc.soft.deploy.ease.api.response.DictionaryResponse;
+import com.qc.soft.deploy.ease.api.response.TenantDictionaryResponse;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/deploy-ease/dict")
+public interface IDictionaryController {
+
+ @GetMapping("/system")
+ List systemDicts();
+
+ @GetMapping("/tenant")
+ List tenantDicts();
+
+}
diff --git a/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/controller/IJenkinsController.java b/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/controller/IJenkinsController.java
new file mode 100644
index 0000000..a78dcff
--- /dev/null
+++ b/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/controller/IJenkinsController.java
@@ -0,0 +1,11 @@
+package com.qc.soft.deploy.ease.api.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/deploy-ease/jenkins")
+public interface IJenkinsController {
+
+}
diff --git a/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/controller/IK8sController.java b/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/controller/IK8sController.java
new file mode 100644
index 0000000..a52eb80
--- /dev/null
+++ b/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/controller/IK8sController.java
@@ -0,0 +1,30 @@
+package com.qc.soft.deploy.ease.api.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@RequestMapping("/deploy-ease/k8s")
+public interface IK8sController {
+
+
+// @GetMapping("namespaces")
+// List namespaces();
+//
+// @GetMapping("deployments/{namespace}")
+// List deployments(@PathVariable String namespace);
+//
+// @GetMapping("/pods/{namespace}/{deploymentName}")
+// List pods(@PathVariable String namespace, @PathVariable String deploymentName);
+//
+// @GetMapping("/pods/{namespace}")
+// List pods(@PathVariable String namespace) ;
+//
+// @GetMapping(value = "/pod/log/{namespace}/{podName}", produces = "text/plain;charset=UTF-8")
+// String getPodLog(@PathVariable String namespace, @PathVariable String podName);
+//
+//
+// @GetMapping("/kube/config")
+// String getKubeConfig() ;
+}
diff --git a/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/controller/INacosController.java b/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/controller/INacosController.java
new file mode 100644
index 0000000..29fc884
--- /dev/null
+++ b/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/controller/INacosController.java
@@ -0,0 +1,9 @@
+package com.qc.soft.deploy.ease.api.controller;
+
+
+
+public interface INacosController {
+
+ void instances();
+
+}
diff --git a/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/controller/IProjectController.java b/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/controller/IProjectController.java
new file mode 100644
index 0000000..9e2ccf1
--- /dev/null
+++ b/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/controller/IProjectController.java
@@ -0,0 +1,18 @@
+package com.qc.soft.deploy.ease.api.controller;
+
+import com.qc.soft.deploy.ease.api.response.ProjectResponse;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/deploy-ease/project")
+public interface IProjectController {
+
+
+ @GetMapping("/list")
+ List list();
+
+}
diff --git a/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/controller/ITestController.java b/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/controller/ITestController.java
new file mode 100644
index 0000000..c7db786
--- /dev/null
+++ b/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/controller/ITestController.java
@@ -0,0 +1,14 @@
+package com.qc.soft.deploy.ease.api.controller;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/deploy-ease/test")
+public interface ITestController {
+
+ @GetMapping("test")
+ void test();
+
+}
diff --git a/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/controller/IUserController.java b/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/controller/IUserController.java
new file mode 100644
index 0000000..1272c70
--- /dev/null
+++ b/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/controller/IUserController.java
@@ -0,0 +1,15 @@
+package com.qc.soft.deploy.ease.api.controller;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/deploy-ease/user")
+public interface IUserController {
+
+
+ @GetMapping("/login")
+ boolean login(String userName, String password);
+
+}
diff --git a/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/response/DictionaryResponse.java b/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/response/DictionaryResponse.java
new file mode 100644
index 0000000..faaae69
--- /dev/null
+++ b/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/response/DictionaryResponse.java
@@ -0,0 +1,21 @@
+package com.qc.soft.deploy.ease.api.response;
+
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class DictionaryResponse implements Serializable {
+
+ private String code;
+
+ private String name;
+
+ private String value;
+
+ private boolean status;
+
+ private boolean tenantSharing;
+
+}
\ No newline at end of file
diff --git a/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/response/ProjectResponse.java b/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/response/ProjectResponse.java
new file mode 100644
index 0000000..5d18902
--- /dev/null
+++ b/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/response/ProjectResponse.java
@@ -0,0 +1,16 @@
+package com.qc.soft.deploy.ease.api.response;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ProjectResponse implements Serializable {
+
+ private String projectCode;
+
+ private String projectName;
+
+ private String tenantCode;
+
+}
\ No newline at end of file
diff --git a/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/response/TenantDictionaryResponse.java b/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/response/TenantDictionaryResponse.java
new file mode 100644
index 0000000..9192d01
--- /dev/null
+++ b/deploy-ease-api/src/main/java/com/qc/soft/deploy/ease/api/response/TenantDictionaryResponse.java
@@ -0,0 +1,18 @@
+package com.qc.soft.deploy.ease.api.response;
+
+import lombok.Data;
+
+@Data
+public class TenantDictionaryResponse {
+
+ private String code;
+
+ private String name;
+
+ private String value;
+
+ private boolean status;
+
+ private String tenantCode;
+
+}
\ No newline at end of file
diff --git a/deploy-ease-core/pom.xml b/deploy-ease-core/pom.xml
new file mode 100644
index 0000000..67283f4
--- /dev/null
+++ b/deploy-ease-core/pom.xml
@@ -0,0 +1,152 @@
+
+
+ 4.0.0
+ deploy-ease-core
+
+
+
+ org.springframework.boot
+ spring-boot
+
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.projectlombok
+ lombok
+ provided
+
+
+
+ mysql
+ mysql-connector-java
+ ${mysql.version}
+
+
+ com.alibaba
+ druid-spring-boot-starter
+ ${druid.version}
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.springframework.statemachine
+ spring-statemachine-core
+ ${spring-statemachine.version}
+
+
+ io.projectreactor
+ reactor-core
+ ${reactor-core.version}
+
+
+ com.alibaba
+ transmittable-thread-local
+ ${transmittable-thread-local.version}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.apache.httpcomponents.client5
+ httpclient5
+ ${http5.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ cn.hutool
+ hutool-all
+ ${hutool.version}
+
+
+ io.kubernetes
+ client-java
+ ${kubernetes.version}
+
+
+ org.freemarker
+ freemarker
+ ${freemarker.version}
+
+
+ com.alibaba.fastjson2
+ fastjson2
+ ${fastjson-version}
+
+
+ com.squareup.okhttp3
+ okhttp
+ ${okhttp3.version}
+
+
+ org.mapstruct
+ mapstruct
+ ${mapstruct.version}
+
+
+ org.mapstruct
+ mapstruct-processor
+ ${mapstruct.version}
+
+
+ org.mapstruct
+ mapstruct-jdk8
+ ${mapstruct.version}
+
+
+ com.qc.soft
+ deploy-ease-api
+ 1.0-SNAPSHOT
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+ com.alibaba.nacos
+ nacos-client
+
+
+
+
+ com.qc.soft
+ deploy-ease
+ 1.0-SNAPSHOT
+
+
+
+
\ No newline at end of file
diff --git a/deploy-ease-core/src/main/java/com/qc/soft/deploy/ease/DeployEaseApplication.java b/deploy-ease-core/src/main/java/com/qc/soft/deploy/ease/DeployEaseApplication.java
new file mode 100644
index 0000000..0611331
--- /dev/null
+++ b/deploy-ease-core/src/main/java/com/qc/soft/deploy/ease/DeployEaseApplication.java
@@ -0,0 +1,20 @@
+package com.qc.soft.deploy.ease;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.SpringBootConfiguration;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+@SpringBootConfiguration
+@EnableAutoConfiguration
+@ComponentScan("com.qc.soft.deploy.ease.*")
+//@MapperScan("com.qc.soft.longi.deployment.dao")
+//@EnableScheduling
+@EnableAsync
+public class DeployEaseApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DeployEaseApplication.class, args);
+ }
+}
diff --git a/deploy-ease-core/src/main/java/com/qc/soft/deploy/ease/config/ApiResponse.java b/deploy-ease-core/src/main/java/com/qc/soft/deploy/ease/config/ApiResponse.java
new file mode 100644
index 0000000..2935943
--- /dev/null
+++ b/deploy-ease-core/src/main/java/com/qc/soft/deploy/ease/config/ApiResponse.java
@@ -0,0 +1,54 @@
+package com.qc.soft.deploy.ease.config;
+
+import com.qc.soft.deploy.ease.enums.BusinessErrorCode;
+import lombok.Builder;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.StringJoiner;
+
+@Builder
+@ToString
+public class ApiResponse implements Serializable {
+
+ private BusinessErrorCode code;
+
+ private String message;
+
+ private T data;
+
+ public ApiResponse(BusinessErrorCode code, String message) {
+ this.code = code;
+ this.message = message;
+ }
+
+ public ApiResponse(BusinessErrorCode code, String message, T data) {
+ this(code, message);
+ this.data = data;
+ }
+
+ public BusinessErrorCode getCode() {
+ return code;
+ }
+
+ public void setCode(BusinessErrorCode code) {
+ this.code = code;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public T getData() {
+ return data;
+ }
+
+ public void setData(T data) {
+ this.data = data;
+ }
+
+}
diff --git a/deploy-ease-core/src/main/java/com/qc/soft/deploy/ease/config/DruidConfig.java b/deploy-ease-core/src/main/java/com/qc/soft/deploy/ease/config/DruidConfig.java
new file mode 100644
index 0000000..34c7182
--- /dev/null
+++ b/deploy-ease-core/src/main/java/com/qc/soft/deploy/ease/config/DruidConfig.java
@@ -0,0 +1,53 @@
+
+package com.qc.soft.deploy.ease.config;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.support.http.StatViewServlet;
+import com.alibaba.druid.support.http.WebStatFilter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.boot.web.servlet.ServletRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.sql.DataSource;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+@Configuration
+public class DruidConfig {
+ @ConfigurationProperties(prefix = "spring.datasource")
+ @Bean
+ public DataSource druid() {
+ return new DruidDataSource();
+ }
+
+ //配置 Druid 监控管理后台的Servlet;
+//内置 Servlet 容器时没有web.xml文件,所以使用 Spring Boot 的注册 Servlet 方式
+ @Bean
+ public ServletRegistrationBean statViewServlet() {
+ ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
+ // 这些参数可以在 com.alibaba.druid.support.http.StatViewServlet 的父类 com.alibaba.druid.support.http.ResourceServlet 中找到
+ Map initParams = new HashMap<>();
+ initParams.put("loginUsername", "admin");
+ initParams.put("loginPassword", "123456");
+ initParams.put("allow", ""); //默认就是允许所有访问
+ //deny:Druid 后台拒绝谁访问,表示禁止此ip访问
+ // initParams.put("deny","192.168.10.132");
+ bean.setInitParameters(initParams);
+ return bean;
+ }
+
+ //2、配置一个web监控的filter
+ @Bean
+ public FilterRegistrationBean webStatFilter() {
+ FilterRegistrationBean bean = new FilterRegistrationBean();
+ bean.setFilter(new WebStatFilter());
+ Map initParams = new HashMap<>();
+ initParams.put("exclusions", "*.js,*.css,/druid/*");
+ bean.setInitParameters(initParams);
+ bean.setUrlPatterns(Arrays.asList("/*"));
+ return bean;
+ }
+}
diff --git a/deploy-ease-core/src/main/java/com/qc/soft/deploy/ease/config/GlobalCorsConfig.java b/deploy-ease-core/src/main/java/com/qc/soft/deploy/ease/config/GlobalCorsConfig.java
new file mode 100644
index 0000000..d4aaf95
--- /dev/null
+++ b/deploy-ease-core/src/main/java/com/qc/soft/deploy/ease/config/GlobalCorsConfig.java
@@ -0,0 +1,23 @@
+package com.qc.soft.deploy.ease.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class GlobalCorsConfig {
+ @Bean
+ public WebMvcConfigurer corsConfigurer() {
+ return new WebMvcConfigurer() {
+ @Override
+ public void addCorsMappings(CorsRegistry registry) {
+ registry.addMapping("/**") // 允许跨域的路径
+ .allowedOrigins("*") // 允许跨域请求的域名
+ .allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的请求方法
+ .allowedHeaders("*") // 允许的请求头
+ .allowCredentials(true); // 是否允许证书(cookies)
+ }
+ };
+ }
+}
\ No newline at end of file
diff --git a/deploy-ease-core/src/main/java/com/qc/soft/deploy/ease/config/GlobalExceptionHandler.java b/deploy-ease-core/src/main/java/com/qc/soft/deploy/ease/config/GlobalExceptionHandler.java
new file mode 100644
index 0000000..294f1fa
--- /dev/null
+++ b/deploy-ease-core/src/main/java/com/qc/soft/deploy/ease/config/GlobalExceptionHandler.java
@@ -0,0 +1,25 @@
+package com.qc.soft.deploy.ease.config;
+
+import com.qc.soft.deploy.ease.enums.ResponseCode;
+import com.qc.soft.deploy.ease.exception.BusinessException;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import javax.servlet.http.HttpServletRequest;
+
+@RestControllerAdvice
+@Slf4j
+public class GlobalExceptionHandler {
+
+ @Autowired
+ private HttpServletRequest httpServletRequest;
+
+ @ExceptionHandler(BusinessException.class)
+ public ApiResponse parameterBodyMissingExceptionHandler(BusinessException exception) {
+ String requestURI = httpServletRequest.getRequestURI();
+ log.error("An exception occurred while requesting an interface:{}", requestURI, exception);
+ return ApiResponse.builder().code(exception.getCode()).message(exception.getMessage()).build();
+ }
+}
\ No newline at end of file
diff --git a/deploy-ease-core/src/main/java/com/qc/soft/deploy/ease/config/GlobalResponseHandler.java b/deploy-ease-core/src/main/java/com/qc/soft/deploy/ease/config/GlobalResponseHandler.java
new file mode 100644
index 0000000..b6a084c
--- /dev/null
+++ b/deploy-ease-core/src/main/java/com/qc/soft/deploy/ease/config/GlobalResponseHandler.java
@@ -0,0 +1,35 @@
+package com.qc.soft.deploy.ease.config;
+
+import com.qc.soft.deploy.ease.enums.ResponseCode;
+import org.springframework.core.MethodParameter;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.http.server.ServerHttpResponse;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
+
+@ControllerAdvice
+public class GlobalResponseHandler implements ResponseBodyAdvice