Skip to content

Commit f21e36c

Browse files
committed
create github client
1 parent 6c69cb3 commit f21e36c

36 files changed

+294
-72
lines changed

core/src/main/java/com/flowci/core/common/config/AppConfig.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,11 +130,12 @@ public void multicastEvent(ApplicationEvent event, ResolvableType eventType) {
130130
}
131131

132132
@Bean("httpClient")
133-
public HttpClient httpClient() {
133+
public HttpClient httpClient(TaskExecutor appTaskExecutor) {
134134
return HttpClient.newBuilder()
135135
.version(HttpClient.Version.HTTP_1_1)
136136
.followRedirects(HttpClient.Redirect.NORMAL)
137137
.connectTimeout(Duration.ofSeconds(10))
138+
.executor(appTaskExecutor)
138139
.build();
139140
}
140141
}

core/src/main/java/com/flowci/core/flow/service/FlowServiceImpl.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@
2828
import com.flowci.core.flow.event.FlowCreatedEvent;
2929
import com.flowci.core.flow.event.FlowDeletedEvent;
3030
import com.flowci.core.flow.event.FlowInitEvent;
31-
import com.flowci.core.git.hook.domain.GitPingTrigger;
32-
import com.flowci.core.git.hook.domain.GitTrigger;
33-
import com.flowci.core.git.hook.event.GitHookEvent;
31+
import com.flowci.core.git.domain.GitPingTrigger;
32+
import com.flowci.core.git.domain.GitTrigger;
33+
import com.flowci.core.git.event.GitHookEvent;
3434
import com.flowci.core.job.domain.Job;
3535
import com.flowci.core.job.event.CreateNewJobEvent;
3636
import com.flowci.core.secret.domain.Secret;
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.flowci.core.git.client;
2+
3+
import com.flowci.core.git.domain.GitCommitWithJobStatus;
4+
5+
public interface GitClient {
6+
7+
void writeCommitStatus(GitCommitWithJobStatus commit);
8+
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package com.flowci.core.git.client;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import com.fasterxml.jackson.core.JsonProcessingException;
5+
import com.fasterxml.jackson.databind.ObjectMapper;
6+
import com.flowci.core.git.dao.GitSettingsDao;
7+
import com.flowci.core.git.domain.GitCommit;
8+
import com.flowci.core.git.domain.GitCommitWithJobStatus;
9+
import com.flowci.core.git.domain.GitRepo;
10+
import com.flowci.core.git.domain.GitSettings;
11+
import com.flowci.exception.CIException;
12+
import com.flowci.exception.NotFoundException;
13+
import com.flowci.exception.UnsupportedException;
14+
import lombok.extern.log4j.Log4j2;
15+
import org.springframework.stereotype.Component;
16+
import org.springframework.web.util.UriTemplate;
17+
18+
import java.net.URI;
19+
import java.net.http.HttpClient;
20+
import java.net.http.HttpRequest;
21+
import java.net.http.HttpResponse;
22+
import java.util.Map;
23+
import java.util.Objects;
24+
25+
@Log4j2
26+
@Component
27+
public class GithubClient implements GitClient {
28+
29+
private final static UriTemplate HttpTemplate = new UriTemplate("https://github.com/{owner}/{repo}.git");
30+
31+
private final static UriTemplate SshTemplate = new UriTemplate("[email protected]:{owner}/{repo}.git");
32+
33+
private final static UriTemplate SshPrefixTemplate = new UriTemplate("ssh://[email protected]:{owner}/{repo}.git");
34+
35+
private final static String CommitStatusAPI = "https://api.github.com/repos/%s/%s/statuses/%s";
36+
37+
private final GitSettingsDao gitSettingsDao;
38+
39+
private final HttpClient httpClient;
40+
41+
private final ObjectMapper objectMapper;
42+
43+
public GithubClient(GitSettingsDao gitSettingsDao, HttpClient httpClient, ObjectMapper objectMapper) {
44+
this.gitSettingsDao = gitSettingsDao;
45+
this.httpClient = httpClient;
46+
this.objectMapper = objectMapper;
47+
}
48+
49+
@Override
50+
public void writeCommitStatus(GitCommitWithJobStatus commit) {
51+
GitRepo repo = getRepo(commit);
52+
53+
var body = new GitCommitPostBody();
54+
body.state = commit.getStatus();
55+
body.targetUrl = commit.getTargetUrl();
56+
body.description = commit.getDesc();
57+
58+
try {
59+
var api = String.format(CommitStatusAPI, repo.getOwner(), repo.getOwner(), commit.getId());
60+
var request = getRequestBuilder(api)
61+
.POST(HttpRequest.BodyPublishers.ofString(objectMapper.writeValueAsString(body)))
62+
.build();
63+
64+
httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString())
65+
.thenAccept(r -> log.info("Update commit status on {} is {}", commit.getUrl(), r.statusCode()));
66+
67+
} catch (JsonProcessingException e) {
68+
throw new CIException("Unable to convert github commit body to json: " + e.getMessage());
69+
}
70+
}
71+
72+
private HttpRequest.Builder getRequestBuilder(String url) {
73+
var optional = gitSettingsDao.findByKey(GitSettings.Key);
74+
if (optional.isEmpty()) {
75+
throw new NotFoundException("Git settings is missing");
76+
}
77+
78+
var tokenSecret = optional.get().getGitHubTokenSecret();
79+
Objects.requireNonNull(tokenSecret, "Github token secret is missing");
80+
81+
return HttpRequest.newBuilder(URI.create(url))
82+
.setHeader("Accept", "application/vnd.github.v3+json")
83+
.setHeader("Authorization", "token " + tokenSecret);
84+
}
85+
86+
private static class GitCommitPostBody {
87+
88+
public String state;
89+
90+
@JsonProperty("target_url")
91+
public String targetUrl;
92+
93+
public String description;
94+
}
95+
96+
public static GitRepo getRepo(GitCommit commit) {
97+
String url = commit.getUrl();
98+
Objects.requireNonNull(url, "commit url is required");
99+
100+
if (HttpTemplate.matches(url)) {
101+
Map<String, String> match = HttpTemplate.match(url);
102+
return new GitRepo(match.get("owner"), match.get("repo"));
103+
}
104+
105+
if (SshTemplate.matches(url)) {
106+
Map<String, String> match = SshTemplate.match(url);
107+
return new GitRepo(match.get("owner"), match.get("repo"));
108+
}
109+
110+
if (SshPrefixTemplate.matches(url)) {
111+
Map<String, String> match = SshPrefixTemplate.match(url);
112+
return new GitRepo(match.get("owner"), match.get("repo"));
113+
}
114+
115+
throw new UnsupportedException("Unable to get owner and repo from GitHub commit url");
116+
}
117+
}

core/src/main/java/com/flowci/core/git/hook/controller/GithookController.java renamed to core/src/main/java/com/flowci/core/git/controller/GithookController.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@
1414
* limitations under the License.
1515
*/
1616

17-
package com.flowci.core.git.hook.controller;
17+
package com.flowci.core.git.controller;
1818

1919
import com.flowci.core.common.domain.GitSource;
2020
import com.flowci.core.common.manager.SpringEventManager;
21-
import com.flowci.core.git.hook.converter.*;
22-
import com.flowci.core.git.hook.domain.GitTrigger;
23-
import com.flowci.core.git.hook.event.GitHookEvent;
21+
import com.flowci.core.git.converter.*;
22+
import com.flowci.core.git.domain.GitTrigger;
23+
import com.flowci.core.git.event.GitHookEvent;
2424
import com.flowci.exception.ArgumentException;
2525
import com.flowci.util.StringHelper;
2626
import lombok.extern.log4j.Log4j2;

core/src/main/java/com/flowci/core/git/hook/converter/GerritConverter.java renamed to core/src/main/java/com/flowci/core/git/converter/GerritConverter.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
package com.flowci.core.git.hook.converter;
1+
package com.flowci.core.git.converter;
22

33
import com.fasterxml.jackson.annotation.JsonAlias;
44
import com.flowci.core.common.domain.GitSource;
5-
import com.flowci.core.git.hook.domain.GitPatchSetTrigger;
6-
import com.flowci.core.git.hook.domain.GitTrigger;
7-
import com.flowci.core.git.hook.domain.GitTriggerable;
8-
import com.flowci.core.git.hook.domain.GitUser;
9-
import com.flowci.core.git.hook.util.BranchHelper;
5+
import com.flowci.core.git.domain.GitPatchSetTrigger;
6+
import com.flowci.core.git.domain.GitTrigger;
7+
import com.flowci.core.git.domain.GitTriggerable;
8+
import com.flowci.core.git.domain.GitUser;
9+
import com.flowci.core.git.util.BranchHelper;
1010
import com.flowci.util.StringHelper;
1111
import com.google.common.collect.ImmutableMap;
1212
import lombok.extern.log4j.Log4j2;

core/src/main/java/com/flowci/core/git/hook/converter/GitHubConverter.java renamed to core/src/main/java/com/flowci/core/git/converter/GitHubConverter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@
1414
* limitations under the License.
1515
*/
1616

17-
package com.flowci.core.git.hook.converter;
17+
package com.flowci.core.git.converter;
1818

1919
import com.fasterxml.jackson.annotation.JsonAlias;
2020
import com.fasterxml.jackson.annotation.JsonProperty;
2121
import com.flowci.core.common.domain.GitSource;
22-
import com.flowci.core.git.hook.domain.*;
23-
import com.flowci.core.git.hook.util.BranchHelper;
22+
import com.flowci.core.git.domain.*;
23+
import com.flowci.core.git.util.BranchHelper;
2424
import com.flowci.exception.ArgumentException;
2525
import com.flowci.util.ObjectsHelper;
2626
import com.google.common.collect.ImmutableMap;

core/src/main/java/com/flowci/core/git/hook/converter/GitLabConverter.java renamed to core/src/main/java/com/flowci/core/git/converter/GitLabConverter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@
1414
* limitations under the License.
1515
*/
1616

17-
package com.flowci.core.git.hook.converter;
17+
package com.flowci.core.git.converter;
1818

1919
import com.fasterxml.jackson.annotation.JsonAlias;
2020
import com.fasterxml.jackson.annotation.JsonProperty;
2121
import com.flowci.core.common.domain.GitSource;
22-
import com.flowci.core.git.hook.domain.*;
23-
import com.flowci.core.git.hook.util.BranchHelper;
22+
import com.flowci.core.git.domain.*;
23+
import com.flowci.core.git.util.BranchHelper;
2424
import com.flowci.exception.ArgumentException;
2525
import com.flowci.util.ObjectsHelper;
2626
import com.flowci.util.StringHelper;

core/src/main/java/com/flowci/core/git/hook/converter/GiteeConverter.java renamed to core/src/main/java/com/flowci/core/git/converter/GiteeConverter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@
1414
* limitations under the License.
1515
*/
1616

17-
package com.flowci.core.git.hook.converter;
17+
package com.flowci.core.git.converter;
1818

1919
import com.fasterxml.jackson.annotation.JsonProperty;
2020
import com.flowci.core.common.domain.GitSource;
21-
import com.flowci.core.git.hook.domain.*;
22-
import com.flowci.core.git.hook.util.BranchHelper;
21+
import com.flowci.core.git.domain.*;
22+
import com.flowci.core.git.util.BranchHelper;
2323
import com.flowci.exception.ArgumentException;
2424
import com.flowci.util.ObjectsHelper;
2525
import com.google.common.collect.ImmutableMap;

core/src/main/java/com/flowci/core/git/hook/converter/GogsConverter.java renamed to core/src/main/java/com/flowci/core/git/converter/GogsConverter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@
1414
* limitations under the License.
1515
*/
1616

17-
package com.flowci.core.git.hook.converter;
17+
package com.flowci.core.git.converter;
1818

1919
import com.fasterxml.jackson.annotation.JsonAlias;
2020
import com.flowci.core.common.domain.GitSource;
21-
import com.flowci.core.git.hook.domain.*;
22-
import com.flowci.core.git.hook.util.BranchHelper;
21+
import com.flowci.core.git.domain.*;
22+
import com.flowci.core.git.util.BranchHelper;
2323
import com.flowci.exception.ArgumentException;
2424
import com.flowci.util.ObjectsHelper;
2525
import com.flowci.util.StringHelper;

0 commit comments

Comments
 (0)