Skip to content

Commit d80aeed

Browse files
authored
Merge pull request #421 from FlowCI/feature/1588
Feature/1588
2 parents c66a873 + 6d0fd3c commit d80aeed

File tree

24 files changed

+819
-253
lines changed

24 files changed

+819
-253
lines changed

.gitignore

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,4 @@ target/
77
.settings/
88
.classpath
99
.factorypath
10-
*Proto.java
11-
.run/
10+
*Proto.java

.run/Application - 1.run.xml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<component name="ProjectRunConfigurationManager">
2+
<configuration default="false" name="Application - 1" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
3+
<module name="core" />
4+
<option name="SPRING_BOOT_MAIN_CLASS" value="com.flowci.core.Application" />
5+
<option name="VM_PARAMETERS" value="-Xms1g -Xmx1g -Xmn600m -XX:-UseAdaptiveSizePolicy -XX:SurvivorRatio=4 -verbose:gc" />
6+
<option name="ALTERNATIVE_JRE_PATH" />
7+
<envs>
8+
<env name="FLOWCI_LOG_LEVEL" value="DEBUG" />
9+
<env name="FLOWCI_PLUGIN_URL" value="https://raw.githubusercontent.com/FlowCI/plugins/develop/repository.json" />
10+
<env name="FLOWCI_RABBITMQ_URI" value="amqp://guest:[email protected]:5672" />
11+
<env name="FLOWCI_ZK_HOST" value="127.0.0.1" />
12+
<env name="FLOWCI_AUTO_AGENT" value="false" />
13+
<env name="FLOWCI_AGENT_VOLUMES" value="name=pyenv,dest=/ci/python,script=init.sh,image=flowci/pyenv,init=init-pyenv-volume.sh" />
14+
<env name="FLOWCI_SERVER_PORT" value="8080" />
15+
<env name="FLOWCI_TEMPLATES" value="https://raw.githubusercontent.com/FlowCI/templates/develop/templates.json" />
16+
<env name="FLOWCI_AGENT_IMAGE" value="flowci/agent:dev" />
17+
<env name="FLOWCI_SERVER_URL" value="http://192.168.31.173:8080" />
18+
</envs>
19+
<method v="2">
20+
<option name="Make" enabled="true" />
21+
</method>
22+
</configuration>
23+
</component>

core/src/main/java/com/flowci/core/common/domain/GitSource.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,6 @@ public enum GitSource {
2727
GOGS,
2828

2929
GITEE,
30+
31+
GERRIT
3032
}

core/src/main/java/com/flowci/core/common/domain/Variables.java

Lines changed: 38 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -129,18 +129,10 @@ public abstract static class Git {
129129
* Push / Tag variables
130130
*/
131131
public static final String PUSH_AUTHOR = "FLOWCI_GIT_AUTHOR";
132-
133132
public static final String PUSH_BRANCH = "FLOWCI_GIT_BRANCH";
134-
135133
public static final String PUSH_MESSAGE = "FLOWCI_GIT_COMMIT_MESSAGE";
136-
137134
public static final String PUSH_COMMIT_TOTAL = "FLOWCI_GIT_COMMIT_TOTAL";
138-
139-
/**
140-
* b64 json content
141-
*/
142-
public static final String PUSH_COMMIT_LIST = "FLOWCI_GIT_COMMIT_LIST";
143-
135+
public static final String PUSH_COMMIT_LIST = "FLOWCI_GIT_COMMIT_LIST"; // b64 json
144136
public static final Collection<String> PUSH_TAG_VARS = ImmutableList.<String>builder()
145137
.add(PUSH_AUTHOR)
146138
.add(PUSH_BRANCH)
@@ -153,31 +145,18 @@ public abstract static class Git {
153145
* Variables for git pull(mr) request
154146
*/
155147
public static final String PR_TITLE = "FLOWCI_GIT_PR_TITLE";
156-
157148
public static final String PR_MESSAGE = "FLOWCI_GIT_PR_MESSAGE";
158-
159149
public static final String PR_AUTHOR = "FLOWCI_GIT_AUTHOR";
160-
161150
public static final String PR_URL = "FLOWCI_GIT_PR_URL";
162-
163151
public static final String PR_TIME = "FLOWCI_GIT_PR_TIME";
164-
165152
public static final String PR_NUMBER = "FLOWCI_GIT_PR_NUMBER";
166-
167153
public static final String PR_IS_MERGED = "FLOWCI_GIT_PR_IS_MERGED";
168-
169154
public static final String PR_HEAD_REPO_NAME = "FLOWCI_GIT_PR_HEAD_REPO_NAME";
170-
171155
public static final String PR_HEAD_REPO_BRANCH = "FLOWCI_GIT_PR_HEAD_REPO_BRANCH";
172-
173156
public static final String PR_HEAD_REPO_COMMIT = "FLOWCI_GIT_PR_HEAD_REPO_COMMIT";
174-
175157
public static final String PR_BASE_REPO_NAME = "FLOWCI_GIT_PR_BASE_REPO_NAME";
176-
177158
public static final String PR_BASE_REPO_BRANCH = "FLOWCI_GIT_PR_BASE_REPO_BRANCH";
178-
179159
public static final String PR_BASE_REPO_COMMIT = "FLOWCI_GIT_PR_BASE_REPO_COMMIT";
180-
181160
public static final Collection<String> PR_VARS = ImmutableList.<String>builder()
182161
.add(PR_TITLE)
183162
.add(PR_MESSAGE)
@@ -194,5 +173,42 @@ public abstract static class Git {
194173
.add(PR_BASE_REPO_COMMIT)
195174
.build();
196175

176+
/**
177+
* Variables for gerrit patchset
178+
*/
179+
public static final String PATCHSET_SUBJECT = "FLOWCI_GIT_PATCHSET_SUBJECT";
180+
public static final String PATCHSET_MESSAGE = "FLOWCI_GIT_PATCHSET_MESSAGE";
181+
public static final String PATCHSET_PROJECT = "FLOWCI_GIT_PATCHSET_PROJECT";
182+
public static final String PATCHSET_BRANCH = "FLOWCI_GIT_PATCHSET_BRANCH";
183+
public static final String PATCHSET_CHANGE_ID = "FLOWCI_GIT_PATCHSET_CHANGE_ID";
184+
public static final String PATCHSET_CHANGE_NUM = "FLOWCI_GIT_PATCHSET_CHANGE_NUM";
185+
public static final String PATCHSET_CHANGE_URL = "FLOWCI_GIT_PATCHSET_CHANGE_URL";
186+
public static final String PATCHSET_CHANGE_STATUS = "FLOWCI_GIT_PATCHSET_CHANGE_STATUS";
187+
public static final String PATCHSET_PATCH_NUM = "FLOWCI_GIT_PATCHSET_PATCH_NUM";
188+
public static final String PATCHSET_PATCH_URL = "FLOWCI_GIT_PATCHSET_PATCH_URL";
189+
public static final String PATCHSET_PATCH_REVISION = "FLOWCI_GIT_PATCHSET_PATCH_REVISION";
190+
public static final String PATCHSET_PATCH_REF = "FLOWCI_GIT_PATCHSET_PATCH_REF";
191+
public static final String PATCHSET_CREATE_TIME = "FLOWCI_GIT_PATCHSET_CREATE_TIME";
192+
public static final String PATCHSET_INSERT_SIZE = "FLOWCI_GIT_PATCHSET_INSERT_SIZE";
193+
public static final String PATCHSET_DELETE_SIZE = "FLOWCI_GIT_PATCHSET_DELETE_SIZE";
194+
public static final String PATCHSET_AUTHOR = "FLOWCI_GIT_PATCHSET_AUTHOR";
195+
public static final Collection<String> PATCHSET_VARS = ImmutableList.<String>builder()
196+
.add(PATCHSET_SUBJECT)
197+
.add(PATCHSET_MESSAGE)
198+
.add(PATCHSET_PROJECT)
199+
.add(PATCHSET_BRANCH)
200+
.add(PATCHSET_CHANGE_ID)
201+
.add(PATCHSET_CHANGE_NUM)
202+
.add(PATCHSET_CHANGE_URL)
203+
.add(PATCHSET_CHANGE_STATUS)
204+
.add(PATCHSET_PATCH_NUM)
205+
.add(PATCHSET_PATCH_URL)
206+
.add(PATCHSET_PATCH_REVISION)
207+
.add(PATCHSET_PATCH_REF)
208+
.add(PATCHSET_CREATE_TIME)
209+
.add(PATCHSET_INSERT_SIZE)
210+
.add(PATCHSET_DELETE_SIZE)
211+
.add(PATCHSET_AUTHOR)
212+
.build();
197213
}
198214
}

core/src/main/java/com/flowci/core/githook/controller/GithookController.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,19 +62,29 @@ public class GithookController {
6262
@Autowired
6363
private TriggerConverter giteeConverter;
6464

65+
@Autowired
66+
private TriggerConverter gerritConverter;
67+
6568
@Autowired
6669
private SpringEventManager eventManager;
6770

68-
private final Map<GitSource, TriggerConverter> converterMap = new HashMap<>(3);
71+
private final Map<GitSource, TriggerConverter> converterMap = new HashMap<>(5);
6972

7073
@PostConstruct
7174
public void createMapping() {
7275
converterMap.put(GitSource.GITHUB, gitHubConverter);
7376
converterMap.put(GitSource.GITLAB, gitLabConverter);
7477
converterMap.put(GitSource.GOGS, gogsConverter);
7578
converterMap.put(GitSource.GITEE, giteeConverter);
79+
converterMap.put(GitSource.GERRIT, gerritConverter);
7680
}
7781

82+
/**
83+
* Gerrit:
84+
* - patch-created - wall be called for each patch push
85+
* @param name
86+
* @throws IOException
87+
*/
7888
@PostMapping("/{name}")
7989
public void onGitTrigger(@PathVariable String name) throws IOException {
8090
GitSourceWithEvent data = findGitSourceByHeader(request);
@@ -128,6 +138,15 @@ private GitSourceWithEvent findGitSourceByHeader(HttpServletRequest request) {
128138
return obj;
129139
}
130140

141+
// gerrit
142+
String gerritUrl = request.getHeader(GerritConverter.Header);
143+
// TODO: verify gerrit url
144+
if (StringHelper.hasValue(gerritUrl)) {
145+
obj.source = GitSource.GERRIT;
146+
obj.event = GerritConverter.AllEvent;
147+
return obj;
148+
}
149+
131150
throw new ArgumentException("Unsupported git event");
132151
}
133152

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
package com.flowci.core.githook.converter;
2+
3+
import com.fasterxml.jackson.annotation.JsonAlias;
4+
import com.flowci.core.common.domain.GitSource;
5+
import com.flowci.core.githook.domain.GitPatchSetTrigger;
6+
import com.flowci.core.githook.domain.GitTrigger;
7+
import com.flowci.core.githook.domain.GitTriggerable;
8+
import com.flowci.core.githook.domain.GitUser;
9+
import com.flowci.core.githook.util.BranchHelper;
10+
import com.flowci.util.StringHelper;
11+
import com.google.common.collect.ImmutableMap;
12+
import lombok.extern.log4j.Log4j2;
13+
import org.springframework.stereotype.Component;
14+
15+
import java.io.IOException;
16+
import java.io.InputStream;
17+
import java.util.Map;
18+
import java.util.Objects;
19+
import java.util.function.Function;
20+
21+
@Log4j2
22+
@Component("gerritConverter")
23+
public class GerritConverter extends TriggerConverter {
24+
25+
public static final String Header = "x-origin-url";
26+
public static final String AllEvent = "all";
27+
28+
private static final String EventPathsetCreated = "patchset-created";
29+
private static final String EventChangeMerged = "change-merged";
30+
31+
private final Map<String, Function<InputStream, GitTrigger>> mapping =
32+
ImmutableMap.<String, Function<InputStream, GitTrigger>>builder()
33+
.put(AllEvent, new AllEventsConverter())
34+
.build();
35+
36+
@Override
37+
GitSource getGitSource() {
38+
return GitSource.GERRIT;
39+
}
40+
41+
@Override
42+
Map<String, Function<InputStream, GitTrigger>> getMapping() {
43+
return mapping;
44+
}
45+
46+
private class AllEventsConverter implements Function<InputStream, GitTrigger> {
47+
48+
@Override
49+
public GitTrigger apply(InputStream inputStream) {
50+
try {
51+
String payload = StringHelper.toString(inputStream);
52+
Event event = objectMapper.readValue(payload, Event.class);
53+
54+
if (Objects.equals(EventPathsetCreated, event.type) || Objects.equals(EventChangeMerged, event.type)) {
55+
PatchSetEvent pce = objectMapper.readValue(payload, PatchSetEvent.class);
56+
return pce.toTrigger();
57+
}
58+
59+
log.warn("Unsupported gerrit event {}", event.type);
60+
} catch (IOException e) {
61+
log.warn("Unable to parse gerrit payload");
62+
}
63+
64+
return null;
65+
}
66+
}
67+
68+
/**
69+
* Basic event type
70+
* "type": "ref-updated",
71+
* "eventCreatedOn": 1642345678
72+
*/
73+
private static class Event {
74+
75+
public String type;
76+
}
77+
78+
79+
private static class PatchSetEvent implements GitTriggerable {
80+
81+
@JsonAlias({"uploader", "submitter"})
82+
public Author author;
83+
84+
public PatchSet patchSet;
85+
86+
public Change change;
87+
88+
public String refName;
89+
90+
@Override
91+
public GitTrigger toTrigger() {
92+
GitPatchSetTrigger t = new GitPatchSetTrigger();
93+
t.setSource(GitSource.GERRIT);
94+
t.setEvent(GitTrigger.GitEvent.PATCHSET_UPDATE);
95+
96+
t.setSubject(change.subject);
97+
t.setMessage(change.commitMessage);
98+
t.setProject(change.project);
99+
t.setChangeId(change.id);
100+
t.setChangeNumber(change.number);
101+
t.setChangeUrl(change.url);
102+
t.setStatus(GitPatchSetTrigger.Status.valueOf(change.status));
103+
104+
t.setPatchNumber(patchSet.number);
105+
t.setPatchUrl(change.url + "/" + patchSet.number);
106+
t.setPatchRevision(patchSet.revision);
107+
t.setPatchRef(patchSet.ref);
108+
109+
t.setBranch(BranchHelper.getBranchName(refName));
110+
t.setCreatedOn(patchSet.createdOn);
111+
t.setAuthor(author.toGitUser());
112+
t.setSizeInsertions(patchSet.sizeInsertions);
113+
t.setSizeDeletions(patchSet.sizeDeletions);
114+
115+
return t;
116+
}
117+
}
118+
119+
private static class PatchSet {
120+
121+
public Integer number;
122+
123+
public String revision;
124+
125+
public String ref;
126+
127+
public String createdOn;
128+
129+
public Integer sizeInsertions;
130+
131+
public Integer sizeDeletions;
132+
}
133+
134+
public static class Change {
135+
136+
public String project;
137+
138+
public String branch;
139+
140+
public String id;
141+
142+
public Integer number;
143+
144+
public String subject;
145+
146+
public String url;
147+
148+
public String commitMessage;
149+
150+
public String status;
151+
}
152+
153+
private static class Author {
154+
155+
public String name;
156+
157+
public String email;
158+
159+
public String username;
160+
161+
public GitUser toGitUser() {
162+
var user = new GitUser();
163+
user.setName(name);
164+
user.setEmail(email);
165+
user.setUsername(username);
166+
return user;
167+
}
168+
}
169+
}

core/src/main/java/com/flowci/core/githook/converter/GiteeConverter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,10 @@ public class GiteeConverter extends TriggerConverter {
5252

5353
private final Map<String, Function<InputStream, GitTrigger>> mapping =
5454
ImmutableMap.<String, Function<InputStream, GitTrigger>>builder()
55-
.put(Ping, new EventConverter<>("Ping", GiteeConverter.PingEvent.class))
55+
.put(Ping, new EventConverter<>("Ping", PingEvent.class))
5656
.put(Push, new EventConverter<>("Push", PushTagEvent.class))
5757
.put(Tag, new EventConverter<>("Tag", PushTagEvent.class))
58-
.put(PR, new EventConverter<>("PR", GiteeConverter.PrEvent.class))
58+
.put(PR, new EventConverter<>("PR", PrEvent.class))
5959
.build();
6060

6161
@Override

core/src/main/java/com/flowci/core/githook/converter/TriggerConverter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,15 @@
3838
public abstract class TriggerConverter {
3939

4040
@Autowired
41-
private ObjectMapper objectMapper;
41+
protected ObjectMapper objectMapper;
4242

4343
public Optional<GitTrigger> convert(String event, InputStream body) {
4444
try {
4545
Map<String, Function<InputStream, GitTrigger>> mapping = getMapping();
4646
GitTrigger trigger = mapping.get(event).apply(body);
4747
return Optional.ofNullable(trigger);
4848
} catch (Exception e) {
49+
log.warn(e.getMessage());
4950
return Optional.empty();
5051
}
5152
}

0 commit comments

Comments
 (0)