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/05/06 17:29:51 UTC

[ignite-teamcity-bot] 02/02: IGNITE-10095: Support Build Parameters saving for Fat Build

This is an automated email from the ASF dual-hosted git repository.

dpavlov pushed a commit to branch ignite-10095
in repository https://gitbox.apache.org/repos/asf/ignite-teamcity-bot.git

commit 56c7d1b8d39331413114070acd61754f7ff8aed5
Author: Dmitriy Pavlov <dp...@apache.org>
AuthorDate: Mon May 6 20:29:25 2019 +0300

    IGNITE-10095: Support Build Parameters saving for Fat Build
---
 .../main/java/org/apache/ignite/ci/ITeamcity.java  | 30 +++----
 .../apache/ignite/ci/IgniteTeamcityConnection.java |  2 +-
 .../org/apache/ignite/ci/tcmodel/Properties.java   | 18 ++---
 .../ignite/ci/tcmodel/conf/bt/Parameters.java      | 21 +++--
 .../apache/ignite/ci/tcmodel/conf/bt/Property.java | 32 +++++---
 .../org/apache/ignite/ci/tcmodel/result/Build.java | 21 ++++-
 .../ci/teamcity/ignited/TeamcityIgnitedImpl.java   |  4 +-
 .../ignited/buildtype/ParametersCompacted.java     |  2 +-
 .../ignited/fatbuild/FatBuildCompacted.java        | 28 +++++--
 .../ignited/fatbuild/PropertiesCompacted.java      | 92 ++++++++++++++++++++++
 .../ignited/fatbuild/StatisticsCompacted.java      | 10 ++-
 .../ignited/IgnitedTcInMemoryIntegrationTest.java  | 10 +++
 12 files changed, 219 insertions(+), 51 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 c9be5dc..c145e1f 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
@@ -17,34 +17,36 @@
 
 package org.apache.ignite.ci;
 
+import java.io.File;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
 import org.apache.ignite.ci.analysis.LogCheckResult;
 import org.apache.ignite.ci.analysis.SingleBuildRunCtx;
-import org.apache.ignite.ci.tcmodel.agent.Agent;
-import org.apache.ignite.ci.tcmodel.conf.BuildType;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
-import org.apache.ignite.ci.tcmodel.result.Build;
 import org.apache.ignite.ci.tcmodel.user.User;
 import org.apache.ignite.ci.teamcity.pure.ITeamcityConn;
 import org.apache.ignite.ci.util.Base64Util;
-import org.apache.ignite.ci.util.FutureUtil;
-import org.jetbrains.annotations.NotNull;
-
-import javax.annotation.Nullable;
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.Executor;
-import java.util.concurrent.ExecutorService;
 
 /**
  * API for calling methods from REST service:
  * https://confluence.jetbrains.com/display/TCD10/REST+API
  */
 public interface ITeamcity extends ITeamcityConn {
+    /** Default. */
     public String DEFAULT = "<default>";
+
+    /** Branch synonym: Refs heads master. */
     public String REFS_HEADS_MASTER = "refs/heads/master";
 
+    /** Branch synonym: Master. */
+    public String MASTER = "master";
+
+    /** Some fake property to avoid merging build in queue: Tcbot trigger time. */
+    public String TCBOT_TRIGGER_TIME = "tcbot.triggerTime";
+
+    /** Default list of properties to be skipped in saving in FAT builds. */
+    public String[] AVOID_SAVE_PROPERTIES = new String[] {TCBOT_TRIGGER_TIME, "build.query.loginTs"};
+
     CompletableFuture<File> unzipFirstFile(CompletableFuture<File> fut);
 
     CompletableFuture<File> downloadBuildLogZip(int id);
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 766e30d..d42029d 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
@@ -233,7 +233,7 @@ public class IgniteTeamcityConnection implements ITeamcity {
         if (buildParms != null)
             props.putAll(buildParms);
 
-        props.put("tcbot.triggerTime", System.currentTimeMillis()); // some fake property to avoid merging build in queue
+        props.put(TCBOT_TRIGGER_TIME, System.currentTimeMillis()); //
 
         StringBuilder sb = new StringBuilder();
         sb.append("<build branchName=\"").append(xmlEscapeText(branchName)).append("\">\n");
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/Properties.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/Properties.java
index f03a7ed..192ec42 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/Properties.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/Properties.java
@@ -80,9 +80,9 @@ public class Properties {
      *
      */
     public List<Property> getProperty() {
-        if (property == null) {
-            property = new ArrayList<Property>();
-        }
+        if (property == null)
+            property = new ArrayList<>();
+
         return this.property;
     }
 
@@ -101,13 +101,13 @@ public class Properties {
     /**
      * Sets the value of the count property.
      *
-     * @param value
+     * @param val
      *     allowed object is
      *     {@link Integer }
      *
      */
-    public void setCount(Integer value) {
-        this.count = value;
+    public void setCount(Integer val) {
+        this.count = val;
     }
 
     /**
@@ -125,12 +125,12 @@ public class Properties {
     /**
      * Sets the value of the href property.
      *
-     * @param value
+     * @param val
      *     allowed object is
      *     {@link String }
      *
      */
-    public void setHref(String value) {
-        this.href = value;
+    public void setHref(String val) {
+        this.href = val;
     }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/bt/Parameters.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/bt/Parameters.java
index de93c4b..9f92e33 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/bt/Parameters.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/bt/Parameters.java
@@ -19,8 +19,6 @@ package org.apache.ignite.ci.tcmodel.conf.bt;
 
 import com.google.common.base.MoreObjects;
 import java.util.ArrayList;
-import org.jetbrains.annotations.Nullable;
-
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
@@ -28,6 +26,7 @@ import java.util.Optional;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * Collection of parameters in build
@@ -40,21 +39,24 @@ public class Parameters {
     public Parameters() {
     }
 
-    public Parameters(List<Property> properties) {
-        this.properties = properties == null ? null : new ArrayList<>(properties);
+    public Parameters(List<Property> props) {
+        this.properties = props == null ? null : new ArrayList<>(props);
     }
 
+    /**
+     * @param key Key of parameter.
+     */
     @Nullable public String getParameter(String key) {
         if (properties == null)
             return null;
 
         final Optional<Property> any = properties.stream().filter(property ->
             Objects.equals(property.name, key)).findAny();
-        return any.map(Property::getValue).orElse(null);
+        return any.map(Property::value).orElse(null);
     }
 
     public List<Property> properties() {
-        if (this.properties==null)
+        if (this.properties == null)
             return Collections.emptyList();
 
         return Collections.unmodifiableList(this.properties);
@@ -91,4 +93,11 @@ public class Parameters {
             .add("properties", properties)
             .toString();
     }
+
+    /**
+     * @return {@code true} if this list contains no elements
+     */
+    public boolean isEmpty() {
+        return properties == null || properties.isEmpty();
+    }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/bt/Property.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/bt/Property.java
index af4b2c7..3f87d0a 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/bt/Property.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/bt/Property.java
@@ -29,30 +29,40 @@ import org.jetbrains.annotations.Nullable;
  */
 @XmlAccessorType(XmlAccessType.FIELD)
 public class Property {
+    /** Parameter Name/Key. */
     @XmlAttribute String name;
+
+    /** Parameter Value. */
     @XmlAttribute String value;
+
+    /** Flag indicating that value is inherited from a template. */
     @XmlAttribute Boolean inherited;
 
     public Property() {
     }
 
-    public Property(String name, String value) {
+    public Property(String name, String val) {
         this.name = name;
-        this.value = value;
+        this.value = val;
         this.inherited = null;
     }
 
-    public Property(String name, String value, Boolean inherited) {
+    public Property(String name, String val, Boolean inherited) {
         this.name = name;
-        this.value = value;
+        this.value = val;
         this.inherited = inherited;
     }
 
-    @Nullable
-    public String getValue() {
+    /**
+     * @return {@link #value}
+     */
+    @Nullable public String value() {
         return value;
     }
 
+    /**
+     * @return {@link #name}
+     */
     public String name() {
         return name;
     }
@@ -65,16 +75,16 @@ public class Property {
         if (!(o instanceof Property))
             return false;
 
-        Property property = (Property)o;
+        Property prop = (Property)o;
 
-        return Objects.equals(name, property.name) &&
-            Objects.equals(getValue(), property.getValue()) &&
-            Objects.equals(inherited, property.inherited);
+        return Objects.equals(name, prop.name) &&
+            Objects.equals(value(), prop.value()) &&
+            Objects.equals(inherited, prop.inherited);
     }
 
     /** {@inheritDoc} */
     @Override public int hashCode() {
-        return Objects.hash(name, getValue(), inherited);
+        return Objects.hash(name, value(), inherited);
     }
 
     /** {@inheritDoc} */
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Build.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Build.java
index 9af0c1b..aa4235a 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Build.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Build.java
@@ -31,6 +31,7 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import org.apache.ignite.ci.tcmodel.changes.ChangesListRef;
 import org.apache.ignite.ci.tcmodel.conf.BuildType;
+import org.apache.ignite.ci.tcmodel.conf.bt.Parameters;
 import org.apache.ignite.ci.tcmodel.hist.BuildRef;
 import org.apache.ignite.ci.tcmodel.vcs.Revision;
 import org.apache.ignite.ci.tcmodel.vcs.Revisions;
@@ -65,7 +66,7 @@ public class Build extends BuildRef {
 
     @XmlElement(name = "statistics") public StatisticsRef statisticsRef;
 
-    /** Changes included into build.*/
+    /** Changes included into build. */
     @XmlElement(name = "changes") public ChangesListRef changesRef;
 
     /** Information about build triggering. */
@@ -73,6 +74,9 @@ public class Build extends BuildRef {
 
     @XmlElement(name = "revisions") private Revisions revisions;
 
+    /** Build parameters. */
+    @Nullable @XmlElement(name = "properties") private Parameters properties;
+
     @NotNull public static Build createFakeStub() {
         return new Build();
     }
@@ -187,4 +191,19 @@ public class Build extends BuildRef {
         this.revisions = new Revisions();
         this.revisions.revisions(revisions);
     }
+
+    /**
+     * @param s Parameter key.
+     */
+    @Nullable public String parameter(String s) {
+        return properties == null ? null : properties.getParameter(s);
+    }
+
+    @Nullable public Parameters parameters() {
+        return properties;
+    }
+
+    public void parameters(Parameters parameters) {
+        this.properties = parameters;
+    }
 }
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 9a4c0aa..3577d14 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
@@ -78,7 +78,6 @@ import static org.apache.ignite.ci.tcmodel.hist.BuildRef.STATUS_UNKNOWN;
  *
  */
 public class TeamcityIgnitedImpl implements ITeamcityIgnited {
-
     /** Default project id. */
     public static final String DEFAULT_PROJECT_ID = "IgniteTests24Java8";
 
@@ -88,9 +87,10 @@ public class TeamcityIgnitedImpl implements ITeamcityIgnited {
     /** Max build id diff to enforce reload during incremental refresh. */
     public static final int MAX_ID_DIFF_TO_ENFORCE_CONTINUE_SCAN = 3000;
 
+    /** Default synonyms. */
     private static final List<String> DEFAULT_SYNONYMS
             = Collections.unmodifiableList(
-                    Lists.newArrayList(ITeamcity.DEFAULT, ITeamcity.REFS_HEADS_MASTER, "master"));
+                    Lists.newArrayList(ITeamcity.DEFAULT, ITeamcity.REFS_HEADS_MASTER, ITeamcity.MASTER));
 
     /** Server (service) code. */
     private String srvCode;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/ParametersCompacted.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/ParametersCompacted.java
index ebac6b9..dd7180f 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/ParametersCompacted.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/ParametersCompacted.java
@@ -50,7 +50,7 @@ public class ParametersCompacted {
             if (Strings.isNullOrEmpty(name))
                 continue;
 
-            String strVal = next.getValue();
+            String strVal = next.value();
             if (Strings.isNullOrEmpty(strVal))
                 continue;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java
index 8ec87d5..b7ed85f 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java
@@ -30,6 +30,8 @@ import java.util.stream.Stream;
 import org.apache.ignite.ci.analysis.IVersionedEntity;
 import org.apache.ignite.ci.db.Persisted;
 import org.apache.ignite.ci.tcmodel.conf.BuildType;
+import org.apache.ignite.ci.tcmodel.conf.bt.Parameters;
+import org.apache.ignite.ci.tcmodel.conf.bt.Property;
 import org.apache.ignite.ci.tcmodel.hist.BuildRef;
 import org.apache.ignite.ci.tcmodel.result.Build;
 import org.apache.ignite.ci.tcmodel.result.TestOccurrencesRef;
@@ -116,6 +118,8 @@ public class FatBuildCompacted extends BuildRefCompacted implements IVersionedEn
 
     @Nullable private RevisionCompacted revisions[];
 
+    @Nullable private PropertiesCompacted parameters;
+
     /** {@inheritDoc} */
     @Override public int version() {
         return _ver;
@@ -200,13 +204,18 @@ public class FatBuildCompacted extends BuildRefCompacted implements IVersionedEn
         }
 
         Revisions revisions = build.getRevisions();
-        if(revisions!=null) {
+        if (revisions != null) {
             this.revisions = revisions.revisions()
                 .stream()
                 .filter(b -> b.version() != null)
                 .map(revision -> new RevisionCompacted(compactor, revision))
                 .toArray(RevisionCompacted[]::new);
         }
+
+        Parameters parameters = build.parameters();
+
+        if (parameters != null && !parameters.isEmpty())
+            this.parameters = new PropertiesCompacted(compactor, parameters);
     }
 
     public FatBuildCompacted setFakeStub(boolean val) {
@@ -240,7 +249,7 @@ public class FatBuildCompacted extends BuildRefCompacted implements IVersionedEn
 
     /**
      * @param compactor Compactor.
-     * @param res Response.
+     * @param res Resulting build.
      */
     private void fillBuildFields(IStringCompactor compactor, Build res) {
         if (startDate > 0)
@@ -322,6 +331,14 @@ public class FatBuildCompacted extends BuildRefCompacted implements IVersionedEn
                         .vcsRootId(vcsRootId));
             }).collect(Collectors.toList()));
         }
+
+        if (parameters != null) {
+            List<Property> props = new ArrayList<>();
+
+            parameters.forEach(compactor, (k, v) -> props.add(new Property(k, v)));
+
+            res.parameters(new Parameters(props));
+        }
     }
 
     /**
@@ -417,12 +434,13 @@ public class FatBuildCompacted extends BuildRefCompacted implements IVersionedEn
             Objects.equals(statistics, that.statistics) &&
             Arrays.equals(changesIds, that.changesIds) &&
             Objects.equals(triggered, that.triggered) &&
-            Arrays.equals(revisions, that.revisions);
+            Arrays.equals(revisions, that.revisions) &&
+            Objects.equals(parameters, that.parameters);
     }
 
     /** {@inheritDoc} */
     @Override public int hashCode() {
-        int res = Objects.hash(super.hashCode(), _ver, startDate, finishDate, queuedDate, projectId, name, tests, flags, problems, statistics, triggered);
+        int res = Objects.hash(super.hashCode(), _ver, startDate, finishDate, queuedDate, projectId, name, tests, flags, problems, statistics, triggered, parameters);
         res = 31 * res + Arrays.hashCode(snapshotDeps);
         res = 31 * res + Arrays.hashCode(changesIds);
         res = 31 * res + Arrays.hashCode(revisions);
@@ -441,7 +459,7 @@ public class FatBuildCompacted extends BuildRefCompacted implements IVersionedEn
     /**
      *
      */
-    public boolean isFakeStub() {
+    @Override public boolean isFakeStub() {
         if (getId() == null)
             return true;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/PropertiesCompacted.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/PropertiesCompacted.java
new file mode 100644
index 0000000..070e3dd
--- /dev/null
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/PropertiesCompacted.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.ci.teamcity.ignited.fatbuild;
+
+import com.google.common.base.Strings;
+import java.util.List;
+import java.util.function.BiConsumer;
+import org.apache.ignite.ci.db.Persisted;
+import org.apache.ignite.ci.tcmodel.conf.bt.Parameters;
+import org.apache.ignite.ci.tcmodel.conf.bt.Property;
+import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.internal.util.GridIntList;
+
+/**
+ * Properties (Build parameters) compacted value for storing in TC Bot DB
+ */
+@Persisted
+public class PropertiesCompacted {
+    /** Property Keys (Names), int value is coming from the compatcor. */
+    private GridIntList keys;
+
+    /** Property Values, int value is coming from the compatcor. */
+    private GridIntList values;
+
+    public PropertiesCompacted() {
+    }
+
+    public PropertiesCompacted(IStringCompactor compactor, Parameters parameters) {
+        List<Property> props = parameters.properties();
+        int size = props.size();
+        keys = new GridIntList(size);
+        values = new GridIntList(size);
+
+        for (Property next : props) {
+            String name = next.name();
+            if (Strings.isNullOrEmpty(name))
+                continue;
+
+            String valStr = next.value();
+
+            keys.add(compactor.getStringId(name));
+            values.add(compactor.getStringId(valStr));
+        }
+    }
+
+    private long findPropertyValue(int propCode) {
+        if (keys == null)
+            return -1L;
+
+        int size = keys.size();
+
+        for (int i = 0; i < size; i++) {
+            int nameid = keys.get(i);
+
+            if (nameid == propCode)
+                return i < values.size() ? values.get(i) : -1;
+        }
+
+        return -1L;
+    }
+
+    public void forEach(IStringCompactor compactor, BiConsumer<String, String> consumer) {
+        int size = keys.size();
+
+        for (int i = 0; i < size; i++) {
+            int nameid = keys.get(i);
+
+            if (i >= values.size())
+                break;
+
+            int valId = values.get(i);
+
+            consumer.accept(compactor.getStringFromId(nameid), compactor.getStringFromId(valId));
+        }
+
+    }
+}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/StatisticsCompacted.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/StatisticsCompacted.java
index 02254a0..1d66c5b 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/StatisticsCompacted.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/StatisticsCompacted.java
@@ -19,6 +19,7 @@ package org.apache.ignite.ci.teamcity.ignited.fatbuild;
 
 import com.google.common.base.Strings;
 import java.util.List;
+import org.apache.ignite.ci.db.Persisted;
 import org.apache.ignite.ci.tcmodel.conf.bt.Property;
 import org.apache.ignite.ci.tcmodel.result.stat.Statistics;
 import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
@@ -27,11 +28,18 @@ import org.apache.ignite.internal.util.GridLongList;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+/**
+ * Statistics values to be saved in compacted form.
+ */
+@Persisted
 public class StatisticsCompacted {
     /** Logger. */
     private static final Logger logger = LoggerFactory.getLogger(StatisticsCompacted.class);
 
+    /** Statistics Keys (Names), int value is coming from the compatcor. */
     private GridIntList keys;
+
+    /** Statistics Parsed Values as long. */
     private GridLongList values;
 
     public StatisticsCompacted() {
@@ -48,7 +56,7 @@ public class StatisticsCompacted {
             if (Strings.isNullOrEmpty(name))
                 continue;
 
-            final String valStr = next.getValue();
+            final String valStr = next.value();
             if (Strings.isNullOrEmpty(valStr))
                 continue;
 
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java
index 04964fd..3a2faa9 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java
@@ -477,6 +477,9 @@ public class IgnitedTcInMemoryIntegrationTest {
         assertEquals(refBuild.getStartDate(), actBuild.getStartDate());
         assertEquals(refBuild.getFinishDate(), actBuild.getFinishDate());
 
+        assertParameter(refBuild, actBuild, "env.JAVA_HOME");
+        assertParameter(refBuild, actBuild, "reverse.dep.*.env.JAVA_HOME");
+
         final Triggered refTrig = refBuild.getTriggered();
         final Triggered actTrig = actBuild.getTriggered();
         assertNotNull(refTrig);
@@ -532,6 +535,13 @@ public class IgnitedTcInMemoryIntegrationTest {
         assertEquals(refRev0.vcsBranchName(), actRev0.vcsBranchName());
         assertEquals(refRev0.vcsRootInstance().id(), actRev0.vcsRootInstance().id());
         assertEquals(refRev0.vcsRootInstance().vcsRootId(), actRev0.vcsRootInstance().vcsRootId());
+
+
+    }
+
+    public void assertParameter(Build refBuild, Build actBuild, String parmKey) {
+        assertNotNull(refBuild.parameter(parmKey));
+        assertEquals(refBuild.parameter(parmKey), actBuild.parameter(parmKey));
     }
 
     private void saveTmpFile(Object obj, String name) throws IOException, JAXBException {