You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by dp...@apache.org on 2019/01/15 14:38:35 UTC
[ignite-teamcity-bot] branch ignite-10930 updated: IGNITE-10930:
PR-less contributions: tickets were added to the list
This is an automated email from the ASF dual-hosted git repository.
dpavlov pushed a commit to branch ignite-10930
in repository https://gitbox.apache.org/repos/asf/ignite-teamcity-bot.git
The following commit(s) were added to refs/heads/ignite-10930 by this push:
new 8f4d3e1 IGNITE-10930: PR-less contributions: tickets were added to the list
8f4d3e1 is described below
commit 8f4d3e198955041a506065057baba9204840e118
Author: Dmitriy Pavlov <dp...@apache.org>
AuthorDate: Tue Jan 15 17:38:32 2019 +0300
IGNITE-10930: PR-less contributions: tickets were added to the list
---
conf/apache.auth.properties | 29 ++++++--
.../java/org/apache/ignite/ci/HelperConfig.java | 3 +
.../ignite/ci/IAnalyticsEnabledTeamcity.java | 1 +
.../apache/ignite/ci/IgnitePersistentTeamcity.java | 5 ++
.../apache/ignite/ci/IgniteTeamcityConnection.java | 11 ++-
.../org/apache/ignite/ci/github/PullRequest.java | 2 +-
.../java/org/apache/ignite/ci/jira/Ticket.java | 2 +-
.../ignite/ci/jira/ignited/IJiraIgnited.java | 8 ++-
.../apache/ignite/ci/jira/ignited/JiraIgnited.java | 5 +-
.../tcbot/visa/TcBotTriggerAndSignOffService.java | 80 +++++++++++++++-------
.../ci/teamcity/ignited/ITeamcityIgnited.java | 2 +
.../ci/teamcity/ignited/TeamcityIgnitedImpl.java | 5 ++
.../ci/teamcity/ignited/buildref/BuildRefDao.java | 2 +-
.../ignite/ci/teamcity/pure/ITeamcityConn.java | 5 ++
ignite-tc-helper-web/src/main/webapp/js/prs-1.1.js | 6 +-
15 files changed, 127 insertions(+), 39 deletions(-)
diff --git a/conf/apache.auth.properties b/conf/apache.auth.properties
index dcc4f07..eb56fbb 100644
--- a/conf/apache.auth.properties
+++ b/conf/apache.auth.properties
@@ -1,15 +1,32 @@
+## Teamcity Integration Parameters
+# Teamcity Host, HTTPs is highly recommended because of Basic Auth used.
host=https://ci.ignite.apache.org/
-
+
+# TC bot downloaded logs path
logs=apache_logs
+## GitHub integration parameters.
+# REST API Url for GitHub. Includes owner (apache) and project (ignite)
git.api_url=https://api.github.com/repos/apache/ignite/
+
+# Specify GitHub Auth token (if needed), go to User->Settings->Developers options->create new.
+# Created token needs to be encrypted using org.apache.ignite.ci.conf.PasswordEncoder
+github.auth_token=
+
+## Branch identification rules
+# PR-less contribution branch name mandatory prefix
+git.branch_prefix=ignite-
+
+## JIRA integration parameters.
jira.api_url=https://issues.apache.org/jira/rest/api/2/
+# JIRA Url, HTTPs is highly recommended because of Basic Auth used.
jira.url=https://issues.apache.org/jira/
-jira.ticket_template=IGNITE-
-#specify JIRA Auth token (if needed)
-jira.auth_token=
+# Ticket template: project code and dash.
+jira.ticket_template=IGNITE-
-#specify GitHub Auth token (if needed)
-github.auth_token=
\ No newline at end of file
+# Specify JIRA Auth token (if needed).
+# Base-64 pre-encoded username and password, which will be included into Basic Auth requests.
+# Encoded token needs to be encrypted using org.apache.ignite.ci.conf.PasswordEncoder
+jira.auth_token=
\ No newline at end of file
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/HelperConfig.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/HelperConfig.java
index fe38350..a0cd102 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/HelperConfig.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/HelperConfig.java
@@ -51,6 +51,9 @@ public class HelperConfig {
/** GitHub authorization token property name. */
public static final String GITHUB_AUTH_TOKEN = "github.auth_token";
+ /** Git branch naming prefix for PRLess contributions. */
+ public static final String GIT_BRANCH_PREFIX = "git.branch_prefix";
+
/** JIRA authorization token property name. */
public static final String JIRA_AUTH_TOKEN = "jira.auth_token";
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IAnalyticsEnabledTeamcity.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IAnalyticsEnabledTeamcity.java
index 2499adc..00e524b 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IAnalyticsEnabledTeamcity.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IAnalyticsEnabledTeamcity.java
@@ -20,6 +20,7 @@ package org.apache.ignite.ci;
/**
* Combination of REST data and persisted statistics.
*/
+@Deprecated
public interface IAnalyticsEnabledTeamcity extends ITeamcity, ITcAnalytics {
public void init(ITeamcity conn);
}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgnitePersistentTeamcity.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgnitePersistentTeamcity.java
index bdf0309..bfa6376 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgnitePersistentTeamcity.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgnitePersistentTeamcity.java
@@ -512,6 +512,11 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
return teamcity.getProjects();
}
+ /** {@inheritDoc} */
+ @Override public String gitBranchPrefix() {
+ return teamcity.gitBranchPrefix();
+ }
+
@Override public Statistics getStatistics(int buildId) {
return teamcity.getStatistics(buildId);
}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityConnection.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityConnection.java
index 6ce1986..6a75fc8 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityConnection.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityConnection.java
@@ -110,6 +110,10 @@ public class IgniteTeamcityConnection implements ITeamcity {
/** Build logger processing running. */
private ConcurrentHashMap<Integer, CompletableFuture<LogCheckTask>> buildLogProcessingRunning = new ConcurrentHashMap<>();
+ /** Git branch prefix for seach TC runs in PR-less contributions. */
+ @NotNull
+ private String gitBranchPrefix;
+
public Executor getExecutor() {
return executor;
}
@@ -135,7 +139,7 @@ public class IgniteTeamcityConnection implements ITeamcity {
logger.error("Failed to set credentials", e);
}
-
+ this.gitBranchPrefix = props.getProperty(HelperConfig.GIT_BRANCH_PREFIX, "ignite-");
final File logsDirFile = HelperConfig.resolveLogs(workDir, props);
@@ -332,6 +336,11 @@ public class IgniteTeamcityConnection implements ITeamcity {
}
/** {@inheritDoc} */
+ @Override public String gitBranchPrefix() {
+ return gitBranchPrefix;
+ }
+
+ /** {@inheritDoc} */
@Override public List<BuildType> getBuildTypes(String projectId) {
return sendGetXmlParseJaxb(host + "app/rest/latest/projects/" + projectId, Project.class)
.getBuildTypesNonNull();
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/PullRequest.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/PullRequest.java
index 1763274..e434417 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/PullRequest.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/PullRequest.java
@@ -61,7 +61,7 @@ public class PullRequest implements IVersionedEntity {
* @return Pull Request time update.
*/
public String getTimeUpdate() {
- return updatedAt;
+ return updatedAt;
}
/**
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/Ticket.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/Ticket.java
index e74727c..dc8806f 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/Ticket.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/Ticket.java
@@ -35,7 +35,7 @@ public class Ticket {
/**
* @param ticketPrefix Ticket name fixed prefix.
- * @return Ignite id (like 123 in IGNITE-123).
+ * @return Ignite ticket Number ignoring project code (like 123 in IGNITE-123).
*/
public int igniteId(String ticketPrefix) {
return Integer.valueOf(key.substring(ticketPrefix.length()));
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/IJiraIgnited.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/IJiraIgnited.java
index 420c9bc..be1011a 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/IJiraIgnited.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/IJiraIgnited.java
@@ -25,8 +25,14 @@ import org.jetbrains.annotations.NotNull;
*
*/
public interface IJiraIgnited {
+ /**
+ *
+ */
@NotNull public String ticketPrefix();
+ /**
+ *
+ */
@NotNull public String projectName();
@@ -45,7 +51,7 @@ public interface IJiraIgnited {
* @param id Ticket full ID (e.g IGNITE-8331)
* @return URL which is used as link to Jira ticket with specified name.
*/
- String generateTicketUrl(String id);
+ public String generateTicketUrl(String id);
/**
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraIgnited.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraIgnited.java
index 334292a..1ffe5ec 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraIgnited.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jira/ignited/JiraIgnited.java
@@ -43,6 +43,9 @@ class JiraIgnited implements IJiraIgnited {
/** Server id mask high. */
private int srvIdMaskHigh;
+ /**
+ * @param jira Pure Jira integration.
+ */
public void init(IJiraIntegration jira) {
this.jira = jira;
@@ -70,8 +73,6 @@ class JiraIgnited implements IJiraIgnited {
return jiraTicketDao.getTickets(srvIdMaskHigh, ticketPrefix());
}
-
-
/** {@inheritDoc} */
@Override public String generateCommentUrl(String ticketFullName, int commentId) {
return jira.generateCommentUrl(ticketFullName, commentId);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java
index e4bd777..738f605 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java
@@ -26,6 +26,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
+import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Objects;
@@ -316,7 +317,7 @@ public class TcBotTriggerAndSignOffService {
if (ticketFullName.isEmpty()) {
return "JIRA ticket will not be notified after the tests are completed - " +
- "PR title \"" + pr.getTitle() + "\" should starts with \"" + prefix + "-NNNNN\"." +
+ "PR title \"" + pr.getTitle() + "\" should starts with \"" + prefix + "NNNNN\"." +
" Please, rename PR according to the" +
" <a href='https://cwiki.apache.org/confluence/display/IGNITE/How+to+Contribute" +
"#HowtoContribute-1.CreateGitHubpull-request'>contributing guide</a>.";
@@ -416,16 +417,6 @@ public class TcBotTriggerAndSignOffService {
if (requests == null)
return null;
- ITeamcityIgnited tcIgn = tcIgnitedProv.server(srvId, credsProv);
-
- Set<Ticket> tickets = jiraIntegration.getTickets();
-
- List<Ticket> paTickets = tickets.stream().filter(Ticket::isActiveContribution).collect(Collectors.toList());
-
- System.out.println("srvId=" + srvId + " tickets " + paTickets);
-
-
- //todo JIRA ignited
List<ContributionToCheck> contribsList = requests.stream().map(pr -> {
ContributionToCheck check = new ContributionToCheck();
@@ -439,6 +430,10 @@ public class TcBotTriggerAndSignOffService {
check.prAuthor = user.login();
check.prAuthorAvatarUrl = user.avatarUrl();
}
+ else {
+ check.prAuthor = "";
+ check.prAuthorAvatarUrl = "";
+ }
String prefix = jiraIntegration.ticketPrefix();
check.jiraIssueId = Strings.emptyToNull(getTicketFullName(pr, prefix));
@@ -450,6 +445,37 @@ public class TcBotTriggerAndSignOffService {
}).collect(Collectors.toList());
+ Set<Ticket> tickets = jiraIntegration.getTickets();
+
+ List<Ticket> paTickets = tickets.stream().filter(Ticket::isActiveContribution).collect(Collectors.toList());
+
+ ITeamcityIgnited tcIgn = tcIgnitedProv.server(srvId, credsProv);
+
+ paTickets.forEach(ticket -> {
+ int ticketId = ticket.igniteId(jiraIntegration.ticketPrefix());
+ String branch = tcIgn.gitBranchPrefix() + ticketId;
+
+ String defBtForMaster = findDefaultBranchBuildType(srvId);
+
+ if(tcIgn.getAllBuildsCompacted(defBtForMaster, branch).isEmpty())
+ return; //Skipping contributions without builds
+
+ ContributionToCheck contribution = new ContributionToCheck();
+
+ contribution.jiraIssueId = ticket.key;
+ contribution.jiraIssueUrl = jiraIntegration.generateTicketUrl( ticket.key);
+ contribution.tcBranchName = branch;
+
+ contribution.prNumber = -ticketId;
+ contribution.prTitle = ""; //todo ticket title
+ contribution.prHtmlUrl = "";
+ contribution.prTimeUpdate = ""; //todo ticket updateTime
+
+ contribution.prAuthor = "";
+ contribution.prAuthorAvatarUrl = "";
+
+ contribsList.add(contribution);
+ });
return contribsList;
}
@@ -505,17 +531,11 @@ public class TcBotTriggerAndSignOffService {
IGitHubConnIgnited ghConn = gitHubConnIgnitedProvider.server(srvId);
- StringBuilder buildTypeId = new StringBuilder();
+ String defBtForMaster = findDefaultBranchBuildType(srvId);
- HelperConfig.getTrackedBranches().get(DEFAULT_TRACKED_BRANCH_NAME)
- .ifPresent(
- b -> b.getChainsStream()
- .filter(c -> Objects.equals(srvId, c.serverId))
- .filter(c -> c.branchForRest.equals(ITeamcity.DEFAULT))
- .findFirst()
- .ifPresent(ch -> buildTypeId.append(ch.suiteId)));
-
- BuildTypeCompacted buildType = buildTypeId.length() > 0 ? teamcity.getBuildType(buildTypeId.toString()) : null;
+ BuildTypeCompacted buildType = Strings.isNullOrEmpty(defBtForMaster)
+ ? null
+ : teamcity.getBuildType(defBtForMaster);
List<String> compositeBuildTypeIds;
String projectId;
@@ -532,8 +552,8 @@ public class TcBotTriggerAndSignOffService {
compositeBuildTypeIds = new ArrayList<>();
- if (buildTypeId.length() > 0)
- compositeBuildTypeIds.add(buildTypeId.toString());
+ if (!Strings.isNullOrEmpty(defBtForMaster))
+ compositeBuildTypeIds.add(defBtForMaster);
}
@@ -547,6 +567,20 @@ public class TcBotTriggerAndSignOffService {
return statuses;
}
+ @NotNull public String findDefaultBranchBuildType(String srvId) {
+ StringBuilder buildTypeId = new StringBuilder();
+
+ HelperConfig.getTrackedBranches().get(DEFAULT_TRACKED_BRANCH_NAME)
+ .ifPresent(
+ b -> b.getChainsStream()
+ .filter(c -> Objects.equals(srvId, c.serverId))
+ .filter(c -> c.branchForRest.equals(ITeamcity.DEFAULT))
+ .findFirst()
+ .ifPresent(ch -> buildTypeId.append(ch.suiteId)));
+
+ return buildTypeId.toString();
+ }
+
/**
* @param srvId Server id.
* @param suiteId Suite id.
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnited.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnited.java
index 16f44e0..28b6ca4 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnited.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnited.java
@@ -179,4 +179,6 @@ public interface ITeamcityIgnited {
@Nullable public IRunStat getSuiteRunStatAllBranches(String suiteBuildTypeId);
List<String> getAllProjectsIds();
+
+ String gitBranchPrefix();
}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java
index 676a1a6..3938c27 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java
@@ -402,6 +402,11 @@ public class TeamcityIgnitedImpl implements ITeamcityIgnited {
}
/** {@inheritDoc} */
+ @Override public String gitBranchPrefix() {
+ return conn.gitBranchPrefix();
+ }
+
+ /** {@inheritDoc} */
@Override public List<String> getCompositeBuildTypesIdsSortedByBuildNumberCounter(String projectId) {
return buildTypeSync.getCompositeBuildTypesIdsSortedByBuildNumberCounter(srvIdMaskHigh, projectId, conn);
}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefDao.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefDao.java
index 0d33822..e254e9a 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefDao.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefDao.java
@@ -153,7 +153,7 @@ public class BuildRefDao {
return getBuildsForBranch(srvId, bracnhNameQry).stream()
.filter(e -> e.buildTypeId() == buildTypeIdId)
- .collect(Collectors.toList());
+ .collect(Collectors.toList());
}
/**
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITeamcityConn.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITeamcityConn.java
index 4a1bfeb..4c69296 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITeamcityConn.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITeamcityConn.java
@@ -109,4 +109,9 @@ public interface ITeamcityConn {
* @return List of all project available at Teamcity server.
*/
List<Project> getProjects();
+
+ /**
+ * @return Branch name mandatory prefix for all PR-less contributions, e.g. "ignite-".
+ */
+ public String gitBranchPrefix();
}
diff --git a/ignite-tc-helper-web/src/main/webapp/js/prs-1.1.js b/ignite-tc-helper-web/src/main/webapp/js/prs-1.1.js
index e96428c..3675175 100644
--- a/ignite-tc-helper-web/src/main/webapp/js/prs-1.1.js
+++ b/ignite-tc-helper-web/src/main/webapp/js/prs-1.1.js
@@ -81,7 +81,7 @@ function showContributionsTable(result, srvId, suiteId) {
"data": "prTimeUpdate",
title: "Update Time",
"render": function (data, type, row, meta) {
- if (type === 'display') {
+ if (type === 'display' && isDefinedAndFilled(data) && data.length >0) {
let date = new Date(data);
data = normalizeDateNum(date.getFullYear()) + '-' + normalizeDateNum(date.getMonth() + 1) +
@@ -96,7 +96,7 @@ function showContributionsTable(result, srvId, suiteId) {
"data": "prHtmlUrl",
title: "PR Number",
"render": function (data, type, row, meta) {
- if (type === 'display') {
+ if (type === 'display' && row.prNumber>0) {
data = "<a href='" + data + "'>#" + row.prNumber + "</a>";
}
@@ -111,7 +111,7 @@ function showContributionsTable(result, srvId, suiteId) {
"data": "prAuthor",
title: "Author",
"render": function (data, type, row, meta) {
- if (type === 'display') {
+ if (type === 'display' && isDefinedAndFilled(row.prAuthorAvatarUrl) && row.prAuthorAvatarUrl.length >0) {
data = "<img src='" + row.prAuthorAvatarUrl + "' width='20px' height='20px'> " + data + "";
}