Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
schbrain-archetype-initializer
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Incidents
Environments
Packages & Registries
Packages & Registries
Package Registry
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
tools
schbrain-archetype-initializer
Commits
99d2bd60
Commit
99d2bd60
authored
Apr 28, 2022
by
liaozan
🏀
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feature: auto create gitlab repo
parent
46f1072f
Changes
16
Show whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
328 additions
and
44 deletions
+328
-44
initializer-backend/pom.xml
initializer-backend/pom.xml
+5
-0
initializer-backend/src/main/java/com/schbrain/archetype/initializer/InitializerBackendApplication.java
.../archetype/initializer/InitializerBackendApplication.java
+4
-6
initializer-backend/src/main/java/com/schbrain/archetype/initializer/config/GitConfiguration.java
...hbrain/archetype/initializer/config/GitConfiguration.java
+32
-0
initializer-backend/src/main/java/com/schbrain/archetype/initializer/config/properties/GitProperties.java
...rchetype/initializer/config/properties/GitProperties.java
+18
-0
initializer-backend/src/main/java/com/schbrain/archetype/initializer/controller/GitlabController.java
...in/archetype/initializer/controller/GitlabController.java
+26
-0
initializer-backend/src/main/java/com/schbrain/archetype/initializer/listener/ProjectWarmUpListener.java
...archetype/initializer/listener/ProjectWarmUpListener.java
+11
-10
initializer-backend/src/main/java/com/schbrain/archetype/initializer/maven/MavenUtils.java
.../com/schbrain/archetype/initializer/maven/MavenUtils.java
+36
-5
initializer-backend/src/main/java/com/schbrain/archetype/initializer/param/ArchetypeGenerateParam.java
...n/archetype/initializer/param/ArchetypeGenerateParam.java
+4
-0
initializer-backend/src/main/java/com/schbrain/archetype/initializer/runner/ArchetypePreparer.java
...brain/archetype/initializer/runner/ArchetypePreparer.java
+6
-7
initializer-backend/src/main/java/com/schbrain/archetype/initializer/schedule/GitlabGroupFetchTask.java
.../archetype/initializer/schedule/GitlabGroupFetchTask.java
+55
-0
initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/ArchetypeService.java
...brain/archetype/initializer/service/ArchetypeService.java
+6
-0
initializer-backend/src/main/resources/META-INF/spring-configuration-metadata.json
...ain/resources/META-INF/spring-configuration-metadata.json
+22
-0
initializer-backend/src/main/resources/application.yaml
initializer-backend/src/main/resources/application.yaml
+4
-1
initializer-ui/package.json
initializer-ui/package.json
+5
-5
initializer-ui/src/App.vue
initializer-ui/src/App.vue
+10
-2
initializer-ui/src/components/starter.vue
initializer-ui/src/components/starter.vue
+84
-8
No files found.
initializer-backend/pom.xml
View file @
99d2bd60
...
@@ -46,6 +46,11 @@
...
@@ -46,6 +46,11 @@
<groupId>
org.eclipse.jgit
</groupId>
<groupId>
org.eclipse.jgit
</groupId>
<artifactId>
org.eclipse.jgit
</artifactId>
<artifactId>
org.eclipse.jgit
</artifactId>
</dependency>
</dependency>
<dependency>
<groupId>
org.gitlab4j
</groupId>
<artifactId>
gitlab4j-api
</artifactId>
<version>
5.0.1
</version>
</dependency>
</dependencies>
</dependencies>
<build>
<build>
...
...
initializer-backend/src/main/java/com/schbrain/archetype/initializer/InitializerBackendApplication.java
View file @
99d2bd60
package
com.schbrain.archetype.initializer
;
package
com.schbrain.archetype.initializer
;
import
com.schbrain.archetype.initializer.listener.ProjectWarmUpListener
;
import
org.springframework.boot.SpringApplication
;
import
org.springframework.boot.autoconfigure.SpringBootApplication
;
import
org.springframework.boot.autoconfigure.SpringBootApplication
;
import
org.springframework.
boot.builder.SpringApplicationBuilder
;
import
org.springframework.
scheduling.annotation.EnableScheduling
;
@EnableScheduling
@SpringBootApplication
@SpringBootApplication
public
class
InitializerBackendApplication
{
public
class
InitializerBackendApplication
{
public
static
void
main
(
String
[]
args
)
{
public
static
void
main
(
String
[]
args
)
{
SpringApplicationBuilder
builder
=
new
SpringApplicationBuilder
();
SpringApplication
.
run
(
InitializerBackendApplication
.
class
,
args
);
builder
.
listeners
(
new
ProjectWarmUpListener
());
builder
.
sources
(
InitializerBackendApplication
.
class
);
builder
.
run
(
args
);
}
}
}
}
\ No newline at end of file
initializer-backend/src/main/java/com/schbrain/archetype/initializer/config/GitConfiguration.java
0 → 100644
View file @
99d2bd60
package
com.schbrain.archetype.initializer.config
;
import
com.schbrain.archetype.initializer.config.properties.GitProperties
;
import
org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider
;
import
org.gitlab4j.api.GitLabApi
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.context.properties.EnableConfigurationProperties
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
/**
* @author liaozan
* @since 2022/4/28
*/
@Configuration
(
proxyBeanMethods
=
false
)
@EnableConfigurationProperties
(
GitProperties
.
class
)
public
class
GitConfiguration
{
@Autowired
private
GitProperties
gitProperties
;
@Bean
public
GitLabApi
gitLabApi
()
{
return
new
GitLabApi
(
gitProperties
.
getServerUrl
(),
gitProperties
.
getPersonalAccessToken
());
}
@Bean
public
UsernamePasswordCredentialsProvider
credentialsProvider
()
{
return
new
UsernamePasswordCredentialsProvider
(
"PRIVATE-TOKEN"
,
gitProperties
.
getPersonalAccessToken
());
}
}
\ No newline at end of file
initializer-backend/src/main/java/com/schbrain/archetype/initializer/config/properties/GitProperties.java
0 → 100644
View file @
99d2bd60
package
com.schbrain.archetype.initializer.config.properties
;
import
lombok.Data
;
import
org.springframework.boot.context.properties.ConfigurationProperties
;
/**
* @author liaozan
* @since 2022/4/28
*/
@Data
@ConfigurationProperties
(
prefix
=
"gitlab"
)
public
class
GitProperties
{
private
String
serverUrl
;
private
String
personalAccessToken
;
}
\ No newline at end of file
initializer-backend/src/main/java/com/schbrain/archetype/initializer/controller/GitlabController.java
0 → 100644
View file @
99d2bd60
package
com.schbrain.archetype.initializer.controller
;
import
cn.hutool.core.lang.tree.Tree
;
import
com.schbrain.archetype.initializer.schedule.GitlabGroupFetchTask
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
java.util.List
;
/**
* @author liaozan
* @since 2022/4/28
*/
@RestController
public
class
GitlabController
{
@Autowired
private
GitlabGroupFetchTask
gitlabGroupFetchTask
;
@GetMapping
(
"/gitlab/groups"
)
public
List
<
Tree
<
Long
>>
groupList
()
{
return
gitlabGroupFetchTask
.
getGroupTree
();
}
}
\ No newline at end of file
initializer-backend/src/main/java/com/schbrain/archetype/initializer/listener/ProjectWarmUpListener.java
View file @
99d2bd60
...
@@ -2,11 +2,11 @@ package com.schbrain.archetype.initializer.listener;
...
@@ -2,11 +2,11 @@ package com.schbrain.archetype.initializer.listener;
import
com.schbrain.archetype.initializer.maven.MavenUtils
;
import
com.schbrain.archetype.initializer.maven.MavenUtils
;
import
com.schbrain.archetype.initializer.param.ArchetypeGenerateParam
;
import
com.schbrain.archetype.initializer.param.ArchetypeGenerateParam
;
import
com.schbrain.common.util.EnvUtils
;
import
lombok.SneakyThrows
;
import
lombok.SneakyThrows
;
import
org.springframework.boot.cloud.CloudPlatform
;
import
org.springframework.boot.context.event.ApplicationStartedEvent
;
import
org.springframework.boot.context.event.ApplicationStartedEvent
;
import
org.springframework.context.ApplicationListener
;
import
org.springframework.context.ApplicationListener
;
import
org.springframework.
core.env.ConfigurableEnvironm
ent
;
import
org.springframework.
stereotype.Compon
ent
;
import
java.util.concurrent.Executor
;
import
java.util.concurrent.Executor
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.Executors
;
...
@@ -15,6 +15,7 @@ import java.util.concurrent.Executors;
...
@@ -15,6 +15,7 @@ import java.util.concurrent.Executors;
* @author liaozan
* @author liaozan
* @since 2022/3/20
* @since 2022/3/20
*/
*/
@Component
public
class
ProjectWarmUpListener
implements
ApplicationListener
<
ApplicationStartedEvent
>
{
public
class
ProjectWarmUpListener
implements
ApplicationListener
<
ApplicationStartedEvent
>
{
private
final
Executor
executor
=
Executors
.
newSingleThreadExecutor
();
private
final
Executor
executor
=
Executors
.
newSingleThreadExecutor
();
...
@@ -22,8 +23,9 @@ public class ProjectWarmUpListener implements ApplicationListener<ApplicationSta
...
@@ -22,8 +23,9 @@ public class ProjectWarmUpListener implements ApplicationListener<ApplicationSta
@SneakyThrows
@SneakyThrows
@Override
@Override
public
void
onApplicationEvent
(
ApplicationStartedEvent
event
)
{
public
void
onApplicationEvent
(
ApplicationStartedEvent
event
)
{
ConfigurableEnvironment
environment
=
event
.
getApplicationContext
().
getEnvironment
();
if
(!
EnvUtils
.
runningOnCloudPlatform
(
event
.
getApplicationContext
().
getEnvironment
()))
{
if
(
CloudPlatform
.
KUBERNETES
.
isActive
(
environment
))
{
return
;
}
executor
.
execute
(()
->
{
executor
.
execute
(()
->
{
ArchetypeGenerateParam
mockParam
=
new
ArchetypeGenerateParam
();
ArchetypeGenerateParam
mockParam
=
new
ArchetypeGenerateParam
();
mockParam
.
setGroupId
(
"com.schbrain"
);
mockParam
.
setGroupId
(
"com.schbrain"
);
...
@@ -31,6 +33,5 @@ public class ProjectWarmUpListener implements ApplicationListener<ApplicationSta
...
@@ -31,6 +33,5 @@ public class ProjectWarmUpListener implements ApplicationListener<ApplicationSta
MavenUtils
.
generate
(
mockParam
);
MavenUtils
.
generate
(
mockParam
);
});
});
}
}
}
}
}
\ No newline at end of file
initializer-backend/src/main/java/com/schbrain/archetype/initializer/maven/MavenUtils.java
View file @
99d2bd60
package
com.schbrain.archetype.initializer.maven
;
package
com.schbrain.archetype.initializer.maven
;
import
cn.hutool.core.io.FileUtil
;
import
cn.hutool.core.io.FileUtil
;
import
cn.hutool.extra.spring.SpringUtil
;
import
com.schbrain.archetype.initializer.param.ArchetypeGenerateParam
;
import
com.schbrain.archetype.initializer.param.ArchetypeGenerateParam
;
import
com.schbrain.common.exception.BaseException
;
import
com.schbrain.common.exception.BaseException
;
import
com.schbrain.common.util.IdWorker
;
import
com.schbrain.common.util.IdWorker
;
...
@@ -13,12 +14,19 @@ import org.apache.maven.settings.Settings;
...
@@ -13,12 +14,19 @@ import org.apache.maven.settings.Settings;
import
org.apache.maven.settings.io.DefaultSettingsWriter
;
import
org.apache.maven.settings.io.DefaultSettingsWriter
;
import
org.eclipse.jgit.api.Git
;
import
org.eclipse.jgit.api.Git
;
import
org.eclipse.jgit.api.errors.GitAPIException
;
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.models.Group
;
import
java.io.File
;
import
java.io.File
;
import
java.io.IOException
;
import
java.io.IOException
;
import
java.net.URISyntaxException
;
import
java.nio.file.Path
;
import
java.nio.file.Path
;
import
java.nio.file.Paths
;
import
java.nio.file.Paths
;
import
java.util.Collections
;
import
java.util.Collections
;
import
java.util.List
;
import
static
org
.
apache
.
maven
.
cli
.
MavenCli
.
MULTIMODULE_PROJECT_DIRECTORY
;
import
static
org
.
apache
.
maven
.
cli
.
MavenCli
.
MULTIMODULE_PROJECT_DIRECTORY
;
...
@@ -31,6 +39,8 @@ public class MavenUtils {
...
@@ -31,6 +39,8 @@ public class MavenUtils {
private
static
final
File
SETTINGS_FILE
=
new
File
(
MavenCli
.
USER_MAVEN_CONFIGURATION_HOME
,
"settings.xml"
);
private
static
final
File
SETTINGS_FILE
=
new
File
(
MavenCli
.
USER_MAVEN_CONFIGURATION_HOME
,
"settings.xml"
);
private
static
final
List
<
String
>
ADDITIONAL_BRANCHES
=
List
.
of
(
"release"
,
"develop"
);
static
{
static
{
System
.
getProperties
().
setProperty
(
MULTIMODULE_PROJECT_DIRECTORY
,
"$M2_HOME"
);
System
.
getProperties
().
setProperty
(
MULTIMODULE_PROJECT_DIRECTORY
,
"$M2_HOME"
);
getSettingsFile
();
getSettingsFile
();
...
@@ -53,7 +63,8 @@ public class MavenUtils {
...
@@ -53,7 +63,8 @@ public class MavenUtils {
mavenCli
.
doMain
(
args
,
null
,
System
.
out
,
System
.
err
);
mavenCli
.
doMain
(
args
,
null
,
System
.
out
,
System
.
err
);
log
.
info
(
"Generate archetype project at {}"
,
outputDirectory
);
log
.
info
(
"Generate archetype project at {}"
,
outputDirectory
);
if
(
param
.
isInitGitRepo
())
{
if
(
param
.
isInitGitRepo
())
{
initGitRepo
(
Paths
.
get
(
archetype
.
getAbsolutePath
(),
param
.
getArtifactId
()));
Path
directory
=
Paths
.
get
(
archetype
.
getAbsolutePath
(),
param
.
getArtifactId
());
initGitRepo
(
directory
,
param
.
getRepoGroupId
(),
param
);
}
}
return
id
;
return
id
;
}
}
...
@@ -63,15 +74,35 @@ public class MavenUtils {
...
@@ -63,15 +74,35 @@ public class MavenUtils {
return
new
File
(
tmpDirPath
,
id
);
return
new
File
(
tmpDirPath
,
id
);
}
}
private
static
void
initGitRepo
(
Path
directory
)
{
private
static
void
initGitRepo
(
Path
directory
,
Long
repoGroupId
,
ArchetypeGenerateParam
param
)
{
try
{
try
{
Git
git
=
Git
.
init
().
setInitialBranch
(
"master"
).
setDirectory
(
directory
.
toFile
()).
call
();
Git
git
=
Git
.
init
().
setInitialBranch
(
"master"
).
setDirectory
(
directory
.
toFile
()).
call
();
git
.
add
().
addFilepattern
(
"."
).
call
();
git
.
add
().
addFilepattern
(
"."
).
call
();
git
.
commit
().
setAllowEmpty
(
true
).
setAuthor
(
"initializer"
,
"no-reply@schbrain.com"
).
setMessage
(
"Initial Commit"
).
call
();
git
.
commit
().
setAllowEmpty
(
true
).
setAuthor
(
"initializer"
,
"no-reply@schbrain.com"
).
setMessage
(
"Initial Commit"
).
call
();
git
.
checkout
().
setCreateBranch
(
true
).
setName
(
"release"
).
call
();
git
.
checkout
().
setCreateBranch
(
true
).
setName
(
"develop"
).
call
();
boolean
pushToRemote
=
repoGroupId
!=
null
;
if
(
pushToRemote
)
{
GitLabApi
gitLabApi
=
SpringUtil
.
getBean
(
GitLabApi
.
class
);
Group
group
=
gitLabApi
.
getGroupApi
().
getGroup
(
repoGroupId
);
String
groupPath
=
group
.
getFullPath
();
String
repositoryUrl
=
String
.
format
(
"%s/%s/%s.git"
,
gitLabApi
.
getGitLabServerUrl
(),
groupPath
,
param
.
getArtifactId
());
URIish
urIish
=
new
URIish
(
repositoryUrl
);
git
.
remoteSetUrl
().
setRemoteName
(
"origin"
).
setRemoteUri
(
urIish
).
call
();
}
for
(
String
branch
:
ADDITIONAL_BRANCHES
)
{
git
.
checkout
().
setName
(
branch
).
setCreateBranch
(
true
).
call
();
}
if
(
pushToRemote
)
{
git
.
push
()
.
setRemote
(
"origin"
)
.
setCredentialsProvider
(
SpringUtil
.
getBean
(
CredentialsProvider
.
class
))
.
setPushAll
()
.
setForce
(
true
)
.
call
();
}
git
.
close
();
git
.
close
();
}
catch
(
GitAPIException
e
)
{
}
catch
(
GitAPIException
|
GitLabApiException
|
URISyntaxException
e
)
{
log
.
warn
(
"Git repo init failed"
,
e
);
log
.
warn
(
"Git repo init failed"
,
e
);
throw
new
BaseException
(
"Git仓库初始化失败"
);
throw
new
BaseException
(
"Git仓库初始化失败"
);
}
}
...
...
initializer-backend/src/main/java/com/schbrain/archetype/initializer/param/ArchetypeGenerateParam.java
View file @
99d2bd60
...
@@ -40,6 +40,10 @@ public class ArchetypeGenerateParam {
...
@@ -40,6 +40,10 @@ public class ArchetypeGenerateParam {
* 是否初始化 git 仓库
* 是否初始化 git 仓库
*/
*/
private
boolean
initGitRepo
;
private
boolean
initGitRepo
;
/**
* 仓库 groupId
*/
private
Long
repoGroupId
;
public
String
getSubModuleNamePrefix
()
{
public
String
getSubModuleNamePrefix
()
{
if
(!
StringUtils
.
hasText
(
this
.
subModuleNamePrefix
))
{
if
(!
StringUtils
.
hasText
(
this
.
subModuleNamePrefix
))
{
...
...
initializer-backend/src/main/java/com/schbrain/archetype/initializer/runner/ArchetypePreparer.java
View file @
99d2bd60
...
@@ -43,13 +43,12 @@ public class ArchetypePreparer implements ApplicationRunner {
...
@@ -43,13 +43,12 @@ public class ArchetypePreparer implements ApplicationRunner {
}
}
private
void
checkoutArchetype
(
File
archetypeTemplateDirectory
)
{
private
void
checkoutArchetype
(
File
archetypeTemplateDirectory
)
{
try
{
try
(
Git
ignored
=
Git
.
cloneRepository
()
Git
.
cloneRepository
()
.
setTagOption
(
TagOpt
.
FETCH_TAGS
)
.
setTagOption
(
TagOpt
.
FETCH_TAGS
)
.
setNoCheckout
(
false
)
.
setNoCheckout
(
false
)
.
setDirectory
(
archetypeTemplateDirectory
)
.
setDirectory
(
archetypeTemplateDirectory
)
.
setURI
(
ARCHETYPE_REPO_URL
)
.
setURI
(
ARCHETYPE_REPO_URL
)
.
call
();
.
call
())
{
log
.
info
(
"Success checkout archetype source from {}"
,
ARCHETYPE_REPO_URL
);
log
.
info
(
"Success checkout archetype source from {}"
,
ARCHETYPE_REPO_URL
);
}
catch
(
GitAPIException
e
)
{
}
catch
(
GitAPIException
e
)
{
throw
new
BaseException
(
"Failed to checkout archetype source from git repository"
,
e
);
throw
new
BaseException
(
"Failed to checkout archetype source from git repository"
,
e
);
...
...
initializer-backend/src/main/java/com/schbrain/archetype/initializer/schedule/GitlabGroupFetchTask.java
0 → 100644
View file @
99d2bd60
package
com.schbrain.archetype.initializer.schedule
;
import
cn.hutool.core.lang.tree.Tree
;
import
cn.hutool.core.lang.tree.TreeNode
;
import
cn.hutool.core.lang.tree.TreeUtil
;
import
lombok.extern.slf4j.Slf4j
;
import
org.gitlab4j.api.GitLabApi
;
import
org.gitlab4j.api.GroupApi
;
import
org.gitlab4j.api.models.Group
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.scheduling.annotation.Scheduled
;
import
org.springframework.stereotype.Component
;
import
java.util.Collections
;
import
java.util.List
;
import
java.util.concurrent.TimeUnit
;
import
java.util.stream.Collectors
;
/**
* @author liaozan
* @since 2022/4/28
*/
@Slf4j
@Component
public
class
GitlabGroupFetchTask
{
@Autowired
private
GitLabApi
gitLabApi
;
private
List
<
Tree
<
Long
>>
groupTree
=
Collections
.
emptyList
();
public
List
<
Tree
<
Long
>>
getGroupTree
()
{
return
groupTree
;
}
@Scheduled
(
fixedRate
=
1
,
timeUnit
=
TimeUnit
.
HOURS
)
public
void
fetchGroups
()
{
try
{
GroupApi
groupApi
=
gitLabApi
.
getGroupApi
();
List
<
Group
>
groups
=
groupApi
.
getGroups
();
List
<
TreeNode
<
Long
>>
treeNodes
=
groups
.
stream
()
.
map
(
group
->
{
TreeNode
<
Long
>
treeNode
=
new
TreeNode
<>();
treeNode
.
setId
(
group
.
getId
());
treeNode
.
setName
(
group
.
getName
());
treeNode
.
setParentId
(
group
.
getParentId
());
return
treeNode
;
}).
collect
(
Collectors
.
toList
());
this
.
groupTree
=
TreeUtil
.
build
(
treeNodes
,
null
);
}
catch
(
Exception
e
)
{
log
.
warn
(
"Failed to fetch Gitlab groups"
,
e
);
}
}
}
\ No newline at end of file
initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/ArchetypeService.java
View file @
99d2bd60
...
@@ -3,11 +3,13 @@ package com.schbrain.archetype.initializer.service;
...
@@ -3,11 +3,13 @@ package com.schbrain.archetype.initializer.service;
import
cn.hutool.cache.impl.TimedCache
;
import
cn.hutool.cache.impl.TimedCache
;
import
cn.hutool.core.util.ArrayUtil
;
import
cn.hutool.core.util.ArrayUtil
;
import
cn.hutool.core.util.ZipUtil
;
import
cn.hutool.core.util.ZipUtil
;
import
com.schbrain.archetype.initializer.config.properties.GitProperties
;
import
com.schbrain.archetype.initializer.maven.MavenUtils
;
import
com.schbrain.archetype.initializer.maven.MavenUtils
;
import
com.schbrain.archetype.initializer.param.ArchetypeGenerateParam
;
import
com.schbrain.archetype.initializer.param.ArchetypeGenerateParam
;
import
com.schbrain.archetype.initializer.response.PreviewFileTree
;
import
com.schbrain.archetype.initializer.response.PreviewFileTree
;
import
com.schbrain.archetype.initializer.runner.ArchetypePreparer
;
import
com.schbrain.archetype.initializer.runner.ArchetypePreparer
;
import
com.schbrain.common.util.ServletUtils
;
import
com.schbrain.common.util.ServletUtils
;
import
org.gitlab4j.api.GitLabApi
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.http.ContentDisposition
;
import
org.springframework.http.ContentDisposition
;
import
org.springframework.http.HttpHeaders
;
import
org.springframework.http.HttpHeaders
;
...
@@ -38,6 +40,10 @@ public class ArchetypeService {
...
@@ -38,6 +40,10 @@ public class ArchetypeService {
@Autowired
@Autowired
private
ArchetypePreparer
archetypePreparer
;
private
ArchetypePreparer
archetypePreparer
;
@Autowired
private
GitLabApi
gitLabApi
;
@Autowired
private
GitProperties
gitProperties
;
public
String
generate
(
ArchetypeGenerateParam
param
)
{
public
String
generate
(
ArchetypeGenerateParam
param
)
{
String
generateId
=
MavenUtils
.
generate
(
param
);
String
generateId
=
MavenUtils
.
generate
(
param
);
...
...
initializer-backend/src/main/resources/META-INF/spring-configuration-metadata.json
0 → 100644
View file @
99d2bd60
{
"groups"
:
[
{
"name"
:
"gitlab"
,
"type"
:
"com.schbrain.archetype.initializer.config.properties.GitProperties"
,
"sourceType"
:
"com.schbrain.archetype.initializer.config.properties.GitProperties"
}
],
"properties"
:
[
{
"name"
:
"gitlab.personal-access-token"
,
"type"
:
"java.lang.String"
,
"sourceType"
:
"com.schbrain.archetype.initializer.config.properties.GitProperties"
},
{
"name"
:
"gitlab.server-url"
,
"type"
:
"java.lang.String"
,
"sourceType"
:
"com.schbrain.archetype.initializer.config.properties.GitProperties"
}
],
"hints"
:
[]
}
\ No newline at end of file
initializer-backend/src/main/resources/application.yaml
View file @
99d2bd60
...
@@ -4,3 +4,6 @@ spring:
...
@@ -4,3 +4,6 @@ spring:
web
:
web
:
resources
:
resources
:
add-mappings
:
true
add-mappings
:
true
gitlab
:
server-url
:
http://gitlab.schbrain.com/gitlab
personal-access-token
:
AzRH1rZ2HysUkHeycsaU
\ No newline at end of file
initializer-ui/package.json
View file @
99d2bd60
...
@@ -7,15 +7,15 @@
...
@@ -7,15 +7,15 @@
},
},
"dependencies"
:
{
"dependencies"
:
{
"vue"
:
"^3.2.33"
,
"vue"
:
"^3.2.33"
,
"axios"
:
"^0.2
6.1
"
,
"axios"
:
"^0.2
7.2
"
,
"ant-design-vue"
:
"^3.2.
0
"
,
"ant-design-vue"
:
"^3.2.
2
"
,
"highlight.js"
:
"^11.5.1"
,
"highlight.js"
:
"^11.5.1"
,
"@highlightjs/vue-plugin"
:
"^2.1.0"
"@highlightjs/vue-plugin"
:
"^2.1.0"
},
},
"devDependencies"
:
{
"devDependencies"
:
{
"@vitejs/plugin-vue"
:
"^2.3.1"
,
"@vitejs/plugin-vue"
:
"^2.3.1"
,
"typescript"
:
"^4.6.
3
"
,
"typescript"
:
"^4.6.
4
"
,
"vite"
:
"^2.9.
5
"
,
"vite"
:
"^2.9.
7
"
,
"vue-tsc"
:
"^0.34.
8
"
"vue-tsc"
:
"^0.34.
11
"
}
}
}
}
\ No newline at end of file
initializer-ui/src/App.vue
View file @
99d2bd60
<
template
>
<
template
>
<!--suppress HtmlUnknownTag -->
<a-config-provider
:locale=
"locale"
>
<Starter/>
<Starter/>
</a-config-provider>
</
template
>
</
template
>
<
script
lang=
"ts"
setup
>
<
script
lang=
"ts"
setup
>
import
Starter
from
"
./components/starter.vue
"
</
script
>
import
Starter
from
"
./components/starter.vue
"
\ No newline at end of file
import
zhCN
from
'
ant-design-vue/es/locale/zh_CN
'
;
import
{
ref
}
from
"
vue
"
;
const
locale
=
ref
(
zhCN
);
</
script
>
\ No newline at end of file
initializer-ui/src/components/starter.vue
View file @
99d2bd60
...
@@ -15,8 +15,14 @@
...
@@ -15,8 +15,14 @@
<a-form-item
has-feedback
label=
"PackageName"
name=
"packageName"
>
<a-form-item
has-feedback
label=
"PackageName"
name=
"packageName"
>
<a-input
v-model:value=
"formState.packageName"
placeholder=
"默认为GroupId"
/>
<a-input
v-model:value=
"formState.packageName"
placeholder=
"默认为GroupId"
/>
</a-form-item>
</a-form-item>
<a-form-item
has-feedback
label=
"仓库群组"
name=
"repoGroup"
v-if=
"formState.initGitRepo"
>
<a-input
v-model:value=
"formState.repoGroup"
@
click=
"gitlabGroupVisible=true"
/>
</a-form-item>
<a-form-item
has-feedback
name=
"repoGroupId"
v-show=
"false"
>
<a-input
v-model:value=
"formState.repoGroupId"
/>
</a-form-item>
<a-form-item
has-feedback
name=
"initGitRepo"
>
<a-form-item
has-feedback
name=
"initGitRepo"
>
<a-checkbox
v-model:checked=
"formState.initGitRepo"
>
初始化 Git 仓库
</a-checkbox>
<a-checkbox
v-model:checked=
"formState.initGitRepo"
@
change=
"fetchGroupTreeList(formState.initGitRepo)"
>
初始化 Git 仓库
</a-checkbox>
</a-form-item>
</a-form-item>
</a-form>
</a-form>
<div
class=
"button-group"
>
<div
class=
"button-group"
>
...
@@ -27,13 +33,17 @@
...
@@ -27,13 +33,17 @@
</a-spin>
</a-spin>
<a-modal
v-model:visible=
"structPreviewVisible"
:footer=
"null"
title=
"预览"
>
<a-modal
v-model:visible=
"structPreviewVisible"
:footer=
"null"
title=
"预览"
>
<a-directory-tree
:tree-data=
"
treeData"
@
select=
"on
Select"
/>
<a-directory-tree
:tree-data=
"
fileTreeData"
@
select=
"onFileTreeNode
Select"
/>
</a-modal>
</a-modal>
<a-modal
v-model:visible=
"contentPreviewVisible"
:footer=
"null"
title=
"文件内容预览"
width=
"1000px"
>
<a-modal
v-model:visible=
"contentPreviewVisible"
:footer=
"null"
title=
"文件内容预览"
width=
"1000px"
>
<!--suppress HtmlUnknownTag -->
<!--suppress HtmlUnknownTag -->
<highlightjs
:autodetect=
"false"
:code=
"fileContent"
:language=
"fileExtension"
></highlightjs>
<highlightjs
:autodetect=
"false"
:code=
"fileContent"
:language=
"fileExtension"
></highlightjs>
</a-modal>
</a-modal>
<a-modal
v-model:visible=
"gitlabGroupVisible"
@
close=
"onGroupModalClose"
@
ok=
"onGroupModalClose"
@
cancel=
"onGroupModalClose"
title=
"Gitlab 群组"
width=
"500px"
>
<a-directory-tree
:tree-data=
"gitlabGroupTreeData"
@
select=
"onGroupTreeNodeSelect"
/>
</a-modal>
</div>
</div>
</
template
>
</
template
>
...
@@ -51,6 +61,8 @@ interface FormState {
...
@@ -51,6 +61,8 @@ interface FormState {
version
:
string
,
version
:
string
,
packageName
:
string
,
packageName
:
string
,
initGitRepo
:
boolean
initGitRepo
:
boolean
repoGroup
:
string
repoGroupId
:
number
}
}
interface
FileNode
{
interface
FileNode
{
...
@@ -60,11 +72,20 @@ interface FileNode {
...
@@ -60,11 +72,20 @@ interface FileNode {
isFile
:
boolean
isFile
:
boolean
}
}
interface
GroupNode
{
id
:
number
,
name
:
string
,
children
:
GroupNode
[],
}
const
fileNodeList
=
ref
<
FileNode
[]
>
([])
const
fileNodeList
=
ref
<
FileNode
[]
>
([])
const
treeData
=
ref
<
TreeProps
[
'
treeData
'
]
>
([])
const
groupNodeList
=
ref
<
GroupNode
[]
>
([])
const
fileTreeData
=
ref
<
TreeProps
[
'
treeData
'
]
>
([])
const
gitlabGroupTreeData
=
ref
<
TreeProps
[
'
treeData
'
]
>
([])
const
id
=
ref
(
-
1
)
const
id
=
ref
(
-
1
)
const
structPreviewVisible
=
ref
(
false
)
const
structPreviewVisible
=
ref
(
false
)
const
contentPreviewVisible
=
ref
(
false
)
const
contentPreviewVisible
=
ref
(
false
)
const
gitlabGroupVisible
=
ref
(
false
)
const
fileContent
=
ref
<
string
|
null
>
()
const
fileContent
=
ref
<
string
|
null
>
()
const
fileExtension
=
ref
<
string
|
null
>
()
const
fileExtension
=
ref
<
string
|
null
>
()
const
loading
=
computed
(()
=>
isLoading
.
value
)
const
loading
=
computed
(()
=>
isLoading
.
value
)
...
@@ -75,7 +96,9 @@ const formState = reactive<FormState>({
...
@@ -75,7 +96,9 @@ const formState = reactive<FormState>({
artifactId
:
''
,
artifactId
:
''
,
version
:
'
1.0.0-SNAPSHOT
'
,
version
:
'
1.0.0-SNAPSHOT
'
,
packageName
:
''
,
packageName
:
''
,
initGitRepo
:
true
initGitRepo
:
false
,
repoGroup
:
''
,
repoGroupId
:
-
1
})
})
const
formRules
=
{
const
formRules
=
{
...
@@ -83,6 +106,17 @@ const formRules = {
...
@@ -83,6 +106,17 @@ const formRules = {
artifactId
:
[{
required
:
true
,
message
:
'
请输入artifactId
'
,
trigger
:
'
change
'
}],
artifactId
:
[{
required
:
true
,
message
:
'
请输入artifactId
'
,
trigger
:
'
change
'
}],
}
}
const
fetchGroupTreeList
=
async
(
initGitRepo
:
boolean
)
=>
{
if
(
initGitRepo
)
{
groupNodeList
.
value
=
await
fetchGroupList
()
gitlabGroupTreeData
.
value
=
createGroupTreeData
(
groupNodeList
.
value
)
gitlabGroupVisible
.
value
=
true
}
else
{
formState
.
repoGroup
=
''
formState
.
repoGroupId
=
-
1
}
}
const
onGenerate
=
async
()
=>
{
const
onGenerate
=
async
()
=>
{
let
result
=
await
downloadForm
.
value
?.
validate
()
let
result
=
await
downloadForm
.
value
?.
validate
()
if
(
result
)
{
if
(
result
)
{
...
@@ -90,6 +124,13 @@ const onGenerate = async () => {
...
@@ -90,6 +124,13 @@ const onGenerate = async () => {
result
.
packageName
=
result
.
groupId
result
.
packageName
=
result
.
groupId
}
}
if
(
result
.
initGitRepo
)
{
if
(
result
.
repoGroupId
===
-
1
)
{
message
.
warn
(
'
Gitlab 群组不能为空!
'
)
return
}
}
let
data
:
BaseResponse
=
await
request
.
post
(
'
/archetype/generate
'
,
result
)
let
data
:
BaseResponse
=
await
request
.
post
(
'
/archetype/generate
'
,
result
)
if
(
data
.
code
===
0
)
{
if
(
data
.
code
===
0
)
{
id
.
value
=
data
.
result
id
.
value
=
data
.
result
...
@@ -100,7 +141,7 @@ const onGenerate = async () => {
...
@@ -100,7 +141,7 @@ const onGenerate = async () => {
const
onPreview
=
async
()
=>
{
const
onPreview
=
async
()
=>
{
fileNodeList
.
value
=
await
fetchFileList
(
id
.
value
)
fileNodeList
.
value
=
await
fetchFileList
(
id
.
value
)
treeData
.
value
=
creat
eTreeData
(
fileNodeList
.
value
)
fileTreeData
.
value
=
createFil
eTreeData
(
fileNodeList
.
value
)
structPreviewVisible
.
value
=
true
structPreviewVisible
.
value
=
true
}
}
...
@@ -111,13 +152,26 @@ const onDownload = async (id: number) => {
...
@@ -111,13 +152,26 @@ const onDownload = async (id: number) => {
downloadGeneratedProject
(
data
,
fileName
)
downloadGeneratedProject
(
data
,
fileName
)
}
}
const
onSelect
=
async
(
selectedKeys
:
string
[],
event
:
{
node
:
TreeDataNode
})
=>
{
const
on
FileTreeNode
Select
=
async
(
selectedKeys
:
string
[],
event
:
{
node
:
TreeDataNode
})
=>
{
const
{
node
}
=
event
const
{
node
}
=
event
fileContent
.
value
=
node
.
fileContent
fileContent
.
value
=
node
.
fileContent
fileExtension
.
value
=
node
.
title
.
substring
(
node
.
title
.
lastIndexOf
(
'
.
'
)
+
1
)
fileExtension
.
value
=
node
.
title
.
substring
(
node
.
title
.
lastIndexOf
(
'
.
'
)
+
1
)
contentPreviewVisible
.
value
=
true
contentPreviewVisible
.
value
=
true
}
}
const
onGroupTreeNodeSelect
=
async
(
selectedKeys
:
string
[],
event
:
{
node
:
TreeDataNode
})
=>
{
const
{
node
}
=
event
formState
.
repoGroupId
=
node
.
key
as
number
formState
.
repoGroup
=
node
.
title
}
const
onGroupModalClose
=
async
()
=>
{
if
(
formState
.
repoGroupId
===
-
1
)
{
formState
.
initGitRepo
=
false
}
gitlabGroupVisible
.
value
=
false
}
const
downloadGeneratedProject
=
(
data
:
BlobPart
,
fileName
:
string
)
=>
{
const
downloadGeneratedProject
=
(
data
:
BlobPart
,
fileName
:
string
)
=>
{
const
blob
=
new
Blob
([
data
])
const
blob
=
new
Blob
([
data
])
const
link
=
document
.
createElement
(
'
a
'
)
const
link
=
document
.
createElement
(
'
a
'
)
...
@@ -137,7 +191,14 @@ const fetchFileList = async (id: number) => {
...
@@ -137,7 +191,14 @@ const fetchFileList = async (id: number) => {
}
}
}
}
const
createTreeData
=
(
fileNodeList
:
FileNode
[]):
any
=>
{
const
fetchGroupList
=
async
()
=>
{
let
data
:
BaseResponse
=
await
request
.
get
(
`/gitlab/groups`
)
if
(
data
.
code
===
0
)
{
return
data
.
result
}
}
const
createFileTreeData
=
(
fileNodeList
:
FileNode
[]):
any
=>
{
if
(
!
fileNodeList
)
{
if
(
!
fileNodeList
)
{
return
[]
return
[]
}
}
...
@@ -145,13 +206,28 @@ const createTreeData = (fileNodeList: FileNode[]): any => {
...
@@ -145,13 +206,28 @@ const createTreeData = (fileNodeList: FileNode[]): any => {
return
{
return
{
key
:
Math
.
random
(),
key
:
Math
.
random
(),
title
:
item
.
fileName
,
title
:
item
.
fileName
,
children
:
createTreeData
(
item
.
children
),
children
:
create
File
TreeData
(
item
.
children
),
selectable
:
item
.
isFile
,
selectable
:
item
.
isFile
,
isLeaf
:
item
.
isFile
,
isLeaf
:
item
.
isFile
,
fileContent
:
item
.
fileContent
fileContent
:
item
.
fileContent
}
}
})
})
}
}
const
createGroupTreeData
=
(
groupNodeList
:
GroupNode
[]):
any
=>
{
if
(
!
groupNodeList
)
{
return
[]
}
return
groupNodeList
.
map
((
item
:
GroupNode
)
=>
{
return
{
key
:
item
.
id
,
title
:
item
.
name
,
children
:
createGroupTreeData
(
item
.
children
),
selectable
:
true
,
isLeaf
:
!
item
.
children
}
})
}
</
script
>
</
script
>
<
style
scoped
>
<
style
scoped
>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment