Browse Source

SONAR-20699 Send DevOps platform information for GitHub from the scanner.

tags/10.3.0.82913
Wojtek Wajerowicz 7 months ago
parent
commit
4670e9985e
20 changed files with 299 additions and 83 deletions
  1. 4
    4
      server/sonar-ce/src/it/java/org/sonar/ce/queue/NextPendingTaskPickerIT.java
  2. 5
    5
      server/sonar-ce/src/main/java/org/sonar/ce/queue/NextPendingTaskPicker.java
  3. 7
    7
      server/sonar-db-dao/src/it/java/org/sonar/db/ce/CeQueueDaoIT.java
  4. 8
    4
      server/sonar-db-dao/src/main/java/org/sonar/db/ce/CeTaskCharacteristicDto.java
  5. 5
    5
      server/sonar-webserver-core/src/main/java/org/sonar/server/issue/index/AsyncIssueIndexingImpl.java
  6. 5
    5
      server/sonar-webserver-core/src/test/java/org/sonar/server/issue/index/AsyncIssueIndexingImplTest.java
  7. 9
    9
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/ActivityActionIT.java
  8. 13
    13
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/ComponentActionIT.java
  9. 7
    7
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/TaskActionIT.java
  10. 8
    5
      server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/TaskFormatter.java
  11. 23
    2
      server/sonar-webserver-webapi/src/test/java/org/sonar/server/ce/ws/SubmitActionTest.java
  12. 32
    0
      sonar-core/src/main/java/org/sonar/core/ce/CeTaskCharacteristics.java
  13. 5
    0
      sonar-scanner-engine/src/main/java/org/sonar/scanner/ci/CiConfiguration.java
  14. 16
    4
      sonar-scanner-engine/src/main/java/org/sonar/scanner/ci/CiConfigurationImpl.java
  15. 5
    0
      sonar-scanner-engine/src/main/java/org/sonar/scanner/ci/CiConfigurationProvider.java
  16. 40
    0
      sonar-scanner-engine/src/main/java/org/sonar/scanner/ci/DevOpsPlatformInfo.java
  17. 17
    3
      sonar-scanner-engine/src/main/java/org/sonar/scanner/ci/vendors/GithubActions.java
  18. 22
    6
      sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ReportPublisher.java
  19. 26
    1
      sonar-scanner-engine/src/test/java/org/sonar/scanner/ci/vendors/GithubActionsTest.java
  20. 42
    3
      sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ReportPublisherTest.java

+ 4
- 4
server/sonar-ce/src/it/java/org/sonar/ce/queue/NextPendingTaskPickerIT.java View File

@@ -29,8 +29,8 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.config.Configuration;
import org.sonar.api.impl.utils.AlwaysIncreasingSystem2;
import org.sonar.api.utils.System2;
import org.sonar.api.testfixtures.log.LogTester;
import org.sonar.api.utils.System2;
import org.sonar.core.config.ComputeEngineProperties;
import org.sonar.db.DbTester;
import org.sonar.db.ce.CeQueueDto;
@@ -41,10 +41,10 @@ import org.sonar.db.component.ComponentDto;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.sonar.core.ce.CeTaskCharacteristics.BRANCH;
import static org.sonar.core.ce.CeTaskCharacteristics.PULL_REQUEST;
import static org.sonar.db.ce.CeQueueDto.Status.IN_PROGRESS;
import static org.sonar.db.ce.CeQueueDto.Status.PENDING;
import static org.sonar.db.ce.CeTaskCharacteristicDto.BRANCH_KEY;
import static org.sonar.db.ce.CeTaskCharacteristicDto.PULL_REQUEST;

public class NextPendingTaskPickerIT {

@@ -293,7 +293,7 @@ public class NextPendingTaskPickerIT {

private CeQueueDto insertPendingBranch(String uuid) {
CeQueueDto queue = insertPending(uuid, null);
insertCharacteristics(queue.getUuid(), BRANCH_KEY);
insertCharacteristics(queue.getUuid(), BRANCH);
return queue;
}


+ 5
- 5
server/sonar-ce/src/main/java/org/sonar/ce/queue/NextPendingTaskPicker.java View File

@@ -26,10 +26,10 @@ import java.util.Optional;
import java.util.Set;
import javax.annotation.Nullable;
import org.apache.commons.lang.ObjectUtils;
import org.sonar.api.ce.ComputeEngineSide;
import org.sonar.api.config.Configuration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonar.api.ce.ComputeEngineSide;
import org.sonar.api.config.Configuration;
import org.sonar.core.config.ComputeEngineProperties;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -38,8 +38,8 @@ import org.sonar.db.ce.CeQueueDto;
import org.sonar.db.ce.CeTaskDtoLight;
import org.sonar.db.ce.PrOrBranchTask;

import static org.sonar.db.ce.CeTaskCharacteristicDto.BRANCH_KEY;
import static org.sonar.db.ce.CeTaskCharacteristicDto.PULL_REQUEST;
import static org.sonar.core.ce.CeTaskCharacteristics.BRANCH;
import static org.sonar.core.ce.CeTaskCharacteristics.PULL_REQUEST;

@ComputeEngineSide
public class NextPendingTaskPicker {
@@ -100,7 +100,7 @@ public class NextPendingTaskPicker {

for (PrOrBranchTask task : queuedPrOrBranches) {
if ((Objects.equals(task.getBranchType(), PULL_REQUEST) && canRunPr(task, inProgressTasks))
|| (Objects.equals(task.getBranchType(), BRANCH_KEY) && canRunBranch(task, inProgressTasks))) {
|| (Objects.equals(task.getBranchType(), BRANCH) && canRunBranch(task, inProgressTasks))) {
return Optional.of(task);
}
}

+ 7
- 7
server/sonar-db-dao/src/it/java/org/sonar/db/ce/CeQueueDaoIT.java View File

@@ -46,12 +46,12 @@ import static org.assertj.core.api.Assertions.entry;
import static org.assertj.core.groups.Tuple.tuple;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.sonar.core.ce.CeTaskCharacteristics.BRANCH;
import static org.sonar.core.ce.CeTaskCharacteristics.PULL_REQUEST;
import static org.sonar.db.ce.CeQueueDto.Status.IN_PROGRESS;
import static org.sonar.db.ce.CeQueueDto.Status.PENDING;
import static org.sonar.db.ce.CeQueueTesting.newCeQueueDto;
import static org.sonar.db.ce.CeQueueTesting.reset;
import static org.sonar.db.ce.CeTaskCharacteristicDto.BRANCH_KEY;
import static org.sonar.db.ce.CeTaskCharacteristicDto.PULL_REQUEST;

public class CeQueueDaoIT {
private static final long INIT_TIME = 1_450_000_000_000L;
@@ -295,7 +295,7 @@ public class CeQueueDaoIT {
List<CeQueueDto> notPendingForWorker = underTestAlwaysIncreasingSystem2.selectNotPendingForWorker(db.getSession(), WORKER_UUID_1);

assertThat(notPendingForWorker).extracting(CeQueueDto::getUuid)
.contains(inProgressTaskWorker1.getUuid());
.contains(inProgressTaskWorker1.getUuid());
}

@Test
@@ -655,7 +655,7 @@ public class CeQueueDaoIT {
assertThat(prOrBranchTasks).hasSize(1);
assertThat(prOrBranchTasks.get(0))
.extracting(PrOrBranchTask::getBranchType, PrOrBranchTask::getComponentUuid, PrOrBranchTask::getEntityUuid, PrOrBranchTask::getTaskType)
.containsExactly(BRANCH_KEY, COMPONENT_UUID_1, ENTITY_UUID_1, CeTaskTypes.REPORT);
.containsExactly(BRANCH, COMPONENT_UUID_1, ENTITY_UUID_1, CeTaskTypes.REPORT);
}

@Test
@@ -667,12 +667,12 @@ public class CeQueueDaoIT {
.setTaskType(CeTaskTypes.REPORT)
.setCreatedAt(123L));
List<PrOrBranchTask> prOrBranchTasks = underTest.selectOldestPendingPrOrBranch(db.getSession());
insertCharacteristic(BRANCH_KEY, "123", "c1", TASK_UUID_1);
insertCharacteristic(BRANCH, "123", "c1", TASK_UUID_1);

assertThat(prOrBranchTasks).hasSize(1);
assertThat(prOrBranchTasks.get(0))
.extracting(PrOrBranchTask::getBranchType, PrOrBranchTask::getComponentUuid, PrOrBranchTask::getEntityUuid, PrOrBranchTask::getTaskType)
.containsExactly(BRANCH_KEY, COMPONENT_UUID_1, ENTITY_UUID_1, CeTaskTypes.REPORT);
.containsExactly(BRANCH, COMPONENT_UUID_1, ENTITY_UUID_1, CeTaskTypes.REPORT);
}

@Test
@@ -725,7 +725,7 @@ public class CeQueueDaoIT {
assertThat(prOrBranchTasks).hasSize(1);
assertThat(prOrBranchTasks.get(0))
.extracting(PrOrBranchTask::getBranchType, PrOrBranchTask::getComponentUuid, PrOrBranchTask::getEntityUuid, PrOrBranchTask::getTaskType)
.containsExactly(BRANCH_KEY, COMPONENT_UUID_1, ENTITY_UUID_1, CeTaskTypes.REPORT);
.containsExactly(BRANCH, COMPONENT_UUID_1, ENTITY_UUID_1, CeTaskTypes.REPORT);
}

private void insertPending(CeQueueDto dto) {

+ 8
- 4
server/sonar-db-dao/src/main/java/org/sonar/db/ce/CeTaskCharacteristicDto.java View File

@@ -21,12 +21,16 @@ package org.sonar.db.ce;

import java.util.Set;

import static org.sonar.core.ce.CeTaskCharacteristics.BRANCH;
import static org.sonar.core.ce.CeTaskCharacteristics.BRANCH_TYPE;
import static org.sonar.core.ce.CeTaskCharacteristics.DEVOPS_PLATFORM_PROJECT_IDENTIFIER;
import static org.sonar.core.ce.CeTaskCharacteristics.DEVOPS_PLATFORM_URL;
import static org.sonar.core.ce.CeTaskCharacteristics.PULL_REQUEST;

public class CeTaskCharacteristicDto {

public static final String BRANCH_KEY = "branch";
public static final String BRANCH_TYPE_KEY = "branchType";
public static final String PULL_REQUEST = "pullRequest";
public static final Set<String> SUPPORTED_KEYS = Set.of(BRANCH_KEY, BRANCH_TYPE_KEY, PULL_REQUEST);

public static final Set<String> SUPPORTED_KEYS = Set.of(BRANCH, BRANCH_TYPE, PULL_REQUEST, DEVOPS_PLATFORM_URL, DEVOPS_PLATFORM_PROJECT_IDENTIFIER);

private String uuid;
private String taskUuid;

+ 5
- 5
server/sonar-webserver-core/src/main/java/org/sonar/server/issue/index/AsyncIssueIndexingImpl.java View File

@@ -32,6 +32,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonar.ce.queue.CeQueue;
import org.sonar.ce.queue.CeTaskSubmit;
import org.sonar.core.ce.CeTaskCharacteristics;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.ce.CeActivityDto;
@@ -41,9 +42,8 @@ import org.sonar.db.component.BranchType;
import org.sonar.db.component.SnapshotDto;

import static java.util.stream.Collectors.toCollection;
import static org.sonar.db.ce.CeTaskCharacteristicDto.BRANCH_KEY;
import static org.sonar.db.ce.CeTaskCharacteristicDto.BRANCH_TYPE_KEY;
import static org.sonar.db.ce.CeTaskCharacteristicDto.PULL_REQUEST;
import static org.sonar.core.ce.CeTaskCharacteristics.BRANCH_TYPE;
import static org.sonar.core.ce.CeTaskCharacteristics.PULL_REQUEST;
import static org.sonar.db.ce.CeTaskTypes.BRANCH_ISSUE_SYNC;

public class AsyncIssueIndexingImpl implements AsyncIssueIndexing {
@@ -181,8 +181,8 @@ public class AsyncIssueIndexingImpl implements AsyncIssueIndexing {

private CeTaskSubmit buildTaskSubmit(BranchDto branch) {
Map<String, String> characteristics = new HashMap<>();
characteristics.put(branch.getBranchType() == BranchType.BRANCH ? BRANCH_KEY : PULL_REQUEST, branch.getKey());
characteristics.put(BRANCH_TYPE_KEY, branch.getBranchType().name());
characteristics.put(branch.getBranchType() == BranchType.BRANCH ? CeTaskCharacteristics.BRANCH : PULL_REQUEST, branch.getKey());
characteristics.put(BRANCH_TYPE, branch.getBranchType().name());

return ceQueue.prepareSubmit()
.setType(BRANCH_ISSUE_SYNC)

+ 5
- 5
server/sonar-webserver-core/src/test/java/org/sonar/server/issue/index/AsyncIssueIndexingImplTest.java View File

@@ -35,6 +35,7 @@ import org.sonar.api.testfixtures.log.LogTester;
import org.sonar.api.utils.System2;
import org.sonar.ce.queue.CeQueue;
import org.sonar.ce.queue.CeTaskSubmit;
import org.sonar.core.ce.CeTaskCharacteristics;
import org.sonar.core.util.SequenceUuidFactory;
import org.sonar.core.util.UuidFactory;
import org.sonar.db.DbClient;
@@ -42,7 +43,6 @@ import org.sonar.db.DbTester;
import org.sonar.db.ce.CeActivityDto;
import org.sonar.db.ce.CeActivityDto.Status;
import org.sonar.db.ce.CeQueueDto;
import org.sonar.db.ce.CeTaskCharacteristicDto;
import org.sonar.db.component.BranchDto;
import org.sonar.db.component.SnapshotDto;
import org.sonar.db.project.ProjectDto;
@@ -55,7 +55,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.sonar.db.ce.CeTaskCharacteristicDto.BRANCH_TYPE_KEY;
import static org.sonar.core.ce.CeTaskCharacteristics.BRANCH_TYPE;
import static org.sonar.db.ce.CeTaskTypes.BRANCH_ISSUE_SYNC;
import static org.sonar.db.ce.CeTaskTypes.REPORT;
import static org.sonar.db.component.BranchType.BRANCH;
@@ -287,9 +287,9 @@ public class AsyncIssueIndexingImplTest {
assertThat(tasks).hasSize(2);

assertThat(tasks)
.extracting(p -> p.getCharacteristics().get(BRANCH_TYPE_KEY),
p -> p.getCharacteristics().get(CeTaskCharacteristicDto.BRANCH_KEY),
p -> p.getCharacteristics().get(CeTaskCharacteristicDto.PULL_REQUEST))
.extracting(p -> p.getCharacteristics().get(BRANCH_TYPE),
p -> p.getCharacteristics().get(CeTaskCharacteristics.BRANCH),
p -> p.getCharacteristics().get(CeTaskCharacteristics.PULL_REQUEST))
.containsExactlyInAnyOrder(
tuple("BRANCH", "branch_1", null),
tuple("PULL_REQUEST", null, "pr_1"));

+ 9
- 9
server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/ActivityActionIT.java View File

@@ -30,6 +30,7 @@ import org.sonar.api.server.ws.WebService.Param;
import org.sonar.api.utils.System2;
import org.sonar.api.web.UserRole;
import org.sonar.ce.task.taskprocessor.CeTaskProcessor;
import org.sonar.core.ce.CeTaskCharacteristics;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbTester;
import org.sonar.db.ce.CeActivityDto;
@@ -69,13 +70,12 @@ import static org.mockito.Mockito.mock;
import static org.sonar.api.server.ws.WebService.Param.TEXT_QUERY;
import static org.sonar.api.utils.DateUtils.formatDate;
import static org.sonar.api.utils.DateUtils.formatDateTime;
import static org.sonar.core.ce.CeTaskCharacteristics.BRANCH_TYPE;
import static org.sonar.core.ce.CeTaskCharacteristics.PULL_REQUEST;
import static org.sonar.db.ce.CeActivityDto.Status.FAILED;
import static org.sonar.db.ce.CeActivityDto.Status.SUCCESS;
import static org.sonar.db.ce.CeQueueDto.Status.IN_PROGRESS;
import static org.sonar.db.ce.CeQueueDto.Status.PENDING;
import static org.sonar.db.ce.CeTaskCharacteristicDto.BRANCH_KEY;
import static org.sonar.db.ce.CeTaskCharacteristicDto.BRANCH_TYPE_KEY;
import static org.sonar.db.ce.CeTaskCharacteristicDto.PULL_REQUEST;
import static org.sonar.db.component.BranchType.BRANCH;
import static org.sonar.server.ce.ws.CeWsParameters.PARAM_COMPONENT;
import static org.sonar.server.ce.ws.CeWsParameters.PARAM_MAX_EXECUTED_AT;
@@ -398,8 +398,8 @@ public class ActivityActionIT {
ComponentDto branch = db.components().insertProjectBranch(project.getMainBranchComponent(), b -> b.setBranchType(BRANCH).setKey(branchName));
SnapshotDto analysis = db.components().insertSnapshot(branch);
CeActivityDto activity = insertActivity("T1", project.projectUuid(), project.mainBranchUuid(), SUCCESS, analysis);
insertCharacteristic(activity, BRANCH_KEY, branchName);
insertCharacteristic(activity, BRANCH_TYPE_KEY, BRANCH.name());
insertCharacteristic(activity, CeTaskCharacteristics.BRANCH, branchName);
insertCharacteristic(activity, BRANCH_TYPE, BRANCH.name());

ActivityResponse response = ws.newRequest().executeProtobuf(ActivityResponse.class);

@@ -414,11 +414,11 @@ public class ActivityActionIT {
logInAsSystemAdministrator();
String branch = "ny_branch";
CeQueueDto queue1 = insertQueue("T1", null, IN_PROGRESS);
insertCharacteristic(queue1, BRANCH_KEY, branch);
insertCharacteristic(queue1, BRANCH_TYPE_KEY, BRANCH.name());
insertCharacteristic(queue1, CeTaskCharacteristics.BRANCH, branch);
insertCharacteristic(queue1, BRANCH_TYPE, BRANCH.name());
CeQueueDto queue2 = insertQueue("T2", null, PENDING);
insertCharacteristic(queue2, BRANCH_KEY, branch);
insertCharacteristic(queue2, BRANCH_TYPE_KEY, BRANCH.name());
insertCharacteristic(queue2, CeTaskCharacteristics.BRANCH, branch);
insertCharacteristic(queue2, BRANCH_TYPE, BRANCH.name());

ActivityResponse response = ws.newRequest()
.setParam("status", "FAILED,IN_PROGRESS,PENDING")

+ 13
- 13
server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/ComponentActionIT.java View File

@@ -27,17 +27,18 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.utils.System2;
import org.sonar.api.web.UserRole;
import org.sonar.core.ce.CeTaskCharacteristics;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbTester;
import org.sonar.db.ce.CeActivityDto;
import org.sonar.db.ce.CeQueueDto;
import org.sonar.db.ce.CeTaskCharacteristicDto;
import org.sonar.db.ce.CeTaskMessageDto;
import org.sonar.db.dismissmessage.MessageType;
import org.sonar.db.ce.CeTaskTypes;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ProjectData;
import org.sonar.db.component.SnapshotDto;
import org.sonar.db.dismissmessage.MessageType;
import org.sonar.db.entity.EntityDto;
import org.sonar.db.project.ProjectDto;
import org.sonar.server.component.TestComponentFinder;
@@ -55,11 +56,10 @@ import static org.apache.commons.lang.RandomStringUtils.randomAlphanumeric;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.api.Assertions.tuple;
import static org.sonar.core.ce.CeTaskCharacteristics.BRANCH_TYPE;
import static org.sonar.db.ce.CeActivityDto.Status.SUCCESS;
import static org.sonar.db.ce.CeQueueDto.Status.IN_PROGRESS;
import static org.sonar.db.ce.CeQueueDto.Status.PENDING;
import static org.sonar.db.ce.CeTaskCharacteristicDto.BRANCH_KEY;
import static org.sonar.db.ce.CeTaskCharacteristicDto.BRANCH_TYPE_KEY;
import static org.sonar.db.component.BranchType.BRANCH;
import static org.sonar.server.ce.ws.CeWsParameters.PARAM_COMPONENT;

@@ -180,8 +180,8 @@ public class ComponentActionIT {
ComponentDto branch = db.components().insertProjectBranch(project.getMainBranchComponent(), b -> b.setBranchType(BRANCH).setKey(branchName));
SnapshotDto analysis = db.components().insertSnapshot(branch);
CeActivityDto activity = insertActivity("T1", project.getMainBranchComponent(), project.getProjectDto(), SUCCESS, analysis);
insertCharacteristic(activity, BRANCH_KEY, branchName);
insertCharacteristic(activity, BRANCH_TYPE_KEY, BRANCH.name());
insertCharacteristic(activity, CeTaskCharacteristics.BRANCH, branchName);
insertCharacteristic(activity, BRANCH_TYPE, BRANCH.name());

Ce.ComponentResponse response = ws.newRequest()
.setParam(PARAM_COMPONENT, project.projectKey())
@@ -200,11 +200,11 @@ public class ComponentActionIT {
String branchName = randomAlphanumeric(248);
ComponentDto branch = db.components().insertProjectBranch(project.getMainBranchComponent(), b -> b.setBranchType(BRANCH).setKey(branchName));
CeQueueDto queue1 = insertQueue("T1", project.getMainBranchComponent(), project.getProjectDto(), IN_PROGRESS);
insertCharacteristic(queue1, BRANCH_KEY, branchName);
insertCharacteristic(queue1, BRANCH_TYPE_KEY, BRANCH.name());
insertCharacteristic(queue1, CeTaskCharacteristics.BRANCH, branchName);
insertCharacteristic(queue1, BRANCH_TYPE, BRANCH.name());
CeQueueDto queue2 = insertQueue("T2", project.getMainBranchComponent(), project.getProjectDto(), PENDING);
insertCharacteristic(queue2, BRANCH_KEY, branchName);
insertCharacteristic(queue2, BRANCH_TYPE_KEY, BRANCH.name());
insertCharacteristic(queue2, CeTaskCharacteristics.BRANCH, branchName);
insertCharacteristic(queue2, BRANCH_TYPE, BRANCH.name());

Ce.ComponentResponse response = ws.newRequest()
.setParam(PARAM_COMPONENT, branch.getKey())
@@ -226,14 +226,14 @@ public class ComponentActionIT {
String branchName1 = "Branch1";
ComponentDto branch1 = db.components().insertProjectBranch(project.getMainBranchComponent(), b -> b.setBranchType(BRANCH).setKey("branch1"));
CeQueueDto branchQueue1 = insertQueue("Branch1", project.getMainBranchComponent(), project.getProjectDto(), IN_PROGRESS);
insertCharacteristic(branchQueue1, BRANCH_KEY, branchName1);
insertCharacteristic(branchQueue1, BRANCH_TYPE_KEY, BRANCH.name());
insertCharacteristic(branchQueue1, CeTaskCharacteristics.BRANCH, branchName1);
insertCharacteristic(branchQueue1, BRANCH_TYPE, BRANCH.name());

ComponentDto branch2 = db.components().insertProjectBranch(project.getMainBranchComponent(), b -> b.setBranchType(BRANCH).setKey("branch2"));
String branchName2 = "Branch2";
CeQueueDto branchQueue2 = insertQueue("Branch2", project.getMainBranchComponent(), project.getProjectDto(), PENDING);
insertCharacteristic(branchQueue2, BRANCH_KEY, branchName2);
insertCharacteristic(branchQueue2, BRANCH_TYPE_KEY, BRANCH.name());
insertCharacteristic(branchQueue2, CeTaskCharacteristics.BRANCH, branchName2);
insertCharacteristic(branchQueue2, BRANCH_TYPE, BRANCH.name());

Ce.ComponentResponse response = ws.newRequest()
.setParam(PARAM_COMPONENT, project.projectKey())

+ 7
- 7
server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/TaskActionIT.java View File

@@ -28,6 +28,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.utils.System2;
import org.sonar.api.web.UserRole;
import org.sonar.core.ce.CeTaskCharacteristics;
import org.sonar.core.util.CloseableIterator;
import org.sonar.core.util.UuidFactoryFast;
import org.sonar.core.util.Uuids;
@@ -36,10 +37,10 @@ import org.sonar.db.ce.CeActivityDto;
import org.sonar.db.ce.CeQueueDto;
import org.sonar.db.ce.CeTaskCharacteristicDto;
import org.sonar.db.ce.CeTaskMessageDto;
import org.sonar.db.dismissmessage.MessageType;
import org.sonar.db.ce.CeTaskTypes;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ProjectData;
import org.sonar.db.dismissmessage.MessageType;
import org.sonar.db.permission.GlobalPermission;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.user.UserDto;
@@ -57,8 +58,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.sonar.api.web.UserRole.ADMIN;
import static org.sonar.api.web.UserRole.SCAN;
import static org.sonar.db.ce.CeTaskCharacteristicDto.BRANCH_KEY;
import static org.sonar.db.ce.CeTaskCharacteristicDto.BRANCH_TYPE_KEY;
import static org.sonar.core.ce.CeTaskCharacteristics.BRANCH_TYPE;
import static org.sonar.db.component.BranchType.BRANCH;

public class TaskActionIT {
@@ -174,8 +174,8 @@ public class TaskActionIT {
ComponentDto branch = db.components().insertProjectBranch(mainBranch, b -> b.setBranchType(BRANCH).setKey(branchName));
db.components().insertSnapshot(branch);
CeActivityDto activity = createAndPersistArchivedTask(mainBranch);
insertCharacteristic(activity, BRANCH_KEY, branchName);
insertCharacteristic(activity, BRANCH_TYPE_KEY, BRANCH.name());
insertCharacteristic(activity, CeTaskCharacteristics.BRANCH, branchName);
insertCharacteristic(activity, BRANCH_TYPE, BRANCH.name());

Ce.TaskResponse taskResponse = ws.newRequest()
.setParam("id", SOME_TASK_UUID)
@@ -193,8 +193,8 @@ public class TaskActionIT {

String branch = "my_branch";
CeQueueDto queueDto = createAndPersistQueueTask(null, user);
insertCharacteristic(queueDto, BRANCH_KEY, branch);
insertCharacteristic(queueDto, BRANCH_TYPE_KEY, BRANCH.name());
insertCharacteristic(queueDto, CeTaskCharacteristics.BRANCH, branch);
insertCharacteristic(queueDto, BRANCH_TYPE, BRANCH.name());

Ce.TaskResponse taskResponse = ws.newRequest()
.setParam("id", SOME_TASK_UUID)

+ 8
- 5
server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/TaskFormatter.java View File

@@ -49,6 +49,9 @@ import static java.lang.String.format;
import static java.util.Collections.singletonList;
import static java.util.Optional.ofNullable;
import static org.sonar.api.utils.DateUtils.formatDateTime;
import static org.sonar.core.ce.CeTaskCharacteristics.BRANCH;
import static org.sonar.core.ce.CeTaskCharacteristics.BRANCH_TYPE;
import static org.sonar.core.ce.CeTaskCharacteristics.PULL_REQUEST;

/**
* Converts {@link CeActivityDto} and {@link CeQueueDto} to the protobuf objects
@@ -198,8 +201,8 @@ public class TaskFormatter {

static DtoCache forActivityDtos(DbClient dbClient, DbSession dbSession, Collection<CeActivityDto> ceActivityDtos) {
Map<String, ComponentDto> componentsByUuid = dbClient.componentDao().selectByUuids(
dbSession,
getComponentUuidsOfCeActivities(ceActivityDtos))
dbSession,
getComponentUuidsOfCeActivities(ceActivityDtos))
.stream()
.collect(Collectors.toMap(ComponentDto::uuid, Function.identity()));
Multimap<String, CeTaskCharacteristicDto> characteristicsByTaskUuid = dbClient.ceTaskCharacteristicsDao()
@@ -228,21 +231,21 @@ public class TaskFormatter {

Optional<String> getBranchKey(String taskUuid) {
return characteristicsByTaskUuid.get(taskUuid).stream()
.filter(c -> c.getKey().equals(CeTaskCharacteristicDto.BRANCH_KEY))
.filter(c -> c.getKey().equals(BRANCH))
.map(CeTaskCharacteristicDto::getValue)
.findAny();
}

Optional<Common.BranchType> getBranchType(String taskUuid) {
return characteristicsByTaskUuid.get(taskUuid).stream()
.filter(c -> c.getKey().equals(CeTaskCharacteristicDto.BRANCH_TYPE_KEY))
.filter(c -> c.getKey().equals(BRANCH_TYPE))
.map(c -> Common.BranchType.valueOf(c.getValue()))
.findAny();
}

Optional<String> getPullRequest(String taskUuid) {
return characteristicsByTaskUuid.get(taskUuid).stream()
.filter(c -> c.getKey().equals(CeTaskCharacteristicDto.PULL_REQUEST))
.filter(c -> c.getKey().equals(PULL_REQUEST))
.map(CeTaskCharacteristicDto::getValue)
.findAny();
}

+ 23
- 2
server/sonar-webserver-webapi/src/test/java/org/sonar/server/ce/ws/SubmitActionTest.java View File

@@ -42,6 +42,10 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.sonar.core.ce.CeTaskCharacteristics.BRANCH;
import static org.sonar.core.ce.CeTaskCharacteristics.DEVOPS_PLATFORM_PROJECT_IDENTIFIER;
import static org.sonar.core.ce.CeTaskCharacteristics.DEVOPS_PLATFORM_URL;
import static org.sonar.core.ce.CeTaskCharacteristics.PULL_REQUEST;

public class SubmitActionTest {

@@ -84,7 +88,15 @@ public class SubmitActionTest {
public void submit_task_with_characteristics() {
when(reportSubmitter.submit(eq("my_project"), eq("My Project"), anyMap(), any())).thenReturn(A_CE_TASK);

String[] characteristics = {"branch=foo", "pullRequest=123", "unsupported=bar"};
String devOpsPlatformUrl = "https://github.com";
String devOpsPlatformProjectIdentifier = "foo/bar";
String[] characteristics = {
buildCharacteristicParam(BRANCH, "foo"),
buildCharacteristicParam(PULL_REQUEST, "123"),
buildCharacteristicParam("unsupported", "bar"),
buildCharacteristicParam(DEVOPS_PLATFORM_URL, devOpsPlatformUrl),
buildCharacteristicParam(DEVOPS_PLATFORM_PROJECT_IDENTIFIER, devOpsPlatformProjectIdentifier) };
Ce.SubmitResponse submitResponse = tester.newRequest()
.setParam("projectKey", "my_project")
.setParam("projectName", "My Project")
@@ -97,7 +109,16 @@ public class SubmitActionTest {
verify(reportSubmitter).submit(eq("my_project"), eq("My Project"), map.capture(), any());

// unsupported characteristics are ignored
assertThat(map.getValue()).containsExactly(entry("branch", "foo"), entry("pullRequest", "123"));

assertThat(map.getValue()).containsExactly(
entry(BRANCH, "foo"),
entry(PULL_REQUEST, "123"),
entry(DEVOPS_PLATFORM_URL, devOpsPlatformUrl),
entry(DEVOPS_PLATFORM_PROJECT_IDENTIFIER, devOpsPlatformProjectIdentifier));
}

private static String buildCharacteristicParam(String characteristic, String value) {
return characteristic + "=" + value;
}

@Test

+ 32
- 0
sonar-core/src/main/java/org/sonar/core/ce/CeTaskCharacteristics.java View File

@@ -0,0 +1,32 @@
/*
* SonarQube
* Copyright (C) 2009-2023 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.core.ce;

public class CeTaskCharacteristics {

public static final String BRANCH = "branch";
public static final String BRANCH_TYPE = "branchType";
public static final String PULL_REQUEST = "pullRequest";
public static final String DEVOPS_PLATFORM_URL = "devOpsPlatformUrl";
public static final String DEVOPS_PLATFORM_PROJECT_IDENTIFIER = "devOpsPlatformProjectIdentifier";

private CeTaskCharacteristics() {
}
}

+ 5
- 0
sonar-scanner-engine/src/main/java/org/sonar/scanner/ci/CiConfiguration.java View File

@@ -41,4 +41,9 @@ public interface CiConfiguration {
*/
Optional<String> getScmRevision();

/**
* The information about DevOpsPlatform that was detected.
*/
Optional<DevOpsPlatformInfo> getDevOpsPlatformInfo();

}

+ 16
- 4
sonar-scanner-engine/src/main/java/org/sonar/scanner/ci/CiConfigurationImpl.java View File

@@ -27,21 +27,33 @@ import static org.apache.commons.lang.StringUtils.defaultIfBlank;
public class CiConfigurationImpl implements CiConfiguration {
private final String ciName;

@Nullable
private final String scmRevision;
private final Optional<String> scmRevision;
private final Optional<DevOpsPlatformInfo> devOpsPlatformInfo;

public CiConfigurationImpl(@Nullable String scmRevision, String ciName) {
this.scmRevision = defaultIfBlank(scmRevision, null);
this.scmRevision = Optional.ofNullable(defaultIfBlank(scmRevision, null));
this.ciName = ciName;
this.devOpsPlatformInfo = Optional.empty();
}

public CiConfigurationImpl(@Nullable String scmRevision, String ciName, DevOpsPlatformInfo devOpsPlatformInfo) {
this.scmRevision = Optional.ofNullable(defaultIfBlank(scmRevision, null));
this.ciName = ciName;
this.devOpsPlatformInfo = Optional.of(devOpsPlatformInfo);
}

@Override
public Optional<String> getScmRevision() {
return Optional.ofNullable(scmRevision);
return scmRevision;
}

@Override
public String getCiName() {
return ciName;
}

@Override
public Optional<DevOpsPlatformInfo> getDevOpsPlatformInfo() {
return devOpsPlatformInfo;
}
}

+ 5
- 0
sonar-scanner-engine/src/main/java/org/sonar/scanner/ci/CiConfigurationProvider.java View File

@@ -64,6 +64,11 @@ public class CiConfigurationProvider {
return Optional.empty();
}

@Override
public Optional<DevOpsPlatformInfo> getDevOpsPlatformInfo() {
return Optional.empty();
}

@Override
public String getCiName() {
return "undetected";

+ 40
- 0
sonar-scanner-engine/src/main/java/org/sonar/scanner/ci/DevOpsPlatformInfo.java View File

@@ -0,0 +1,40 @@
/*
* SonarQube
* Copyright (C) 2009-2023 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.scanner.ci;

public class DevOpsPlatformInfo {

private final String url;
private final String projectIdentifier;

public DevOpsPlatformInfo(String url, String projectIdentifier) {
this.url = url;
this.projectIdentifier = projectIdentifier;
}

public String getUrl() {
return url;
}

public String getProjectIdentifier() {
return projectIdentifier;
}

}

+ 17
- 3
sonar-scanner-engine/src/main/java/org/sonar/scanner/ci/vendors/GithubActions.java View File

@@ -20,11 +20,13 @@
package org.sonar.scanner.ci.vendors;

import org.apache.commons.lang.StringUtils;
import org.sonar.api.utils.System2;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonar.api.utils.System2;
import org.sonar.scanner.ci.CiConfiguration;
import org.sonar.scanner.ci.CiConfigurationImpl;
import org.sonar.scanner.ci.CiVendor;
import org.sonar.scanner.ci.DevOpsPlatformInfo;

import static org.apache.commons.lang.StringUtils.isEmpty;

@@ -35,7 +37,11 @@ import static org.apache.commons.lang.StringUtils.isEmpty;
*/
public class GithubActions implements CiVendor {

private static final Logger LOG = LoggerFactory.getLogger(GithubActions.class);

private static final String PROPERTY_COMMIT = "GITHUB_SHA";
public static final String GITHUB_REPOSITORY_ENV_VAR = "GITHUB_REPOSITORY";
public static final String GITHUB_API_URL_ENV_VAR = "GITHUB_API_URL";

private final System2 system;

@@ -57,8 +63,16 @@ public class GithubActions implements CiVendor {
public CiConfiguration loadConfiguration() {
String revision = system.envVariable(PROPERTY_COMMIT);
if (isEmpty(revision)) {
LoggerFactory.getLogger(getClass()).warn("Missing environment variable " + PROPERTY_COMMIT);
LOG.warn("Missing environment variable " + PROPERTY_COMMIT);
}
return new CiConfigurationImpl(revision, getName());

String githubRepository = system.envVariable(GITHUB_REPOSITORY_ENV_VAR);
String githubApiUrl = system.envVariable(GITHUB_API_URL_ENV_VAR);
if (isEmpty(githubRepository) || isEmpty(githubApiUrl)) {
LOG.warn("Missing or empty environment variables: {}, and/or {}", GITHUB_API_URL_ENV_VAR, GITHUB_REPOSITORY_ENV_VAR);
return new CiConfigurationImpl(revision, getName());
}
return new CiConfigurationImpl(revision, getName(), new DevOpsPlatformInfo(githubApiUrl, githubRepository));

}
}

+ 22
- 6
sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ReportPublisher.java View File

@@ -34,16 +34,18 @@ import java.util.Map;
import javax.annotation.Nullable;
import okhttp3.HttpUrl;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonar.api.Startable;
import org.sonar.api.notifications.AnalysisWarnings;
import org.sonar.api.platform.Server;
import org.sonar.api.utils.MessageException;
import org.sonar.api.utils.TempFolder;
import org.sonar.api.utils.ZipUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonar.core.ce.CeTaskCharacteristics;
import org.sonar.scanner.bootstrap.DefaultScannerWsClient;
import org.sonar.scanner.bootstrap.GlobalAnalysisMode;
import org.sonar.scanner.ci.CiConfiguration;
import org.sonar.scanner.fs.InputModuleHierarchy;
import org.sonar.scanner.protocol.output.FileStructure;
import org.sonar.scanner.protocol.output.ScannerReportReader;
@@ -61,6 +63,9 @@ import org.sonarqube.ws.client.WsResponse;
import static java.net.URLEncoder.encode;
import static org.apache.commons.lang.StringUtils.EMPTY;
import static org.apache.commons.lang.StringUtils.isBlank;
import static org.sonar.core.ce.CeTaskCharacteristics.BRANCH_TYPE;
import static org.sonar.core.ce.CeTaskCharacteristics.DEVOPS_PLATFORM_PROJECT_IDENTIFIER;
import static org.sonar.core.ce.CeTaskCharacteristics.DEVOPS_PLATFORM_URL;
import static org.sonar.core.util.FileUtils.deleteQuietly;
import static org.sonar.core.util.FileUtils.humanReadableByteCountSI;
import static org.sonar.scanner.scan.branch.BranchType.PULL_REQUEST;
@@ -93,10 +98,12 @@ public class ReportPublisher implements Startable {
private final AnalysisWarnings analysisWarnings;
private final JavaArchitectureInformationProvider javaArchitectureInformationProvider;

private final CiConfiguration ciConfiguration;

public ReportPublisher(ScanProperties properties, DefaultScannerWsClient wsClient, Server server, AnalysisContextReportPublisher contextPublisher,
InputModuleHierarchy moduleHierarchy, GlobalAnalysisMode analysisMode, TempFolder temp, ReportPublisherStep[] publishers, BranchConfiguration branchConfiguration,
CeTaskReportDataHolder ceTaskReportDataHolder, AnalysisWarnings analysisWarnings,
JavaArchitectureInformationProvider javaArchitectureInformationProvider, FileStructure fileStructure) {
JavaArchitectureInformationProvider javaArchitectureInformationProvider, FileStructure fileStructure, CiConfiguration ciConfiguration) {
this.wsClient = wsClient;
this.server = server;
this.contextPublisher = contextPublisher;
@@ -112,6 +119,7 @@ public class ReportPublisher implements Startable {
this.javaArchitectureInformationProvider = javaArchitectureInformationProvider;
this.writer = new ScannerReportWriter(fileStructure);
this.reader = new ScannerReportReader(fileStructure);
this.ciConfiguration = ciConfiguration;
}

@Override
@@ -211,11 +219,15 @@ public class ReportPublisher implements Startable {

String branchName = branchConfiguration.branchName();
if (branchName != null) {
ciConfiguration.getDevOpsPlatformInfo().ifPresent(devOpsPlatformInfo -> {
post.setParam(CHARACTERISTIC, buildCharacteristicParam(DEVOPS_PLATFORM_URL ,devOpsPlatformInfo.getUrl()));
post.setParam(CHARACTERISTIC, buildCharacteristicParam(DEVOPS_PLATFORM_PROJECT_IDENTIFIER, devOpsPlatformInfo.getProjectIdentifier()));
});
if (branchConfiguration.branchType() != PULL_REQUEST) {
post.setParam(CHARACTERISTIC, "branch=" + branchName);
post.setParam(CHARACTERISTIC, "branchType=" + branchConfiguration.branchType().name());
post.setParam(CHARACTERISTIC, buildCharacteristicParam(CeTaskCharacteristics.BRANCH, branchName));
post.setParam(CHARACTERISTIC, buildCharacteristicParam(BRANCH_TYPE, branchConfiguration.branchType().name()));
} else {
post.setParam(CHARACTERISTIC, "pullRequest=" + branchConfiguration.pullRequestKey());
post.setParam(CHARACTERISTIC, buildCharacteristicParam(CeTaskCharacteristics.PULL_REQUEST, branchConfiguration.pullRequestKey()));
}
}

@@ -242,6 +254,10 @@ public class ReportPublisher implements Startable {
}
}

private static String buildCharacteristicParam(String characteristic, String value) {
return characteristic + "=" + value;
}

void prepareAndDumpMetadata(String taskId) {
Map<String, String> metadata = new LinkedHashMap<>();


+ 26
- 1
sonar-scanner-engine/src/test/java/org/sonar/scanner/ci/vendors/GithubActionsTest.java View File

@@ -25,7 +25,9 @@ import org.junit.Test;
import org.slf4j.event.Level;
import org.sonar.api.testfixtures.log.LogTester;
import org.sonar.api.utils.System2;
import org.sonar.scanner.ci.CiConfiguration;
import org.sonar.scanner.ci.CiVendor;
import org.sonar.scanner.ci.DevOpsPlatformInfo;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
@@ -33,6 +35,9 @@ import static org.mockito.Mockito.when;

public class GithubActionsTest {

private static final String GITHUB_API_URL = "https://api.github.com/";
private static final String REPOSITORY = "foo/bar";

@Rule
public LogTester logs = new LogTester();

@@ -57,8 +62,12 @@ public class GithubActionsTest {
public void loadConfiguration() {
setEnvVariable("GITHUB_ACTION", "build");
setEnvVariable("GITHUB_SHA", "abd12fc");
setEnvVariable("GITHUB_API_URL", GITHUB_API_URL);
setEnvVariable("GITHUB_REPOSITORY", REPOSITORY);

assertThat(underTest.loadConfiguration().getScmRevision()).hasValue("abd12fc");
CiConfiguration configuration = underTest.loadConfiguration();
assertThat(configuration.getScmRevision()).hasValue("abd12fc");
checkDevOpsPlatformInfo(configuration);
}

@Test
@@ -69,7 +78,23 @@ public class GithubActionsTest {
assertThat(logs.logs(Level.WARN)).contains("Missing environment variable GITHUB_SHA");
}

@Test
public void loadConfiguration_whenMissingGitHubEnvironmentVariables_shouldLogWarn() {
setEnvVariable("GITHUB_ACTION", "build");

assertThat(underTest.loadConfiguration().getDevOpsPlatformInfo()).isEmpty();
assertThat(logs.logs(Level.WARN)).contains("Missing or empty environment variables: GITHUB_API_URL, and/or GITHUB_REPOSITORY");
}

private void setEnvVariable(String key, @Nullable String value) {
when(system.envVariable(key)).thenReturn(value);
}

private void checkDevOpsPlatformInfo(CiConfiguration configuration) {
assertThat(configuration.getDevOpsPlatformInfo()).isNotEmpty();
DevOpsPlatformInfo devOpsPlatformInfo = configuration.getDevOpsPlatformInfo().get();
assertThat(devOpsPlatformInfo.getProjectIdentifier()).isEqualTo(REPOSITORY);
assertThat(devOpsPlatformInfo.getUrl()).isEqualTo(GITHUB_API_URL);

}
}

+ 42
- 3
sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ReportPublisherTest.java View File

@@ -24,6 +24,7 @@ import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Optional;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -40,6 +41,8 @@ import org.sonar.api.utils.MessageException;
import org.sonar.api.utils.TempFolder;
import org.sonar.scanner.bootstrap.DefaultScannerWsClient;
import org.sonar.scanner.bootstrap.GlobalAnalysisMode;
import org.sonar.scanner.ci.CiConfiguration;
import org.sonar.scanner.ci.DevOpsPlatformInfo;
import org.sonar.scanner.fs.InputModuleHierarchy;
import org.sonar.scanner.protocol.output.FileStructure;
import org.sonar.scanner.protocol.output.ScannerReport;
@@ -81,6 +84,7 @@ public class ReportPublisherTest {
private AnalysisContextReportPublisher contextPublisher = mock(AnalysisContextReportPublisher.class);
private BranchConfiguration branchConfiguration = mock(BranchConfiguration.class);
private CeTaskReportDataHolder reportMetadataHolder = mock(CeTaskReportDataHolder.class);
private CiConfiguration ciConfiguration = mock(CiConfiguration.class);
private ReportPublisher underTest;
private AnalysisWarnings analysisWarnings = mock(AnalysisWarnings.class);
private FileStructure fileStructure;
@@ -99,7 +103,7 @@ public class ReportPublisherTest {
.resolve("folder")
.resolve("report-task.txt"));
underTest = new ReportPublisher(properties, wsClient, server, contextPublisher, moduleHierarchy, mode, reportTempFolder,
new ReportPublisherStep[0], branchConfiguration, reportMetadataHolder, analysisWarnings, javaArchitectureInformationProvider, fileStructure);
new ReportPublisherStep[0], branchConfiguration, reportMetadataHolder, analysisWarnings, javaArchitectureInformationProvider, fileStructure, ciConfiguration);
}

@Test
@@ -196,7 +200,7 @@ public class ReportPublisherTest {
when(branchConfiguration.branchType()).thenReturn(BRANCH);
when(branchConfiguration.branchName()).thenReturn("branch-6.7");
ReportPublisher underTest = new ReportPublisher(properties, wsClient, server, contextPublisher, moduleHierarchy, mode, mock(TempFolder.class),
new ReportPublisherStep[0], branchConfiguration, reportMetadataHolder, analysisWarnings, javaArchitectureInformationProvider, fileStructure);
new ReportPublisherStep[0], branchConfiguration, reportMetadataHolder, analysisWarnings, javaArchitectureInformationProvider, fileStructure, ciConfiguration);

underTest.prepareAndDumpMetadata("TASK-123");

@@ -217,7 +221,7 @@ public class ReportPublisherTest {
when(branchConfiguration.pullRequestKey()).thenReturn("105");

ReportPublisher underTest = new ReportPublisher(properties, wsClient, server, contextPublisher, moduleHierarchy, mode, mock(TempFolder.class),
new ReportPublisherStep[0], branchConfiguration, reportMetadataHolder, analysisWarnings, javaArchitectureInformationProvider, fileStructure);
new ReportPublisherStep[0], branchConfiguration, reportMetadataHolder, analysisWarnings, javaArchitectureInformationProvider, fileStructure, ciConfiguration);

underTest.prepareAndDumpMetadata("TASK-123");

@@ -316,6 +320,7 @@ public class ReportPublisherTest {
WsRequest wsRequest = capture.getValue();
assertThat(wsRequest.getParameters().getKeys()).containsOnly("projectKey");
assertThat(wsRequest.getParameters().getValue("projectKey")).isEqualTo("org.sonarsource.sonarqube:sonarqube");
assertThat(wsRequest.getParameters().getValues("characteristic")).isEmpty();
}

@Test
@@ -378,6 +383,40 @@ public class ReportPublisherTest {
.containsExactlyInAnyOrder("pullRequest=" + pullRequestId);
}

@Test
public void upload_whenDevOpsPlatformInformationPresentInCiConfiguration_shouldUploadDevOpsPlatformInfoAsCharacteristic() throws Exception {
String branchName = "feature";
String pullRequestId = "pr-123";
DevOpsPlatformInfo devOpsPlatformInfo = new DevOpsPlatformInfo("https://devops.example.com", "projectId");

when(branchConfiguration.branchName()).thenReturn(branchName);
when(branchConfiguration.branchType()).thenReturn(PULL_REQUEST);
when(branchConfiguration.pullRequestKey()).thenReturn(pullRequestId);
when(ciConfiguration.getDevOpsPlatformInfo()).thenReturn(Optional.of(devOpsPlatformInfo));

WsResponse response = mock(WsResponse.class);

PipedOutputStream out = new PipedOutputStream();
PipedInputStream in = new PipedInputStream(out);
Ce.SubmitResponse.newBuilder().build().writeTo(out);
out.close();

when(response.failIfNotSuccessful()).thenReturn(response);
when(response.contentStream()).thenReturn(in);

when(wsClient.call(any(WsRequest.class))).thenReturn(response);
underTest.upload(reportTempFolder.newFile());

ArgumentCaptor<WsRequest> capture = ArgumentCaptor.forClass(WsRequest.class);
verify(wsClient).call(capture.capture());

WsRequest wsRequest = capture.getValue();
assertThat(wsRequest.getParameters().getValues("characteristic"))
.contains(
"devOpsPlatformUrl=" + devOpsPlatformInfo.getUrl(),
"devOpsPlatformProjectIdentifier=" + devOpsPlatformInfo.getProjectIdentifier());
}

@Test
public void test_do_not_log_or_add_warning_if_using_64bit_jre() {
when(javaArchitectureInformationProvider.is64bitJavaVersion()).thenReturn(true);

Loading…
Cancel
Save