aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJulien Lancelot <julien.lancelot@sonarsource.com>2018-01-16 13:40:15 +0100
committerGrégoire Aubert <gregoire.aubert@sonarsource.com>2018-01-25 15:16:50 +0100
commit4b10c71bb4b2458a908c91980e5046dfa966b9ee (patch)
tree403282759667a03cc928e42295ad751b280fd574
parent26b7b078e22dd7aab61e24da4f41c2e7c82d75ad (diff)
downloadsonarqube-4b10c71bb4b2458a908c91980e5046dfa966b9ee.tar.gz
sonarqube-4b10c71bb4b2458a908c91980e5046dfa966b9ee.zip
SONAR-10266 Generate quality gate card
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/badge/ws/QualityGateAction.java67
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/badge/ws/SvgGenerator.java13
-rw-r--r--server/sonar-server/src/main/resources/org/sonar/server/badge/ws/templates/quality_gate_failed.svg104
-rw-r--r--server/sonar-server/src/main/resources/org/sonar/server/badge/ws/templates/quality_gate_passed.svg115
-rw-r--r--server/sonar-server/src/main/resources/org/sonar/server/badge/ws/templates/quality_gate_warn.svg107
-rw-r--r--server/sonar-server/src/main/resources/org/sonar/server/sticker/ws/templates/quality_gate_failed.svg104
-rw-r--r--server/sonar-server/src/main/resources/org/sonar/server/sticker/ws/templates/quality_gate_passed.svg115
-rw-r--r--server/sonar-server/src/main/resources/org/sonar/server/sticker/ws/templates/quality_gate_warn.svg107
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/badge/ws/QualityGateActionTest.java184
9 files changed, 896 insertions, 20 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/badge/ws/QualityGateAction.java b/server/sonar-server/src/main/java/org/sonar/server/badge/ws/QualityGateAction.java
index 6f605191db2..7b969514073 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/badge/ws/QualityGateAction.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/badge/ws/QualityGateAction.java
@@ -20,40 +20,83 @@
package org.sonar.server.badge.ws;
import com.google.common.io.Resources;
-import org.apache.commons.io.IOUtils;
+import org.sonar.api.measures.CoreMetrics;
+import org.sonar.api.measures.Metric.Level;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.NewAction;
+import org.sonar.db.DbClient;
+import org.sonar.db.DbSession;
+import org.sonar.db.component.ComponentDto;
+import org.sonar.db.measure.LiveMeasureDto;
+import org.sonar.server.component.ComponentFinder;
+import org.sonar.server.exceptions.ForbiddenException;
+import org.sonar.server.exceptions.NotFoundException;
+import org.sonar.server.user.UserSession;
-import static java.util.Arrays.asList;
+import static java.lang.String.format;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.apache.commons.io.IOUtils.write;
+import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.server.ws.KeyExamples.KEY_BRANCH_EXAMPLE_001;
import static org.sonar.server.ws.KeyExamples.KEY_PROJECT_EXAMPLE_001;
+import static org.sonarqube.ws.MediaTypes.SVG;
public class QualityGateAction implements ProjectBadgesWsAction {
- public static final String PARAM_COMPONENT = "component";
- public static final String PARAM_TYPE = "type";
+ private static final String PARAM_PROJECT = "project";
+ private static final String PARAM_BRANCH = "branch";
+
+ private final UserSession userSession;
+ private final DbClient dbClient;
+ private final ComponentFinder componentFinder;
+ private final SvgGenerator svgGenerator;
+
+ public QualityGateAction(UserSession userSession, DbClient dbClient, ComponentFinder componentFinder, SvgGenerator svgGenerator) {
+ this.userSession = userSession;
+ this.dbClient = dbClient;
+ this.componentFinder = componentFinder;
+ this.svgGenerator = svgGenerator;
+ }
@Override
public void define(WebService.NewController controller) {
NewAction action = controller.createAction("quality_gate")
.setHandler(this)
- .setDescription("Generate badge for quality gate as an SVG")
+ .setSince("7.1")
+ .setDescription("Generate badge for project's quality gate as an SVG.<br/>" +
+ "Requires 'Browse' permission on the specified project.")
.setResponseExample(Resources.getResource(getClass(), "quality_gate-example.svg"));
- action.createParam(PARAM_COMPONENT)
+ action.createParam(PARAM_PROJECT)
.setDescription("Project key")
.setRequired(true)
.setExampleValue(KEY_PROJECT_EXAMPLE_001);
- action.createParam(PARAM_TYPE)
- .setDescription("Type of badge.")
- .setRequired(false)
- .setPossibleValues(asList("BADGE", "CARD"));
+ action
+ .createParam(PARAM_BRANCH)
+ .setDescription("Branch key")
+ .setExampleValue(KEY_BRANCH_EXAMPLE_001);
}
@Override
public void handle(Request request, Response response) throws Exception {
- response.stream().setMediaType("image/svg+xml");
- IOUtils.copy(Resources.getResource(getClass(), "quality_gate-example.svg").openStream(), response.stream().output());
+ response.stream().setMediaType(SVG);
+ String projectKey = request.mandatoryParam(PARAM_PROJECT);
+ String branch = request.param(PARAM_BRANCH);
+ try (DbSession dbSession = dbClient.openSession(false)) {
+ ComponentDto project = componentFinder.getByKeyAndOptionalBranch(dbSession, projectKey, branch);
+ userSession.checkComponentPermission(USER, project);
+ Level qualityGateStatus = getQualityGate(dbSession, project);
+ write(svgGenerator.generateQualityGate(qualityGateStatus), response.stream().output(), UTF_8);
+ } catch (ProjectBadgesException | ForbiddenException | NotFoundException e) {
+ write(svgGenerator.generateError(e.getMessage()), response.stream().output(), UTF_8);
+ }
+ }
+
+ private Level getQualityGate(DbSession dbSession, ComponentDto project) {
+ return Level.valueOf(dbClient.liveMeasureDao().selectMeasure(dbSession, project.uuid(), CoreMetrics.ALERT_STATUS_KEY)
+ .map(LiveMeasureDto::getTextValue)
+ .orElseThrow(() -> new ProjectBadgesException(format("Quality gate has not been found for project '%s' and branch '%s'", project.getKey(), project.getBranch()))));
}
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/badge/ws/SvgGenerator.java b/server/sonar-server/src/main/java/org/sonar/server/badge/ws/SvgGenerator.java
index 8bf78cd5a8b..bbe633aea05 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/badge/ws/SvgGenerator.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/badge/ws/SvgGenerator.java
@@ -27,10 +27,14 @@ import java.io.IOException;
import java.util.Map;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.text.StrSubstitutor;
+import org.sonar.api.measures.Metric;
import org.sonar.api.server.ServerSide;
import static java.lang.String.valueOf;
import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.sonar.api.measures.Metric.Level.ERROR;
+import static org.sonar.api.measures.Metric.Level.OK;
+import static org.sonar.api.measures.Metric.Level.WARN;
@ServerSide
public class SvgGenerator {
@@ -51,10 +55,15 @@ public class SvgGenerator {
private final String errorTemplate;
private final String badgeTemplate;
+ private final Map<Metric.Level, String> qualityGateTemplates;
public SvgGenerator() {
this.errorTemplate = readTemplate("error.svg");
this.badgeTemplate = readTemplate("badge.svg");
+ this.qualityGateTemplates = ImmutableMap.of(
+ OK, readTemplate("quality_gate_passed.svg"),
+ WARN, readTemplate("quality_gate_warn.svg"),
+ ERROR, readTemplate("quality_gate_failed.svg"));
}
public String generateBadge(String label, String value, Color backgroundValueColor) {
@@ -75,6 +84,10 @@ public class SvgGenerator {
return strSubstitutor.replace(badgeTemplate);
}
+ public String generateQualityGate(Metric.Level level){
+ return qualityGateTemplates.get(level);
+ }
+
public String generateError(String error) {
Map<String, String> values = ImmutableMap.of(
PARAMETER_TOTAL_WIDTH, valueOf(MARGIN + computeWidth(error) + MARGIN),
diff --git a/server/sonar-server/src/main/resources/org/sonar/server/badge/ws/templates/quality_gate_failed.svg b/server/sonar-server/src/main/resources/org/sonar/server/badge/ws/templates/quality_gate_failed.svg
new file mode 100644
index 00000000000..010e1fef5b7
--- /dev/null
+++ b/server/sonar-server/src/main/resources/org/sonar/server/badge/ws/templates/quality_gate_failed.svg
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px"
+ viewBox="0 0 350 262.5" style="enable-background:new 0 0 350 262.5;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#FFFFFF;}
+ .st1{fill:#CFD3D7;}
+ .st2{fill:#ED333A;}
+ .st3{fill:#434447;}
+ .st4{fill:#F3702A;}
+ .st5{fill:#1B171B;}
+</style>
+<g>
+ <path class="st0" d="M328.4,259.5H21.3c-10.6,0-19.5-8.7-19.5-19.5V22c0-10.6,8.7-19.5,19.5-19.5h307.1c10.6,0,19.5,8.7,19.5,19.5
+ V240C347.9,250.8,339,259.5,328.4,259.5z"/>
+ <path class="st1" d="M328.4,260.4H21.3c-11.2,0-20.4-9.2-20.4-20.4V22c0-11.2,9.2-20.4,20.4-20.4h307.1c11.2,0,20.4,9.2,20.4,20.4
+ V240C348.8,251.2,339.5,260.4,328.4,260.4z M21.3,3.4C11,3.4,2.7,11.7,2.7,22V240c0,10.3,8.3,18.6,18.6,18.6h307.1
+ c10.3,0,18.6-8.3,18.6-18.6V22c0-10.3-8.3-18.6-18.6-18.6H21.3z"/>
+</g>
+<path class="st2" d="M213,162.9h-77.2c-17.6,0-31.9-14.4-31.9-31.9l0,0c0-17.6,14.4-31.9,31.9-31.9H213c17.6,0,31.9,14.4,31.9,31.9
+ l0,0C244.9,148.6,230.6,162.9,213,162.9z"/>
+<g>
+ <path class="st3" d="M94.9,54.3c0,2.7-0.4,5-1.3,7c-0.9,1.9-2.1,3.5-3.6,4.6l5,3.9L92.5,72l-5.9-4.7c-0.9,0.2-1.9,0.3-2.9,0.3
+ c-2.2,0-4.1-0.5-5.8-1.6c-1.7-1.1-3-2.6-3.9-4.6c-0.9-2-1.4-4.3-1.4-6.9v-2c0-2.7,0.5-5,1.4-7.1c0.9-2.1,2.2-3.6,3.9-4.7
+ s3.6-1.6,5.8-1.6c2.2,0,4.2,0.5,5.9,1.6c1.7,1.1,3,2.6,3.9,4.7c0.9,2,1.4,4.4,1.4,7.1V54.3z M91.3,52.5c0-3.3-0.7-5.8-2-7.6
+ c-1.3-1.8-3.2-2.7-5.6-2.7c-2.3,0-4.1,0.9-5.5,2.6c-1.3,1.8-2,4.2-2.1,7.4v2c0,3.2,0.7,5.7,2,7.5c1.3,1.8,3.2,2.8,5.6,2.8
+ c2.4,0,4.2-0.9,5.5-2.6c1.3-1.7,2-4.2,2-7.4V52.5z"/>
+ <path class="st3" d="M112.8,65.3c-1.4,1.6-3.4,2.4-6.1,2.4c-2.2,0-3.9-0.6-5-1.9c-1.2-1.3-1.7-3.2-1.7-5.7V46.6h3.5V60
+ c0,3.1,1.3,4.7,3.8,4.7c2.7,0,4.5-1,5.4-3v-15h3.5v20.7h-3.4L112.8,65.3z"/>
+ <path class="st3" d="M134.4,67.3c-0.2-0.4-0.4-1.1-0.5-2.2c-1.6,1.7-3.6,2.6-5.9,2.6c-2,0-3.7-0.6-5-1.7c-1.3-1.2-2-2.6-2-4.4
+ c0-2.2,0.8-3.8,2.5-5c1.6-1.2,3.9-1.8,6.9-1.8h3.4v-1.6c0-1.2-0.4-2.2-1.1-3c-0.7-0.7-1.8-1.1-3.3-1.1c-1.3,0-2.3,0.3-3.2,1
+ c-0.9,0.6-1.3,1.4-1.3,2.3h-3.6c0-1,0.4-2,1.1-3c0.7-1,1.7-1.7,3-2.3c1.3-0.6,2.6-0.8,4.1-0.8c2.4,0,4.3,0.6,5.6,1.8
+ c1.4,1.2,2.1,2.8,2.1,4.9v9.5c0,1.9,0.2,3.4,0.7,4.5v0.3H134.4z M128.5,64.6c1.1,0,2.2-0.3,3.2-0.9c1-0.6,1.7-1.3,2.2-2.2v-4.2
+ h-2.8c-4.3,0-6.5,1.3-6.5,3.8c0,1.1,0.4,2,1.1,2.6C126.4,64.3,127.4,64.6,128.5,64.6z"/>
+ <path class="st3" d="M146.8,67.3h-3.5V37.9h3.5V67.3z"/>
+ <path class="st3" d="M152.5,41.1c0-0.6,0.2-1.1,0.5-1.5s0.9-0.6,1.6-0.6c0.7,0,1.2,0.2,1.6,0.6s0.5,0.9,0.5,1.5s-0.2,1.1-0.5,1.4
+ s-0.9,0.6-1.6,0.6c-0.7,0-1.2-0.2-1.6-0.6S152.5,41.7,152.5,41.1z M156.3,67.3h-3.5V46.6h3.5V67.3z"/>
+ <path class="st3" d="M166.7,41.6v5h3.9v2.7h-3.9v12.8c0,0.8,0.2,1.5,0.5,1.9c0.3,0.4,0.9,0.6,1.8,0.6c0.4,0,1-0.1,1.7-0.2v2.9
+ c-0.9,0.3-1.8,0.4-2.7,0.4c-1.6,0-2.8-0.5-3.6-1.4c-0.8-1-1.2-2.3-1.2-4.1V49.4h-3.8v-2.7h3.8v-5H166.7z"/>
+ <path class="st3" d="M181.5,62.1l4.8-15.5h3.8l-8.3,23.9c-1.3,3.4-3.3,5.2-6.1,5.2l-0.7-0.1l-1.3-0.2v-2.9l1,0.1
+ c1.2,0,2.1-0.2,2.8-0.7c0.7-0.5,1.2-1.4,1.7-2.7l0.8-2.1l-7.4-20.5h3.9L181.5,62.1z"/>
+ <path class="st3" d="M224.1,63.7c-0.9,1.4-2.3,2.4-3.9,3c-1.7,0.7-3.7,1-5.9,1c-2.3,0-4.3-0.5-6-1.6c-1.8-1.1-3.1-2.6-4.1-4.5
+ c-1-2-1.5-4.2-1.5-6.8v-2.4c0-4.2,1-7.4,2.9-9.8c2-2.3,4.7-3.5,8.3-3.5c2.9,0,5.2,0.7,7,2.2c1.8,1.5,2.9,3.6,3.2,6.3h-3.7
+ c-0.7-3.7-2.9-5.5-6.6-5.5c-2.5,0-4.3,0.9-5.6,2.6c-1.3,1.7-1.9,4.2-1.9,7.5v2.3c0,3.1,0.7,5.6,2.1,7.5c1.4,1.8,3.4,2.8,5.8,2.8
+ c1.4,0,2.6-0.2,3.6-0.5c1-0.3,1.9-0.8,2.6-1.5v-6.2H214v-3h10.1V63.7z"/>
+ <path class="st3" d="M242.4,67.3c-0.2-0.4-0.4-1.1-0.5-2.2c-1.6,1.7-3.6,2.6-5.9,2.6c-2,0-3.7-0.6-5-1.7c-1.3-1.2-2-2.6-2-4.4
+ c0-2.2,0.8-3.8,2.5-5c1.6-1.2,3.9-1.8,6.9-1.8h3.4v-1.6c0-1.2-0.4-2.2-1.1-3c-0.7-0.7-1.8-1.1-3.3-1.1c-1.3,0-2.3,0.3-3.2,1
+ c-0.9,0.6-1.3,1.4-1.3,2.3h-3.6c0-1,0.4-2,1.1-3c0.7-1,1.7-1.7,3-2.3c1.3-0.6,2.6-0.8,4.1-0.8c2.4,0,4.3,0.6,5.6,1.8
+ c1.4,1.2,2.1,2.8,2.1,4.9v9.5c0,1.9,0.2,3.4,0.7,4.5v0.3H242.4z M236.5,64.6c1.1,0,2.2-0.3,3.2-0.9c1-0.6,1.7-1.3,2.2-2.2v-4.2
+ h-2.8c-4.3,0-6.5,1.3-6.5,3.8c0,1.1,0.4,2,1.1,2.6C234.4,64.3,235.4,64.6,236.5,64.6z"/>
+ <path class="st3" d="M255.7,41.6v5h3.9v2.7h-3.9v12.8c0,0.8,0.2,1.5,0.5,1.9c0.3,0.4,0.9,0.6,1.8,0.6c0.4,0,1-0.1,1.7-0.2v2.9
+ c-0.9,0.3-1.8,0.4-2.7,0.4c-1.6,0-2.8-0.5-3.6-1.4c-0.8-1-1.2-2.3-1.2-4.1V49.4h-3.8v-2.7h3.8v-5H255.7z"/>
+ <path class="st3" d="M272.3,67.7c-2.8,0-5.1-0.9-6.8-2.8c-1.8-1.8-2.6-4.3-2.6-7.4v-0.6c0-2.1,0.4-3.9,1.2-5.5
+ c0.8-1.6,1.9-2.9,3.3-3.8c1.4-0.9,2.9-1.4,4.6-1.4c2.7,0,4.8,0.9,6.3,2.7c1.5,1.8,2.2,4.3,2.2,7.6V58h-14c0.1,2,0.6,3.7,1.8,4.9
+ c1.1,1.3,2.6,1.9,4.3,1.9c1.2,0,2.3-0.3,3.2-0.8c0.9-0.5,1.6-1.2,2.3-2l2.2,1.7C278.4,66.4,275.8,67.7,272.3,67.7z M271.9,49.1
+ c-1.4,0-2.6,0.5-3.6,1.6c-1,1-1.6,2.5-1.8,4.4h10.4v-0.3c-0.1-1.8-0.6-3.2-1.5-4.2S273.3,49.1,271.9,49.1z"/>
+</g>
+<g>
+ <path class="st0" d="M156.1,132.3h-12v12.4h-6.2v-30.3h19.7v5.1h-13.5v7.8h12V132.3z"/>
+ <path class="st0" d="M174.4,138.4h-11l-2.1,6.2h-6.6l11.3-30.3h5.8l11.4,30.3h-6.6L174.4,138.4z M165.1,133.4h7.6l-3.8-11.4
+ L165.1,133.4z"/>
+ <path class="st0" d="M192.6,144.7h-6.2v-30.3h6.2V144.7z"/>
+ <path class="st0" d="M204.6,139.7h13.3v5h-19.5v-30.3h6.2V139.7z"/>
+</g>
+<g id="SonarCloud_Black_2_">
+ <path class="st4" d="M302.5,204.3c-1.6-1.9-3.7-3.3-6-4v-0.1c0-6.9-5.6-12.5-12.5-12.5s-12.5,5.6-12.5,12.5c0,0.1,0,0.1,0,0.2
+ c-5.1,1.6-8.8,6.3-8.8,11.9c0,6.9,5.6,12.5,12.5,12.5c3.3,0,6.5-1.3,8.8-3.6c2.3,2.2,5.4,3.6,8.8,3.6c6.9,0,12.5-5.6,12.5-12.5
+ C305.3,209.4,304.3,206.5,302.5,204.3z M292.8,221.6c-5.2,0-9.4-4.2-9.4-9.4c0-0.9-0.7-1.6-1.6-1.6s-1.6,0.7-1.6,1.6
+ c0,2.3,0.6,4.5,1.8,6.4c-1.8,1.9-4.2,3-6.8,3c-5.2,0-9.4-4.2-9.4-9.4s4.2-9.4,9.4-9.4c1.1,0,2.2,0.2,3.2,0.6l0,0
+ c0.4,0.1,0.9,0.4,1,0.5c0.7,0.6,1.7,0.5,2.2-0.2c0.6-0.7,0.5-1.7-0.2-2.2c-0.7-0.6-1.8-1-2-1.1c-1.4-0.5-2.8-0.8-4.3-0.8
+ c-0.2,0-0.4,0-0.6,0c0.2-5,4.3-9,9.3-9c5.2,0,9.4,4.2,9.4,9.4c0,3-1.5,5.9-3.9,7.6c-0.7,0.5-0.9,1.5-0.4,2.2
+ c0.3,0.4,0.8,0.7,1.3,0.7c0.3,0,0.6-0.1,0.9-0.3c2.4-1.7,4-4.1,4.8-6.9c3.6,1.3,6.1,4.8,6.1,8.8C302.2,217.4,298,221.6,292.8,221.6
+ z"/>
+ <g>
+ <path class="st5" d="M45.1,216c1.3,0.8,4,1.7,6,1.7c2.1,0,3-0.7,3-1.9s-0.7-1.7-3.3-2.6c-4.7-1.6-6.5-4.1-6.4-6.8
+ c0-4.2,3.6-7.4,9.2-7.4c2.6,0,5,0.6,6.4,1.3l-1.2,4.8c-1-0.6-3-1.3-4.9-1.3c-1.7,0-2.7,0.7-2.7,1.8s0.9,1.6,3.6,2.6
+ c4.3,1.5,6.1,3.6,6.1,7c0,4.2-3.3,7.3-9.8,7.3c-3,0-5.6-0.6-7.3-1.6L45.1,216z"/>
+ <path class="st5" d="M85.6,210.6c0,8.3-5.9,12-11.9,12c-6.6,0-11.7-4.3-11.7-11.6s4.8-11.9,12-11.9
+ C81,199.1,85.6,203.8,85.6,210.6z M69.3,210.8c0,3.9,1.6,6.8,4.6,6.8c2.7,0,4.5-2.7,4.5-6.8c0-3.4-1.3-6.8-4.5-6.8
+ C70.5,204.1,69.3,207.5,69.3,210.8z"/>
+ <path class="st5" d="M88.1,206.8c0-2.8-0.1-5.2-0.2-7.2H94l0.3,3.1h0.1c0.9-1.4,3.2-3.6,7-3.6c4.6,0,8.1,3,8.1,9.7v13.4h-7v-12.5
+ c0-2.9-1-4.9-3.6-4.9c-1.9,0-3.1,1.3-3.5,2.6c-0.2,0.4-0.3,1.1-0.3,1.8v13h-7V206.8z"/>
+ <path class="st5" d="M126.1,222.1l-0.4-2.3h-0.1c-1.5,1.8-3.8,2.8-6.5,2.8c-4.6,0-7.3-3.3-7.3-6.9c0-5.9,5.3-8.7,13.2-8.6v-0.3
+ c0-1.2-0.6-2.9-4.1-2.9c-2.3,0-4.7,0.8-6.2,1.7l-1.3-4.5c1.6-0.9,4.7-2,8.8-2c7.5,0,9.9,4.4,9.9,9.7v7.8c0,2.2,0.1,4.2,0.3,5.5
+ H126.1z M125.3,211.5c-3.7,0-6.6,0.8-6.6,3.6c0,1.8,1.2,2.7,2.8,2.7c1.8,0,3.2-1.2,3.6-2.6c0.1-0.4,0.1-0.8,0.1-1.2L125.3,211.5
+ L125.3,211.5z"/>
+ <path class="st5" d="M135.8,207c0-3.3-0.1-5.5-0.2-7.4h6l0.2,4.1h0.2c1.2-3.3,3.9-4.7,6.1-4.7c0.6,0,1,0,1.5,0.1v6.6
+ c-0.5-0.1-1.1-0.2-1.9-0.2c-2.6,0-4.3,1.4-4.8,3.6c-0.1,0.5-0.1,1-0.1,1.6v11.4h-7V207z"/>
+ <path class="st5" d="M167.9,221.3c-1.1,0.6-3.4,1.3-6.4,1.3c-6.7,0-11.1-4.6-11.1-11.4c0-6.9,4.7-11.9,12-11.9
+ c2.4,0,4.5,0.6,5.6,1.2l-0.9,3.1c-1-0.6-2.5-1.1-4.7-1.1c-5.1,0-7.9,3.8-7.9,8.4c0,5.2,3.3,8.3,7.7,8.3c2.3,0,3.8-0.6,5-1.1
+ L167.9,221.3z"/>
+ <path class="st5" d="M170.9,189.4h4.1v32.7h-4.1V189.4z"/>
+ <path class="st5" d="M200.1,210.8c0,8.3-5.7,11.9-11.1,11.9c-6,0-10.7-4.4-10.7-11.5c0-7.5,4.9-11.9,11.1-11.9
+ C195.8,199.3,200.1,204,200.1,210.8z M182.4,211c0,4.9,2.8,8.6,6.8,8.6c3.9,0,6.8-3.6,6.8-8.7c0-3.8-1.9-8.6-6.7-8.6
+ C184.5,202.4,182.4,206.8,182.4,211z"/>
+ <path class="st5" d="M222.1,216c0,2.3,0,4.3,0.2,6.1h-3.6l-0.2-3.6h-0.1c-1.1,1.8-3.4,4.2-7.4,4.2c-3.5,0-7.7-1.9-7.7-9.8v-13.1
+ h4.1v12.4c0,4.2,1.3,7.1,5,7.1c2.7,0,4.6-1.9,5.3-3.7c0.2-0.6,0.4-1.3,0.4-2.1v-13.7h4.1V216H222.1z"/>
+ <path class="st5" d="M246.2,189.4v27c0,2,0,4.2,0.2,5.8h-3.6l-0.2-3.9h-0.1c-1.2,2.5-4,4.4-7.6,4.4c-5.4,0-9.5-4.6-9.5-11.3
+ c0-7.4,4.6-12,10-12c3.4,0,5.7,1.6,6.7,3.4h0.1v-13.3L246.2,189.4L246.2,189.4z M242.2,208.9c0-0.5,0-1.2-0.2-1.7
+ c-0.6-2.6-2.8-4.7-5.9-4.7c-4.2,0-6.7,3.7-6.7,8.6c0,4.5,2.2,8.3,6.6,8.3c2.7,0,5.2-1.8,5.9-4.8c0.1-0.6,0.2-1.1,0.2-1.8
+ L242.2,208.9L242.2,208.9z"/>
+ </g>
+</g>
+</svg>
diff --git a/server/sonar-server/src/main/resources/org/sonar/server/badge/ws/templates/quality_gate_passed.svg b/server/sonar-server/src/main/resources/org/sonar/server/badge/ws/templates/quality_gate_passed.svg
new file mode 100644
index 00000000000..06cba700093
--- /dev/null
+++ b/server/sonar-server/src/main/resources/org/sonar/server/badge/ws/templates/quality_gate_passed.svg
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px"
+ viewBox="0 0 350 262.5" style="enable-background:new 0 0 350 262.5;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#FFFFFF;}
+ .st1{fill:#CFD3D7;}
+ .st2{fill:#29BE4C;}
+ .st3{fill:#F3702A;}
+ .st4{fill:#1B171B;}
+ .st5{enable-background:new ;}
+ .st6{fill:#434447;}
+</style>
+<g>
+ <path class="st0" d="M328.4,259.5H21.5C10.9,259.5,2,250.8,2,240V21.9C2,11.3,10.7,2.4,21.5,2.4h307.1c10.6,0,19.5,8.7,19.5,19.5
+ V240C347.9,250.8,339.3,259.5,328.4,259.5z"/>
+ <path class="st1" d="M328.4,260.4H21.5c-11.2,0-20.4-9.2-20.4-20.4V21.9c0-11.2,9-20.4,20.4-20.4h307.1c11.2,0,20.4,9.2,20.4,20.4
+ V240C348.8,251.2,339.8,260.4,328.4,260.4z M21.5,3.3c-10.3,0-18.6,8.3-18.6,18.6V240c0,10.3,8.3,18.6,18.6,18.6h307.1
+ c10.3,0,18.6-8.3,18.6-18.6V21.9c0-10.3-8.3-18.6-18.6-18.6C328.6,3.3,21.5,3.3,21.5,3.3z"/>
+</g>
+<path class="st2" d="M234.3,162.9H115.5c-17.6,0-31.9-14.4-31.9-31.9l0,0c0-17.6,14.4-31.9,31.9-31.9h118.8
+ c17.6,0,31.9,14.4,31.9,31.9l0,0C266.2,148.5,251.8,162.9,234.3,162.9z"/>
+<g id="SonarCloud_Black_2_">
+ <path class="st3" d="M302.5,204.3c-1.6-1.9-3.7-3.3-6-4v-0.1c0-6.9-5.6-12.5-12.5-12.5s-12.5,5.6-12.5,12.5c0,0.1,0,0.1,0,0.2
+ c-5.1,1.6-8.8,6.3-8.8,11.9c0,6.9,5.6,12.5,12.5,12.5c3.3,0,6.5-1.3,8.8-3.6c2.3,2.2,5.4,3.6,8.8,3.6c6.9,0,12.5-5.6,12.5-12.5
+ C305.3,209.4,304.3,206.5,302.5,204.3z M292.8,221.6c-5.2,0-9.4-4.2-9.4-9.4c0-0.9-0.7-1.6-1.6-1.6s-1.6,0.7-1.6,1.6
+ c0,2.3,0.6,4.5,1.8,6.4c-1.8,1.9-4.2,3-6.8,3c-5.2,0-9.4-4.2-9.4-9.4s4.2-9.4,9.4-9.4c1.1,0,2.2,0.2,3.2,0.6l0,0
+ c0.4,0.1,0.9,0.4,1,0.5c0.7,0.6,1.7,0.5,2.2-0.2c0.6-0.7,0.5-1.7-0.2-2.2c-0.7-0.6-1.8-1-2-1.1c-1.4-0.5-2.8-0.8-4.3-0.8
+ c-0.2,0-0.4,0-0.6,0c0.2-5,4.3-9,9.3-9c5.2,0,9.4,4.2,9.4,9.4c0,3-1.5,5.9-3.9,7.6c-0.7,0.5-0.9,1.5-0.4,2.2
+ c0.3,0.4,0.8,0.7,1.3,0.7c0.3,0,0.6-0.1,0.9-0.3c2.4-1.7,4-4.1,4.8-6.9c3.6,1.3,6.1,4.8,6.1,8.8C302.2,217.4,298,221.6,292.8,221.6
+ z"/>
+ <g>
+ <path class="st4" d="M45.1,216c1.3,0.8,4,1.7,6,1.7c2.1,0,3-0.7,3-1.9s-0.7-1.7-3.3-2.6c-4.7-1.6-6.5-4.1-6.4-6.8
+ c0-4.2,3.6-7.4,9.2-7.4c2.6,0,5,0.6,6.4,1.3l-1.2,4.8c-1-0.6-3-1.3-4.9-1.3c-1.7,0-2.7,0.7-2.7,1.8s0.9,1.6,3.6,2.6
+ c4.3,1.5,6.1,3.6,6.1,7c0,4.2-3.3,7.3-9.8,7.3c-3,0-5.6-0.6-7.3-1.6L45.1,216z"/>
+ <path class="st4" d="M85.6,210.6c0,8.3-5.9,12-11.9,12c-6.6,0-11.7-4.3-11.7-11.6s4.8-11.9,12-11.9
+ C81,199.1,85.6,203.8,85.6,210.6z M69.3,210.8c0,3.9,1.6,6.8,4.6,6.8c2.7,0,4.5-2.7,4.5-6.8c0-3.4-1.3-6.8-4.5-6.8
+ C70.5,204.1,69.3,207.5,69.3,210.8z"/>
+ <path class="st4" d="M88.1,206.8c0-2.8-0.1-5.2-0.2-7.2H94l0.3,3.1h0.1c0.9-1.4,3.2-3.6,7-3.6c4.6,0,8.1,3,8.1,9.7v13.4h-7v-12.5
+ c0-2.9-1-4.9-3.6-4.9c-1.9,0-3.1,1.3-3.5,2.6c-0.2,0.4-0.3,1.1-0.3,1.8v13h-7V206.8z"/>
+ <path class="st4" d="M126.1,222.1l-0.4-2.3h-0.1c-1.5,1.8-3.8,2.8-6.5,2.8c-4.6,0-7.3-3.3-7.3-6.9c0-5.9,5.3-8.7,13.2-8.6v-0.3
+ c0-1.2-0.6-2.9-4.1-2.9c-2.3,0-4.7,0.8-6.2,1.7l-1.3-4.5c1.6-0.9,4.7-2,8.8-2c7.5,0,9.9,4.4,9.9,9.7v7.8c0,2.2,0.1,4.2,0.3,5.5
+ H126.1z M125.3,211.5c-3.7,0-6.6,0.8-6.6,3.6c0,1.8,1.2,2.7,2.8,2.7c1.8,0,3.2-1.2,3.6-2.6c0.1-0.4,0.1-0.8,0.1-1.2L125.3,211.5
+ L125.3,211.5z"/>
+ <path class="st4" d="M135.8,207c0-3.3-0.1-5.5-0.2-7.4h6l0.2,4.1h0.2c1.2-3.3,3.9-4.7,6.1-4.7c0.6,0,1,0,1.5,0.1v6.6
+ c-0.5-0.1-1.1-0.2-1.9-0.2c-2.6,0-4.3,1.4-4.8,3.6c-0.1,0.5-0.1,1-0.1,1.6v11.4h-7V207z"/>
+ <path class="st4" d="M167.9,221.3c-1.1,0.6-3.4,1.3-6.4,1.3c-6.7,0-11.1-4.6-11.1-11.4c0-6.9,4.7-11.9,12-11.9
+ c2.4,0,4.5,0.6,5.6,1.2l-0.9,3.1c-1-0.6-2.5-1.1-4.7-1.1c-5.1,0-7.9,3.8-7.9,8.4c0,5.2,3.3,8.3,7.7,8.3c2.3,0,3.8-0.6,5-1.1
+ L167.9,221.3z"/>
+ <path class="st4" d="M170.9,189.4h4.1v32.7h-4.1V189.4z"/>
+ <path class="st4" d="M200.1,210.8c0,8.3-5.7,11.9-11.1,11.9c-6,0-10.7-4.4-10.7-11.5c0-7.5,4.9-11.9,11.1-11.9
+ C195.8,199.3,200.1,204,200.1,210.8z M182.4,211c0,4.9,2.8,8.6,6.8,8.6c3.9,0,6.8-3.6,6.8-8.7c0-3.8-1.9-8.6-6.7-8.6
+ C184.5,202.4,182.4,206.8,182.4,211z"/>
+ <path class="st4" d="M222.1,216c0,2.3,0,4.3,0.2,6.1h-3.6l-0.2-3.6h-0.1c-1.1,1.8-3.4,4.2-7.4,4.2c-3.5,0-7.7-1.9-7.7-9.8v-13.1
+ h4.1v12.4c0,4.2,1.3,7.1,5,7.1c2.7,0,4.6-1.9,5.3-3.7c0.2-0.6,0.4-1.3,0.4-2.1v-13.7h4.1V216H222.1z"/>
+ <path class="st4" d="M246.2,189.4v27c0,2,0,4.2,0.2,5.8h-3.6l-0.2-3.9h-0.1c-1.2,2.5-4,4.4-7.6,4.4c-5.4,0-9.5-4.6-9.5-11.3
+ c0-7.4,4.6-12,10-12c3.4,0,5.7,1.6,6.7,3.4h0.1v-13.3L246.2,189.4L246.2,189.4z M242.2,208.9c0-0.5,0-1.2-0.2-1.7
+ c-0.6-2.6-2.8-4.7-5.9-4.7c-4.2,0-6.7,3.7-6.7,8.6c0,4.5,2.2,8.3,6.6,8.3c2.7,0,5.2-1.8,5.9-4.8c0.1-0.6,0.2-1.1,0.2-1.8
+ L242.2,208.9L242.2,208.9z"/>
+ </g>
+</g>
+<g class="st5">
+ <path class="st6" d="M94.9,54.1c0,2.7-0.4,5-1.3,7c-0.9,1.9-2.1,3.5-3.6,4.6l5,3.9l-2.5,2.3l-5.9-4.7c-0.9,0.2-1.9,0.3-2.9,0.3
+ c-2.2,0-4.1-0.5-5.8-1.6c-1.7-1.1-3-2.6-3.9-4.6c-0.9-2-1.4-4.3-1.4-6.9v-2c0-2.7,0.5-5,1.4-7.1c0.9-2.1,2.2-3.6,3.9-4.7
+ s3.6-1.6,5.8-1.6c2.2,0,4.2,0.5,5.9,1.6c1.7,1.1,3,2.6,3.9,4.7c0.9,2,1.4,4.4,1.4,7.1V54.1z M91.3,52.3c0-3.3-0.7-5.8-2-7.6
+ c-1.3-1.8-3.2-2.7-5.6-2.7c-2.3,0-4.1,0.9-5.5,2.6c-1.3,1.8-2,4.2-2.1,7.4v2c0,3.2,0.7,5.7,2,7.5c1.3,1.8,3.2,2.8,5.6,2.8
+ s4.2-0.9,5.5-2.6c1.3-1.7,2-4.2,2-7.4V52.3z"/>
+ <path class="st6" d="M112.8,65.1c-1.4,1.6-3.4,2.4-6.1,2.4c-2.2,0-3.9-0.6-5-1.9s-1.7-3.2-1.7-5.7V46.5h3.5v13.4
+ c0,3.1,1.3,4.7,3.8,4.7c2.7,0,4.5-1,5.4-3v-15h3.5v20.7h-3.4L112.8,65.1z"/>
+ <path class="st6" d="M134.4,67.1c-0.2-0.4-0.4-1.1-0.5-2.2c-1.6,1.7-3.6,2.6-5.9,2.6c-2,0-3.7-0.6-5-1.7s-2-2.6-2-4.4
+ c0-2.2,0.8-3.8,2.5-5s3.9-1.8,6.9-1.8h3.4V53c0-1.2-0.4-2.2-1.1-3c-0.7-0.7-1.8-1.1-3.3-1.1c-1.3,0-2.3,0.3-3.2,1
+ c-0.9,0.6-1.3,1.4-1.3,2.3h-3.6c0-1,0.4-2,1.1-3c0.7-1,1.7-1.7,3-2.3c1.3-0.6,2.6-0.8,4.1-0.8c2.4,0,4.3,0.6,5.6,1.8
+ c1.4,1.2,2.1,2.8,2.1,4.9v9.5c0,1.9,0.2,3.4,0.7,4.5v0.3H134.4z M128.5,64.4c1.1,0,2.2-0.3,3.2-0.9c1-0.6,1.7-1.3,2.2-2.2v-4.2
+ h-2.8c-4.3,0-6.5,1.3-6.5,3.8c0,1.1,0.4,2,1.1,2.6C126.4,64.1,127.4,64.4,128.5,64.4z"/>
+ <path class="st6" d="M146.8,67.1h-3.5V37.8h3.5V67.1z"/>
+ <path class="st6" d="M152.5,41c0-0.6,0.2-1.1,0.5-1.5s0.9-0.6,1.6-0.6s1.2,0.2,1.6,0.6s0.5,0.9,0.5,1.5s-0.2,1.1-0.5,1.4
+ s-0.9,0.6-1.6,0.6s-1.2-0.2-1.6-0.6S152.5,41.5,152.5,41z M156.3,67.1h-3.5V46.5h3.5V67.1z"/>
+ <path class="st6" d="M166.7,41.4v5h3.9v2.7h-3.9V62c0,0.8,0.2,1.5,0.5,1.9c0.3,0.4,0.9,0.6,1.8,0.6c0.4,0,1-0.1,1.7-0.2v2.9
+ c-0.9,0.3-1.8,0.4-2.7,0.4c-1.6,0-2.8-0.5-3.6-1.4c-0.8-1-1.2-2.3-1.2-4.1V49.2h-3.8v-2.7h3.8v-5H166.7z"/>
+ <path class="st6" d="M181.5,62l4.8-15.5h3.8l-8.3,23.9c-1.3,3.4-3.3,5.2-6.1,5.2l-0.7-0.1l-1.3-0.2v-2.9l1,0.1
+ c1.2,0,2.1-0.2,2.8-0.7s1.2-1.4,1.7-2.7l0.8-2.1l-7.4-20.5h3.9L181.5,62z"/>
+ <path class="st6" d="M224.1,63.5c-0.9,1.4-2.3,2.4-3.9,3c-1.7,0.7-3.7,1-5.9,1c-2.3,0-4.3-0.5-6-1.6s-3.1-2.6-4.1-4.5
+ c-1-2-1.5-4.2-1.5-6.8v-2.4c0-4.2,1-7.4,2.9-9.8c2-2.3,4.7-3.5,8.2-3.5c2.9,0,5.2,0.7,7,2.2c1.8,1.5,2.9,3.6,3.2,6.3h-3.7
+ c-0.7-3.7-2.9-5.5-6.6-5.5c-2.5,0-4.3,0.9-5.6,2.6c-1.3,1.7-1.9,4.2-1.9,7.5v2.3c0,3.1,0.7,5.6,2.1,7.5c1.4,1.8,3.4,2.8,5.8,2.8
+ c1.4,0,2.6-0.2,3.6-0.5s1.9-0.8,2.6-1.5v-6.2H214v-3h10.1V63.5z"/>
+ <path class="st6" d="M242.4,67.1c-0.2-0.4-0.4-1.1-0.5-2.2c-1.6,1.7-3.6,2.6-5.9,2.6c-2,0-3.7-0.6-5-1.7s-2-2.6-2-4.4
+ c0-2.2,0.8-3.8,2.5-5s3.9-1.8,6.9-1.8h3.4V53c0-1.2-0.4-2.2-1.1-3c-0.7-0.7-1.8-1.1-3.3-1.1c-1.3,0-2.3,0.3-3.2,1
+ c-0.9,0.6-1.3,1.4-1.3,2.3h-3.6c0-1,0.4-2,1.1-3c0.7-1,1.7-1.7,3-2.3c1.3-0.6,2.6-0.8,4.1-0.8c2.4,0,4.3,0.6,5.6,1.8
+ c1.4,1.2,2.1,2.8,2.1,4.9v9.5c0,1.9,0.2,3.4,0.7,4.5v0.3H242.4z M236.5,64.4c1.1,0,2.2-0.3,3.2-0.9c1-0.6,1.7-1.3,2.2-2.2v-4.2
+ h-2.8c-4.3,0-6.5,1.3-6.5,3.8c0,1.1,0.4,2,1.1,2.6C234.4,64.1,235.4,64.4,236.5,64.4z"/>
+ <path class="st6" d="M255.7,41.4v5h3.9v2.7h-3.9V62c0,0.8,0.2,1.5,0.5,1.9c0.3,0.4,0.9,0.6,1.8,0.6c0.4,0,1-0.1,1.7-0.2v2.9
+ c-0.9,0.3-1.8,0.4-2.7,0.4c-1.6,0-2.8-0.5-3.6-1.4c-0.8-1-1.2-2.3-1.2-4.1V49.2h-3.8v-2.7h3.8v-5H255.7z"/>
+ <path class="st6" d="M272.3,67.5c-2.8,0-5.1-0.9-6.8-2.8c-1.8-1.8-2.6-4.3-2.6-7.4v-0.7c0-2.1,0.4-3.9,1.2-5.5
+ c0.8-1.6,1.9-2.9,3.3-3.8c1.4-0.9,2.9-1.4,4.6-1.4c2.7,0,4.8,0.9,6.3,2.7c1.5,1.8,2.2,4.3,2.2,7.6v1.5h-14c0.1,2,0.6,3.7,1.8,4.9
+ c1.1,1.3,2.6,1.9,4.3,1.9c1.2,0,2.3-0.3,3.2-0.8c0.9-0.5,1.6-1.2,2.3-2l2.2,1.7C278.4,66.2,275.8,67.5,272.3,67.5z M271.9,49
+ c-1.4,0-2.6,0.5-3.6,1.6c-1,1-1.6,2.5-1.8,4.4h10.4v-0.3c-0.1-1.8-0.6-3.2-1.5-4.2S273.3,49,271.9,49z"/>
+</g>
+<g class="st5">
+ <path class="st0" d="M131.5,133.8v10.7h-6.2v-30.3H137c2.3,0,4.3,0.4,6,1.2s3.1,2,4,3.6s1.4,3.3,1.4,5.2c0,3-1,5.3-3.1,7
+ c-2,1.7-4.8,2.6-8.4,2.6H131.5z M131.5,128.8h5.6c1.7,0,2.9-0.4,3.8-1.2c0.9-0.8,1.3-1.9,1.3-3.3c0-1.5-0.4-2.7-1.3-3.6
+ c-0.9-0.9-2.1-1.4-3.6-1.4h-5.7V128.8z"/>
+ <path class="st0" d="M166.1,138.3h-11l-2.1,6.2h-6.6l11.3-30.3h5.8l11.3,30.3h-6.6L166.1,138.3z M156.9,133.2h7.6l-3.8-11.3
+ L156.9,133.2z"/>
+ <path class="st0" d="M193.4,136.6c0-1.2-0.4-2.1-1.2-2.7s-2.3-1.3-4.5-2s-3.9-1.4-5.1-2.1c-3.4-1.9-5.2-4.4-5.2-7.5
+ c0-1.6,0.5-3.1,1.4-4.4c0.9-1.3,2.2-2.3,4-3s3.7-1.1,5.8-1.1c2.2,0,4.1,0.4,5.8,1.2s3,1.9,3.9,3.3c0.9,1.4,1.4,3.1,1.4,4.9h-6.2
+ c0-1.4-0.4-2.5-1.3-3.2c-0.9-0.8-2.1-1.2-3.7-1.2c-1.5,0-2.7,0.3-3.6,1c-0.8,0.6-1.3,1.5-1.3,2.6c0,1,0.5,1.8,1.5,2.5
+ c1,0.7,2.5,1.3,4.4,1.9c3.6,1.1,6.1,2.4,7.8,4c1.6,1.6,2.4,3.6,2.4,5.9c0,2.6-1,4.7-3,6.2s-4.7,2.2-8,2.2c-2.3,0-4.5-0.4-6.4-1.3
+ c-1.9-0.9-3.4-2-4.4-3.5c-1-1.5-1.5-3.2-1.5-5.2h6.3c0,3.3,2,5,6,5c1.5,0,2.6-0.3,3.5-0.9C193,138.5,193.4,137.7,193.4,136.6z"/>
+ <path class="st0" d="M219.7,136.6c0-1.2-0.4-2.1-1.2-2.7s-2.3-1.3-4.5-2s-3.9-1.4-5.1-2.1c-3.4-1.9-5.2-4.4-5.2-7.5
+ c0-1.6,0.5-3.1,1.4-4.4c0.9-1.3,2.2-2.3,4-3s3.7-1.1,5.8-1.1c2.2,0,4.1,0.4,5.8,1.2s3,1.9,3.9,3.3c0.9,1.4,1.4,3.1,1.4,4.9h-6.2
+ c0-1.4-0.4-2.5-1.3-3.2c-0.9-0.8-2.1-1.2-3.7-1.2c-1.5,0-2.7,0.3-3.6,1c-0.8,0.6-1.3,1.5-1.3,2.6c0,1,0.5,1.8,1.5,2.5
+ c1,0.7,2.5,1.3,4.4,1.9c3.6,1.1,6.1,2.4,7.8,4c1.6,1.6,2.4,3.6,2.4,5.9c0,2.6-1,4.7-3,6.2s-4.7,2.2-8,2.2c-2.3,0-4.5-0.4-6.4-1.3
+ c-1.9-0.9-3.4-2-4.4-3.5c-1-1.5-1.5-3.2-1.5-5.2h6.3c0,3.3,2,5,6,5c1.5,0,2.6-0.3,3.5-0.9C219.2,138.5,219.7,137.7,219.7,136.6z"/>
+</g>
+</svg>
diff --git a/server/sonar-server/src/main/resources/org/sonar/server/badge/ws/templates/quality_gate_warn.svg b/server/sonar-server/src/main/resources/org/sonar/server/badge/ws/templates/quality_gate_warn.svg
new file mode 100644
index 00000000000..f43ca6404a5
--- /dev/null
+++ b/server/sonar-server/src/main/resources/org/sonar/server/badge/ws/templates/quality_gate_warn.svg
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px"
+ viewBox="0 0 350 262.5" style="enable-background:new 0 0 350 262.5;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#FFFFFF;}
+ .st1{fill:#CFD3D7;}
+ .st2{fill:#ED7D20;}
+ .st3{fill:#434447;}
+ .st4{fill:#F3702A;}
+ .st5{fill:#1B171B;}
+</style>
+<g>
+ <path class="st0" d="M328.4,259.5H21.3c-10.6,0-19.5-8.7-19.5-19.5V22c0-10.6,8.7-19.5,19.5-19.5h307.1c10.6,0,19.5,8.7,19.5,19.5
+ v218C347.9,250.8,339,259.5,328.4,259.5z"/>
+ <path class="st1" d="M328.4,260.4H21.3c-11.2,0-20.4-9.2-20.4-20.4V22c0-11.2,9.2-20.4,20.4-20.4h307.1c11.2,0,20.4,9.2,20.4,20.4
+ v218C348.8,251.2,339.5,260.4,328.4,260.4z M21.3,3.4C11,3.4,2.7,11.7,2.7,22v218c0,10.3,8.3,18.6,18.6,18.6h307.1
+ c10.3,0,18.6-8.3,18.6-18.6V22c0-10.3-8.3-18.6-18.6-18.6C328.4,3.4,21.3,3.4,21.3,3.4z"/>
+</g>
+<path class="st2" d="M227.6,162.9H120.4c-17.6,0-31.9-14.4-31.9-31.9l0,0c0-17.6,14.4-31.9,31.9-31.9h107.2
+ c17.6,0,31.9,14.4,31.9,31.9l0,0C259.5,148.6,245.2,162.9,227.6,162.9z"/>
+<g>
+ <path class="st3" d="M94.9,54.3c0,2.7-0.4,5-1.3,7c-0.9,1.9-2.1,3.5-3.6,4.6l5,3.9L92.5,72l-5.9-4.7c-0.9,0.2-1.9,0.3-2.9,0.3
+ c-2.2,0-4.1-0.5-5.8-1.6c-1.7-1.1-3-2.6-3.9-4.6s-1.4-4.3-1.4-6.9v-2c0-2.7,0.5-5,1.4-7.1s2.2-3.6,3.9-4.7s3.6-1.6,5.8-1.6
+ c2.2,0,4.2,0.5,5.9,1.6c1.7,1.1,3,2.6,3.9,4.7c0.9,2,1.4,4.4,1.4,7.1V54.3z M91.3,52.5c0-3.3-0.7-5.8-2-7.6s-3.2-2.7-5.6-2.7
+ c-2.3,0-4.1,0.9-5.5,2.6c-1.3,1.8-2,4.2-2.1,7.4v2c0,3.2,0.7,5.7,2,7.5s3.2,2.8,5.6,2.8s4.2-0.9,5.5-2.6c1.3-1.7,2-4.2,2-7.4
+ L91.3,52.5L91.3,52.5z"/>
+ <path class="st3" d="M112.8,65.3c-1.4,1.6-3.4,2.4-6.1,2.4c-2.2,0-3.9-0.6-5-1.9c-1.2-1.3-1.7-3.2-1.7-5.7V46.6h3.5V60
+ c0,3.1,1.3,4.7,3.8,4.7c2.7,0,4.5-1,5.4-3v-15h3.5v20.7h-3.4L112.8,65.3z"/>
+ <path class="st3" d="M134.4,67.3c-0.2-0.4-0.4-1.1-0.5-2.2c-1.6,1.7-3.6,2.6-5.9,2.6c-2,0-3.7-0.6-5-1.7c-1.3-1.2-2-2.6-2-4.4
+ c0-2.2,0.8-3.8,2.5-5c1.6-1.2,3.9-1.8,6.9-1.8h3.4v-1.6c0-1.2-0.4-2.2-1.1-3c-0.7-0.7-1.8-1.1-3.3-1.1c-1.3,0-2.3,0.3-3.2,1
+ c-0.9,0.6-1.3,1.4-1.3,2.3h-3.6c0-1,0.4-2,1.1-3s1.7-1.7,3-2.3s2.6-0.8,4.1-0.8c2.4,0,4.3,0.6,5.6,1.8c1.4,1.2,2.1,2.8,2.1,4.9v9.5
+ c0,1.9,0.2,3.4,0.7,4.5v0.3L134.4,67.3L134.4,67.3z M128.5,64.6c1.1,0,2.2-0.3,3.2-0.9s1.7-1.3,2.2-2.2v-4.2h-2.8
+ c-4.3,0-6.5,1.3-6.5,3.8c0,1.1,0.4,2,1.1,2.6C126.4,64.3,127.4,64.6,128.5,64.6z"/>
+ <path class="st3" d="M146.8,67.3h-3.5V37.9h3.5V67.3z"/>
+ <path class="st3" d="M152.5,41.1c0-0.6,0.2-1.1,0.5-1.5s0.9-0.6,1.6-0.6c0.7,0,1.2,0.2,1.6,0.6s0.5,0.9,0.5,1.5s-0.2,1.1-0.5,1.4
+ s-0.9,0.6-1.6,0.6c-0.7,0-1.2-0.2-1.6-0.6S152.5,41.7,152.5,41.1z M156.3,67.3h-3.5V46.6h3.5V67.3z"/>
+ <path class="st3" d="M166.7,41.6v5h3.9v2.7h-3.9v12.8c0,0.8,0.2,1.5,0.5,1.9s0.9,0.6,1.8,0.6c0.4,0,1-0.1,1.7-0.2v2.9
+ c-0.9,0.3-1.8,0.4-2.7,0.4c-1.6,0-2.8-0.5-3.6-1.4c-0.8-1-1.2-2.3-1.2-4.1V49.4h-3.8v-2.7h3.8v-5h3.5V41.6z"/>
+ <path class="st3" d="M181.5,62.1l4.8-15.5h3.8l-8.3,23.9c-1.3,3.4-3.3,5.2-6.1,5.2l-0.7-0.1l-1.3-0.2v-2.9l1,0.1
+ c1.2,0,2.1-0.2,2.8-0.7s1.2-1.4,1.7-2.7l0.8-2.1l-7.4-20.5h3.9L181.5,62.1z"/>
+ <path class="st3" d="M224.1,63.7c-0.9,1.4-2.3,2.4-3.9,3c-1.7,0.7-3.7,1-5.9,1c-2.3,0-4.3-0.5-6-1.6c-1.8-1.1-3.1-2.6-4.1-4.5
+ c-1-2-1.5-4.2-1.5-6.8v-2.4c0-4.2,1-7.4,2.9-9.8c2-2.3,4.7-3.5,8.3-3.5c2.9,0,5.2,0.7,7,2.2s2.9,3.6,3.2,6.3h-3.7
+ c-0.7-3.7-2.9-5.5-6.6-5.5c-2.5,0-4.3,0.9-5.6,2.6c-1.3,1.7-1.9,4.2-1.9,7.5v2.3c0,3.1,0.7,5.6,2.1,7.5c1.4,1.8,3.4,2.8,5.8,2.8
+ c1.4,0,2.6-0.2,3.6-0.5c1-0.3,1.9-0.8,2.6-1.5v-6.2H214v-3h10.1V63.7z"/>
+ <path class="st3" d="M242.4,67.3c-0.2-0.4-0.4-1.1-0.5-2.2c-1.6,1.7-3.6,2.6-5.9,2.6c-2,0-3.7-0.6-5-1.7c-1.3-1.2-2-2.6-2-4.4
+ c0-2.2,0.8-3.8,2.5-5c1.6-1.2,3.9-1.8,6.9-1.8h3.4v-1.6c0-1.2-0.4-2.2-1.1-3c-0.7-0.7-1.8-1.1-3.3-1.1c-1.3,0-2.3,0.3-3.2,1
+ c-0.9,0.6-1.3,1.4-1.3,2.3h-3.6c0-1,0.4-2,1.1-3c0.7-1,1.7-1.7,3-2.3s2.6-0.8,4.1-0.8c2.4,0,4.3,0.6,5.6,1.8
+ c1.4,1.2,2.1,2.8,2.1,4.9v9.5c0,1.9,0.2,3.4,0.7,4.5v0.3L242.4,67.3L242.4,67.3z M236.5,64.6c1.1,0,2.2-0.3,3.2-0.9
+ s1.7-1.3,2.2-2.2v-4.2h-2.8c-4.3,0-6.5,1.3-6.5,3.8c0,1.1,0.4,2,1.1,2.6C234.4,64.3,235.4,64.6,236.5,64.6z"/>
+ <path class="st3" d="M255.7,41.6v5h3.9v2.7h-3.9v12.8c0,0.8,0.2,1.5,0.5,1.9c0.3,0.4,0.9,0.6,1.8,0.6c0.4,0,1-0.1,1.7-0.2v2.9
+ c-0.9,0.3-1.8,0.4-2.7,0.4c-1.6,0-2.8-0.5-3.6-1.4c-0.8-1-1.2-2.3-1.2-4.1V49.4h-3.8v-2.7h3.8v-5h3.5V41.6z"/>
+ <path class="st3" d="M272.3,67.7c-2.8,0-5.1-0.9-6.8-2.8c-1.8-1.8-2.6-4.3-2.6-7.4v-0.6c0-2.1,0.4-3.9,1.2-5.5
+ c0.8-1.6,1.9-2.9,3.3-3.8c1.4-0.9,2.9-1.4,4.6-1.4c2.7,0,4.8,0.9,6.3,2.7s2.2,4.3,2.2,7.6V58h-14c0.1,2,0.6,3.7,1.8,4.9
+ c1.1,1.3,2.6,1.9,4.3,1.9c1.2,0,2.3-0.3,3.2-0.8c0.9-0.5,1.6-1.2,2.3-2l2.2,1.7C278.4,66.4,275.8,67.7,272.3,67.7z M271.9,49.1
+ c-1.4,0-2.6,0.5-3.6,1.6c-1,1-1.6,2.5-1.8,4.4h10.4v-0.3c-0.1-1.8-0.6-3.2-1.5-4.2S273.3,49.1,271.9,49.1z"/>
+</g>
+<g id="SonarCloud_Black_2_">
+ <path class="st4" d="M302.5,204.3c-1.6-1.9-3.7-3.3-6-4v-0.1c0-6.9-5.6-12.5-12.5-12.5s-12.5,5.6-12.5,12.5c0,0.1,0,0.1,0,0.2
+ c-5.1,1.6-8.8,6.3-8.8,11.9c0,6.9,5.6,12.5,12.5,12.5c3.3,0,6.5-1.3,8.8-3.6c2.3,2.2,5.4,3.6,8.8,3.6c6.9,0,12.5-5.6,12.5-12.5
+ C305.3,209.4,304.3,206.5,302.5,204.3z M292.8,221.6c-5.2,0-9.4-4.2-9.4-9.4c0-0.9-0.7-1.6-1.6-1.6s-1.6,0.7-1.6,1.6
+ c0,2.3,0.6,4.5,1.8,6.4c-1.8,1.9-4.2,3-6.8,3c-5.2,0-9.4-4.2-9.4-9.4s4.2-9.4,9.4-9.4c1.1,0,2.2,0.2,3.2,0.6l0,0
+ c0.4,0.1,0.9,0.4,1,0.5c0.7,0.6,1.7,0.5,2.2-0.2c0.6-0.7,0.5-1.7-0.2-2.2c-0.7-0.6-1.8-1-2-1.1c-1.4-0.5-2.8-0.8-4.3-0.8
+ c-0.2,0-0.4,0-0.6,0c0.2-5,4.3-9,9.3-9c5.2,0,9.4,4.2,9.4,9.4c0,3-1.5,5.9-3.9,7.6c-0.7,0.5-0.9,1.5-0.4,2.2
+ c0.3,0.4,0.8,0.7,1.3,0.7c0.3,0,0.6-0.1,0.9-0.3c2.4-1.7,4-4.1,4.8-6.9c3.6,1.3,6.1,4.8,6.1,8.8C302.2,217.4,298,221.6,292.8,221.6
+ z"/>
+ <g>
+ <path class="st5" d="M45.1,216c1.3,0.8,4,1.7,6,1.7c2.1,0,3-0.7,3-1.9s-0.7-1.7-3.3-2.6c-4.7-1.6-6.5-4.1-6.4-6.8
+ c0-4.2,3.6-7.4,9.2-7.4c2.6,0,5,0.6,6.4,1.3l-1.2,4.8c-1-0.6-3-1.3-4.9-1.3c-1.7,0-2.7,0.7-2.7,1.8s0.9,1.6,3.6,2.6
+ c4.3,1.5,6.1,3.6,6.1,7c0,4.2-3.3,7.3-9.8,7.3c-3,0-5.6-0.6-7.3-1.6L45.1,216z"/>
+ <path class="st5" d="M85.6,210.6c0,8.3-5.9,12-11.9,12c-6.6,0-11.7-4.3-11.7-11.6s4.8-11.9,12-11.9
+ C81,199.1,85.6,203.8,85.6,210.6z M69.3,210.8c0,3.9,1.6,6.8,4.6,6.8c2.7,0,4.5-2.7,4.5-6.8c0-3.4-1.3-6.8-4.5-6.8
+ C70.5,204.1,69.3,207.5,69.3,210.8z"/>
+ <path class="st5" d="M88.1,206.8c0-2.8-0.1-5.2-0.2-7.2H94l0.3,3.1h0.1c0.9-1.4,3.2-3.6,7-3.6c4.6,0,8.1,3,8.1,9.7v13.4h-7v-12.5
+ c0-2.9-1-4.9-3.6-4.9c-1.9,0-3.1,1.3-3.5,2.6c-0.2,0.4-0.3,1.1-0.3,1.8v13h-7V206.8z"/>
+ <path class="st5" d="M126.1,222.1l-0.4-2.3h-0.1c-1.5,1.8-3.8,2.8-6.5,2.8c-4.6,0-7.3-3.3-7.3-6.9c0-5.9,5.3-8.7,13.2-8.6v-0.3
+ c0-1.2-0.6-2.9-4.1-2.9c-2.3,0-4.7,0.8-6.2,1.7l-1.3-4.5c1.6-0.9,4.7-2,8.8-2c7.5,0,9.9,4.4,9.9,9.7v7.8c0,2.2,0.1,4.2,0.3,5.5
+ H126.1z M125.3,211.5c-3.7,0-6.6,0.8-6.6,3.6c0,1.8,1.2,2.7,2.8,2.7c1.8,0,3.2-1.2,3.6-2.6c0.1-0.4,0.1-0.8,0.1-1.2L125.3,211.5
+ L125.3,211.5z"/>
+ <path class="st5" d="M135.8,207c0-3.3-0.1-5.5-0.2-7.4h6l0.2,4.1h0.2c1.2-3.3,3.9-4.7,6.1-4.7c0.6,0,1,0,1.5,0.1v6.6
+ c-0.5-0.1-1.1-0.2-1.9-0.2c-2.6,0-4.3,1.4-4.8,3.6c-0.1,0.5-0.1,1-0.1,1.6v11.4h-7V207z"/>
+ <path class="st5" d="M167.9,221.3c-1.1,0.6-3.4,1.3-6.4,1.3c-6.7,0-11.1-4.6-11.1-11.4c0-6.9,4.7-11.9,12-11.9
+ c2.4,0,4.5,0.6,5.6,1.2l-0.9,3.1c-1-0.6-2.5-1.1-4.7-1.1c-5.1,0-7.9,3.8-7.9,8.4c0,5.2,3.3,8.3,7.7,8.3c2.3,0,3.8-0.6,5-1.1
+ L167.9,221.3z"/>
+ <path class="st5" d="M170.9,189.4h4.1v32.7h-4.1V189.4z"/>
+ <path class="st5" d="M200.1,210.8c0,8.3-5.7,11.9-11.1,11.9c-6,0-10.7-4.4-10.7-11.5c0-7.5,4.9-11.9,11.1-11.9
+ C195.8,199.3,200.1,204,200.1,210.8z M182.4,211c0,4.9,2.8,8.6,6.8,8.6c3.9,0,6.8-3.6,6.8-8.7c0-3.8-1.9-8.6-6.7-8.6
+ C184.5,202.4,182.4,206.8,182.4,211z"/>
+ <path class="st5" d="M222.1,216c0,2.3,0,4.3,0.2,6.1h-3.6l-0.2-3.6h-0.1c-1.1,1.8-3.4,4.2-7.4,4.2c-3.5,0-7.7-1.9-7.7-9.8v-13.1
+ h4.1v12.4c0,4.2,1.3,7.1,5,7.1c2.7,0,4.6-1.9,5.3-3.7c0.2-0.6,0.4-1.3,0.4-2.1v-13.7h4.1V216H222.1z"/>
+ <path class="st5" d="M246.2,189.4v27c0,2,0,4.2,0.2,5.8h-3.6l-0.2-3.9h-0.1c-1.2,2.5-4,4.4-7.6,4.4c-5.4,0-9.5-4.6-9.5-11.3
+ c0-7.4,4.6-12,10-12c3.4,0,5.7,1.6,6.7,3.4h0.1v-13.3L246.2,189.4L246.2,189.4z M242.2,208.9c0-0.5,0-1.2-0.2-1.7
+ c-0.6-2.6-2.8-4.7-5.9-4.7c-4.2,0-6.7,3.7-6.7,8.6c0,4.5,2.2,8.3,6.6,8.3c2.7,0,5.2-1.8,5.9-4.8c0.1-0.6,0.2-1.1,0.2-1.8
+ L242.2,208.9L242.2,208.9z"/>
+ </g>
+</g>
+<g>
+ <path class="st0" d="M139.1,136.9l4.1-21.6h6.2l-6.7,30.3h-6.3l-4.9-20.3l-4.9,20.3h-6.3l-6.7-30.3h6.2l4.1,21.5l5-21.5h5.3
+ L139.1,136.9z"/>
+ <path class="st0" d="M169,139.4h-11l-2.1,6.2h-6.6l11.3-30.3h5.8l11.4,30.3h-6.6L169,139.4z M159.7,134.4h7.6l-3.8-11.4
+ L159.7,134.4z"/>
+ <path class="st0" d="M191.8,134.6h-5v11.1h-6.2v-30.3h11.3c3.6,0,6.3,0.8,8.3,2.4c1.9,1.6,2.9,3.9,2.9,6.8c0,2.1-0.4,3.8-1.3,5.2
+ c-0.9,1.4-2.3,2.5-4.1,3.3l6.6,12.4v0.3h-6.7L191.8,134.6z M186.8,129.5h5c1.6,0,2.8-0.4,3.6-1.2c0.9-0.8,1.3-1.9,1.3-3.3
+ c0-1.4-0.4-2.6-1.2-3.4c-0.8-0.8-2.1-1.2-3.7-1.2h-5V129.5z"/>
+ <path class="st0" d="M232.5,145.7h-6.2l-12.2-20v20h-6.2v-30.3h6.2l12.2,20v-20h6.2V145.7z"/>
+</g>
+</svg>
diff --git a/server/sonar-server/src/main/resources/org/sonar/server/sticker/ws/templates/quality_gate_failed.svg b/server/sonar-server/src/main/resources/org/sonar/server/sticker/ws/templates/quality_gate_failed.svg
new file mode 100644
index 00000000000..010e1fef5b7
--- /dev/null
+++ b/server/sonar-server/src/main/resources/org/sonar/server/sticker/ws/templates/quality_gate_failed.svg
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px"
+ viewBox="0 0 350 262.5" style="enable-background:new 0 0 350 262.5;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#FFFFFF;}
+ .st1{fill:#CFD3D7;}
+ .st2{fill:#ED333A;}
+ .st3{fill:#434447;}
+ .st4{fill:#F3702A;}
+ .st5{fill:#1B171B;}
+</style>
+<g>
+ <path class="st0" d="M328.4,259.5H21.3c-10.6,0-19.5-8.7-19.5-19.5V22c0-10.6,8.7-19.5,19.5-19.5h307.1c10.6,0,19.5,8.7,19.5,19.5
+ V240C347.9,250.8,339,259.5,328.4,259.5z"/>
+ <path class="st1" d="M328.4,260.4H21.3c-11.2,0-20.4-9.2-20.4-20.4V22c0-11.2,9.2-20.4,20.4-20.4h307.1c11.2,0,20.4,9.2,20.4,20.4
+ V240C348.8,251.2,339.5,260.4,328.4,260.4z M21.3,3.4C11,3.4,2.7,11.7,2.7,22V240c0,10.3,8.3,18.6,18.6,18.6h307.1
+ c10.3,0,18.6-8.3,18.6-18.6V22c0-10.3-8.3-18.6-18.6-18.6H21.3z"/>
+</g>
+<path class="st2" d="M213,162.9h-77.2c-17.6,0-31.9-14.4-31.9-31.9l0,0c0-17.6,14.4-31.9,31.9-31.9H213c17.6,0,31.9,14.4,31.9,31.9
+ l0,0C244.9,148.6,230.6,162.9,213,162.9z"/>
+<g>
+ <path class="st3" d="M94.9,54.3c0,2.7-0.4,5-1.3,7c-0.9,1.9-2.1,3.5-3.6,4.6l5,3.9L92.5,72l-5.9-4.7c-0.9,0.2-1.9,0.3-2.9,0.3
+ c-2.2,0-4.1-0.5-5.8-1.6c-1.7-1.1-3-2.6-3.9-4.6c-0.9-2-1.4-4.3-1.4-6.9v-2c0-2.7,0.5-5,1.4-7.1c0.9-2.1,2.2-3.6,3.9-4.7
+ s3.6-1.6,5.8-1.6c2.2,0,4.2,0.5,5.9,1.6c1.7,1.1,3,2.6,3.9,4.7c0.9,2,1.4,4.4,1.4,7.1V54.3z M91.3,52.5c0-3.3-0.7-5.8-2-7.6
+ c-1.3-1.8-3.2-2.7-5.6-2.7c-2.3,0-4.1,0.9-5.5,2.6c-1.3,1.8-2,4.2-2.1,7.4v2c0,3.2,0.7,5.7,2,7.5c1.3,1.8,3.2,2.8,5.6,2.8
+ c2.4,0,4.2-0.9,5.5-2.6c1.3-1.7,2-4.2,2-7.4V52.5z"/>
+ <path class="st3" d="M112.8,65.3c-1.4,1.6-3.4,2.4-6.1,2.4c-2.2,0-3.9-0.6-5-1.9c-1.2-1.3-1.7-3.2-1.7-5.7V46.6h3.5V60
+ c0,3.1,1.3,4.7,3.8,4.7c2.7,0,4.5-1,5.4-3v-15h3.5v20.7h-3.4L112.8,65.3z"/>
+ <path class="st3" d="M134.4,67.3c-0.2-0.4-0.4-1.1-0.5-2.2c-1.6,1.7-3.6,2.6-5.9,2.6c-2,0-3.7-0.6-5-1.7c-1.3-1.2-2-2.6-2-4.4
+ c0-2.2,0.8-3.8,2.5-5c1.6-1.2,3.9-1.8,6.9-1.8h3.4v-1.6c0-1.2-0.4-2.2-1.1-3c-0.7-0.7-1.8-1.1-3.3-1.1c-1.3,0-2.3,0.3-3.2,1
+ c-0.9,0.6-1.3,1.4-1.3,2.3h-3.6c0-1,0.4-2,1.1-3c0.7-1,1.7-1.7,3-2.3c1.3-0.6,2.6-0.8,4.1-0.8c2.4,0,4.3,0.6,5.6,1.8
+ c1.4,1.2,2.1,2.8,2.1,4.9v9.5c0,1.9,0.2,3.4,0.7,4.5v0.3H134.4z M128.5,64.6c1.1,0,2.2-0.3,3.2-0.9c1-0.6,1.7-1.3,2.2-2.2v-4.2
+ h-2.8c-4.3,0-6.5,1.3-6.5,3.8c0,1.1,0.4,2,1.1,2.6C126.4,64.3,127.4,64.6,128.5,64.6z"/>
+ <path class="st3" d="M146.8,67.3h-3.5V37.9h3.5V67.3z"/>
+ <path class="st3" d="M152.5,41.1c0-0.6,0.2-1.1,0.5-1.5s0.9-0.6,1.6-0.6c0.7,0,1.2,0.2,1.6,0.6s0.5,0.9,0.5,1.5s-0.2,1.1-0.5,1.4
+ s-0.9,0.6-1.6,0.6c-0.7,0-1.2-0.2-1.6-0.6S152.5,41.7,152.5,41.1z M156.3,67.3h-3.5V46.6h3.5V67.3z"/>
+ <path class="st3" d="M166.7,41.6v5h3.9v2.7h-3.9v12.8c0,0.8,0.2,1.5,0.5,1.9c0.3,0.4,0.9,0.6,1.8,0.6c0.4,0,1-0.1,1.7-0.2v2.9
+ c-0.9,0.3-1.8,0.4-2.7,0.4c-1.6,0-2.8-0.5-3.6-1.4c-0.8-1-1.2-2.3-1.2-4.1V49.4h-3.8v-2.7h3.8v-5H166.7z"/>
+ <path class="st3" d="M181.5,62.1l4.8-15.5h3.8l-8.3,23.9c-1.3,3.4-3.3,5.2-6.1,5.2l-0.7-0.1l-1.3-0.2v-2.9l1,0.1
+ c1.2,0,2.1-0.2,2.8-0.7c0.7-0.5,1.2-1.4,1.7-2.7l0.8-2.1l-7.4-20.5h3.9L181.5,62.1z"/>
+ <path class="st3" d="M224.1,63.7c-0.9,1.4-2.3,2.4-3.9,3c-1.7,0.7-3.7,1-5.9,1c-2.3,0-4.3-0.5-6-1.6c-1.8-1.1-3.1-2.6-4.1-4.5
+ c-1-2-1.5-4.2-1.5-6.8v-2.4c0-4.2,1-7.4,2.9-9.8c2-2.3,4.7-3.5,8.3-3.5c2.9,0,5.2,0.7,7,2.2c1.8,1.5,2.9,3.6,3.2,6.3h-3.7
+ c-0.7-3.7-2.9-5.5-6.6-5.5c-2.5,0-4.3,0.9-5.6,2.6c-1.3,1.7-1.9,4.2-1.9,7.5v2.3c0,3.1,0.7,5.6,2.1,7.5c1.4,1.8,3.4,2.8,5.8,2.8
+ c1.4,0,2.6-0.2,3.6-0.5c1-0.3,1.9-0.8,2.6-1.5v-6.2H214v-3h10.1V63.7z"/>
+ <path class="st3" d="M242.4,67.3c-0.2-0.4-0.4-1.1-0.5-2.2c-1.6,1.7-3.6,2.6-5.9,2.6c-2,0-3.7-0.6-5-1.7c-1.3-1.2-2-2.6-2-4.4
+ c0-2.2,0.8-3.8,2.5-5c1.6-1.2,3.9-1.8,6.9-1.8h3.4v-1.6c0-1.2-0.4-2.2-1.1-3c-0.7-0.7-1.8-1.1-3.3-1.1c-1.3,0-2.3,0.3-3.2,1
+ c-0.9,0.6-1.3,1.4-1.3,2.3h-3.6c0-1,0.4-2,1.1-3c0.7-1,1.7-1.7,3-2.3c1.3-0.6,2.6-0.8,4.1-0.8c2.4,0,4.3,0.6,5.6,1.8
+ c1.4,1.2,2.1,2.8,2.1,4.9v9.5c0,1.9,0.2,3.4,0.7,4.5v0.3H242.4z M236.5,64.6c1.1,0,2.2-0.3,3.2-0.9c1-0.6,1.7-1.3,2.2-2.2v-4.2
+ h-2.8c-4.3,0-6.5,1.3-6.5,3.8c0,1.1,0.4,2,1.1,2.6C234.4,64.3,235.4,64.6,236.5,64.6z"/>
+ <path class="st3" d="M255.7,41.6v5h3.9v2.7h-3.9v12.8c0,0.8,0.2,1.5,0.5,1.9c0.3,0.4,0.9,0.6,1.8,0.6c0.4,0,1-0.1,1.7-0.2v2.9
+ c-0.9,0.3-1.8,0.4-2.7,0.4c-1.6,0-2.8-0.5-3.6-1.4c-0.8-1-1.2-2.3-1.2-4.1V49.4h-3.8v-2.7h3.8v-5H255.7z"/>
+ <path class="st3" d="M272.3,67.7c-2.8,0-5.1-0.9-6.8-2.8c-1.8-1.8-2.6-4.3-2.6-7.4v-0.6c0-2.1,0.4-3.9,1.2-5.5
+ c0.8-1.6,1.9-2.9,3.3-3.8c1.4-0.9,2.9-1.4,4.6-1.4c2.7,0,4.8,0.9,6.3,2.7c1.5,1.8,2.2,4.3,2.2,7.6V58h-14c0.1,2,0.6,3.7,1.8,4.9
+ c1.1,1.3,2.6,1.9,4.3,1.9c1.2,0,2.3-0.3,3.2-0.8c0.9-0.5,1.6-1.2,2.3-2l2.2,1.7C278.4,66.4,275.8,67.7,272.3,67.7z M271.9,49.1
+ c-1.4,0-2.6,0.5-3.6,1.6c-1,1-1.6,2.5-1.8,4.4h10.4v-0.3c-0.1-1.8-0.6-3.2-1.5-4.2S273.3,49.1,271.9,49.1z"/>
+</g>
+<g>
+ <path class="st0" d="M156.1,132.3h-12v12.4h-6.2v-30.3h19.7v5.1h-13.5v7.8h12V132.3z"/>
+ <path class="st0" d="M174.4,138.4h-11l-2.1,6.2h-6.6l11.3-30.3h5.8l11.4,30.3h-6.6L174.4,138.4z M165.1,133.4h7.6l-3.8-11.4
+ L165.1,133.4z"/>
+ <path class="st0" d="M192.6,144.7h-6.2v-30.3h6.2V144.7z"/>
+ <path class="st0" d="M204.6,139.7h13.3v5h-19.5v-30.3h6.2V139.7z"/>
+</g>
+<g id="SonarCloud_Black_2_">
+ <path class="st4" d="M302.5,204.3c-1.6-1.9-3.7-3.3-6-4v-0.1c0-6.9-5.6-12.5-12.5-12.5s-12.5,5.6-12.5,12.5c0,0.1,0,0.1,0,0.2
+ c-5.1,1.6-8.8,6.3-8.8,11.9c0,6.9,5.6,12.5,12.5,12.5c3.3,0,6.5-1.3,8.8-3.6c2.3,2.2,5.4,3.6,8.8,3.6c6.9,0,12.5-5.6,12.5-12.5
+ C305.3,209.4,304.3,206.5,302.5,204.3z M292.8,221.6c-5.2,0-9.4-4.2-9.4-9.4c0-0.9-0.7-1.6-1.6-1.6s-1.6,0.7-1.6,1.6
+ c0,2.3,0.6,4.5,1.8,6.4c-1.8,1.9-4.2,3-6.8,3c-5.2,0-9.4-4.2-9.4-9.4s4.2-9.4,9.4-9.4c1.1,0,2.2,0.2,3.2,0.6l0,0
+ c0.4,0.1,0.9,0.4,1,0.5c0.7,0.6,1.7,0.5,2.2-0.2c0.6-0.7,0.5-1.7-0.2-2.2c-0.7-0.6-1.8-1-2-1.1c-1.4-0.5-2.8-0.8-4.3-0.8
+ c-0.2,0-0.4,0-0.6,0c0.2-5,4.3-9,9.3-9c5.2,0,9.4,4.2,9.4,9.4c0,3-1.5,5.9-3.9,7.6c-0.7,0.5-0.9,1.5-0.4,2.2
+ c0.3,0.4,0.8,0.7,1.3,0.7c0.3,0,0.6-0.1,0.9-0.3c2.4-1.7,4-4.1,4.8-6.9c3.6,1.3,6.1,4.8,6.1,8.8C302.2,217.4,298,221.6,292.8,221.6
+ z"/>
+ <g>
+ <path class="st5" d="M45.1,216c1.3,0.8,4,1.7,6,1.7c2.1,0,3-0.7,3-1.9s-0.7-1.7-3.3-2.6c-4.7-1.6-6.5-4.1-6.4-6.8
+ c0-4.2,3.6-7.4,9.2-7.4c2.6,0,5,0.6,6.4,1.3l-1.2,4.8c-1-0.6-3-1.3-4.9-1.3c-1.7,0-2.7,0.7-2.7,1.8s0.9,1.6,3.6,2.6
+ c4.3,1.5,6.1,3.6,6.1,7c0,4.2-3.3,7.3-9.8,7.3c-3,0-5.6-0.6-7.3-1.6L45.1,216z"/>
+ <path class="st5" d="M85.6,210.6c0,8.3-5.9,12-11.9,12c-6.6,0-11.7-4.3-11.7-11.6s4.8-11.9,12-11.9
+ C81,199.1,85.6,203.8,85.6,210.6z M69.3,210.8c0,3.9,1.6,6.8,4.6,6.8c2.7,0,4.5-2.7,4.5-6.8c0-3.4-1.3-6.8-4.5-6.8
+ C70.5,204.1,69.3,207.5,69.3,210.8z"/>
+ <path class="st5" d="M88.1,206.8c0-2.8-0.1-5.2-0.2-7.2H94l0.3,3.1h0.1c0.9-1.4,3.2-3.6,7-3.6c4.6,0,8.1,3,8.1,9.7v13.4h-7v-12.5
+ c0-2.9-1-4.9-3.6-4.9c-1.9,0-3.1,1.3-3.5,2.6c-0.2,0.4-0.3,1.1-0.3,1.8v13h-7V206.8z"/>
+ <path class="st5" d="M126.1,222.1l-0.4-2.3h-0.1c-1.5,1.8-3.8,2.8-6.5,2.8c-4.6,0-7.3-3.3-7.3-6.9c0-5.9,5.3-8.7,13.2-8.6v-0.3
+ c0-1.2-0.6-2.9-4.1-2.9c-2.3,0-4.7,0.8-6.2,1.7l-1.3-4.5c1.6-0.9,4.7-2,8.8-2c7.5,0,9.9,4.4,9.9,9.7v7.8c0,2.2,0.1,4.2,0.3,5.5
+ H126.1z M125.3,211.5c-3.7,0-6.6,0.8-6.6,3.6c0,1.8,1.2,2.7,2.8,2.7c1.8,0,3.2-1.2,3.6-2.6c0.1-0.4,0.1-0.8,0.1-1.2L125.3,211.5
+ L125.3,211.5z"/>
+ <path class="st5" d="M135.8,207c0-3.3-0.1-5.5-0.2-7.4h6l0.2,4.1h0.2c1.2-3.3,3.9-4.7,6.1-4.7c0.6,0,1,0,1.5,0.1v6.6
+ c-0.5-0.1-1.1-0.2-1.9-0.2c-2.6,0-4.3,1.4-4.8,3.6c-0.1,0.5-0.1,1-0.1,1.6v11.4h-7V207z"/>
+ <path class="st5" d="M167.9,221.3c-1.1,0.6-3.4,1.3-6.4,1.3c-6.7,0-11.1-4.6-11.1-11.4c0-6.9,4.7-11.9,12-11.9
+ c2.4,0,4.5,0.6,5.6,1.2l-0.9,3.1c-1-0.6-2.5-1.1-4.7-1.1c-5.1,0-7.9,3.8-7.9,8.4c0,5.2,3.3,8.3,7.7,8.3c2.3,0,3.8-0.6,5-1.1
+ L167.9,221.3z"/>
+ <path class="st5" d="M170.9,189.4h4.1v32.7h-4.1V189.4z"/>
+ <path class="st5" d="M200.1,210.8c0,8.3-5.7,11.9-11.1,11.9c-6,0-10.7-4.4-10.7-11.5c0-7.5,4.9-11.9,11.1-11.9
+ C195.8,199.3,200.1,204,200.1,210.8z M182.4,211c0,4.9,2.8,8.6,6.8,8.6c3.9,0,6.8-3.6,6.8-8.7c0-3.8-1.9-8.6-6.7-8.6
+ C184.5,202.4,182.4,206.8,182.4,211z"/>
+ <path class="st5" d="M222.1,216c0,2.3,0,4.3,0.2,6.1h-3.6l-0.2-3.6h-0.1c-1.1,1.8-3.4,4.2-7.4,4.2c-3.5,0-7.7-1.9-7.7-9.8v-13.1
+ h4.1v12.4c0,4.2,1.3,7.1,5,7.1c2.7,0,4.6-1.9,5.3-3.7c0.2-0.6,0.4-1.3,0.4-2.1v-13.7h4.1V216H222.1z"/>
+ <path class="st5" d="M246.2,189.4v27c0,2,0,4.2,0.2,5.8h-3.6l-0.2-3.9h-0.1c-1.2,2.5-4,4.4-7.6,4.4c-5.4,0-9.5-4.6-9.5-11.3
+ c0-7.4,4.6-12,10-12c3.4,0,5.7,1.6,6.7,3.4h0.1v-13.3L246.2,189.4L246.2,189.4z M242.2,208.9c0-0.5,0-1.2-0.2-1.7
+ c-0.6-2.6-2.8-4.7-5.9-4.7c-4.2,0-6.7,3.7-6.7,8.6c0,4.5,2.2,8.3,6.6,8.3c2.7,0,5.2-1.8,5.9-4.8c0.1-0.6,0.2-1.1,0.2-1.8
+ L242.2,208.9L242.2,208.9z"/>
+ </g>
+</g>
+</svg>
diff --git a/server/sonar-server/src/main/resources/org/sonar/server/sticker/ws/templates/quality_gate_passed.svg b/server/sonar-server/src/main/resources/org/sonar/server/sticker/ws/templates/quality_gate_passed.svg
new file mode 100644
index 00000000000..06cba700093
--- /dev/null
+++ b/server/sonar-server/src/main/resources/org/sonar/server/sticker/ws/templates/quality_gate_passed.svg
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px"
+ viewBox="0 0 350 262.5" style="enable-background:new 0 0 350 262.5;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#FFFFFF;}
+ .st1{fill:#CFD3D7;}
+ .st2{fill:#29BE4C;}
+ .st3{fill:#F3702A;}
+ .st4{fill:#1B171B;}
+ .st5{enable-background:new ;}
+ .st6{fill:#434447;}
+</style>
+<g>
+ <path class="st0" d="M328.4,259.5H21.5C10.9,259.5,2,250.8,2,240V21.9C2,11.3,10.7,2.4,21.5,2.4h307.1c10.6,0,19.5,8.7,19.5,19.5
+ V240C347.9,250.8,339.3,259.5,328.4,259.5z"/>
+ <path class="st1" d="M328.4,260.4H21.5c-11.2,0-20.4-9.2-20.4-20.4V21.9c0-11.2,9-20.4,20.4-20.4h307.1c11.2,0,20.4,9.2,20.4,20.4
+ V240C348.8,251.2,339.8,260.4,328.4,260.4z M21.5,3.3c-10.3,0-18.6,8.3-18.6,18.6V240c0,10.3,8.3,18.6,18.6,18.6h307.1
+ c10.3,0,18.6-8.3,18.6-18.6V21.9c0-10.3-8.3-18.6-18.6-18.6C328.6,3.3,21.5,3.3,21.5,3.3z"/>
+</g>
+<path class="st2" d="M234.3,162.9H115.5c-17.6,0-31.9-14.4-31.9-31.9l0,0c0-17.6,14.4-31.9,31.9-31.9h118.8
+ c17.6,0,31.9,14.4,31.9,31.9l0,0C266.2,148.5,251.8,162.9,234.3,162.9z"/>
+<g id="SonarCloud_Black_2_">
+ <path class="st3" d="M302.5,204.3c-1.6-1.9-3.7-3.3-6-4v-0.1c0-6.9-5.6-12.5-12.5-12.5s-12.5,5.6-12.5,12.5c0,0.1,0,0.1,0,0.2
+ c-5.1,1.6-8.8,6.3-8.8,11.9c0,6.9,5.6,12.5,12.5,12.5c3.3,0,6.5-1.3,8.8-3.6c2.3,2.2,5.4,3.6,8.8,3.6c6.9,0,12.5-5.6,12.5-12.5
+ C305.3,209.4,304.3,206.5,302.5,204.3z M292.8,221.6c-5.2,0-9.4-4.2-9.4-9.4c0-0.9-0.7-1.6-1.6-1.6s-1.6,0.7-1.6,1.6
+ c0,2.3,0.6,4.5,1.8,6.4c-1.8,1.9-4.2,3-6.8,3c-5.2,0-9.4-4.2-9.4-9.4s4.2-9.4,9.4-9.4c1.1,0,2.2,0.2,3.2,0.6l0,0
+ c0.4,0.1,0.9,0.4,1,0.5c0.7,0.6,1.7,0.5,2.2-0.2c0.6-0.7,0.5-1.7-0.2-2.2c-0.7-0.6-1.8-1-2-1.1c-1.4-0.5-2.8-0.8-4.3-0.8
+ c-0.2,0-0.4,0-0.6,0c0.2-5,4.3-9,9.3-9c5.2,0,9.4,4.2,9.4,9.4c0,3-1.5,5.9-3.9,7.6c-0.7,0.5-0.9,1.5-0.4,2.2
+ c0.3,0.4,0.8,0.7,1.3,0.7c0.3,0,0.6-0.1,0.9-0.3c2.4-1.7,4-4.1,4.8-6.9c3.6,1.3,6.1,4.8,6.1,8.8C302.2,217.4,298,221.6,292.8,221.6
+ z"/>
+ <g>
+ <path class="st4" d="M45.1,216c1.3,0.8,4,1.7,6,1.7c2.1,0,3-0.7,3-1.9s-0.7-1.7-3.3-2.6c-4.7-1.6-6.5-4.1-6.4-6.8
+ c0-4.2,3.6-7.4,9.2-7.4c2.6,0,5,0.6,6.4,1.3l-1.2,4.8c-1-0.6-3-1.3-4.9-1.3c-1.7,0-2.7,0.7-2.7,1.8s0.9,1.6,3.6,2.6
+ c4.3,1.5,6.1,3.6,6.1,7c0,4.2-3.3,7.3-9.8,7.3c-3,0-5.6-0.6-7.3-1.6L45.1,216z"/>
+ <path class="st4" d="M85.6,210.6c0,8.3-5.9,12-11.9,12c-6.6,0-11.7-4.3-11.7-11.6s4.8-11.9,12-11.9
+ C81,199.1,85.6,203.8,85.6,210.6z M69.3,210.8c0,3.9,1.6,6.8,4.6,6.8c2.7,0,4.5-2.7,4.5-6.8c0-3.4-1.3-6.8-4.5-6.8
+ C70.5,204.1,69.3,207.5,69.3,210.8z"/>
+ <path class="st4" d="M88.1,206.8c0-2.8-0.1-5.2-0.2-7.2H94l0.3,3.1h0.1c0.9-1.4,3.2-3.6,7-3.6c4.6,0,8.1,3,8.1,9.7v13.4h-7v-12.5
+ c0-2.9-1-4.9-3.6-4.9c-1.9,0-3.1,1.3-3.5,2.6c-0.2,0.4-0.3,1.1-0.3,1.8v13h-7V206.8z"/>
+ <path class="st4" d="M126.1,222.1l-0.4-2.3h-0.1c-1.5,1.8-3.8,2.8-6.5,2.8c-4.6,0-7.3-3.3-7.3-6.9c0-5.9,5.3-8.7,13.2-8.6v-0.3
+ c0-1.2-0.6-2.9-4.1-2.9c-2.3,0-4.7,0.8-6.2,1.7l-1.3-4.5c1.6-0.9,4.7-2,8.8-2c7.5,0,9.9,4.4,9.9,9.7v7.8c0,2.2,0.1,4.2,0.3,5.5
+ H126.1z M125.3,211.5c-3.7,0-6.6,0.8-6.6,3.6c0,1.8,1.2,2.7,2.8,2.7c1.8,0,3.2-1.2,3.6-2.6c0.1-0.4,0.1-0.8,0.1-1.2L125.3,211.5
+ L125.3,211.5z"/>
+ <path class="st4" d="M135.8,207c0-3.3-0.1-5.5-0.2-7.4h6l0.2,4.1h0.2c1.2-3.3,3.9-4.7,6.1-4.7c0.6,0,1,0,1.5,0.1v6.6
+ c-0.5-0.1-1.1-0.2-1.9-0.2c-2.6,0-4.3,1.4-4.8,3.6c-0.1,0.5-0.1,1-0.1,1.6v11.4h-7V207z"/>
+ <path class="st4" d="M167.9,221.3c-1.1,0.6-3.4,1.3-6.4,1.3c-6.7,0-11.1-4.6-11.1-11.4c0-6.9,4.7-11.9,12-11.9
+ c2.4,0,4.5,0.6,5.6,1.2l-0.9,3.1c-1-0.6-2.5-1.1-4.7-1.1c-5.1,0-7.9,3.8-7.9,8.4c0,5.2,3.3,8.3,7.7,8.3c2.3,0,3.8-0.6,5-1.1
+ L167.9,221.3z"/>
+ <path class="st4" d="M170.9,189.4h4.1v32.7h-4.1V189.4z"/>
+ <path class="st4" d="M200.1,210.8c0,8.3-5.7,11.9-11.1,11.9c-6,0-10.7-4.4-10.7-11.5c0-7.5,4.9-11.9,11.1-11.9
+ C195.8,199.3,200.1,204,200.1,210.8z M182.4,211c0,4.9,2.8,8.6,6.8,8.6c3.9,0,6.8-3.6,6.8-8.7c0-3.8-1.9-8.6-6.7-8.6
+ C184.5,202.4,182.4,206.8,182.4,211z"/>
+ <path class="st4" d="M222.1,216c0,2.3,0,4.3,0.2,6.1h-3.6l-0.2-3.6h-0.1c-1.1,1.8-3.4,4.2-7.4,4.2c-3.5,0-7.7-1.9-7.7-9.8v-13.1
+ h4.1v12.4c0,4.2,1.3,7.1,5,7.1c2.7,0,4.6-1.9,5.3-3.7c0.2-0.6,0.4-1.3,0.4-2.1v-13.7h4.1V216H222.1z"/>
+ <path class="st4" d="M246.2,189.4v27c0,2,0,4.2,0.2,5.8h-3.6l-0.2-3.9h-0.1c-1.2,2.5-4,4.4-7.6,4.4c-5.4,0-9.5-4.6-9.5-11.3
+ c0-7.4,4.6-12,10-12c3.4,0,5.7,1.6,6.7,3.4h0.1v-13.3L246.2,189.4L246.2,189.4z M242.2,208.9c0-0.5,0-1.2-0.2-1.7
+ c-0.6-2.6-2.8-4.7-5.9-4.7c-4.2,0-6.7,3.7-6.7,8.6c0,4.5,2.2,8.3,6.6,8.3c2.7,0,5.2-1.8,5.9-4.8c0.1-0.6,0.2-1.1,0.2-1.8
+ L242.2,208.9L242.2,208.9z"/>
+ </g>
+</g>
+<g class="st5">
+ <path class="st6" d="M94.9,54.1c0,2.7-0.4,5-1.3,7c-0.9,1.9-2.1,3.5-3.6,4.6l5,3.9l-2.5,2.3l-5.9-4.7c-0.9,0.2-1.9,0.3-2.9,0.3
+ c-2.2,0-4.1-0.5-5.8-1.6c-1.7-1.1-3-2.6-3.9-4.6c-0.9-2-1.4-4.3-1.4-6.9v-2c0-2.7,0.5-5,1.4-7.1c0.9-2.1,2.2-3.6,3.9-4.7
+ s3.6-1.6,5.8-1.6c2.2,0,4.2,0.5,5.9,1.6c1.7,1.1,3,2.6,3.9,4.7c0.9,2,1.4,4.4,1.4,7.1V54.1z M91.3,52.3c0-3.3-0.7-5.8-2-7.6
+ c-1.3-1.8-3.2-2.7-5.6-2.7c-2.3,0-4.1,0.9-5.5,2.6c-1.3,1.8-2,4.2-2.1,7.4v2c0,3.2,0.7,5.7,2,7.5c1.3,1.8,3.2,2.8,5.6,2.8
+ s4.2-0.9,5.5-2.6c1.3-1.7,2-4.2,2-7.4V52.3z"/>
+ <path class="st6" d="M112.8,65.1c-1.4,1.6-3.4,2.4-6.1,2.4c-2.2,0-3.9-0.6-5-1.9s-1.7-3.2-1.7-5.7V46.5h3.5v13.4
+ c0,3.1,1.3,4.7,3.8,4.7c2.7,0,4.5-1,5.4-3v-15h3.5v20.7h-3.4L112.8,65.1z"/>
+ <path class="st6" d="M134.4,67.1c-0.2-0.4-0.4-1.1-0.5-2.2c-1.6,1.7-3.6,2.6-5.9,2.6c-2,0-3.7-0.6-5-1.7s-2-2.6-2-4.4
+ c0-2.2,0.8-3.8,2.5-5s3.9-1.8,6.9-1.8h3.4V53c0-1.2-0.4-2.2-1.1-3c-0.7-0.7-1.8-1.1-3.3-1.1c-1.3,0-2.3,0.3-3.2,1
+ c-0.9,0.6-1.3,1.4-1.3,2.3h-3.6c0-1,0.4-2,1.1-3c0.7-1,1.7-1.7,3-2.3c1.3-0.6,2.6-0.8,4.1-0.8c2.4,0,4.3,0.6,5.6,1.8
+ c1.4,1.2,2.1,2.8,2.1,4.9v9.5c0,1.9,0.2,3.4,0.7,4.5v0.3H134.4z M128.5,64.4c1.1,0,2.2-0.3,3.2-0.9c1-0.6,1.7-1.3,2.2-2.2v-4.2
+ h-2.8c-4.3,0-6.5,1.3-6.5,3.8c0,1.1,0.4,2,1.1,2.6C126.4,64.1,127.4,64.4,128.5,64.4z"/>
+ <path class="st6" d="M146.8,67.1h-3.5V37.8h3.5V67.1z"/>
+ <path class="st6" d="M152.5,41c0-0.6,0.2-1.1,0.5-1.5s0.9-0.6,1.6-0.6s1.2,0.2,1.6,0.6s0.5,0.9,0.5,1.5s-0.2,1.1-0.5,1.4
+ s-0.9,0.6-1.6,0.6s-1.2-0.2-1.6-0.6S152.5,41.5,152.5,41z M156.3,67.1h-3.5V46.5h3.5V67.1z"/>
+ <path class="st6" d="M166.7,41.4v5h3.9v2.7h-3.9V62c0,0.8,0.2,1.5,0.5,1.9c0.3,0.4,0.9,0.6,1.8,0.6c0.4,0,1-0.1,1.7-0.2v2.9
+ c-0.9,0.3-1.8,0.4-2.7,0.4c-1.6,0-2.8-0.5-3.6-1.4c-0.8-1-1.2-2.3-1.2-4.1V49.2h-3.8v-2.7h3.8v-5H166.7z"/>
+ <path class="st6" d="M181.5,62l4.8-15.5h3.8l-8.3,23.9c-1.3,3.4-3.3,5.2-6.1,5.2l-0.7-0.1l-1.3-0.2v-2.9l1,0.1
+ c1.2,0,2.1-0.2,2.8-0.7s1.2-1.4,1.7-2.7l0.8-2.1l-7.4-20.5h3.9L181.5,62z"/>
+ <path class="st6" d="M224.1,63.5c-0.9,1.4-2.3,2.4-3.9,3c-1.7,0.7-3.7,1-5.9,1c-2.3,0-4.3-0.5-6-1.6s-3.1-2.6-4.1-4.5
+ c-1-2-1.5-4.2-1.5-6.8v-2.4c0-4.2,1-7.4,2.9-9.8c2-2.3,4.7-3.5,8.2-3.5c2.9,0,5.2,0.7,7,2.2c1.8,1.5,2.9,3.6,3.2,6.3h-3.7
+ c-0.7-3.7-2.9-5.5-6.6-5.5c-2.5,0-4.3,0.9-5.6,2.6c-1.3,1.7-1.9,4.2-1.9,7.5v2.3c0,3.1,0.7,5.6,2.1,7.5c1.4,1.8,3.4,2.8,5.8,2.8
+ c1.4,0,2.6-0.2,3.6-0.5s1.9-0.8,2.6-1.5v-6.2H214v-3h10.1V63.5z"/>
+ <path class="st6" d="M242.4,67.1c-0.2-0.4-0.4-1.1-0.5-2.2c-1.6,1.7-3.6,2.6-5.9,2.6c-2,0-3.7-0.6-5-1.7s-2-2.6-2-4.4
+ c0-2.2,0.8-3.8,2.5-5s3.9-1.8,6.9-1.8h3.4V53c0-1.2-0.4-2.2-1.1-3c-0.7-0.7-1.8-1.1-3.3-1.1c-1.3,0-2.3,0.3-3.2,1
+ c-0.9,0.6-1.3,1.4-1.3,2.3h-3.6c0-1,0.4-2,1.1-3c0.7-1,1.7-1.7,3-2.3c1.3-0.6,2.6-0.8,4.1-0.8c2.4,0,4.3,0.6,5.6,1.8
+ c1.4,1.2,2.1,2.8,2.1,4.9v9.5c0,1.9,0.2,3.4,0.7,4.5v0.3H242.4z M236.5,64.4c1.1,0,2.2-0.3,3.2-0.9c1-0.6,1.7-1.3,2.2-2.2v-4.2
+ h-2.8c-4.3,0-6.5,1.3-6.5,3.8c0,1.1,0.4,2,1.1,2.6C234.4,64.1,235.4,64.4,236.5,64.4z"/>
+ <path class="st6" d="M255.7,41.4v5h3.9v2.7h-3.9V62c0,0.8,0.2,1.5,0.5,1.9c0.3,0.4,0.9,0.6,1.8,0.6c0.4,0,1-0.1,1.7-0.2v2.9
+ c-0.9,0.3-1.8,0.4-2.7,0.4c-1.6,0-2.8-0.5-3.6-1.4c-0.8-1-1.2-2.3-1.2-4.1V49.2h-3.8v-2.7h3.8v-5H255.7z"/>
+ <path class="st6" d="M272.3,67.5c-2.8,0-5.1-0.9-6.8-2.8c-1.8-1.8-2.6-4.3-2.6-7.4v-0.7c0-2.1,0.4-3.9,1.2-5.5
+ c0.8-1.6,1.9-2.9,3.3-3.8c1.4-0.9,2.9-1.4,4.6-1.4c2.7,0,4.8,0.9,6.3,2.7c1.5,1.8,2.2,4.3,2.2,7.6v1.5h-14c0.1,2,0.6,3.7,1.8,4.9
+ c1.1,1.3,2.6,1.9,4.3,1.9c1.2,0,2.3-0.3,3.2-0.8c0.9-0.5,1.6-1.2,2.3-2l2.2,1.7C278.4,66.2,275.8,67.5,272.3,67.5z M271.9,49
+ c-1.4,0-2.6,0.5-3.6,1.6c-1,1-1.6,2.5-1.8,4.4h10.4v-0.3c-0.1-1.8-0.6-3.2-1.5-4.2S273.3,49,271.9,49z"/>
+</g>
+<g class="st5">
+ <path class="st0" d="M131.5,133.8v10.7h-6.2v-30.3H137c2.3,0,4.3,0.4,6,1.2s3.1,2,4,3.6s1.4,3.3,1.4,5.2c0,3-1,5.3-3.1,7
+ c-2,1.7-4.8,2.6-8.4,2.6H131.5z M131.5,128.8h5.6c1.7,0,2.9-0.4,3.8-1.2c0.9-0.8,1.3-1.9,1.3-3.3c0-1.5-0.4-2.7-1.3-3.6
+ c-0.9-0.9-2.1-1.4-3.6-1.4h-5.7V128.8z"/>
+ <path class="st0" d="M166.1,138.3h-11l-2.1,6.2h-6.6l11.3-30.3h5.8l11.3,30.3h-6.6L166.1,138.3z M156.9,133.2h7.6l-3.8-11.3
+ L156.9,133.2z"/>
+ <path class="st0" d="M193.4,136.6c0-1.2-0.4-2.1-1.2-2.7s-2.3-1.3-4.5-2s-3.9-1.4-5.1-2.1c-3.4-1.9-5.2-4.4-5.2-7.5
+ c0-1.6,0.5-3.1,1.4-4.4c0.9-1.3,2.2-2.3,4-3s3.7-1.1,5.8-1.1c2.2,0,4.1,0.4,5.8,1.2s3,1.9,3.9,3.3c0.9,1.4,1.4,3.1,1.4,4.9h-6.2
+ c0-1.4-0.4-2.5-1.3-3.2c-0.9-0.8-2.1-1.2-3.7-1.2c-1.5,0-2.7,0.3-3.6,1c-0.8,0.6-1.3,1.5-1.3,2.6c0,1,0.5,1.8,1.5,2.5
+ c1,0.7,2.5,1.3,4.4,1.9c3.6,1.1,6.1,2.4,7.8,4c1.6,1.6,2.4,3.6,2.4,5.9c0,2.6-1,4.7-3,6.2s-4.7,2.2-8,2.2c-2.3,0-4.5-0.4-6.4-1.3
+ c-1.9-0.9-3.4-2-4.4-3.5c-1-1.5-1.5-3.2-1.5-5.2h6.3c0,3.3,2,5,6,5c1.5,0,2.6-0.3,3.5-0.9C193,138.5,193.4,137.7,193.4,136.6z"/>
+ <path class="st0" d="M219.7,136.6c0-1.2-0.4-2.1-1.2-2.7s-2.3-1.3-4.5-2s-3.9-1.4-5.1-2.1c-3.4-1.9-5.2-4.4-5.2-7.5
+ c0-1.6,0.5-3.1,1.4-4.4c0.9-1.3,2.2-2.3,4-3s3.7-1.1,5.8-1.1c2.2,0,4.1,0.4,5.8,1.2s3,1.9,3.9,3.3c0.9,1.4,1.4,3.1,1.4,4.9h-6.2
+ c0-1.4-0.4-2.5-1.3-3.2c-0.9-0.8-2.1-1.2-3.7-1.2c-1.5,0-2.7,0.3-3.6,1c-0.8,0.6-1.3,1.5-1.3,2.6c0,1,0.5,1.8,1.5,2.5
+ c1,0.7,2.5,1.3,4.4,1.9c3.6,1.1,6.1,2.4,7.8,4c1.6,1.6,2.4,3.6,2.4,5.9c0,2.6-1,4.7-3,6.2s-4.7,2.2-8,2.2c-2.3,0-4.5-0.4-6.4-1.3
+ c-1.9-0.9-3.4-2-4.4-3.5c-1-1.5-1.5-3.2-1.5-5.2h6.3c0,3.3,2,5,6,5c1.5,0,2.6-0.3,3.5-0.9C219.2,138.5,219.7,137.7,219.7,136.6z"/>
+</g>
+</svg>
diff --git a/server/sonar-server/src/main/resources/org/sonar/server/sticker/ws/templates/quality_gate_warn.svg b/server/sonar-server/src/main/resources/org/sonar/server/sticker/ws/templates/quality_gate_warn.svg
new file mode 100644
index 00000000000..c77123455f0
--- /dev/null
+++ b/server/sonar-server/src/main/resources/org/sonar/server/sticker/ws/templates/quality_gate_warn.svg
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 350 262.5" style="enable-background:new 0 0 350 262.5;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#FFFFFF;}
+ .st1{fill:#CFD3D7;}
+ .st2{fill:#ED7D20;}
+ .st3{fill:#434447;}
+ .st4{fill:#F3702A;}
+ .st5{fill:#1B171B;}
+</style>
+<g>
+ <path class="st0" d="M328.4,259.5H21.3c-10.6,0-19.5-8.7-19.5-19.5V22c0-10.6,8.7-19.5,19.5-19.5h307.1c10.6,0,19.5,8.7,19.5,19.5
+ v218C347.9,250.8,339,259.5,328.4,259.5z"/>
+ <path class="st1" d="M328.4,260.4H21.3c-11.2,0-20.4-9.2-20.4-20.4V22c0-11.2,9.2-20.4,20.4-20.4h307.1c11.2,0,20.4,9.2,20.4,20.4
+ v218C348.8,251.2,339.5,260.4,328.4,260.4z M21.3,3.4C11,3.4,2.7,11.7,2.7,22v218c0,10.3,8.3,18.6,18.6,18.6h307.1
+ c10.3,0,18.6-8.3,18.6-18.6V22c0-10.3-8.3-18.6-18.6-18.6C328.4,3.4,21.3,3.4,21.3,3.4z"/>
+</g>
+<path class="st2" d="M227.6,162.9H120.4c-17.6,0-31.9-14.4-31.9-31.9l0,0c0-17.6,14.4-31.9,31.9-31.9h107.2
+ c17.6,0,31.9,14.4,31.9,31.9l0,0C259.5,148.6,245.2,162.9,227.6,162.9z"/>
+<g>
+ <path class="st3" d="M94.9,54.3c0,2.7-0.4,5-1.3,7c-0.9,1.9-2.1,3.5-3.6,4.6l5,3.9L92.5,72l-5.9-4.7c-0.9,0.2-1.9,0.3-2.9,0.3
+ c-2.2,0-4.1-0.5-5.8-1.6c-1.7-1.1-3-2.6-3.9-4.6s-1.4-4.3-1.4-6.9v-2c0-2.7,0.5-5,1.4-7.1s2.2-3.6,3.9-4.7s3.6-1.6,5.8-1.6
+ c2.2,0,4.2,0.5,5.9,1.6c1.7,1.1,3,2.6,3.9,4.7c0.9,2,1.4,4.4,1.4,7.1V54.3z M91.3,52.5c0-3.3-0.7-5.8-2-7.6s-3.2-2.7-5.6-2.7
+ c-2.3,0-4.1,0.9-5.5,2.6c-1.3,1.8-2,4.2-2.1,7.4v2c0,3.2,0.7,5.7,2,7.5s3.2,2.8,5.6,2.8s4.2-0.9,5.5-2.6c1.3-1.7,2-4.2,2-7.4
+ L91.3,52.5L91.3,52.5z"/>
+ <path class="st3" d="M112.8,65.3c-1.4,1.6-3.4,2.4-6.1,2.4c-2.2,0-3.9-0.6-5-1.9c-1.2-1.3-1.7-3.2-1.7-5.7V46.6h3.5V60
+ c0,3.1,1.3,4.7,3.8,4.7c2.7,0,4.5-1,5.4-3v-15h3.5v20.7h-3.4L112.8,65.3z"/>
+ <path class="st3" d="M134.4,67.3c-0.2-0.4-0.4-1.1-0.5-2.2c-1.6,1.7-3.6,2.6-5.9,2.6c-2,0-3.7-0.6-5-1.7c-1.3-1.2-2-2.6-2-4.4
+ c0-2.2,0.8-3.8,2.5-5c1.6-1.2,3.9-1.8,6.9-1.8h3.4v-1.6c0-1.2-0.4-2.2-1.1-3c-0.7-0.7-1.8-1.1-3.3-1.1c-1.3,0-2.3,0.3-3.2,1
+ c-0.9,0.6-1.3,1.4-1.3,2.3h-3.6c0-1,0.4-2,1.1-3s1.7-1.7,3-2.3s2.6-0.8,4.1-0.8c2.4,0,4.3,0.6,5.6,1.8c1.4,1.2,2.1,2.8,2.1,4.9v9.5
+ c0,1.9,0.2,3.4,0.7,4.5v0.3L134.4,67.3L134.4,67.3z M128.5,64.6c1.1,0,2.2-0.3,3.2-0.9s1.7-1.3,2.2-2.2v-4.2h-2.8
+ c-4.3,0-6.5,1.3-6.5,3.8c0,1.1,0.4,2,1.1,2.6C126.4,64.3,127.4,64.6,128.5,64.6z"/>
+ <path class="st3" d="M146.8,67.3h-3.5V37.9h3.5V67.3z"/>
+ <path class="st3" d="M152.5,41.1c0-0.6,0.2-1.1,0.5-1.5s0.9-0.6,1.6-0.6c0.7,0,1.2,0.2,1.6,0.6s0.5,0.9,0.5,1.5s-0.2,1.1-0.5,1.4
+ s-0.9,0.6-1.6,0.6c-0.7,0-1.2-0.2-1.6-0.6S152.5,41.7,152.5,41.1z M156.3,67.3h-3.5V46.6h3.5V67.3z"/>
+ <path class="st3" d="M166.7,41.6v5h3.9v2.7h-3.9v12.8c0,0.8,0.2,1.5,0.5,1.9s0.9,0.6,1.8,0.6c0.4,0,1-0.1,1.7-0.2v2.9
+ c-0.9,0.3-1.8,0.4-2.7,0.4c-1.6,0-2.8-0.5-3.6-1.4c-0.8-1-1.2-2.3-1.2-4.1V49.4h-3.8v-2.7h3.8v-5h3.5V41.6z"/>
+ <path class="st3" d="M181.5,62.1l4.8-15.5h3.8l-8.3,23.9c-1.3,3.4-3.3,5.2-6.1,5.2l-0.7-0.1l-1.3-0.2v-2.9l1,0.1
+ c1.2,0,2.1-0.2,2.8-0.7s1.2-1.4,1.7-2.7l0.8-2.1l-7.4-20.5h3.9L181.5,62.1z"/>
+ <path class="st3" d="M224.1,63.7c-0.9,1.4-2.3,2.4-3.9,3c-1.7,0.7-3.7,1-5.9,1c-2.3,0-4.3-0.5-6-1.6c-1.8-1.1-3.1-2.6-4.1-4.5
+ c-1-2-1.5-4.2-1.5-6.8v-2.4c0-4.2,1-7.4,2.9-9.8c2-2.3,4.7-3.5,8.3-3.5c2.9,0,5.2,0.7,7,2.2s2.9,3.6,3.2,6.3h-3.7
+ c-0.7-3.7-2.9-5.5-6.6-5.5c-2.5,0-4.3,0.9-5.6,2.6c-1.3,1.7-1.9,4.2-1.9,7.5v2.3c0,3.1,0.7,5.6,2.1,7.5c1.4,1.8,3.4,2.8,5.8,2.8
+ c1.4,0,2.6-0.2,3.6-0.5c1-0.3,1.9-0.8,2.6-1.5v-6.2H214v-3h10.1V63.7z"/>
+ <path class="st3" d="M242.4,67.3c-0.2-0.4-0.4-1.1-0.5-2.2c-1.6,1.7-3.6,2.6-5.9,2.6c-2,0-3.7-0.6-5-1.7c-1.3-1.2-2-2.6-2-4.4
+ c0-2.2,0.8-3.8,2.5-5c1.6-1.2,3.9-1.8,6.9-1.8h3.4v-1.6c0-1.2-0.4-2.2-1.1-3c-0.7-0.7-1.8-1.1-3.3-1.1c-1.3,0-2.3,0.3-3.2,1
+ c-0.9,0.6-1.3,1.4-1.3,2.3h-3.6c0-1,0.4-2,1.1-3c0.7-1,1.7-1.7,3-2.3s2.6-0.8,4.1-0.8c2.4,0,4.3,0.6,5.6,1.8
+ c1.4,1.2,2.1,2.8,2.1,4.9v9.5c0,1.9,0.2,3.4,0.7,4.5v0.3L242.4,67.3L242.4,67.3z M236.5,64.6c1.1,0,2.2-0.3,3.2-0.9
+ s1.7-1.3,2.2-2.2v-4.2h-2.8c-4.3,0-6.5,1.3-6.5,3.8c0,1.1,0.4,2,1.1,2.6C234.4,64.3,235.4,64.6,236.5,64.6z"/>
+ <path class="st3" d="M255.7,41.6v5h3.9v2.7h-3.9v12.8c0,0.8,0.2,1.5,0.5,1.9c0.3,0.4,0.9,0.6,1.8,0.6c0.4,0,1-0.1,1.7-0.2v2.9
+ c-0.9,0.3-1.8,0.4-2.7,0.4c-1.6,0-2.8-0.5-3.6-1.4c-0.8-1-1.2-2.3-1.2-4.1V49.4h-3.8v-2.7h3.8v-5h3.5V41.6z"/>
+ <path class="st3" d="M272.3,67.7c-2.8,0-5.1-0.9-6.8-2.8c-1.8-1.8-2.6-4.3-2.6-7.4v-0.6c0-2.1,0.4-3.9,1.2-5.5
+ c0.8-1.6,1.9-2.9,3.3-3.8c1.4-0.9,2.9-1.4,4.6-1.4c2.7,0,4.8,0.9,6.3,2.7s2.2,4.3,2.2,7.6V58h-14c0.1,2,0.6,3.7,1.8,4.9
+ c1.1,1.3,2.6,1.9,4.3,1.9c1.2,0,2.3-0.3,3.2-0.8c0.9-0.5,1.6-1.2,2.3-2l2.2,1.7C278.4,66.4,275.8,67.7,272.3,67.7z M271.9,49.1
+ c-1.4,0-2.6,0.5-3.6,1.6c-1,1-1.6,2.5-1.8,4.4h10.4v-0.3c-0.1-1.8-0.6-3.2-1.5-4.2S273.3,49.1,271.9,49.1z"/>
+</g>
+<g id="SonarCloud_Black_2_">
+ <path class="st4" d="M302.5,204.3c-1.6-1.9-3.7-3.3-6-4v-0.1c0-6.9-5.6-12.5-12.5-12.5s-12.5,5.6-12.5,12.5c0,0.1,0,0.1,0,0.2
+ c-5.1,1.6-8.8,6.3-8.8,11.9c0,6.9,5.6,12.5,12.5,12.5c3.3,0,6.5-1.3,8.8-3.6c2.3,2.2,5.4,3.6,8.8,3.6c6.9,0,12.5-5.6,12.5-12.5
+ C305.3,209.4,304.3,206.5,302.5,204.3z M292.8,221.6c-5.2,0-9.4-4.2-9.4-9.4c0-0.9-0.7-1.6-1.6-1.6s-1.6,0.7-1.6,1.6
+ c0,2.3,0.6,4.5,1.8,6.4c-1.8,1.9-4.2,3-6.8,3c-5.2,0-9.4-4.2-9.4-9.4s4.2-9.4,9.4-9.4c1.1,0,2.2,0.2,3.2,0.6l0,0
+ c0.4,0.1,0.9,0.4,1,0.5c0.7,0.6,1.7,0.5,2.2-0.2c0.6-0.7,0.5-1.7-0.2-2.2c-0.7-0.6-1.8-1-2-1.1c-1.4-0.5-2.8-0.8-4.3-0.8
+ c-0.2,0-0.4,0-0.6,0c0.2-5,4.3-9,9.3-9c5.2,0,9.4,4.2,9.4,9.4c0,3-1.5,5.9-3.9,7.6c-0.7,0.5-0.9,1.5-0.4,2.2
+ c0.3,0.4,0.8,0.7,1.3,0.7c0.3,0,0.6-0.1,0.9-0.3c2.4-1.7,4-4.1,4.8-6.9c3.6,1.3,6.1,4.8,6.1,8.8C302.2,217.4,298,221.6,292.8,221.6
+ z"/>
+ <g>
+ <path class="st5" d="M45.1,216c1.3,0.8,4,1.7,6,1.7c2.1,0,3-0.7,3-1.9s-0.7-1.7-3.3-2.6c-4.7-1.6-6.5-4.1-6.4-6.8
+ c0-4.2,3.6-7.4,9.2-7.4c2.6,0,5,0.6,6.4,1.3l-1.2,4.8c-1-0.6-3-1.3-4.9-1.3c-1.7,0-2.7,0.7-2.7,1.8s0.9,1.6,3.6,2.6
+ c4.3,1.5,6.1,3.6,6.1,7c0,4.2-3.3,7.3-9.8,7.3c-3,0-5.6-0.6-7.3-1.6L45.1,216z"/>
+ <path class="st5" d="M85.6,210.6c0,8.3-5.9,12-11.9,12c-6.6,0-11.7-4.3-11.7-11.6s4.8-11.9,12-11.9
+ C81,199.1,85.6,203.8,85.6,210.6z M69.3,210.8c0,3.9,1.6,6.8,4.6,6.8c2.7,0,4.5-2.7,4.5-6.8c0-3.4-1.3-6.8-4.5-6.8
+ C70.5,204.1,69.3,207.5,69.3,210.8z"/>
+ <path class="st5" d="M88.1,206.8c0-2.8-0.1-5.2-0.2-7.2H94l0.3,3.1h0.1c0.9-1.4,3.2-3.6,7-3.6c4.6,0,8.1,3,8.1,9.7v13.4h-7v-12.5
+ c0-2.9-1-4.9-3.6-4.9c-1.9,0-3.1,1.3-3.5,2.6c-0.2,0.4-0.3,1.1-0.3,1.8v13h-7V206.8z"/>
+ <path class="st5" d="M126.1,222.1l-0.4-2.3h-0.1c-1.5,1.8-3.8,2.8-6.5,2.8c-4.6,0-7.3-3.3-7.3-6.9c0-5.9,5.3-8.7,13.2-8.6v-0.3
+ c0-1.2-0.6-2.9-4.1-2.9c-2.3,0-4.7,0.8-6.2,1.7l-1.3-4.5c1.6-0.9,4.7-2,8.8-2c7.5,0,9.9,4.4,9.9,9.7v7.8c0,2.2,0.1,4.2,0.3,5.5
+ H126.1z M125.3,211.5c-3.7,0-6.6,0.8-6.6,3.6c0,1.8,1.2,2.7,2.8,2.7c1.8,0,3.2-1.2,3.6-2.6c0.1-0.4,0.1-0.8,0.1-1.2L125.3,211.5
+ L125.3,211.5z"/>
+ <path class="st5" d="M135.8,207c0-3.3-0.1-5.5-0.2-7.4h6l0.2,4.1h0.2c1.2-3.3,3.9-4.7,6.1-4.7c0.6,0,1,0,1.5,0.1v6.6
+ c-0.5-0.1-1.1-0.2-1.9-0.2c-2.6,0-4.3,1.4-4.8,3.6c-0.1,0.5-0.1,1-0.1,1.6v11.4h-7V207z"/>
+ <path class="st5" d="M167.9,221.3c-1.1,0.6-3.4,1.3-6.4,1.3c-6.7,0-11.1-4.6-11.1-11.4c0-6.9,4.7-11.9,12-11.9
+ c2.4,0,4.5,0.6,5.6,1.2l-0.9,3.1c-1-0.6-2.5-1.1-4.7-1.1c-5.1,0-7.9,3.8-7.9,8.4c0,5.2,3.3,8.3,7.7,8.3c2.3,0,3.8-0.6,5-1.1
+ L167.9,221.3z"/>
+ <path class="st5" d="M170.9,189.4h4.1v32.7h-4.1V189.4z"/>
+ <path class="st5" d="M200.1,210.8c0,8.3-5.7,11.9-11.1,11.9c-6,0-10.7-4.4-10.7-11.5c0-7.5,4.9-11.9,11.1-11.9
+ C195.8,199.3,200.1,204,200.1,210.8z M182.4,211c0,4.9,2.8,8.6,6.8,8.6c3.9,0,6.8-3.6,6.8-8.7c0-3.8-1.9-8.6-6.7-8.6
+ C184.5,202.4,182.4,206.8,182.4,211z"/>
+ <path class="st5" d="M222.1,216c0,2.3,0,4.3,0.2,6.1h-3.6l-0.2-3.6h-0.1c-1.1,1.8-3.4,4.2-7.4,4.2c-3.5,0-7.7-1.9-7.7-9.8v-13.1
+ h4.1v12.4c0,4.2,1.3,7.1,5,7.1c2.7,0,4.6-1.9,5.3-3.7c0.2-0.6,0.4-1.3,0.4-2.1v-13.7h4.1V216H222.1z"/>
+ <path class="st5" d="M246.2,189.4v27c0,2,0,4.2,0.2,5.8h-3.6l-0.2-3.9h-0.1c-1.2,2.5-4,4.4-7.6,4.4c-5.4,0-9.5-4.6-9.5-11.3
+ c0-7.4,4.6-12,10-12c3.4,0,5.7,1.6,6.7,3.4h0.1v-13.3L246.2,189.4L246.2,189.4z M242.2,208.9c0-0.5,0-1.2-0.2-1.7
+ c-0.6-2.6-2.8-4.7-5.9-4.7c-4.2,0-6.7,3.7-6.7,8.6c0,4.5,2.2,8.3,6.6,8.3c2.7,0,5.2-1.8,5.9-4.8c0.1-0.6,0.2-1.1,0.2-1.8
+ L242.2,208.9L242.2,208.9z"/>
+ </g>
+</g>
+<g>
+ <path class="st0" d="M139.1,136.9l4.1-21.6h6.2l-6.7,30.3h-6.3l-4.9-20.3l-4.9,20.3h-6.3l-6.7-30.3h6.2l4.1,21.5l5-21.5h5.3
+ L139.1,136.9z"/>
+ <path class="st0" d="M169,139.4h-11l-2.1,6.2h-6.6l11.3-30.3h5.8l11.4,30.3h-6.6L169,139.4z M159.7,134.4h7.6l-3.8-11.4
+ L159.7,134.4z"/>
+ <path class="st0" d="M191.8,134.6h-5v11.1h-6.2v-30.3h11.3c3.6,0,6.3,0.8,8.3,2.4c1.9,1.6,2.9,3.9,2.9,6.8c0,2.1-0.4,3.8-1.3,5.2
+ c-0.9,1.4-2.3,2.5-4.1,3.3l6.6,12.4v0.3h-6.7L191.8,134.6z M186.8,129.5h5c1.6,0,2.8-0.4,3.6-1.2c0.9-0.8,1.3-1.9,1.3-3.3
+ c0-1.4-0.4-2.6-1.2-3.4c-0.8-0.8-2.1-1.2-3.7-1.2h-5V129.5z"/>
+ <path class="st0" d="M232.5,145.7h-6.2l-12.2-20v20h-6.2v-30.3h6.2l12.2,20v-20h6.2V145.7z"/>
+</g>
+</svg>
diff --git a/server/sonar-server/src/test/java/org/sonar/server/badge/ws/QualityGateActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/badge/ws/QualityGateActionTest.java
index cfecf96178b..56da90807b7 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/badge/ws/QualityGateActionTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/badge/ws/QualityGateActionTest.java
@@ -19,17 +19,162 @@
*/
package org.sonar.server.badge.ws;
+import java.io.IOException;
+import org.apache.commons.io.IOUtils;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.sonar.api.measures.Metric.Level;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.Param;
+import org.sonar.api.web.UserRole;
+import org.sonar.db.DbTester;
+import org.sonar.db.component.BranchType;
+import org.sonar.db.component.ComponentDto;
+import org.sonar.db.metric.MetricDto;
+import org.sonar.server.component.ComponentFinder;
+import org.sonar.server.tester.UserSessionRule;
import org.sonar.server.ws.WsActionTester;
+import static java.lang.String.format;
+import static java.nio.charset.StandardCharsets.UTF_8;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.tuple;
+import static org.sonar.api.measures.CoreMetrics.ALERT_STATUS_KEY;
+import static org.sonar.api.measures.Metric.Level.ERROR;
+import static org.sonar.api.measures.Metric.Level.OK;
+import static org.sonar.api.measures.Metric.Level.WARN;
+import static org.sonar.api.measures.Metric.ValueType.LEVEL;
public class QualityGateActionTest {
- private WsActionTester ws = new WsActionTester(new QualityGateAction());
+ @Rule
+ public ExpectedException expectedException = ExpectedException.none();
+ @Rule
+ public UserSessionRule userSession = UserSessionRule.standalone();
+ @Rule
+ public DbTester db = DbTester.create();
+
+ private WsActionTester ws = new WsActionTester(
+ new QualityGateAction(userSession, db.getDbClient(), new ComponentFinder(db.getDbClient(), null), new SvgGenerator()));
+
+ @Test
+ public void quality_gate_passed() {
+ ComponentDto project = db.components().insertPublicProject();
+ userSession.registerComponents(project);
+ MetricDto metric = createQualityGateMetric();
+ db.measures().insertLiveMeasure(project, metric, m -> m.setData(OK.name()));
+
+ String response = ws.newRequest()
+ .setParam("project", project.getKey())
+ .execute().getInput();
+
+ checkResponse(response, OK);
+ }
+
+ @Test
+ public void quality_gate_warn() {
+ ComponentDto project = db.components().insertPublicProject();
+ userSession.registerComponents(project);
+ MetricDto metric = createQualityGateMetric();
+ db.measures().insertLiveMeasure(project, metric, m -> m.setData(WARN.name()));
+
+ String response = ws.newRequest()
+ .setParam("project", project.getKey())
+ .execute().getInput();
+
+ checkResponse(response, WARN);
+ }
+
+ @Test
+ public void quality_gate_failed() {
+ ComponentDto project = db.components().insertPublicProject();
+ userSession.registerComponents(project);
+ MetricDto metric = createQualityGateMetric();
+ db.measures().insertLiveMeasure(project, metric, m -> m.setData(ERROR.name()));
+
+ String response = ws.newRequest()
+ .setParam("project", project.getKey())
+ .execute().getInput();
+
+ checkResponse(response, ERROR);
+ }
+
+ @Test
+ public void project_does_not_exist() {
+ String response = ws.newRequest()
+ .setParam("project", "unknown")
+ .execute().getInput();
+
+ checkError(response, "Component key 'unknown' not found");
+ }
+
+ @Test
+ public void branch_does_not_exist() {
+ ComponentDto project = db.components().insertMainBranch();
+ ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.LONG));
+ userSession.addProjectPermission(UserRole.USER, project);
+
+ String response = ws.newRequest()
+ .setParam("project", branch.getKey())
+ .setParam("branch", "unknown")
+ .execute().getInput();
+
+ checkError(response, format("Component '%s' on branch 'unknown' not found", branch.getKey()));
+ }
+
+ @Test
+ public void fail_on_invalid_quality_gate() {
+ ComponentDto project = db.components().insertMainBranch();
+ userSession.addProjectPermission(UserRole.USER, project);
+ MetricDto metric = createQualityGateMetric();
+ db.measures().insertLiveMeasure(project, metric, m -> m.setData("UNKNOWN"));
+
+ expectedException.expect(IllegalArgumentException.class);
+ expectedException.expectMessage("No enum constant org.sonar.api.measures.Metric.Level.UNKNOWN");
+
+ ws.newRequest()
+ .setParam("project", project.getKey())
+ .execute();
+ }
+
+ @Test
+ public void measure_not_found() {
+ ComponentDto project = db.components().insertPublicProject();
+ userSession.registerComponents(project);
+
+ String response = ws.newRequest()
+ .setParam("project", project.getKey())
+ .execute().getInput();
+
+ checkError(response, format("Quality gate has not been found for project '%s' and branch 'null'", project.getKey()));
+ }
+
+ @Test
+ public void measure_value_is_null() {
+ ComponentDto project = db.components().insertPublicProject();
+ userSession.registerComponents(project);
+ MetricDto metric = createQualityGateMetric();
+ db.measures().insertLiveMeasure(project, metric, m -> m.setValue(null).setData((String) null));
+
+ String response = ws.newRequest()
+ .setParam("project", project.getKey())
+ .setParam("metric", metric.getKey())
+ .execute().getInput();
+
+ checkError(response, format("Quality gate has not been found for project '%s' and branch 'null'", project.getKey()));
+ }
+
+ @Test
+ public void unauthorized() {
+ ComponentDto project = db.components().insertPrivateProject();
+
+ String response = ws.newRequest()
+ .setParam("project", project.getKey())
+ .execute().getInput();
+
+ checkError(response, "Insufficient privileges");
+ }
@Test
public void test_definition() {
@@ -37,20 +182,43 @@ public class QualityGateActionTest {
assertThat(def.key()).isEqualTo("quality_gate");
assertThat(def.isInternal()).isFalse();
assertThat(def.isPost()).isFalse();
- assertThat(def.since()).isNull();
+ assertThat(def.since()).isEqualTo("7.1");
assertThat(def.responseExampleAsString()).isNotEmpty();
assertThat(def.params())
.extracting(Param::key, Param::isRequired)
.containsExactlyInAnyOrder(
- tuple("component", true),
- tuple("type", false));
+ tuple("project", true),
+ tuple("branch", false));
}
- @Test
- public void test_example() {
- String response = ws.newRequest().execute().getInput();
+ private MetricDto createQualityGateMetric() {
+ return db.measures().insertMetric(m -> m.setKey(ALERT_STATUS_KEY).setValueType(LEVEL.name()));
+ }
+
+ private void checkError(String svg, String expectedError) {
+ assertThat(svg).contains("<text", ">" + expectedError + "</text>");
+ }
+
+ private void checkResponse(String response, Level status) {
+ switch (status) {
+ case OK:
+ assertThat(response).isEqualTo(readTemplate("quality_gate_passed.svg"));
+ break;
+ case WARN:
+ assertThat(response).isEqualTo(readTemplate("quality_gate_warn.svg"));
+ break;
+ case ERROR:
+ assertThat(response).isEqualTo(readTemplate("quality_gate_failed.svg"));
+ break;
+ }
+ }
- assertThat(response).isEqualTo(ws.getDef().responseExampleAsString());
+ private String readTemplate(String template) {
+ try {
+ return IOUtils.toString(getClass().getResource("templates/" + template), UTF_8);
+ } catch (IOException e) {
+ throw new IllegalStateException(String.format("Can't read svg template '%s'", template), e);
+ }
}
}