This is an automated email from the ASF dual-hosted git repository. dpavlov pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/ignite-teamcity-bot.git
The following commit(s) were added to refs/heads/master by this push: new 1604b22 Incremental build upload from TC implemented - Fixes #15. 1604b22 is described below commit 1604b221bcb984add815421d88e930ee217d7d08 Author: Dmitriy Pavlov <dpav...@apache.org> AuthorDate: Thu Sep 20 16:08:08 2018 +0300 Incremental build upload from TC implemented - Fixes #15. Signed-off-by: Dmitriy Pavlov <dpav...@apache.org> --- .../main/java/org/apache/ignite/ci/ITeamcity.java | 16 ++-- .../apache/ignite/ci/IgnitePersistentTeamcity.java | 94 ++++++++++++++-------- .../org/apache/ignite/ci/IgniteTeamcityHelper.java | 52 ++++++------ .../org/apache/ignite/ci/issue/IssueDetector.java | 2 +- .../runners/IgniteTeamcityHelperRunnerExample.java | 4 +- 5 files changed, 97 insertions(+), 71 deletions(-) diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITeamcity.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITeamcity.java index 4e9f9d6..ccc3fea 100644 --- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITeamcity.java +++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITeamcity.java @@ -66,16 +66,17 @@ public interface ITeamcity extends AutoCloseable { * @return list of builds in historical order, recent builds coming last */ default List<BuildRef> getFinishedBuilds(String projectId, String branch) { - return getFinishedBuilds(projectId, branch, null); + return getFinishedBuilds(projectId, branch, null, null); }; /** * @param projectId suite ID (string without spaces) * @param branch * @param cnt builds count + * @param sinceBuildNumber * @return list of builds in historical order, recent builds coming last */ - List<BuildRef> getFinishedBuilds(String projectId, String branch, Long cnt); + List<BuildRef> getFinishedBuilds(String projectId, String branch, Long cnt, Integer sinceBuildNumber); /** * Includes snapshot dependencies failed builds into list @@ -85,7 +86,7 @@ public interface ITeamcity extends AutoCloseable { * @return list of builds in historical order, recent builds coming last */ default List<BuildRef> getFinishedBuildsIncludeSnDepFailed(String projectId, String branch){ - return getFinishedBuildsIncludeSnDepFailed(projectId, branch, null); + return getFinishedBuildsIncludeSnDepFailed(projectId, branch, null, null); }; /** @@ -94,9 +95,10 @@ public interface ITeamcity extends AutoCloseable { * @param projectId suite ID (string without spaces) * @param branch branch in TC identification * @param cnt builds count + * @param sinceBuildNumber limit builds export with some build number, not operational for Persistent connection * @return list of builds in historical order, recent builds coming last */ - List<BuildRef> getFinishedBuildsIncludeSnDepFailed(String projectId, String branch, Long cnt); + List<BuildRef> getFinishedBuildsIncludeSnDepFailed(String projectId, String branch, Long cnt, Integer sinceBuildNumber); /** */ CompletableFuture<List<BuildRef>> getRunningBuilds(@Nullable String branch); @@ -104,12 +106,8 @@ public interface ITeamcity extends AutoCloseable { /** */ CompletableFuture<List<BuildRef>> getQueuedBuilds(@Nullable String branch); - default int[] getBuildNumbersFromHistory(String projectId, String branchNameForHist) { - return getBuildNumbersFromHistory(projectId, branchNameForHist, null); - } - default int[] getBuildNumbersFromHistory(String projectId, String branchNameForHist, Long cnt) { - return getFinishedBuilds(projectId, branchNameForHist, cnt).stream().mapToInt(BuildRef::getId).toArray(); + return getFinishedBuilds(projectId, branchNameForHist, cnt, null).stream().mapToInt(BuildRef::getId).toArray(); } Build getBuild(String href); 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 d3b038d..4d49121 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 @@ -33,6 +33,7 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; +import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -71,37 +72,43 @@ import org.apache.ignite.ci.util.CacheUpdateUtil; import org.apache.ignite.ci.util.CollectionUtil; import org.apache.ignite.ci.util.ObjectInterner; import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.xml.sax.SAXParseException; import static org.apache.ignite.ci.BuildChainProcessor.normalizeBranch; /** - * + * Apache Ignite based cache over teamcity responses */ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITeamcity, ITcAnalytics { - //V1 caches, 1024 parts - - //V2 caches, 32 parts - public static final String TESTS_OCCURRENCES = "testOccurrences"; - public static final String TESTS_RUN_STAT = "testsRunStat"; - public static final String CALCULATED_STATISTIC = "calculatedStatistic"; - public static final String LOG_CHECK_RESULT = "logCheckResult"; - public static final String CHANGE_INFO_FULL = "changeInfoFull"; - public static final String CHANGES_LIST = "changesList"; - public static final String ISSUES_USAGES_LIST = "issuesUsagesList"; - public static final String TEST_FULL = "testFull"; - public static final String BUILD_PROBLEMS = "buildProblems"; - public static final String BUILD_STATISTICS = "buildStatistics"; - public static final String BUILD_HIST_FINISHED = "buildHistFinished"; - public static final String BUILD_HIST_FINISHED_OR_FAILED = "buildHistFinishedOrFailed"; + /** Logger. */ + private static final Logger logger = LoggerFactory.getLogger(IgnitePersistentTeamcity.class); + + //V2 caches, 32 parts (V1 caches were 1024 parts) + private static final String TESTS_OCCURRENCES = "testOccurrences"; + private static final String TESTS_RUN_STAT = "testsRunStat"; + private static final String CALCULATED_STATISTIC = "calculatedStatistic"; + private static final String LOG_CHECK_RESULT = "logCheckResult"; + private static final String CHANGE_INFO_FULL = "changeInfoFull"; + private static final String CHANGES_LIST = "changesList"; + private static final String ISSUES_USAGES_LIST = "issuesUsagesList"; + private static final String TEST_FULL = "testFull"; + private static final String BUILD_PROBLEMS = "buildProblems"; + private static final String BUILD_STATISTICS = "buildStatistics"; + private static final String BUILD_HIST_FINISHED = "buildHistFinished"; + private static final String BUILD_HIST_FINISHED_OR_FAILED = "buildHistFinishedOrFailed"; public static final String BOT_DETECTED_ISSUES = "botDetectedIssues"; //todo need separate cache or separate key for 'execution time' because it is placed in statistics - public static final String BUILDS_FAILURE_RUN_STAT = "buildsFailureRunStat"; + private static final String BUILDS_FAILURE_RUN_STAT = "buildsFailureRunStat"; public static final String BUILDS = "builds"; - public static final String BUILD_QUEUE = "buildQueue"; - public static final String RUNNING_BUILDS = "runningBuilds"; + private static final String BUILD_QUEUE = "buildQueue"; + private static final String RUNNING_BUILDS = "runningBuilds"; + + /** Number of builds to re-query from TC to be sure some builds in the middle are not lost. */ + private static final int MAX_BUILDS_IN_PAST_TO_RELOAD = 5; @Inject private Ignite ignite; @@ -135,7 +142,6 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea //for DI public IgnitePersistentTeamcity() {} - private IgnitePersistentTeamcity(Ignite ignite, IgniteTeamcityHelper teamcity) { init(teamcity); this.ignite = ignite; @@ -267,12 +273,12 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea return loaded; } - protected <K> List<BuildRef> loadBuildHistory(IgniteCache<K, Expirable<List<BuildRef>>> cache, - int seconds, - Long cnt, - K key, - Function<K, List<BuildRef>> realLoad) { - @Nullable Expirable<List<BuildRef>> persistedBuilds = readBuildHistEntry( cache, (K) key); + protected <K> List<BuildRef> loadBuildHistory(IgniteCache<K, Expirable<List<BuildRef>>> cache, + int seconds, + Long cnt, + K key, + BiFunction<K, Integer, List<BuildRef>> realLoad) { + @Nullable Expirable<List<BuildRef>> persistedBuilds = readBuildHistEntry(cache, (K) key); if (persistedBuilds != null && (persistedBuilds.isAgeLessThanSecs(seconds) @@ -297,9 +303,24 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea //todo sinceBuild:(number:) // --todo -10 build numbers + Integer sinceBuildNum = null; + if (persistedBuilds != null) { + List<BuildRef> prevData = persistedBuilds.getData(); + if (prevData.size() >= MAX_BUILDS_IN_PAST_TO_RELOAD) { + BuildRef buildRef = prevData.get(prevData.size() - MAX_BUILDS_IN_PAST_TO_RELOAD); + + if (!Strings.isNullOrEmpty(buildRef.buildNumber)) { + try { + sinceBuildNum = Integer.valueOf(buildRef.buildNumber); + } catch (NumberFormatException e) { + logger.info("", e); + } + } + } + } List<BuildRef> dataFromRest; try { - dataFromRest = realLoad.apply(key); + dataFromRest = realLoad.apply(key, sinceBuildNum); } catch (Exception e) { if (Throwables.getRootCause(e) instanceof FileNotFoundException) { @@ -340,8 +361,8 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea @AutoProfiling @SuppressWarnings("WeakerAccess") - protected <K> Lock lockBuildHistEntry(IgniteCache<K, Expirable<List<BuildRef>>> cache, K key) { - if(noLocks) + protected <K> Lock lockBuildHistEntry(IgniteCache<K, Expirable<List<BuildRef>>> cache, K key) { + if (noLocks) return null; Lock lock = cache.lock(key); @@ -353,11 +374,15 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea /** {@inheritDoc} */ @AutoProfiling - @Override public List<BuildRef> getFinishedBuilds(String projectId, String branch, Long cnt) { + @Override public List<BuildRef> getFinishedBuilds(String projectId, + String branch, + Long cnt, + Integer ignored) { + //todo may be support sinceBuildNo final SuiteInBranch suiteInBranch = new SuiteInBranch(projectId, branch); List<BuildRef> buildRefs = loadBuildHistory(buildHistCache(), 60, cnt, suiteInBranch, - (key) -> teamcity.getFinishedBuilds(projectId, branch, cnt)); + (key, sinceBuildNumber) -> teamcity.getFinishedBuilds(projectId, branch, cnt, sinceBuildNumber)); if (cnt == null) return buildRefs; @@ -385,11 +410,14 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea /** {@inheritDoc} */ @AutoProfiling - @Override public List<BuildRef> getFinishedBuildsIncludeSnDepFailed(String projectId, String branch, Long cnt) { + @Override public List<BuildRef> getFinishedBuildsIncludeSnDepFailed(String projectId, + String branch, + Long cnt, + Integer ignored) { final SuiteInBranch suiteInBranch = new SuiteInBranch(projectId, branch); return loadBuildHistory(buildHistIncFailedCache(), 60, cnt, suiteInBranch, - (key) -> teamcity.getFinishedBuildsIncludeSnDepFailed(projectId, branch, cnt)); + (key, sinceBuildNumber) -> teamcity.getFinishedBuildsIncludeSnDepFailed(projectId, branch, cnt, sinceBuildNumber)); } diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityHelper.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityHelper.java index ba8a7d6..41da839 100644 --- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityHelper.java +++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityHelper.java @@ -462,36 +462,32 @@ public class IgniteTeamcityHelper implements ITeamcity { } } + @SuppressWarnings("WeakerAccess") @AutoProfiling - protected <T> T loadXml(Class<T> rootElem, InputStreamReader reader) throws JAXBException { + protected <T> T loadXml(Class<T> rootElem, InputStreamReader reader) throws JAXBException { return XmlUtil.load(rootElem, reader); } private List<BuildRef> getBuildHistory(@Nullable String buildTypeId, - @Nullable String branchName, - boolean dfltFilter, - @Nullable String state){ - - return getBuildHistory(buildTypeId, branchName, dfltFilter, state, null); - } - - private List<BuildRef> getBuildHistory(@Nullable String buildTypeId, - @Nullable String branchName, - boolean dfltFilter, - @Nullable String state, - @Nullable Long cnt) { - String btFilter = isNullOrEmpty(buildTypeId) ? "" : ",buildType:" + buildTypeId + ""; + @Nullable String branchName, + boolean dfltFilter, + @Nullable String state, + @Nullable Long cnt, + @Nullable Integer sinceBuildNumber) { + String btFilter = isNullOrEmpty(buildTypeId) ? "" : ",buildType:" + buildTypeId; String stateFilter = isNullOrEmpty(state) ? "" : (",state:" + state); - String branchFilter = isNullOrEmpty(branchName) ? "" :",branch:" + branchName; + String branchFilter = isNullOrEmpty(branchName) ? "" : ",branch:" + branchName; + String buildNoFilter = sinceBuildNumber == null ? "" : ",sinceBuild:(number:" + sinceBuildNumber + ")"; long cntFilter = cnt == null ? DEFAULT_BUILDS_COUNT : cnt; return sendGetXmlParseJaxb(host + "app/rest/latest/builds" - + "?locator=" - + "defaultFilter:" + dfltFilter - + btFilter - + stateFilter - + branchFilter - + ",count:" + cntFilter, Builds.class).getBuildsNonNull(); + + "?locator=" + + "defaultFilter:" + dfltFilter + + btFilter + + stateFilter + + branchFilter + + buildNoFilter + + ",count:" + cntFilter, Builds.class).getBuildsNonNull(); } @AutoProfiling @@ -566,18 +562,22 @@ public class IgniteTeamcityHelper implements ITeamcity { @Override public List<BuildRef> getFinishedBuilds(String projectId, String branch) { - return getFinishedBuilds(projectId, branch, null); + return getFinishedBuilds(projectId, branch, null, null); } /** {@inheritDoc} */ @Override @AutoProfiling public List<BuildRef> getFinishedBuilds(String projectId, - String branch, Long cnt) { + String branch, + Long cnt, + @Nullable Integer sinceBuildNumber) { List<BuildRef> finished = getBuildHistory(projectId, UrlUtil.escape(branch), true, - null, cnt); + null, + cnt, + sinceBuildNumber); return finished.stream().filter(BuildRef::isNotCancelled).collect(Collectors.toList()); } @@ -590,7 +590,7 @@ public class IgniteTeamcityHelper implements ITeamcity { /** {@inheritDoc} */ @Override - @AutoProfiling public List<BuildRef> getFinishedBuildsIncludeSnDepFailed(String projectId, String branch, Long cnt) { + @AutoProfiling public List<BuildRef> getFinishedBuildsIncludeSnDepFailed(String projectId, String branch, Long cnt, Integer sinceBuildNumber) { return getBuildsInState(projectId, branch, BuildRef.STATE_FINISHED, cnt); } @@ -614,7 +614,7 @@ public class IgniteTeamcityHelper implements ITeamcity { List<BuildRef> finished = getBuildHistory(projectId, UrlUtil.escape(branch), false, - state, cnt); + state, cnt, null); return finished.stream().filter(BuildRef::isNotCancelled).collect(Collectors.toList()); } diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/IssueDetector.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/IssueDetector.java index e6b3eb6..eb12138 100644 --- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/IssueDetector.java +++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/IssueDetector.java @@ -397,7 +397,7 @@ public class IssueDetector { 1, backgroundOpsTcHelper, backgroundOpsCreds, - executor); + executor); registerIssuesLater(failures, backgroundOpsTcHelper, backgroundOpsCreds); } diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/IgniteTeamcityHelperRunnerExample.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/IgniteTeamcityHelperRunnerExample.java index 92ff0c8..bdfc34a 100644 --- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/IgniteTeamcityHelperRunnerExample.java +++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/IgniteTeamcityHelperRunnerExample.java @@ -19,7 +19,6 @@ package org.apache.ignite.ci.runners; import com.google.common.base.Throwables; import java.io.File; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -30,6 +29,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.stream.Collectors; + import org.apache.ignite.ci.IgniteTeamcityHelper; import org.apache.ignite.ci.tcmodel.conf.BuildType; import org.apache.ignite.ci.tcmodel.conf.bt.BuildTypeFull; @@ -57,7 +57,7 @@ public class IgniteTeamcityHelperRunnerExample { if (bt.getName().toLowerCase().contains("pds") // || bt.getName().toLowerCase().contains("cache") ) { - int[] ints = helper.getBuildNumbersFromHistory(bt.getName(), branchNameForHist); + int[] ints = helper.getBuildNumbersFromHistory(bt.getName(), branchNameForHist, null); List<CompletableFuture<File>> fileFutList = helper.standardProcessLogs(ints); List<File> collect = getFuturesResults(fileFutList);