From cfbc691c7c75a8ba9c20d0cd499a77d555d2934b Mon Sep 17 00:00:00 2001 From: liaozan <378024053@qq.com> Date: Wed, 26 Jul 2023 10:10:45 +0800 Subject: [PATCH] Polish --- initializer-backend/pom.xml | 6 +- .../initializer/runner/ArchetypePreparer.java | 2 +- .../initializer/service/ArchetypeService.java | 51 ++++++----- .../initializer/util/GitlabUtils.java | 89 +++++++++++++++++++ .../{maven => util}/MavenUtils.java | 88 ++---------------- 5 files changed, 127 insertions(+), 109 deletions(-) create mode 100644 initializer-backend/src/main/java/com/schbrain/archetype/initializer/util/GitlabUtils.java rename initializer-backend/src/main/java/com/schbrain/archetype/initializer/{maven => util}/MavenUtils.java (51%) diff --git a/initializer-backend/pom.xml b/initializer-backend/pom.xml index 7a4a379..6ab0916 100644 --- a/initializer-backend/pom.xml +++ b/initializer-backend/pom.xml @@ -63,8 +63,8 @@ integration-maven-plugin - pl.project13.maven - git-commit-id-plugin + io.github.git-commit-id + git-commit-id-maven-plugin maven-resources-plugin @@ -93,4 +93,4 @@ - \ No newline at end of file + diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/runner/ArchetypePreparer.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/runner/ArchetypePreparer.java index f59ad12..9334415 100644 --- a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/runner/ArchetypePreparer.java +++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/runner/ArchetypePreparer.java @@ -3,7 +3,7 @@ package com.schbrain.archetype.initializer.runner; import cn.hutool.core.io.FileUtil; import cn.hutool.system.SystemUtil; import com.schbrain.archetype.initializer.config.properties.ArchetypeProperties; -import com.schbrain.archetype.initializer.maven.MavenUtils; +import com.schbrain.archetype.initializer.util.MavenUtils; import com.schbrain.common.exception.BaseException; import com.schbrain.common.util.EnvUtils; import com.schbrain.framework.support.spring.OnceApplicationContextEventListener; diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/ArchetypeService.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/ArchetypeService.java index 346934a..e737c56 100644 --- a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/ArchetypeService.java +++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/ArchetypeService.java @@ -1,15 +1,18 @@ package com.schbrain.archetype.initializer.service; +import cn.hutool.cache.Cache; import cn.hutool.cache.impl.TimedCache; import cn.hutool.core.io.file.PathUtil; import cn.hutool.core.util.ZipUtil; import cn.hutool.system.SystemUtil; -import com.schbrain.archetype.initializer.maven.MavenUtils; import com.schbrain.archetype.initializer.param.ArchetypeGenerateParam; import com.schbrain.archetype.initializer.response.PreviewFileTree; +import com.schbrain.archetype.initializer.util.GitlabUtils; +import com.schbrain.archetype.initializer.util.MavenUtils; import com.schbrain.common.exception.BaseException; import com.schbrain.common.web.utils.ServletUtils; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.tuple.Pair; import org.springframework.http.ContentDisposition; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; @@ -24,6 +27,7 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.time.Duration; import java.util.Arrays; import java.util.Comparator; @@ -41,24 +45,31 @@ public class ArchetypeService { private static final String GITKEEP = ".gitkeep"; - private final TimedCache archetypeNameCache = new TimedCache<>(Duration.ofHours(1).toMillis()); + private final Cache archetypeNameCache = new TimedCache<>(Duration.ofMinutes(5).toMillis()); private final Path gitKeepFile = createGitKeepFile(SystemUtil.getUserInfo().getTempDir()); public String generate(ArchetypeGenerateParam param) throws FileNotFoundException { - String generateId = MavenUtils.generate(param); - archetypeNameCache.put(generateId, param.getArtifactId()); - preview(generateId); - return generateId; + Pair generated = MavenUtils.generate(param); + String generatedId = generated.getKey(); + File generatedFile = generated.getRight(); + // generate .gitkeep + preview(generatedId); + archetypeNameCache.put(generatedId, param.getArtifactId()); + if (param.isInitGitRepo()) { + Path directory = Paths.get(generatedFile.getAbsolutePath(), param.getArtifactId()); + GitlabUtils.initGitRepo(directory, param.getRepoGroupId(), param); + } + return generatedId; } - public List preview(String id) throws FileNotFoundException { - File generatedFiles = getGeneratedFiles(id); + public List preview(String generatedId) throws FileNotFoundException { + File generatedFiles = getGeneratedFiles(generatedId); return List.of(buildFileTree(generatedFiles)); } - public void download(String id) throws IOException { - File generatedFiles = ZipUtil.zip(getGeneratedFiles(id)); + public void download(String generatedId) throws IOException { + File generatedFiles = ZipUtil.zip(getGeneratedFiles(generatedId)); FileInputStream inputStream = new FileInputStream(generatedFiles); HttpServletResponse response = ServletUtils.getResponse(); response.addHeader(HttpHeaders.CONTENT_DISPOSITION, contentDisposition(generatedFiles)); @@ -66,10 +77,10 @@ public class ArchetypeService { StreamUtils.copy(inputStream, response.getOutputStream()); } - private PreviewFileTree buildFileTree(File root) { - File[] fileItems = Optional.ofNullable(root.listFiles()).orElse(new File[0]); + private PreviewFileTree buildFileTree(File directory) { + File[] fileItems = Optional.ofNullable(directory.listFiles()).orElse(new File[0]); if (fileItems.length == 0) { - Path target = Path.of(root.getPath(), GITKEEP); + Path target = Path.of(directory.getPath(), GITKEEP); fileItems = new File[]{PathUtil.copy(gitKeepFile, target).toFile()}; } List children = Arrays.stream(fileItems) @@ -84,7 +95,7 @@ public class ArchetypeService { }) .sorted(Comparator.comparing(PreviewFileTree::getIsFile)) .collect(Collectors.toList()); - return new PreviewFileTree(root, children); + return new PreviewFileTree(directory, children); } private Path createGitKeepFile(String directory) { @@ -97,12 +108,12 @@ public class ArchetypeService { } } - private File getGeneratedFiles(String id) throws FileNotFoundException { - File archetypeDirectory = MavenUtils.getArchetypeDirectory(id); + private File getGeneratedFiles(String generatedId) throws FileNotFoundException { + File archetypeDirectory = MavenUtils.getArchetypeDirectory(generatedId); if (!archetypeDirectory.exists()) { throw new FileNotFoundException(archetypeDirectory.getAbsolutePath()); } - String artifactId = archetypeNameCache.get(id); + String artifactId = archetypeNameCache.get(generatedId); if (!StringUtils.hasText(artifactId)) { throw new FileNotFoundException("文件已过期,请重新生成"); } @@ -110,11 +121,7 @@ public class ArchetypeService { } private String contentDisposition(File file) { - return ContentDisposition - .attachment() - .filename(file.getName()) - .build() - .toString(); + return ContentDisposition.attachment().filename(file.getName()).build().toString(); } } diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/util/GitlabUtils.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/util/GitlabUtils.java new file mode 100644 index 0000000..0acf675 --- /dev/null +++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/util/GitlabUtils.java @@ -0,0 +1,89 @@ +package com.schbrain.archetype.initializer.util; + +import cn.hutool.extra.spring.SpringUtil; +import com.schbrain.archetype.initializer.param.ArchetypeGenerateParam; +import com.schbrain.common.exception.BaseException; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.transport.CredentialsProvider; +import org.eclipse.jgit.transport.URIish; +import org.gitlab4j.api.GitLabApi; +import org.gitlab4j.api.GitLabApiException; +import org.gitlab4j.api.ProtectedBranchesApi; +import org.gitlab4j.api.models.Group; +import org.gitlab4j.api.models.Project; +import org.gitlab4j.api.models.ProtectedBranch; + +import java.net.URISyntaxException; +import java.nio.file.Path; +import java.util.List; + +/** + * @author liaozan + * @since 2023/7/26 + */ +@Slf4j +public class GitlabUtils { + + private static final List ADDITIONAL_BRANCHES = List.of("release", "main"); + + public static void initGitRepo(Path directory, Long repoGroupId, ArchetypeGenerateParam param) { + try { + Git git = Git.init().setInitialBranch("develop").setDirectory(directory.toFile()).call(); + git.add().addFilepattern(".").call(); + git.commit().setAllowEmpty(true).setAuthor("initializer", "no-reply@schbrain.com").setMessage("Initial Commit").call(); + for (String branch : ADDITIONAL_BRANCHES) { + git.checkout().setName(branch).setCreateBranch(true).call(); + } + + if (repoGroupId != null) { + GitLabApi gitLabApi = SpringUtil.getBean(GitLabApi.class); + Group group = gitLabApi.getGroupApi().getGroup(repoGroupId); + String groupPath = group.getFullPath(); + String projectName = param.getArtifactId(); + String repositoryUrl = String.format("%s/%s/%s.git", gitLabApi.getGitLabServerUrl(), groupPath, projectName); + URIish urIish = new URIish(repositoryUrl); + git.remoteSetUrl().setRemoteName("origin").setRemoteUri(urIish).call(); + git.push() + .setRemote("origin") + .setCredentialsProvider(SpringUtil.getBean(CredentialsProvider.class)) + .setPushAll() + .setForce(true) + .call(); + Project project = getProject(gitLabApi, groupPath, projectName); + if (project == null) { + return; + } + updateProtectedBranches(gitLabApi, project); + updateProjectDefaultBranch(gitLabApi, project); + } + } catch (GitAPIException | GitLabApiException | URISyntaxException e) { + log.warn("Git repo init failed", e); + throw new BaseException("Git仓库初始化失败"); + } + } + + private static Project getProject(GitLabApi gitLabApi, String groupPath, String projectName) throws GitLabApiException { + String projectPath = String.format("%s/%s", groupPath, projectName); + return gitLabApi.getProjectApi().getProject(projectPath); + } + + private static void updateProjectDefaultBranch(GitLabApi gitLabApi, Project project) throws GitLabApiException { + project.setDefaultBranch("main"); + gitLabApi.getProjectApi().updateProject(project); + } + + private static void updateProtectedBranches(GitLabApi gitlabApi, Project project) throws GitLabApiException { + ProtectedBranchesApi protectedBranchesApi = gitlabApi.getProtectedBranchesApi(); + String projectPath = project.getPathWithNamespace(); + List protectedBranches = protectedBranchesApi.getProtectedBranches(projectPath); + if (CollectionUtils.isNotEmpty(protectedBranches)) { + for (ProtectedBranch protectedBranch : protectedBranches) { + protectedBranchesApi.unprotectBranch(projectPath, protectedBranch.getName()); + } + } + } + +} diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/maven/MavenUtils.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/util/MavenUtils.java similarity index 51% rename from initializer-backend/src/main/java/com/schbrain/archetype/initializer/maven/MavenUtils.java rename to initializer-backend/src/main/java/com/schbrain/archetype/initializer/util/MavenUtils.java index 6851eb2..99b5abf 100644 --- a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/maven/MavenUtils.java +++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/util/MavenUtils.java @@ -1,36 +1,21 @@ -package com.schbrain.archetype.initializer.maven; +package com.schbrain.archetype.initializer.util; import cn.hutool.core.io.FileUtil; -import cn.hutool.extra.spring.SpringUtil; import com.schbrain.archetype.initializer.param.ArchetypeGenerateParam; -import com.schbrain.common.exception.BaseException; import com.schbrain.common.util.IdWorker; import com.schbrain.common.util.JacksonUtils; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; import org.apache.maven.cli.MavenCli; import org.apache.maven.settings.Mirror; import org.apache.maven.settings.Server; import org.apache.maven.settings.Settings; import org.apache.maven.settings.io.DefaultSettingsWriter; -import org.eclipse.jgit.api.Git; -import org.eclipse.jgit.api.errors.GitAPIException; -import org.eclipse.jgit.transport.CredentialsProvider; -import org.eclipse.jgit.transport.URIish; -import org.gitlab4j.api.GitLabApi; -import org.gitlab4j.api.GitLabApiException; -import org.gitlab4j.api.ProtectedBranchesApi; -import org.gitlab4j.api.models.Group; -import org.gitlab4j.api.models.Project; -import org.gitlab4j.api.models.ProtectedBranch; import java.io.File; import java.io.IOException; -import java.net.URISyntaxException; -import java.nio.file.Path; -import java.nio.file.Paths; import java.util.Collections; -import java.util.List; import static org.apache.maven.cli.MavenCli.MULTIMODULE_PROJECT_DIRECTORY; @@ -43,8 +28,6 @@ public class MavenUtils { private static final File SETTINGS_FILE = new File(MavenCli.USER_MAVEN_CONFIGURATION_HOME, "settings.xml"); - private static final List ADDITIONAL_BRANCHES = List.of("release", "main"); - static { System.getProperties().setProperty(MULTIMODULE_PROJECT_DIRECTORY, "$M2_HOME"); initSettingsFile(); @@ -57,7 +40,7 @@ public class MavenUtils { log.info("Success install archive from : {}", workDirectory); } - public static String generate(ArchetypeGenerateParam param) { + public static Pair generate(ArchetypeGenerateParam param) { log.info("Prepare to generate archetype project: {}", JacksonUtils.toJsonString(param, true)); String id = IdWorker.getIdStr(); File archetype = getArchetypeDirectory(id); @@ -65,11 +48,7 @@ public class MavenUtils { String[] args = getArchetypeGenerateArgs(param, SETTINGS_FILE.getAbsolutePath(), outputDirectory); MavenCli.doMain(args, null); log.info("Generate archetype project at {}", outputDirectory); - if (param.isInitGitRepo()) { - Path directory = Paths.get(archetype.getAbsolutePath(), param.getArtifactId()); - initGitRepo(directory, param.getRepoGroupId(), param); - } - return id; + return ImmutablePair.of(id, archetype); } public static File getArchetypeDirectory(String id) { @@ -77,52 +56,6 @@ public class MavenUtils { return new File(tmpDirPath, id); } - private static void initGitRepo(Path directory, Long repoGroupId, ArchetypeGenerateParam param) { - try { - Git git = Git.init().setInitialBranch("develop").setDirectory(directory.toFile()).call(); - git.add().addFilepattern(".").call(); - git.commit().setAllowEmpty(true).setAuthor("initializer", "no-reply@schbrain.com").setMessage("Initial Commit").call(); - for (String branch : ADDITIONAL_BRANCHES) { - git.checkout().setName(branch).setCreateBranch(true).call(); - } - - if (repoGroupId != null) { - GitLabApi gitLabApi = SpringUtil.getBean(GitLabApi.class); - Group group = gitLabApi.getGroupApi().getGroup(repoGroupId); - String groupPath = group.getFullPath(); - String projectName = param.getArtifactId(); - String repositoryUrl = String.format("%s/%s/%s.git", gitLabApi.getGitLabServerUrl(), groupPath, projectName); - URIish urIish = new URIish(repositoryUrl); - git.remoteSetUrl().setRemoteName("origin").setRemoteUri(urIish).call(); - git.push() - .setRemote("origin") - .setCredentialsProvider(SpringUtil.getBean(CredentialsProvider.class)) - .setPushAll() - .setForce(true) - .call(); - Project project = getProject(gitLabApi, groupPath, projectName); - if (project == null) { - return; - } - updateProjectDefaultBranch(gitLabApi, project); - updateProtectedBranches(gitLabApi, project); - } - } catch (GitAPIException | GitLabApiException | URISyntaxException e) { - log.warn("Git repo init failed", e); - throw new BaseException("Git仓库初始化失败"); - } - } - - private static void updateProjectDefaultBranch(GitLabApi gitLabApi, Project project) throws GitLabApiException { - project.setDefaultBranch("main"); - gitLabApi.getProjectApi().updateProject(project); - } - - private static Project getProject(GitLabApi gitLabApi, String groupPath, String projectName) throws GitLabApiException { - String projectPath = String.format("%s/%s", groupPath, projectName); - return gitLabApi.getProjectApi().getProject(projectPath); - } - private static void initSettingsFile() { Settings settings = new Settings(); settings.setLocalRepository("/data/maven/repository"); @@ -184,15 +117,4 @@ public class MavenUtils { }; } - private static void updateProtectedBranches(GitLabApi gitlabApi, Project project) throws GitLabApiException { - ProtectedBranchesApi protectedBranchesApi = gitlabApi.getProtectedBranchesApi(); - String projectPath = project.getPathWithNamespace(); - List protectedBranches = protectedBranchesApi.getProtectedBranches(projectPath); - if (CollectionUtils.isNotEmpty(protectedBranches)) { - for (ProtectedBranch protectedBranch : protectedBranches) { - protectedBranchesApi.unprotectBranch(projectPath, protectedBranch.getName()); - } - } - } - } -- GitLab