Skip to content

Commit 669e2c6

Browse files
committed
update gitea integration for 2023.05
1 parent 3f14d91 commit 669e2c6

File tree

3 files changed

+59
-26
lines changed

3 files changed

+59
-26
lines changed

commit-status-publisher-server/src/main/java/jetbrains/buildServer/commitPublisher/gitea/GiteaPublisher.java

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
package jetbrains.buildServer.commitPublisher.gitea;
1818

1919
import com.google.gson.Gson;
20+
21+
import java.io.IOException;
2022
import java.util.Arrays;
2123
import java.util.Collections;
2224
import java.util.LinkedHashMap;
@@ -30,17 +32,18 @@
3032
import jetbrains.buildServer.util.StringUtil;
3133
import jetbrains.buildServer.vcs.VcsRoot;
3234
import jetbrains.buildServer.vcs.VcsRootInstance;
35+
import jetbrains.buildServer.vcshostings.http.HttpHelper;
3336
import org.jetbrains.annotations.NotNull;
3437
import org.jetbrains.annotations.Nullable;
3538

3639
import static jetbrains.buildServer.commitPublisher.LoggerUtil.LOG;
3740

38-
class GiteaPublisher extends HttpBasedCommitStatusPublisher {
41+
class GiteaPublisher extends HttpBasedCommitStatusPublisher<GiteaBuildStatus> {
3942

4043
private static final Gson myGson = new Gson();
4144
private static final GitRepositoryParser VCS_URL_PARSER = new GitRepositoryParser();
4245

43-
private final CommitStatusesCache<GiteaCommitStatus> myStatusesCache;
46+
@NotNull private final CommitStatusesCache<GiteaCommitStatus> myStatusesCache;
4447

4548
GiteaPublisher(@NotNull CommitStatusPublisherSettings settings,
4649
@NotNull SBuildType buildType, @NotNull String buildFeatureId,
@@ -74,8 +77,8 @@ public boolean buildQueued(@NotNull BuildPromotion buildPromotion, @NotNull Buil
7477

7578
@Override
7679
public boolean buildRemovedFromQueue(@NotNull BuildPromotion buildPromotion, @NotNull BuildRevision revision, @NotNull AdditionalTaskInfo additionalTaskInfo) throws PublisherException {
77-
GiteaBuildStatus targetStatus = additionalTaskInfo.isPromotionReplaced() ? GiteaBuildStatus.PENDING : GiteaBuildStatus.WARNING;
78-
publish(buildPromotion, revision, targetStatus, additionalTaskInfo);
80+
if (!additionalTaskInfo.isBuildManuallyRemoved()) return false;
81+
publish(buildPromotion, revision, GiteaBuildStatus.WARNING , additionalTaskInfo);
7982
return true;
8083
}
8184

@@ -125,8 +128,13 @@ RevisionStatus getRevisionStatusForRemovedBuild(@NotNull SQueuedBuild removedBui
125128
return null;
126129
}
127130
Event event = getTriggeredEvent(commitStatus);
128-
boolean isSameBuild = StringUtil.areEqual(myLinks.getQueuedBuildUrl(removedBuild), commitStatus.target_url);
129-
return new RevisionStatus(event, commitStatus.description, isSameBuild);
131+
boolean isSameBuildType = StringUtil.areEqual(getBuildName(removedBuild.getBuildPromotion()), commitStatus.context);
132+
return new RevisionStatus(event, commitStatus.description, isSameBuildType);
133+
}
134+
135+
private String getBuildName(BuildPromotion promotion) {
136+
SBuildType buildType = promotion.getBuildType();
137+
return buildType != null ? buildType.getFullName() : promotion.getBuildTypeExternalId();
130138
}
131139

132140
@Override
@@ -160,7 +168,7 @@ private GiteaCommitStatus[] loadGiteaStatuses(@NotNull BuildRevision revision, @
160168
String url = buildRevisionStatusesUrl(revision, buildType);
161169
url += "?access_token=" + getPrivateToken();
162170
ResponseEntityProcessor<GiteaCommitStatus[]> processor = new ResponseEntityProcessor<>(GiteaCommitStatus[].class);
163-
GiteaCommitStatus[] commitStatuses = get(url, null, null, null, processor);
171+
GiteaCommitStatus[] commitStatuses = get(url, null, null, processor);
164172
if (commitStatuses == null || commitStatuses.length == 0) {
165173
return new GiteaCommitStatus[0];
166174
}
@@ -173,8 +181,8 @@ RevisionStatus getRevisionStatus(@NotNull BuildPromotion buildPromotion, @Nullab
173181
return null;
174182
}
175183
Event event = getTriggeredEvent(commitStatus);
176-
boolean isSameBuild = StringUtil.areEqual(getViewUrl(buildPromotion), commitStatus.target_url);
177-
return new RevisionStatus(event, commitStatus.description, isSameBuild);
184+
boolean isSameBuildType = StringUtil.areEqual(getBuildName(buildPromotion), commitStatus.context);
185+
return new RevisionStatus(event, commitStatus.description, isSameBuildType);
178186
}
179187

180188
private String buildRevisionStatusesUrl(@NotNull BuildRevision revision, @Nullable BuildType buildType) throws PublisherException {
@@ -225,8 +233,7 @@ private void publish(@NotNull SBuild build,
225233
@NotNull BuildRevision revision,
226234
@NotNull GiteaBuildStatus status,
227235
@NotNull String description) throws PublisherException {
228-
SBuildType buildType = build.getBuildType();
229-
String buildName = buildType != null ? buildType.getFullName() : build.getBuildTypeExternalId();
236+
String buildName = getBuildName(build.getBuildPromotion());
230237
String message = createMessage(status, buildName, revision, getViewUrl(build), description);
231238
publish(message, revision, LogUtil.describe(build));
232239
myStatusesCache.removeStatusFromCache(revision, buildName);
@@ -237,9 +244,13 @@ private void publish(@NotNull BuildPromotion buildPromotion,
237244
@NotNull GiteaBuildStatus status,
238245
@NotNull AdditionalTaskInfo additionalTaskInfo) throws PublisherException {
239246
String url = getViewUrl(buildPromotion);
247+
if (url == null) {
248+
LOG.debug(String.format("Can not build view URL for the build #%d. Probably build configuration was removed. Status \"%s\" won't be published",
249+
buildPromotion.getId(), status.getName()));
250+
return;
251+
}
240252
String description = additionalTaskInfo.getComment();
241-
SBuildType buildType = buildPromotion.getBuildType();
242-
String buildName = buildType != null ? buildType.getFullName() : buildPromotion.getBuildTypeExternalId();
253+
String buildName = getBuildName(buildPromotion);
243254
String message = createMessage(status, buildName, revision, url, description);
244255
publish(message, revision, LogUtil.describe(buildPromotion));
245256
myStatusesCache.removeStatusFromCache(revision, buildName);
@@ -269,15 +280,17 @@ private void publish(@NotNull String commit, @NotNull String data, @NotNull Repo
269280
String url = GiteaSettings.getProjectsUrl(getApiUrl(), repository.owner(), repository.repositoryName()) + "/statuses/" + commit;
270281
LOG.debug("Request url: " + url + ", message: " + data);
271282
url += "?access_token=" + getPrivateToken();
272-
postJson(url, null, null, data, null, buildDescription);
283+
postJson(url, null, data, null, buildDescription);
273284
}
274285

275286
@Override
276-
public void processResponse(HttpHelper.HttpResponse response) throws HttpPublisherException {
287+
public void processResponse(HttpHelper.HttpResponse response) throws IOException, HttpPublisherException {
277288
final int statusCode = response.getStatusCode();
278289
if (statusCode >= 400) {
279290
String responseString = response.getContent();
280-
if (!responseString.contains("Cannot transition status via :enqueue from :pending") &&
291+
if (404 == statusCode) {
292+
throw new HttpPublisherException(statusCode, "Repository not found. Please check if it was renamed or moved to another namespace");
293+
} else if (!responseString.contains("Cannot transition status via :enqueue from :pending") &&
281294
!responseString.contains("Cannot transition status via :enqueue from :running") &&
282295
!responseString.contains("Cannot transition status via :run from :running")) {
283296
throw new HttpPublisherException(statusCode,
@@ -320,4 +333,12 @@ private String getPrivateToken() {
320333
return myParams.get(Constants.GITEA_TOKEN);
321334
}
322335

336+
/* Currently not needed
337+
* determineStatusCommit
338+
* getMergeRequest
339+
* getParentRevisions
340+
* determineParentInSourceBranch
341+
* isOnlyInSourceBranch
342+
* supportMergeResults
343+
*/
323344
}

commit-status-publisher-server/src/main/java/jetbrains/buildServer/commitPublisher/gitea/GiteaSettings.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import jetbrains.buildServer.serverSide.*;
2525
import jetbrains.buildServer.util.ssl.SSLTrustStoreProvider;
2626
import jetbrains.buildServer.vcs.VcsRoot;
27+
import jetbrains.buildServer.vcshostings.http.HttpHelper;
2728
import jetbrains.buildServer.web.openapi.PluginDescriptor;
2829
import jetbrains.buildServer.web.util.WebUtil;
2930
import org.jetbrains.annotations.NotNull;
@@ -109,19 +110,24 @@ public void testConnection(@NotNull BuildTypeIdentity buildTypeOrTemplate, @NotN
109110
ProjectInfoResponseProcessor processorPrj = new ProjectInfoResponseProcessor();
110111
String url = getProjectsUrl(apiUrl, repository.owner(), repository.repositoryName());
111112
url += "?access_token=" + token;
112-
HttpHelper.get(url, null, null, null,
113+
HttpHelper.get(url, null, null,
113114
BaseCommitStatusPublisher.DEFAULT_CONNECTION_TIMEOUT, trustStore(), processorPrj);
114115
if (!processorPrj.hasPushAccess()) {
115116
UserInfoResponseProcessor processorUser = new UserInfoResponseProcessor();
116117
url = getUserUrl(apiUrl);
117118
url += "?access_token=" + token;
118-
HttpHelper.get(url, null, null, null,
119+
HttpHelper.get(url, null, null,
119120
BaseCommitStatusPublisher.DEFAULT_CONNECTION_TIMEOUT, trustStore(), processorUser);
120121
if (!processorUser.isAdmin()) {
121122
throw new HttpPublisherException("Gitea does not grant enough permissions to publish a commit status");
122123
}
123124
}
124125
});
126+
} catch (HttpPublisherException pe) {
127+
Integer statusCode = pe.getStatusCode();
128+
if (Objects.equals(statusCode, 404)) {
129+
throw new PublisherException(String.format("Repository \"%s\" can not be found. Please check if it was renamed or moved to another namespace", repository.repositoryName()));
130+
}
125131
} catch (Exception ex) {
126132
throw new PublisherException(String.format("Gitea publisher has failed to connect to \"%s\" repository", repository.url()), ex);
127133
}

commit-status-publisher-server/src/test/java/jetbrains/buildServer/commitPublisher/gitea/GiteaPublisherTest.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,12 @@
2626
import jetbrains.buildServer.commitPublisher.gitea.data.GiteaPermissions;
2727
import jetbrains.buildServer.commitPublisher.gitea.data.GiteaRepoInfo;
2828
import jetbrains.buildServer.messages.Status;
29-
import jetbrains.buildServer.serverSide.BuildPromotion;
30-
import jetbrains.buildServer.serverSide.BuildRevision;
31-
import jetbrains.buildServer.serverSide.SimpleParameter;
29+
import jetbrains.buildServer.serverSide.*;
3230
import jetbrains.buildServer.vcs.VcsRootInstance;
3331
import org.apache.http.HttpRequest;
3432
import org.apache.http.HttpResponse;
3533
import org.apache.http.entity.StringEntity;
34+
import org.jmock.Mock;
3635
import org.testng.annotations.BeforeMethod;
3736
import org.testng.annotations.Test;
3837

@@ -141,12 +140,19 @@ public void should_calculate_correct_revision_status() {
141140
}
142141

143142
public void should_define_correctly_if_event_allowed() {
144-
MockQueuedBuild removedBuild = new MockQueuedBuild();
145-
removedBuild.setBuildTypeId("buildType");
146-
removedBuild.setItemId("123");
143+
Mock removedBuildMock = new Mock(SQueuedBuild.class);
144+
removedBuildMock.stubs().method("getBuildTypeId").withNoArguments().will(returnValue("buildType"));
145+
removedBuildMock.stubs().method("getItemId").withNoArguments().will(returnValue("123"));
146+
Mock buildPromotionMock = new Mock(BuildPromotion.class);
147+
Mock buildTypeMock = new Mock(SBuildType.class);
148+
buildTypeMock.stubs().method("getFullName").withNoArguments().will(returnValue("typeFullName"));
149+
buildPromotionMock.stubs().method("getBuildType").withNoArguments().will(returnValue(buildTypeMock.proxy()));
150+
removedBuildMock.stubs().method("getBuildPromotion").withNoArguments().will(returnValue(buildPromotionMock.proxy()));
151+
SQueuedBuild removedBuild = (SQueuedBuild)removedBuildMock.proxy();
152+
147153
GiteaPublisher publisher = (GiteaPublisher)myPublisher;
148-
assertTrue(publisher.getRevisionStatusForRemovedBuild(removedBuild, new GiteaCommitStatus(null, GiteaBuildStatus.PENDING.getName(), DefaultStatusMessages.BUILD_QUEUED, null, "http://localhost/viewQueued.html?itemId=123")).isEventAllowed(CommitStatusPublisher.Event.REMOVED_FROM_QUEUE));
149-
assertFalse(publisher.getRevisionStatusForRemovedBuild(removedBuild, new GiteaCommitStatus(null, GiteaBuildStatus.PENDING.getName(), DefaultStatusMessages.BUILD_QUEUED, null, "http://localhost/viewQueued.html?itemId=321")).isEventAllowed(CommitStatusPublisher.Event.REMOVED_FROM_QUEUE));
154+
assertTrue(publisher.getRevisionStatusForRemovedBuild(removedBuild, new GiteaCommitStatus(null, GiteaBuildStatus.PENDING.getName(), DefaultStatusMessages.BUILD_QUEUED, "typeFullName", "http://localhost:8111/viewQueued.html?itemId=123")).isEventAllowed(CommitStatusPublisher.Event.REMOVED_FROM_QUEUE));
155+
assertFalse(publisher.getRevisionStatusForRemovedBuild(removedBuild, new GiteaCommitStatus(null, GiteaBuildStatus.PENDING.getName(), DefaultStatusMessages.BUILD_QUEUED, "anotherTypeFullName", "http://localhost:8111/viewQueued.html?itemId=321")).isEventAllowed(CommitStatusPublisher.Event.REMOVED_FROM_QUEUE));
150156
}
151157

152158
@BeforeMethod

0 commit comments

Comments
 (0)