Skip to content

Commit

Permalink
#71 remove polling for build and test menu
Browse files Browse the repository at this point in the history
  • Loading branch information
jmecosta committed Jan 11, 2021
1 parent 130f68e commit a2eb179
Show file tree
Hide file tree
Showing 12 changed files with 272 additions and 187 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Expand Up @@ -6,7 +6,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.trimble.tekla</groupId>
<artifactId>TeamCityTriggerHook</artifactId>
<version>4.7.0</version>
<version>4.9.1</version>

<organization>
<name>Tekla</name>
Expand Down
54 changes: 30 additions & 24 deletions src/main/java/com/trimble/tekla/AreBuildsInQueueOrRunningCheck.java
Expand Up @@ -52,54 +52,60 @@ public AreBuildsInQueueOrRunningCheck(@ComponentImport I18nService i18nService,
@Override
public RepositoryHookResult preUpdate(@Nonnull PreRepositoryHookContext prhc, @Nonnull PullRequestMergeHookRequest t) {
PullRequest pr = t.getPullRequest();
Repository repository = pr.getToRef().getRepository();
Repository repository = pr.getToRef().getRepository();
final String repoName = repository.getName();

Optional<Settings> settings = this.settingsService.getSettings(repository);

if(!settings.isPresent()) {
return RepositoryHookResult.accepted();
}

TeamcityLogger.logMessage(settings.get(), "[AreBuildsInQueueOrRunningCheck] Queue Checker Started");
final String teamcityAddress = settings.get().getString("teamCityUrl");
TeamcityLogger.logMessage(settings.get(), repoName, "[AreBuildsInQueueOrRunningCheck] Queue Checker Started");
final String teamcityAddress = settings.get().getString(Field.TEAMCITY_URL);
if(teamcityAddress == null || "".equals(teamcityAddress)) {
return RepositoryHookResult.accepted();
}

final String password = this.connectionSettings.getPassword(repository);
final TeamcityConfiguration conf
= new TeamcityConfiguration(
settings.get().getString("teamCityUrl"),
settings.get().getString("teamCityUserName"),
settings.get().getString(Field.TEAMCITY_URL),
settings.get().getString(Field.TEAMCITY_USERNAME),
password);

final String branch = pr.getFromRef().getDisplayId();
if(AreBuildsInQueueForBranch(branch, conf, settings.get())) {
TeamcityLogger.logMessage(settings.get(), "Builds in queue for " + branch);
String teamcityAddressQueue = settings.get().getString("teamCityUrl") + "/queue.html";
String summaryMsg = i18nService.getText("mergecheck.builds.inqueue.summary", "Builds in queue or running");
String detailedMsg = i18nService.getText("mergecheck.builds.inqueue.detailed", "Builds are still in queue or running, visit: ") + teamcityAddressQueue;

TeamcityLogger.logMessage(settings.get(), "[AreBuildsInQueueOrRunningCheck] builds in queue for " + branch + " reject");
return RepositoryHookResult.rejected(summaryMsg, detailedMsg);
}

TeamcityLogger.logMessage(settings.get(), "[AreBuildsInQueueOrRunningCheck] No builds in queue for " + branch);
try {
if(AreBuildsInQueueForBranch(branch, conf, settings.get(), repoName)) {
TeamcityLogger.logMessage(settings.get(), repoName, "Builds in queue for " + branch);
String teamcityAddressQueue = settings.get().getString(Field.TEAMCITY_URL) + "/queue.html";
String teamcityAddressAgents = settings.get().getString(Field.TEAMCITY_URL) + "/agents.html";
String summaryMsg = i18nService.getText("mergecheck.builds.inqueue.summary", "Builds in queue or running");
String detailedMsg = i18nService.getText("mergecheck.builds.inqueue.detailed", "Builds are still in queue or running, visit: ") +
teamcityAddressQueue + " or " + teamcityAddressAgents;
TeamcityLogger.logMessage(settings.get(), repoName, "[AreBuildsInQueueOrRunningCheck] builds in queue for " + branch + " reject");
return RepositoryHookResult.rejected(summaryMsg, detailedMsg);
}
} catch (Exception ex) {
TeamcityLogger.logMessage(settings.get(), repoName, "Exception retriving queued or running builds for " + branch);
String summaryMsg = i18nService.getText("mergecheck.builds.inqueue.summary", "Exception: Cannot retrive data from Teamcity server");
String detailedMsg = i18nService.getText("mergecheck.builds.inqueue.detailed", "Make sure: ") + teamcityAddress + " is up and running. And accessible to current Bitbucket server";
TeamcityLogger.logMessage(settings.get(), repoName, "[AreBuildsInQueueOrRunningCheck] exception " + ex.getMessage() + " reject");
return RepositoryHookResult.rejected(summaryMsg, detailedMsg);
}

TeamcityLogger.logMessage(settings.get(), repoName, "[AreBuildsInQueueOrRunningCheck] No builds in queue for " + branch);
return RepositoryHookResult.accepted();
}

private Boolean AreBuildsInQueueForBranch(String branch,
final TeamcityConfiguration conf,
final Settings settings) {
final Settings settings,
final String repoName) throws IOException, JSONException {
List<TeamcityQueuedElement> queue;
try {
queue = this.connector.GetQueuedAndRunningBuilds(conf, settings, branch);
TeamcityLogger.logMessage(settings, "[AreBuildsInQueueOrRunningCheck] Detected: " + queue.size() + " in queue.");
queue = this.connector.GetQueuedAndRunningBuilds(conf, settings, branch, repoName);
TeamcityLogger.logMessage(settings, repoName, "[AreBuildsInQueueOrRunningCheck] Detected: " + queue.size() + " in queue.");
return !queue.isEmpty();
} catch (IOException | JSONException ex) {
TeamcityLogger.logMessage(settings, "[AreBuildsInQueueOrRunningCheck] Exception " + ex.getMessage());
}

return false;
}
}
Expand Up @@ -66,8 +66,8 @@ private void validateConnectionTab(final Settings settings, final SettingsValida
errors.addFieldError(Field.BITBUCKET_URL, this.i18n.getText("error.invalid.url"));
}

final String teamCityUrl = settings.getString(Field.TEAMCITY_URL, StringUtils.EMPTY);
if (!URL_VALIDATION_PATTERN.matcher(teamCityUrl).matches()) {
final String urlTeamcity = settings.getString(Field.TEAMCITY_URL, StringUtils.EMPTY);
if (!URL_VALIDATION_PATTERN.matcher(urlTeamcity).matches()) {
errors.addFieldError(Field.TEAMCITY_URL, this.i18n.getText("error.invalid.url"));
}

Expand Down
Expand Up @@ -69,7 +69,7 @@ public void onPullRequestOpenedEvent(final PullRequestOpenedEvent event) throws
try {
TriggerBuildFromPullRequest(pr, false);
} catch (final IOException | JSONException ex) {
TeamcityLogger.logMessage(settings.get(), "PullRequest Opened Event Failed: " + ex.getMessage());
TeamcityLogger.logMessage(settings.get(), repo.getName(), "PullRequest Opened Event Failed: " + ex.getMessage());
}
}

Expand All @@ -89,7 +89,7 @@ public void onPullRequestParticipantsUpdatedEvent(final PullRequestParticipantsU
try {
TriggerBuildFromPullRequest(event.getPullRequest(), true);
} catch (final IOException | JSONException ex) {
TeamcityLogger.logMessage(settings.get(), "PullRequest Reviwer update event failed: " + ex.getMessage());
TeamcityLogger.logMessage(settings.get(), repo.getName(), "PullRequest Reviwer update event failed: " + ex.getMessage());
}
}
}
Expand All @@ -111,10 +111,10 @@ public void onPullRequestRescoped(final PullRequestRescopedEvent event) throws I
}

try {
TeamcityLogger.logMessage(settings.get(), "Run PullRequest Rescoped Event : " + pr.getFromRef().getDisplayId());
TeamcityLogger.logMessage(settings.get(), repo.getName(), "Run PullRequest Rescoped Event : " + pr.getFromRef().getDisplayId());
TriggerBuildFromPullRequest(pr, false);
} catch (final IOException | JSONException ex) {
TeamcityLogger.logMessage(settings.get(), "PullRequest Rescoped Event Failed: " + ex.getMessage() + " " + pr.getFromRef().getDisplayId());
TeamcityLogger.logMessage(settings.get(), repo.getName(), "PullRequest Rescoped Event Failed: " + ex.getMessage() + " " + pr.getFromRef().getDisplayId());
}
}

Expand All @@ -131,8 +131,8 @@ private void TriggerBuildFromPullRequest(final PullRequest pr, Boolean UpdatedRe
final Boolean areParticipants = !pr.getReviewers().isEmpty();
final TeamcityConfiguration conf
= new TeamcityConfiguration(
settings.get().getString("teamCityUrl"),
settings.get().getString("teamCityUserName"),
settings.get().getString(Field.TEAMCITY_URL),
settings.get().getString(Field.TEAMCITY_USERNAME),
password);

final String branch = pr.getFromRef().getId();
Expand All @@ -146,17 +146,17 @@ private void TriggerBuildFromPullRequest(final PullRequest pr, Boolean UpdatedRe
final ArrayList<String> changes = ChangesetService.GetChangedFiles(pr, pullRequestService);
final Trigger[] configurations = Trigger.GetBuildConfigurationsFromBranch(repositoryTriggersJson, branch);
for (final Trigger buildConfig : configurations) {
TeamcityLogger.logMessage(settings.get(), "Try Trigger: " + buildConfig.getBranchConfig() + " " + branch + " : " + buildConfig.getTarget());
TeamcityLogger.logMessage(settings.get(), repo.getName(), "Try Trigger: " + buildConfig.getBranchConfig() + " " + branch + " : " + buildConfig.getTarget());
if (buildConfig.isTriggerOnPullRequest()) {
if (UpdatedReviewers && buildConfig.isTriggerWhenNoReviewers()) {
TeamcityLogger.logMessage(settings.get(), "Skip For Update Reviewers: " + buildConfig.getBranchConfig() + " " + branch);
TeamcityLogger.logMessage(settings.get(), repo.getName(), "Skip For Update Reviewers: " + buildConfig.getBranchConfig() + " " + branch);
// we dont want to build when reviewers were updated and we allow to trigger when no reviwers are defined
continue;
}

if (!areParticipants && !buildConfig.isTriggerWhenNoReviewers()) {
// we dont want to build if there are no participants
TeamcityLogger.logMessage(settings.get(), "Skip: " + buildConfig.getBranchConfig() + " " + branch);
TeamcityLogger.logMessage(settings.get(), repo.getName(), "Skip: " + buildConfig.getBranchConfig() + " " + branch);
continue;
}

Expand All @@ -168,22 +168,23 @@ private void TriggerBuildFromPullRequest(final PullRequest pr, Boolean UpdatedRe
continue;
}

TeamcityLogger.logMessage(settings.get(), "Trigger BuildId: " + buildConfig.getTarget() + " " + branch);
TeamcityLogger.logMessage(settings.get(), repo.getName(), "Trigger BuildId: " + buildConfig.getTarget() + " " + branch);
try {
if (this.connector.IsInQueue(conf, buildConfig.getTarget(), buildConfig.getBranchConfig(), settings.get())) {
TeamcityLogger.logMessage(settings.get(), "Skip already in queue: " + buildConfig.getTarget()+ " " + branch);
if (this.connector.IsInQueue(conf, buildConfig.getTarget(), buildConfig.getBranchConfig(), settings.get(), repo.getName())) {
TeamcityLogger.logMessage(settings.get(), repo.getName(), "Skip already in queue: " + buildConfig.getTarget()+ " " + branch);
continue;
}
} catch (IOException | JSONException ex) {
TeamcityLogger.logMessage(settings.get(), "Exception: " + ex.getMessage() + " " + branch);
TeamcityLogger.logMessage(settings.get(), repo.getName(), "Exception: " + ex.getMessage() + " " + branch);
}

// check if build is running
final String buildData = this.connector.GetBuildsForBranch(
conf,
buildConfig.getBranchConfig(),
buildConfig.getTarget(),
settings.get());
settings.get(),
repo.getName());

final JSONObject obj = new JSONObject(buildData);
final String count = obj.getString("count");
Expand All @@ -195,15 +196,16 @@ private void TriggerBuildFromPullRequest(final PullRequest pr, Boolean UpdatedRe
buildConfig.getTarget(),
"Trigger from Bitbucket: Pull Request: " + pr.getId(),
false,
settings.get());
settings.get(),
repo.getName());
triggeredBuilds.add(buildConfig.getTarget());
} else {
final JSONArray builds = obj.getJSONArray("build");
for (int i = 0; i < builds.length(); i++) {
final Boolean isRunning = builds.getJSONObject(i).getString("state").equals("running");
if (isRunning) {
final String id = builds.getJSONObject(i).getString("id");
this.connector.ReQueueBuild(conf, id, settings.get(), false);
this.connector.ReQueueBuild(conf, id, settings.get(), false, repo.getName());
}
}

Expand All @@ -214,7 +216,8 @@ private void TriggerBuildFromPullRequest(final PullRequest pr, Boolean UpdatedRe
buildConfig.getTarget(),
"Trigger from Bitbucket: Pull Request: " + pr.getId(),
false,
settings.get());
settings.get(),
repo.getName());
}
}
}
Expand Down

0 comments on commit a2eb179

Please sign in to comment.