From f922056110af3837630738c1560c5d66c47820af Mon Sep 17 00:00:00 2001 From: Janos Gyerik Date: Thu, 14 Mar 2019 15:28:05 +0100 Subject: [PATCH] SONAR-11631 Persist sonar.buildString in database --- .../component/ProjectAttributes.java | 10 +++- .../step/BuildComponentTreeStep.java | 3 +- .../step/PersistAnalysisStep.java | 2 + .../component/ComponentImplTest.java | 5 +- .../component/ComponentTreeBuilderTest.java | 7 ++- .../component/ReportComponent.java | 18 +++--- .../step/BuildComponentTreeStepTest.java | 20 +++++++ .../step/ReportPersistAnalysisStepTest.java | 7 ++- .../org/sonar/db/version/schema-h2.ddl | 1 + .../org/sonar/db/component/SnapshotDto.java | 11 ++++ .../org/sonar/db/component/SnapshotMapper.xml | 3 + .../shouldPurgeAnalysis-result.xml | 1 + .../shouldDeleteAbortedBuilds-result.xml | 1 + .../shouldDeleteAnalyses-result.xml | 1 + ...oricalDataOfDirectoriesAndFiles-result.xml | 1 + .../shouldPurgeProject-result.xml | 1 + .../version/v77/AddBuildStringToSnapshot.java | 50 ++++++++++++++++ .../db/migration/version/v77/DbVersion77.java | 2 +- .../v77/AddBuildStringToSnapshotTest.java | 57 +++++++++++++++++++ .../version/v77/DbVersion77Test.java | 2 +- .../snapshots.sql | 29 ++++++++++ 21 files changed, 216 insertions(+), 16 deletions(-) create mode 100644 server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v77/AddBuildStringToSnapshot.java create mode 100644 server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v77/AddBuildStringToSnapshotTest.java create mode 100644 server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v77/AddBuildStringToSnapshotTest/snapshots.sql diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/component/ProjectAttributes.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/component/ProjectAttributes.java index 5d6e0716028..0acceca3255 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/component/ProjectAttributes.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/component/ProjectAttributes.java @@ -27,15 +27,18 @@ import static java.util.Objects.requireNonNull; public class ProjectAttributes { private final String projectVersion; private final String codePeriodVersion; + private final String buildString; - public ProjectAttributes(@Nullable String projectVersion, String codePeriodVersion) { + public ProjectAttributes(@Nullable String projectVersion, String codePeriodVersion, String buildString) { this.projectVersion = projectVersion; this.codePeriodVersion = requireNonNull(codePeriodVersion, "codePeriod version can't be null"); + this.buildString = buildString; } public ProjectAttributes(ProjectAttributes projectAttributes) { this.projectVersion = projectAttributes.projectVersion; this.codePeriodVersion = projectAttributes.codePeriodVersion; + this.buildString = projectAttributes.buildString; } public Optional getProjectVersion() { @@ -46,11 +49,16 @@ public class ProjectAttributes { return codePeriodVersion; } + public Optional getBuildString() { + return Optional.ofNullable(buildString); + } + @Override public String toString() { return "ProjectAttributes{" + "projectVersion='" + projectVersion + '\'' + "codePeriodVersion='" + codePeriodVersion + '\'' + + "buildString='" + buildString + '\'' + '}'; } } diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/BuildComponentTreeStep.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/BuildComponentTreeStep.java index 1fd3bcaa91e..1bd1d95f9ee 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/BuildComponentTreeStep.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/BuildComponentTreeStep.java @@ -113,7 +113,8 @@ public class BuildComponentTreeStep implements ComputationStep { private static ProjectAttributes createProjectAttributes(ScannerReport.Metadata metadata, @Nullable SnapshotDto baseAnalysis) { String projectVersion = trimToNull(metadata.getProjectVersion()); String codePeriodVersion = computeCodePeriodVersion(metadata.getCodePeriodVersion(), projectVersion, baseAnalysis); - return new ProjectAttributes(projectVersion, codePeriodVersion); + String buildString = trimToNull(metadata.getBuildString()); + return new ProjectAttributes(projectVersion, codePeriodVersion, buildString); } private static String computeCodePeriodVersion(String rawCodePeriodVersion, @Nullable String projectVersion, @Nullable SnapshotDto baseAnalysis) { diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistAnalysisStep.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistAnalysisStep.java index d8cfa4c067d..c693268c341 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistAnalysisStep.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistAnalysisStep.java @@ -104,10 +104,12 @@ public class PersistAnalysisStep implements ComputationStep { String componentUuid = component.getUuid(); String codePeriodVersion = component.getType() == PROJECT ? component.getProjectAttributes().getCodePeriodVersion() : null; String projectVersion = component.getType() == PROJECT ? component.getProjectAttributes().getProjectVersion().orElse(null) : null; + String buildString = component.getType() == PROJECT ? component.getProjectAttributes().getBuildString().orElse(null) : null; return new SnapshotDto() .setUuid(snapshotUuid) .setCodePeriodVersion(codePeriodVersion) .setProjectVersion(projectVersion) + .setBuildString(buildString) .setComponentUuid(componentUuid) .setLast(false) .setStatus(SnapshotDto.STATUS_UNPROCESSED) diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ComponentImplTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ComponentImplTest.java index cc59ac0afdb..ce49e193645 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ComponentImplTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ComponentImplTest.java @@ -21,12 +21,14 @@ package org.sonar.ce.task.projectanalysis.component; import java.util.Arrays; import java.util.Collections; +import org.apache.commons.lang.RandomStringUtils; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.sonar.ce.task.projectanalysis.component.Component.Status; import static com.google.common.base.Strings.repeat; +import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; import static org.sonar.ce.task.projectanalysis.component.Component.Type.FILE; @@ -246,7 +248,8 @@ public class ComponentImplTest { .setUuid("uuid_" + dbKey) .setReportAttributes(ReportAttributes.newBuilder(dbKey.hashCode()).build()); if (type == PROJECT) { - builder.setProjectAttributes(new ProjectAttributes(null, "version_1")); + String buildString = randomAlphabetic(15); + builder.setProjectAttributes(new ProjectAttributes(null, "version_1", buildString)); } return builder; } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ComponentTreeBuilderTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ComponentTreeBuilderTest.java index 2788ecd315a..cd49f887369 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ComponentTreeBuilderTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ComponentTreeBuilderTest.java @@ -28,6 +28,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.Random; import java.util.function.Function; import javax.annotation.Nullable; @@ -70,7 +71,7 @@ public class ComponentTreeBuilderTest { // both no project as "" or null should be supported private static final ProjectAttributes SOME_PROJECT_ATTRIBUTES = new ProjectAttributes( new Random().nextBoolean() ? null : randomAlphabetic(12), - randomAlphabetic(20)); + randomAlphabetic(20), randomAlphabetic(21)); @Rule public ExpectedException expectedException = ExpectedException.none(); @@ -131,13 +132,14 @@ public class ComponentTreeBuilderTest { public void by_default_project_fields_are_loaded_from_report(@Nullable String projectVersion) { String nameInReport = "the name"; String descriptionInReport = "the desc"; + String buildString = randomAlphabetic(21); Component root = call(newBuilder() .setType(PROJECT) .setKey(projectInDb.getKey()) .setRef(42) .setName(nameInReport) .setDescription(descriptionInReport) - .build(), NO_SCM_BASE_PATH, new ProjectAttributes(projectVersion, "6.5")); + .build(), NO_SCM_BASE_PATH, new ProjectAttributes(projectVersion, "6.5", buildString)); assertThat(root.getUuid()).isEqualTo("generated_K1_uuid"); assertThat(root.getDbKey()).isEqualTo("generated_K1"); @@ -153,6 +155,7 @@ public class ComponentTreeBuilderTest { assertThat(root.getProjectAttributes().getProjectVersion()).contains(projectVersion); } assertThat(root.getProjectAttributes().getCodePeriodVersion()).isEqualTo("6.5"); + assertThat(root.getProjectAttributes().getBuildString()).isEqualTo(Optional.of(buildString)); assertThatFileAttributesAreNotSet(root); } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ReportComponent.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ReportComponent.java index 2a48e802cf7..da34e9235d8 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ReportComponent.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ReportComponent.java @@ -70,7 +70,7 @@ public class ReportComponent implements Component { this.description = builder.description; this.uuid = builder.uuid; this.projectAttributes = Optional.ofNullable(builder.codePeriodVersion) - .map(t -> new ProjectAttributes(builder.projectVersion, t)) + .map(t -> new ProjectAttributes(builder.projectVersion, t, builder.buildString)) .orElse(null); this.reportAttributes = ReportAttributes.newBuilder(builder.ref) .build(); @@ -207,6 +207,7 @@ public class ReportComponent implements Component { private String shortName; private String codePeriodVersion; private String projectVersion; + private String buildString; private String description; private FileAttributes fileAttributes; private final List children = new ArrayList<>(); @@ -251,7 +252,7 @@ public class ReportComponent implements Component { } public Builder setCodePeriodVersion(String s) { - checkCodePeriodVersion(s); + checkArgument(type != Type.PROJECT ^ s != null, "CodePeriod version must and can only be set on Project"); this.codePeriodVersion = s; return this; } @@ -261,6 +262,11 @@ public class ReportComponent implements Component { return this; } + public Builder setBuildString(@Nullable String buildString) { + this.buildString = buildString; + return this; + } + public Builder setFileAttributes(FileAttributes fileAttributes) { checkState(type == Type.FILE, "Only Component of type File can have File attributes"); this.fileAttributes = fileAttributes; @@ -281,13 +287,9 @@ public class ReportComponent implements Component { } public ReportComponent build() { - checkCodePeriodVersion(this.codePeriodVersion); + checkArgument(type != Type.PROJECT ^ this.codePeriodVersion != null, "CodePeriod version must and can only be set on Project"); + checkArgument(type == Type.PROJECT || this.buildString == null, "BuildString can only be set on Project"); return new ReportComponent(this); } - - private void checkCodePeriodVersion(@Nullable String s) { - checkArgument(type != Type.PROJECT ^ s != null, "CodePeriod version must and can only be set on Project"); - } } - } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/BuildComponentTreeStepTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/BuildComponentTreeStepTest.java index 29d71d67d1f..1fa66c1a285 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/BuildComponentTreeStepTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/BuildComponentTreeStepTest.java @@ -24,6 +24,7 @@ import com.tngtech.java.junit.dataprovider.DataProviderRunner; import com.tngtech.java.junit.dataprovider.UseDataProvider; import java.util.HashMap; import java.util.Map; +import java.util.Optional; import javax.annotation.Nullable; import org.junit.Rule; import org.junit.Test; @@ -469,6 +470,20 @@ public class BuildComponentTreeStepTest { assertThat(treeRootHolder.getReportTreeRoot().getProjectAttributes().getProjectVersion()).contains(projectVersion); } + @Test + @UseDataProvider("oneParameterNullNonNullCombinations") + public void set_buildString(@Nullable String buildString) { + String projectVersion = randomAlphabetic(7); + String codePeriodVersion = randomAlphabetic(8); + setAnalysisMetadataHolder(); + reportReader.setMetadata(createReportMetadata(projectVersion, codePeriodVersion, buildString)); + reportReader.putComponent(component(ROOT_REF, PROJECT, REPORT_PROJECT_KEY)); + + underTest.execute(new TestComputationStepContext()); + + assertThat(treeRootHolder.getReportTreeRoot().getProjectAttributes().getBuildString()).isEqualTo(Optional.ofNullable(buildString)); + } + @DataProvider public static Object[][] oneParameterNullNonNullCombinations() { return new Object[][] { @@ -608,11 +623,16 @@ public class BuildComponentTreeStepTest { } public static ScannerReport.Metadata createReportMetadata(@Nullable String projectVersion, @Nullable String scannerCodePeriodVersion) { + return createReportMetadata(projectVersion, scannerCodePeriodVersion, null); + } + + public static ScannerReport.Metadata createReportMetadata(@Nullable String projectVersion, @Nullable String scannerCodePeriodVersion, @Nullable String buildString) { ScannerReport.Metadata.Builder builder = ScannerReport.Metadata.newBuilder() .setProjectKey(REPORT_PROJECT_KEY) .setRootComponentRef(ROOT_REF); ofNullable(scannerCodePeriodVersion).ifPresent(builder::setCodePeriodVersion); ofNullable(projectVersion).ifPresent(builder::setProjectVersion); + ofNullable(buildString).ifPresent(builder::setBuildString); return builder.build(); } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ReportPersistAnalysisStepTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ReportPersistAnalysisStepTest.java index 23f7f75716a..22e6835fc61 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ReportPersistAnalysisStepTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ReportPersistAnalysisStepTest.java @@ -23,6 +23,8 @@ import com.tngtech.java.junit.dataprovider.DataProvider; import com.tngtech.java.junit.dataprovider.DataProviderRunner; import com.tngtech.java.junit.dataprovider.UseDataProvider; import java.util.List; +import java.util.Optional; +import javax.annotation.Nullable; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -100,7 +102,7 @@ public class ReportPersistAnalysisStepTest extends BaseStepTest { @Test @UseDataProvider("projectVersionOrNull") - public void persist_analysis(String projectVersion) { + public void persist_analysis(@Nullable String projectVersion) { OrganizationDto organizationDto = dbTester.organizations().insert(); ComponentDto projectDto = ComponentTesting.newPrivateProjectDto(organizationDto, "ABCD").setDbKey(PROJECT_KEY).setName("Project"); dbClient.componentDao().insert(dbTester.getSession(), projectDto); @@ -114,11 +116,13 @@ public class ReportPersistAnalysisStepTest extends BaseStepTest { Component file = ReportComponent.builder(Component.Type.FILE, 3).setUuid("DEFG").setKey("MODULE_KEY:src/main/java/dir/Foo.java").build(); Component directory = ReportComponent.builder(Component.Type.DIRECTORY, 2).setUuid("CDEF").setKey("MODULE_KEY:src/main/java/dir").addChildren(file).build(); + String buildString = Optional.ofNullable(projectVersion).map(v -> randomAlphabetic(7)).orElse(null); Component project = ReportComponent.builder(Component.Type.PROJECT, 1) .setUuid("ABCD") .setKey(PROJECT_KEY) .setCodePeriodVersion("1.0") .setProjectVersion(projectVersion) + .setBuildString(buildString) .addChildren(directory) .build(); treeRootHolder.setRoot(project); @@ -136,6 +140,7 @@ public class ReportPersistAnalysisStepTest extends BaseStepTest { assertThat(projectSnapshot.getComponentUuid()).isEqualTo(project.getUuid()); assertThat(projectSnapshot.getCodePeriodVersion()).isEqualTo("1.0"); assertThat(projectSnapshot.getProjectVersion()).isEqualTo(projectVersion); + assertThat(projectSnapshot.getBuildString()).isEqualTo(buildString); assertThat(projectSnapshot.getLast()).isFalse(); assertThat(projectSnapshot.getStatus()).isEqualTo("U"); assertThat(projectSnapshot.getCreatedAt()).isEqualTo(analysisDate); diff --git a/server/sonar-db-core/src/main/resources/org/sonar/db/version/schema-h2.ddl b/server/sonar-db-core/src/main/resources/org/sonar/db/version/schema-h2.ddl index 34decebab6b..80c4b377e4d 100644 --- a/server/sonar-db-core/src/main/resources/org/sonar/db/version/schema-h2.ddl +++ b/server/sonar-db-core/src/main/resources/org/sonar/db/version/schema-h2.ddl @@ -143,6 +143,7 @@ CREATE TABLE "SNAPSHOTS" ( "ISLAST" BOOLEAN NOT NULL DEFAULT FALSE, "VERSION" VARCHAR(500), "PROJECT_VERSION" VARCHAR(100), + "BUILD_STRING" VARCHAR(100), "PERIOD1_MODE" VARCHAR(100), "PERIOD1_PARAM" VARCHAR(100), "PERIOD1_DATE" BIGINT, diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/component/SnapshotDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/component/SnapshotDto.java index d96035e0bdf..d6c8766fc2e 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/component/SnapshotDto.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/component/SnapshotDto.java @@ -43,6 +43,7 @@ public final class SnapshotDto { private Boolean last; private String codePeriodVersion; private String projectVersion; + private String buildString; private String periodMode; private String periodParam; private Long periodDate; @@ -147,6 +148,16 @@ public final class SnapshotDto { this.projectVersion = projectVersion; } + @CheckForNull + public String getBuildString() { + return buildString; + } + + public SnapshotDto setBuildString(@Nullable String buildString) { + this.buildString = buildString; + return this; + } + public SnapshotDto setPeriodMode(@Nullable String p) { periodMode = p; return this; diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/component/SnapshotMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/component/SnapshotMapper.xml index 9d2e6043c79..15fd8261549 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/component/SnapshotMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/component/SnapshotMapper.xml @@ -12,6 +12,7 @@ s.islast as last, s.version as rawCodePeriodVersion, s.project_version as rawProjectVersion, + s.build_string as buildString, s.period1_mode as periodMode, s.period1_param as periodParam, s.period1_date as periodDate @@ -166,6 +167,7 @@ islast, version, project_version, + build_string, period1_mode, period1_param, period1_date @@ -179,6 +181,7 @@ #{last, jdbcType=BOOLEAN}, #{codePeriodVersion, jdbcType=VARCHAR}, #{projectVersion, jdbcType=VARCHAR}, + #{buildString, jdbcType=VARCHAR}, #{periodMode, jdbcType=VARCHAR}, #{periodParam, jdbcType=VARCHAR}, #{periodDate, jdbcType=BIGINT} diff --git a/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeCommandsTest/shouldPurgeAnalysis-result.xml b/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeCommandsTest/shouldPurgeAnalysis-result.xml index e7651e44899..e9e512f02d2 100644 --- a/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeCommandsTest/shouldPurgeAnalysis-result.xml +++ b/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeCommandsTest/shouldPurgeAnalysis-result.xml @@ -33,6 +33,7 @@ Note that measures, events and reviews are not deleted. build_date="1228222680000" version="[null]" project_version="[null]" + build_string="[null]" /> diff --git a/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/shouldDeleteAnalyses-result.xml b/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/shouldDeleteAnalyses-result.xml index bc8a1e2382e..16a0bab013e 100644 --- a/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/shouldDeleteAnalyses-result.xml +++ b/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/shouldDeleteAnalyses-result.xml @@ -26,6 +26,7 @@ build_date="1228222680000" version="[null]" project_version="[null]" + build_string="[null]" /> diff --git a/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/shouldDeleteHistoricalDataOfDirectoriesAndFiles-result.xml b/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/shouldDeleteHistoricalDataOfDirectoriesAndFiles-result.xml index 259be92616c..39fe34d21c7 100644 --- a/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/shouldDeleteHistoricalDataOfDirectoriesAndFiles-result.xml +++ b/server/sonar-db-dao/src/test/resources/org/sonar/db/purge/PurgeDaoTest/shouldDeleteHistoricalDataOfDirectoriesAndFiles-result.xml @@ -186,6 +186,7 @@ build_date="1228222680000" version="[null]" project_version="[null]" + build_string="[null]" /> diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v77/AddBuildStringToSnapshot.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v77/AddBuildStringToSnapshot.java new file mode 100644 index 00000000000..2390465ea14 --- /dev/null +++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v77/AddBuildStringToSnapshot.java @@ -0,0 +1,50 @@ +/* + * SonarQube + * Copyright (C) 2009-2019 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.server.platform.db.migration.version.v77; + +import java.sql.SQLException; +import org.sonar.db.Database; +import org.sonar.server.platform.db.migration.SupportsBlueGreen; +import org.sonar.server.platform.db.migration.def.VarcharColumnDef; +import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder; +import org.sonar.server.platform.db.migration.step.DdlChange; + +import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder; + +@SupportsBlueGreen +public class AddBuildStringToSnapshot extends DdlChange { + private static final String TABLE_NAME = "snapshots"; + private static final VarcharColumnDef COLUMN = newVarcharColumnDefBuilder() + .setColumnName("build_string") + .setIsNullable(true) + .setLimit(100) + .build(); + + public AddBuildStringToSnapshot(Database db) { + super(db); + } + + @Override + public void execute(Context context) throws SQLException { + context.execute(new AddColumnsBuilder(getDialect(), TABLE_NAME) + .addColumn(COLUMN) + .build()); + } +} diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v77/DbVersion77.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v77/DbVersion77.java index e4d052bb8d1..c12afef8e3b 100644 --- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v77/DbVersion77.java +++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v77/DbVersion77.java @@ -38,7 +38,7 @@ public class DbVersion77 implements DbVersion { .add(2608, "Delete favorites on not supported components", DeleteFavouritesOnNotSupportedComponentQualifiers.class) .add(2609, "Delete exceeding favorites when there are more than 100 for a user", DeleteFavoritesExceedingOneHundred.class) .add(2610, "Truncate ES_QUEUE table content", TruncateEsQueue.class) - + .add(2611, "Add SNAPSHOTS.BUILD_STRING", AddBuildStringToSnapshot.class) ; } } diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v77/AddBuildStringToSnapshotTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v77/AddBuildStringToSnapshotTest.java new file mode 100644 index 00000000000..a9fda0f1ca6 --- /dev/null +++ b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v77/AddBuildStringToSnapshotTest.java @@ -0,0 +1,57 @@ +/* + * SonarQube + * Copyright (C) 2009-2019 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.server.platform.db.migration.version.v77; + +import java.sql.SQLException; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.sonar.db.CoreDbTester; + +import static java.sql.Types.VARCHAR; + +public class AddBuildStringToSnapshotTest { + + private static final String TABLE = "snapshots"; + + @Rule + public ExpectedException expectedException = ExpectedException.none(); + @Rule + public final CoreDbTester db = CoreDbTester.createForSchema(AddBuildStringToSnapshotTest.class, "snapshots.sql"); + + private AddBuildStringToSnapshot underTest = new AddBuildStringToSnapshot(db.database()); + + @Test + public void creates_table_on_empty_db() throws SQLException { + underTest.execute(); + + db.assertColumnDefinition(TABLE, "project_version", VARCHAR, 100, true); + } + + @Test + public void migration_is_not_reentrant() throws SQLException { + underTest.execute(); + + expectedException.expect(IllegalStateException.class); + + underTest.execute(); + } + +} diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v77/DbVersion77Test.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v77/DbVersion77Test.java index 001eef0e521..802d22d59a3 100644 --- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v77/DbVersion77Test.java +++ b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v77/DbVersion77Test.java @@ -36,7 +36,7 @@ public class DbVersion77Test { @Test public void verify_migration_count() { - verifyMigrationCount(underTest, 11); + verifyMigrationCount(underTest, 12); } } diff --git a/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v77/AddBuildStringToSnapshotTest/snapshots.sql b/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v77/AddBuildStringToSnapshotTest/snapshots.sql new file mode 100644 index 00000000000..30a335b114e --- /dev/null +++ b/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v77/AddBuildStringToSnapshotTest/snapshots.sql @@ -0,0 +1,29 @@ +CREATE TABLE "SNAPSHOTS" ( + "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1), + "UUID" VARCHAR(50) NOT NULL, + "CREATED_AT" BIGINT, + "BUILD_DATE" BIGINT, + "COMPONENT_UUID" VARCHAR(50) NOT NULL, + "STATUS" VARCHAR(4) NOT NULL DEFAULT 'U', + "PURGE_STATUS" INTEGER, + "ISLAST" BOOLEAN NOT NULL DEFAULT FALSE, + "VERSION" VARCHAR(500), + "PROJECT_VERSION" VARCHAR(100), + "PERIOD1_MODE" VARCHAR(100), + "PERIOD1_PARAM" VARCHAR(100), + "PERIOD1_DATE" BIGINT, + "PERIOD2_MODE" VARCHAR(100), + "PERIOD2_PARAM" VARCHAR(100), + "PERIOD2_DATE" BIGINT, + "PERIOD3_MODE" VARCHAR(100), + "PERIOD3_PARAM" VARCHAR(100), + "PERIOD3_DATE" BIGINT, + "PERIOD4_MODE" VARCHAR(100), + "PERIOD4_PARAM" VARCHAR(100), + "PERIOD4_DATE" BIGINT, + "PERIOD5_MODE" VARCHAR(100), + "PERIOD5_PARAM" VARCHAR(100), + "PERIOD5_DATE" BIGINT +); +CREATE INDEX "SNAPSHOT_COMPONENT" ON "SNAPSHOTS" ("COMPONENT_UUID"); +CREATE UNIQUE INDEX "ANALYSES_UUID" ON "SNAPSHOTS" ("UUID"); -- 2.39.5