Skip to content

Commit 1317127

Browse files
authored
Merge pull request #424 from FlowCI/feature/1593
Feature/1593
2 parents 435411d + c90137f commit 1317127

File tree

15 files changed

+190
-54
lines changed

15 files changed

+190
-54
lines changed

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

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package com.flowci.core.common.domain;
1818

19-
import com.google.common.collect.ImmutableList;
19+
import com.google.common.collect.ImmutableSet;
2020

2121
import java.util.Collection;
2222

@@ -126,17 +126,32 @@ public abstract static class Git {
126126
*/
127127
public static final String BRANCH = "FLOWCI_GIT_BRANCH";
128128

129+
/**
130+
* For some git sources, they need repo id for write back commit status
131+
*/
132+
public static final String REPO_ID = "FLOWCI_GIT_REPO_ID";
133+
134+
public static final Collection<String> GENERIC_VARS = ImmutableSet.<String>builder()
135+
.add(SOURCE)
136+
.add(COMMIT_ID)
137+
.add(EVENT)
138+
.add(EVENT_ID)
139+
.add(REPO_ID)
140+
.add(BRANCH)
141+
.add(SECRET)
142+
.add(REPO_NAME)
143+
.add(URL)
144+
.build();
145+
129146
/**
130147
* Push / Tag variables
131148
*/
132149
public static final String PUSH_AUTHOR = "FLOWCI_GIT_AUTHOR";
133-
public static final String PUSH_BRANCH = "FLOWCI_GIT_BRANCH";
134150
public static final String PUSH_MESSAGE = "FLOWCI_GIT_COMMIT_MESSAGE";
135151
public static final String PUSH_COMMIT_TOTAL = "FLOWCI_GIT_COMMIT_TOTAL";
136152
public static final String PUSH_COMMIT_LIST = "FLOWCI_GIT_COMMIT_LIST"; // b64 json
137-
public static final Collection<String> PUSH_TAG_VARS = ImmutableList.<String>builder()
153+
public static final Collection<String> PUSH_TAG_VARS = ImmutableSet.<String>builder()
138154
.add(PUSH_AUTHOR)
139-
.add(PUSH_BRANCH)
140155
.add(PUSH_MESSAGE)
141156
.add(PUSH_COMMIT_TOTAL)
142157
.add(PUSH_COMMIT_LIST)
@@ -158,7 +173,7 @@ public abstract static class Git {
158173
public static final String PR_BASE_REPO_NAME = "FLOWCI_GIT_PR_BASE_REPO_NAME";
159174
public static final String PR_BASE_REPO_BRANCH = "FLOWCI_GIT_PR_BASE_REPO_BRANCH";
160175
public static final String PR_BASE_REPO_COMMIT = "FLOWCI_GIT_PR_BASE_REPO_COMMIT";
161-
public static final Collection<String> PR_VARS = ImmutableList.<String>builder()
176+
public static final Collection<String> PR_VARS = ImmutableSet.<String>builder()
162177
.add(PR_TITLE)
163178
.add(PR_MESSAGE)
164179
.add(PR_AUTHOR)
@@ -193,7 +208,7 @@ public abstract static class Git {
193208
public static final String PATCHSET_INSERT_SIZE = "FLOWCI_GIT_PATCHSET_INSERT_SIZE";
194209
public static final String PATCHSET_DELETE_SIZE = "FLOWCI_GIT_PATCHSET_DELETE_SIZE";
195210
public static final String PATCHSET_AUTHOR = "FLOWCI_GIT_PATCHSET_AUTHOR";
196-
public static final Collection<String> PATCHSET_VARS = ImmutableList.<String>builder()
211+
public static final Collection<String> PATCHSET_VARS = ImmutableSet.<String>builder()
197212
.add(PATCHSET_SUBJECT)
198213
.add(PATCHSET_MESSAGE)
199214
.add(PATCHSET_PROJECT)

core/src/main/java/com/flowci/core/git/client/GerritAPIClient.java renamed to core/src/main/java/com/flowci/core/git/client/GerritApiClient.java

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import com.fasterxml.jackson.core.JsonProcessingException;
55
import com.fasterxml.jackson.databind.ObjectMapper;
66
import com.flowci.core.git.domain.GitCommitStatus;
7-
import com.flowci.core.git.domain.GitConfig;
87
import com.flowci.core.git.domain.GitConfigWithHost;
98
import com.flowci.core.git.util.CommitHelper;
109
import com.flowci.core.secret.domain.AuthSecret;
@@ -26,13 +25,13 @@
2625
import java.net.http.HttpResponse;
2726

2827
@Log4j2
29-
public class GerritAPIClient implements GitAPIClient {
28+
public class GerritApiClient implements GitApiClient<GitConfigWithHost> {
3029

3130
private final HttpClient httpClient;
3231

3332
private final ObjectMapper objectMapper;
3433

35-
public GerritAPIClient(HttpClient httpClient, ObjectMapper objectMapper) {
34+
public GerritApiClient(HttpClient httpClient, ObjectMapper objectMapper) {
3635
this.httpClient = httpClient;
3736
this.objectMapper = objectMapper;
3837
}
@@ -41,25 +40,15 @@ public GerritAPIClient(HttpClient httpClient, ObjectMapper objectMapper) {
4140
* Write commit status on change only
4241
*/
4342
@Override
44-
public void writeCommitStatus(GitCommitStatus commit, GitConfig config) {
45-
if (!(config instanceof GitConfigWithHost)) {
46-
throw new ArgumentException("GitConfigWithHost is required for Gerrit");
47-
}
48-
43+
public void writeCommitStatus(GitCommitStatus commit, GitConfigWithHost config) {
4944
var secret = config.getSecretObj();
50-
if (!(secret instanceof AuthSecret)) {
51-
throw new ArgumentException("AuthSecret is required for Gerrit");
52-
}
53-
5445
var changeId = CommitHelper.getChangeId(commit);
5546
if (changeId.isEmpty()) {
5647
throw new NotFoundException("Change-Id not found from commit message");
5748
}
5849

5950
try {
60-
var gitConfig = (GitConfigWithHost) config;
61-
62-
var url = UriComponentsBuilder.fromHttpUrl(gitConfig.getHost())
51+
var url = UriComponentsBuilder.fromHttpUrl(config.getHost())
6352
.path("/a/changes/")
6453
.path(changeId.get())
6554
.path("/revisions/")

core/src/main/java/com/flowci/core/git/client/GitAPIClient.java renamed to core/src/main/java/com/flowci/core/git/client/GitApiClient.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import com.flowci.core.git.domain.GitCommitStatus;
44
import com.flowci.core.git.domain.GitConfig;
55

6-
public interface GitAPIClient {
6+
public interface GitApiClient<C extends GitConfig> {
77

8-
void writeCommitStatus(GitCommitStatus commit, GitConfig config);
8+
void writeCommitStatus(GitCommitStatus commit, C config);
99
}

core/src/main/java/com/flowci/core/git/client/GithubAPIClient.java renamed to core/src/main/java/com/flowci/core/git/client/GitHubApiClient.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import java.util.Objects;
2424

2525
@Log4j2
26-
public class GithubAPIClient implements GitAPIClient {
26+
public class GitHubApiClient implements GitApiClient<GitConfig> {
2727

2828
private final static UriTemplate HttpTemplate = new UriTemplate("https://github.com/{owner}/{repo}.git");
2929

@@ -37,19 +37,14 @@ public class GithubAPIClient implements GitAPIClient {
3737

3838
private final ObjectMapper objectMapper;
3939

40-
public GithubAPIClient(HttpClient httpClient, ObjectMapper objectMapper) {
40+
public GitHubApiClient(HttpClient httpClient, ObjectMapper objectMapper) {
4141
this.httpClient = httpClient;
4242
this.objectMapper = objectMapper;
4343
}
4444

4545
@Override
4646
public void writeCommitStatus(GitCommitStatus commit, GitConfig config) {
4747
var secret = config.getSecretObj();
48-
49-
if (!(secret instanceof TokenSecret)) {
50-
throw new ArgumentException("Token secret is required Github");
51-
}
52-
5348
var tokenSecret = (TokenSecret) secret;
5449
var repo = getRepo(commit);
5550

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package com.flowci.core.git.client;
2+
3+
import com.flowci.core.git.domain.GitCommitStatus;
4+
import com.flowci.core.git.domain.GitConfigWithHost;
5+
import com.flowci.core.secret.domain.TokenSecret;
6+
import com.flowci.exception.ArgumentException;
7+
import com.flowci.util.StringHelper;
8+
import com.google.common.collect.ImmutableMap;
9+
import lombok.extern.log4j.Log4j2;
10+
import org.springframework.http.HttpHeaders;
11+
import org.springframework.http.HttpStatus;
12+
import org.springframework.http.MediaType;
13+
import org.springframework.web.util.UriComponentsBuilder;
14+
15+
import java.net.URI;
16+
import java.net.URLEncoder;
17+
import java.net.http.HttpClient;
18+
import java.net.http.HttpRequest;
19+
import java.net.http.HttpResponse;
20+
import java.nio.charset.StandardCharsets;
21+
import java.util.Map;
22+
23+
@Log4j2
24+
public class GitLabV4ApiClient implements GitApiClient<GitConfigWithHost> {
25+
26+
private final HttpClient httpClient;
27+
28+
public GitLabV4ApiClient(HttpClient httpClient) {
29+
this.httpClient = httpClient;
30+
}
31+
32+
@Override
33+
public void writeCommitStatus(GitCommitStatus commit, GitConfigWithHost config) {
34+
if (!StringHelper.hasValue(commit.getRepoId())) {
35+
throw new ArgumentException("GitLab repo id is missing");
36+
}
37+
38+
var url = UriComponentsBuilder.fromHttpUrl(config.getHost())
39+
.path("/api/v4/projects/")
40+
.path(commit.getRepoId())
41+
.path("/statuses/")
42+
.path(commit.getId())
43+
.build()
44+
.toUriString();
45+
46+
var request = getRequestBuilder(url, (TokenSecret) config.getSecretObj())
47+
.POST(buildFormData(ImmutableMap.builder()
48+
.put("state", commit.getStatus())
49+
.put("ref", commit.getBranch())
50+
.put("context", "flow.ci")
51+
.put("target_url", commit.getTargetUrl())
52+
.put("description", commit.getDesc())
53+
.build()))
54+
.build();
55+
56+
httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString())
57+
.thenAccept(r -> {
58+
log.info("Update commit status on {} is {}", commit.getUrl(), r.statusCode());
59+
if (r.statusCode() != HttpStatus.OK.value()) {
60+
log.debug(r.body());
61+
}
62+
});
63+
}
64+
65+
private HttpRequest.Builder getRequestBuilder(String url, TokenSecret secret) {
66+
return HttpRequest.newBuilder(URI.create(url))
67+
.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE)
68+
.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + secret.getTokenData());
69+
}
70+
71+
public static HttpRequest.BodyPublisher buildFormData(Map<Object, Object> data) {
72+
var builder = new StringBuilder();
73+
for (Map.Entry<Object, Object> entry : data.entrySet()) {
74+
if (builder.length() > 0) {
75+
builder.append("&");
76+
}
77+
builder.append(URLEncoder.encode(entry.getKey().toString(), StandardCharsets.UTF_8));
78+
builder.append("=");
79+
builder.append(URLEncoder.encode(entry.getValue().toString(), StandardCharsets.UTF_8));
80+
}
81+
return HttpRequest.BodyPublishers.ofString(builder.toString());
82+
}
83+
}

core/src/main/java/com/flowci/core/git/converter/GitLabConverter.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,13 +204,15 @@ public GitTrigger toTrigger() {
204204
GitPrTrigger.Source head = new GitPrTrigger.Source();
205205
head.setCommit(attributes.lastCommit.id);
206206
head.setRef(attributes.sourceBranch);
207+
head.setRepoId(attributes.source.id);
207208
head.setRepoName(attributes.source.name);
208209
head.setRepoUrl(attributes.source.webUrl);
209210
trigger.setHead(head);
210211

211212
GitPrTrigger.Source base = new GitPrTrigger.Source();
212213
base.setCommit(StringHelper.EMPTY);
213214
base.setRef(attributes.targetBranch);
215+
base.setRepoId(attributes.target.id);
214216
base.setRepoName(attributes.target.name);
215217
base.setRepoUrl(attributes.target.webUrl);
216218
trigger.setBase(base);

core/src/main/java/com/flowci/core/git/domain/GitCommitStatus.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,8 @@ public class GitCommitStatus extends GitCommit {
1212
private String targetUrl;
1313

1414
private String desc;
15+
16+
private String repoId;
17+
18+
private String branch;
1519
}

core/src/main/java/com/flowci/core/git/domain/GitPrTrigger.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ public StringVars toVariableMap() {
7373
map.put(PR_BASE_REPO_COMMIT, base.commit);
7474

7575
map.put(BRANCH, merged ? base.ref : head.ref);
76+
map.put(REPO_ID, merged ? base.repoId : head.repoId);
7677
return map;
7778
}
7879

@@ -99,6 +100,8 @@ public static class Source {
99100

100101
private String repoName;
101102

103+
private String repoId;
104+
102105
private String repoUrl;
103106
}
104107
}

core/src/main/java/com/flowci/core/git/domain/GitPushTrigger.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ public StringVars toVariableMap() {
5959
// ignore
6060
}
6161

62-
map.put(PUSH_BRANCH, ref);
62+
map.put(BRANCH, ref);
63+
map.put(REPO_ID, repoId);
6364
map.put(PUSH_MESSAGE, message);
6465
map.put(PUSH_AUTHOR, sender.getEmail());
6566
map.put(PUSH_COMMIT_TOTAL, String.valueOf(numOfCommit));

0 commit comments

Comments
 (0)