From bfc5bceb12ba2061c40896779b6bb95e4c0096f8 Mon Sep 17 00:00:00 2001 From: Kezhi Xiong Date: Sun, 14 Feb 2021 15:52:50 +0800 Subject: [PATCH 01/12] Support actions in publish checks step --- pom.xml | 8 +++- .../plugins/checks/api/ChecksAction.java | 5 ++- .../checks/steps/PublishChecksStep.java | 39 +++++++++++++++++++ 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index d8035ca2..6da845fa 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ io.jenkins.plugins checks-api - ${revision}${changelist} + 1.6.0-SNAPSHOT hpi Checks API plugin @@ -118,6 +118,12 @@ \d+\.\d+\.\d+ + + true + java.field.serialVersionUIDUnchanged + field io.jenkins.plugins.checks.steps.PublishChecksStep.serialVersionUID + Newly implementing the Serializable will not break the API. + diff --git a/src/main/java/io/jenkins/plugins/checks/api/ChecksAction.java b/src/main/java/io/jenkins/plugins/checks/api/ChecksAction.java index 0620f345..11bffb8a 100644 --- a/src/main/java/io/jenkins/plugins/checks/api/ChecksAction.java +++ b/src/main/java/io/jenkins/plugins/checks/api/ChecksAction.java @@ -1,5 +1,6 @@ package io.jenkins.plugins.checks.api; +import java.io.Serializable; import java.util.Optional; import edu.umd.cs.findbugs.annotations.CheckForNull; @@ -8,7 +9,9 @@ /** * An action of a check. It can be used to create actions like re-run or automatic formatting. */ -public class ChecksAction { +public class ChecksAction implements Serializable { + private static final long serialVersionUID = 1L; + private final String label; private final String description; private final String identifier; diff --git a/src/main/java/io/jenkins/plugins/checks/steps/PublishChecksStep.java b/src/main/java/io/jenkins/plugins/checks/steps/PublishChecksStep.java index 82d4f479..49a2f092 100644 --- a/src/main/java/io/jenkins/plugins/checks/steps/PublishChecksStep.java +++ b/src/main/java/io/jenkins/plugins/checks/steps/PublishChecksStep.java @@ -31,6 +31,7 @@ public class PublishChecksStep extends Step implements Serializable { private String detailsURL = StringUtils.EMPTY; private ChecksStatus status = ChecksStatus.COMPLETED; private ChecksConclusion conclusion = ChecksConclusion.SUCCESS; + private List actions = Collections.emptyList(); /** * Constructor used for pipeline by Stapler. @@ -86,6 +87,11 @@ public void setConclusion(final ChecksConclusion conclusion) { this.conclusion = conclusion; } + @DataBoundSetter + public void setActions(final List actions) { + this.actions = actions; + } + public String getName() { return name; } @@ -114,6 +120,10 @@ public ChecksConclusion getConclusion() { return conclusion; } + public List getActions() { + return actions; + } + @Override public StepExecution start(final StepContext stepContext) { return new PublishChecksStepExecution(stepContext, this); @@ -209,7 +219,36 @@ ChecksDetails extractChecksDetails() throws IOException, InterruptedException { .withSummary(step.getSummary()) .withText(step.getText()) .build()) + .withActions(step.getActions().stream() + .map(StepChecksAction::getAction) + .collect(Collectors.toList())) .build(); } } + + public static class StepChecksAction implements Serializable { + private static final long serialVersionUID = 1L; + private final ChecksAction action; + + @DataBoundConstructor + public StepChecksAction(final String label, final String description, final String identifier) { + action = new ChecksAction(label, description, identifier); + } + + public String getLabel() { + return action.getLabel().orElse(StringUtils.EMPTY); + } + + public String getDescription() { + return action.getDescription().orElse(StringUtils.EMPTY); + } + + public String getIdentifier() { + return action.getIdentifier().orElse(StringUtils.EMPTY); + } + + public ChecksAction getAction() { + return action; + } + } } From b4762f7bb37194fc29600b39858a816f0b7f1759 Mon Sep 17 00:00:00 2001 From: Kezhi Xiong Date: Tue, 16 Feb 2021 18:07:17 +0800 Subject: [PATCH 02/12] Add test --- .../checks/steps/PublishChecksStepITest.java | 10 ++++---- .../checks/steps/PublishChecksStepTest.java | 23 +++++++++++++++---- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepITest.java b/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepITest.java index e0807060..6803ff86 100644 --- a/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepITest.java +++ b/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepITest.java @@ -1,9 +1,6 @@ package io.jenkins.plugins.checks.steps; -import io.jenkins.plugins.checks.api.ChecksConclusion; -import io.jenkins.plugins.checks.api.ChecksDetails; -import io.jenkins.plugins.checks.api.ChecksOutput; -import io.jenkins.plugins.checks.api.ChecksStatus; +import io.jenkins.plugins.checks.api.*; import io.jenkins.plugins.checks.util.CapturingChecksPublisher; import io.jenkins.plugins.util.IntegrationTestWithJenkinsPerTest; import org.jenkinsci.plugins.workflow.job.WorkflowJob; @@ -36,7 +33,8 @@ public void shouldPublishChecksWhenUsingPipeline() throws IOException { WorkflowJob job = createPipeline(); job.setDefinition(asStage("publishChecks name: 'customized-check', " + "summary: 'customized check created in pipeline', title: 'Publish Checks Step', " - + "text: 'Pipeline support for checks', status: 'IN_PROGRESS', conclusion: 'NONE'")); + + "text: 'Pipeline support for checks', status: 'IN_PROGRESS', conclusion: 'NONE', " + + "actions: [[label:'test-label', description:'test-desc', identifier:'test-id']]")); assertThat(JenkinsRule.getLog(buildSuccessfully(job))) .contains("[Pipeline] publishChecks"); @@ -49,6 +47,8 @@ public void shouldPublishChecksWhenUsingPipeline() throws IOException { assertThat(details.getOutput()).isPresent(); assertThat(details.getStatus()).isEqualTo(ChecksStatus.IN_PROGRESS); assertThat(details.getConclusion()).isEqualTo(ChecksConclusion.NONE); + assertThat(details.getActions()).usingFieldByFieldElementComparator().containsExactlyInAnyOrder( + new ChecksAction("test-label", "test-desc", "test-id")); ChecksOutput output = details.getOutput().get(); assertThat(output.getTitle()).isPresent().get().isEqualTo("Publish Checks Step"); diff --git a/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepTest.java b/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepTest.java index 78d5ad89..989f3c6f 100644 --- a/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepTest.java +++ b/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepTest.java @@ -2,17 +2,15 @@ import hudson.model.Run; import hudson.model.TaskListener; -import io.jenkins.plugins.checks.api.ChecksConclusion; -import io.jenkins.plugins.checks.api.ChecksDetails; -import io.jenkins.plugins.checks.api.ChecksOutput; -import io.jenkins.plugins.checks.api.ChecksStatus; +import io.jenkins.plugins.checks.api.*; import org.apache.commons.lang3.StringUtils; import org.jenkinsci.plugins.workflow.steps.StepContext; import org.jenkinsci.plugins.workflow.steps.StepExecution; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; import java.util.Objects; import static org.assertj.core.api.Assertions.assertThat; @@ -44,6 +42,7 @@ void shouldPublishCheckWithDefaultValues() throws IOException, InterruptedExcept .withSummary(StringUtils.EMPTY) .withText(StringUtils.EMPTY) .build()) + .withActions(Collections.emptyList()) .build()); } @@ -93,6 +92,17 @@ void shouldPublishCheckWithStatusQueue() throws IOException, InterruptedExceptio @Test void shouldPublishCheckWithSetValues() throws IOException, InterruptedException { + PublishChecksStep step = new PublishChecksStep(); + step.setName("Jenkins"); + step.setSummary("a check made by Jenkins"); + step.setTitle("Jenkins Build"); + step.setText("a failed build"); + step.setStatus(ChecksStatus.IN_PROGRESS); + step.setConclusion(ChecksConclusion.FAILURE); + step.setDetailsURL("http://ci.jenkins.io"); + step.setActions(Arrays.asList( + new PublishChecksStep.StepChecksAction("label-1", "description-1", "identifier-1"), + new PublishChecksStep.StepChecksAction("label-2", "description-2", "identifier-2"))); PublishChecksStep step = getModifiedPublishChecksStepObject("a failed build", ChecksStatus.IN_PROGRESS, ChecksConclusion.FAILURE); @@ -110,6 +120,9 @@ void shouldPublishCheckWithSetValues() throws IOException, InterruptedException .withSummary("a check made by Jenkins") .withText("a failed build") .build()) + .withActions(Arrays.asList( + new ChecksAction("label-1", "description-1", "identifier-1"), + new ChecksAction("label-2", "description-2", "identifier-2"))) .build()); } From 12c4975caa2d0f2e3c3540626184ce107abd2038 Mon Sep 17 00:00:00 2001 From: Kezhi Xiong Date: Tue, 16 Feb 2021 20:45:55 +0800 Subject: [PATCH 03/12] Change revision --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 6da845fa..78d375f8 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ io.jenkins.plugins checks-api - 1.6.0-SNAPSHOT + ${revision}${changelist} hpi Checks API plugin @@ -19,7 +19,7 @@ 8 - 1.5.1 + 1.6.0 -SNAPSHOT From e92f6de49efb44c08f83bb40c7cfc9564e26323f Mon Sep 17 00:00:00 2001 From: Kezhi Xiong Date: Wed, 17 Feb 2021 12:08:26 +0800 Subject: [PATCH 04/12] Add docs --- .../plugins/checks/steps/PublishChecksStep.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/io/jenkins/plugins/checks/steps/PublishChecksStep.java b/src/main/java/io/jenkins/plugins/checks/steps/PublishChecksStep.java index 49a2f092..08be4d5e 100644 --- a/src/main/java/io/jenkins/plugins/checks/steps/PublishChecksStep.java +++ b/src/main/java/io/jenkins/plugins/checks/steps/PublishChecksStep.java @@ -226,10 +226,23 @@ ChecksDetails extractChecksDetails() throws IOException, InterruptedException { } } + /** + * A simple wrapper for {@link ChecksAction} to allow users add checks actions by {@link PublishChecksStep}. + */ public static class StepChecksAction implements Serializable { private static final long serialVersionUID = 1L; private final ChecksAction action; + /** + * Creates an instance that wraps a newly constructed {@link ChecksAction} with according parameters. + * + * @param label + * label of the action to display in the checks report on SCMs + * @param description + * description for the action + * @param identifier + * identifier for the action, useful to identify which action is requested by users + */ @DataBoundConstructor public StepChecksAction(final String label, final String description, final String identifier) { action = new ChecksAction(label, description, identifier); From 88f492a0dcf2e0f6c0027051eb2f43701a478b5b Mon Sep 17 00:00:00 2001 From: Kezhi Xiong Date: Sat, 20 Feb 2021 11:45:01 +0800 Subject: [PATCH 05/12] Rebase master and improve test --- .../checks/steps/PublishChecksStepTest.java | 67 +++++++++---------- 1 file changed, 30 insertions(+), 37 deletions(-) diff --git a/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepTest.java b/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepTest.java index 989f3c6f..4305be1e 100644 --- a/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepTest.java +++ b/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepTest.java @@ -11,24 +11,15 @@ import java.io.IOException; import java.util.Arrays; import java.util.Collections; -import java.util.Objects; import static org.assertj.core.api.Assertions.assertThat; import static io.jenkins.plugins.checks.assertions.Assertions.assertThat; import static org.mockito.Mockito.*; class PublishChecksStepTest { - - StepContext getStepContext() throws IOException, InterruptedException { - StepContext context = mock(StepContext.class); - when(context.get(Run.class)).thenReturn(mock(Run.class)); - when(context.get(TaskListener.class)).thenReturn(TaskListener.NULL); - return context; - } - @Test void shouldPublishCheckWithDefaultValues() throws IOException, InterruptedException { - StepExecution execution = new PublishChecksStep().start(getStepContext()); + StepExecution execution = new PublishChecksStep().start(createStepContext()); assertThat(execution).isInstanceOf(PublishChecksStep.PublishChecksStepExecution.class); assertThat(((PublishChecksStep.PublishChecksStepExecution)execution).extractChecksDetails()) .usingRecursiveComparison() @@ -48,10 +39,10 @@ void shouldPublishCheckWithDefaultValues() throws IOException, InterruptedExcept @Test void shouldPublishCheckWithStatusInProgress() throws IOException, InterruptedException { - PublishChecksStep step = getModifiedPublishChecksStepObject("an in progress build", - ChecksStatus.IN_PROGRESS, null); + PublishChecksStep step = createPublishChecksStep("an in progress build", ChecksStatus.IN_PROGRESS, + ChecksConclusion.NONE); - StepExecution execution = step.start(getStepContext()); + StepExecution execution = step.start(createStepContext()); assertThat(execution).isInstanceOf(PublishChecksStep.PublishChecksStepExecution.class); assertThat(((PublishChecksStep.PublishChecksStepExecution)execution).extractChecksDetails()) .usingRecursiveComparison() @@ -69,11 +60,11 @@ void shouldPublishCheckWithStatusInProgress() throws IOException, InterruptedExc } @Test - void shouldPublishCheckWithStatusQueue() throws IOException, InterruptedException { - PublishChecksStep step = getModifiedPublishChecksStepObject("a queued build", - ChecksStatus.QUEUED, null); + void shouldPublishCheckWithStatusQueued() throws IOException, InterruptedException { + PublishChecksStep step = createPublishChecksStep("a queued build", ChecksStatus.QUEUED, + ChecksConclusion.NONE); - StepExecution execution = step.start(getStepContext()); + StepExecution execution = step.start(createStepContext()); assertThat(execution).isInstanceOf(PublishChecksStep.PublishChecksStepExecution.class); assertThat(((PublishChecksStep.PublishChecksStepExecution)execution).extractChecksDetails()) .usingRecursiveComparison() @@ -92,21 +83,20 @@ void shouldPublishCheckWithStatusQueue() throws IOException, InterruptedExceptio @Test void shouldPublishCheckWithSetValues() throws IOException, InterruptedException { - PublishChecksStep step = new PublishChecksStep(); - step.setName("Jenkins"); - step.setSummary("a check made by Jenkins"); - step.setTitle("Jenkins Build"); - step.setText("a failed build"); - step.setStatus(ChecksStatus.IN_PROGRESS); - step.setConclusion(ChecksConclusion.FAILURE); - step.setDetailsURL("http://ci.jenkins.io"); + PublishChecksStep step = createPublishChecksStep("a failed build", ChecksStatus.IN_PROGRESS, + ChecksConclusion.FAILURE); + step.setActions(Arrays.asList( new PublishChecksStep.StepChecksAction("label-1", "description-1", "identifier-1"), new PublishChecksStep.StepChecksAction("label-2", "description-2", "identifier-2"))); - PublishChecksStep step = getModifiedPublishChecksStepObject("a failed build", - ChecksStatus.IN_PROGRESS, ChecksConclusion.FAILURE); + assertThat(step.getActions().stream().map(PublishChecksStep.StepChecksAction::getLabel)) + .containsExactlyInAnyOrder("label-1", "label-2"); + assertThat(step.getActions().stream().map(PublishChecksStep.StepChecksAction::getDescription)) + .containsExactlyInAnyOrder("description-1", "description-2"); + assertThat(step.getActions().stream().map(PublishChecksStep.StepChecksAction::getIdentifier)) + .containsExactlyInAnyOrder("identifier-1", "identifier-2"); - StepExecution execution = step.start(getStepContext()); + StepExecution execution = step.start(createStepContext()); assertThat(execution).isInstanceOf(PublishChecksStep.PublishChecksStepExecution.class); assertThat(((PublishChecksStep.PublishChecksStepExecution)execution).extractChecksDetails()) .usingRecursiveComparison() @@ -134,20 +124,23 @@ void shouldDefinePublishChecksStepDescriptorCorrectly() { assertThat(descriptor.getRequiredContext().toArray()).containsExactlyInAnyOrder(Run.class, TaskListener.class); } - private PublishChecksStep getModifiedPublishChecksStepObject(final String stepText, final ChecksStatus status, - final ChecksConclusion conclusion) { + private StepContext createStepContext() throws IOException, InterruptedException { + StepContext context = mock(StepContext.class); + when(context.get(Run.class)).thenReturn(mock(Run.class)); + when(context.get(TaskListener.class)).thenReturn(TaskListener.NULL); + return context; + } + + private PublishChecksStep createPublishChecksStep(final String stepText, final ChecksStatus status, + final ChecksConclusion conclusion) { PublishChecksStep step = new PublishChecksStep(); step.setName("Jenkins"); step.setSummary("a check made by Jenkins"); step.setTitle("Jenkins Build"); - step.setText(stepText); - if (Objects.nonNull(status)) { - step.setStatus(status); - } - if (Objects.nonNull(conclusion)) { - step.setConclusion(conclusion); - } step.setDetailsURL("http://ci.jenkins.io"); + step.setText(stepText); + step.setStatus(status); + step.setConclusion(conclusion); return step; } From 166c08bdef4c56ceaab224958a74750fbef1cb47 Mon Sep 17 00:00:00 2001 From: Kezhi Xiong Date: Sat, 20 Feb 2021 23:30:57 +0800 Subject: [PATCH 06/12] Make description optional --- .../jenkins/plugins/checks/api/ChecksAction.java | 2 +- .../plugins/checks/steps/PublishChecksStep.java | 13 ++++++++----- .../checks/steps/PublishChecksStepTest.java | 14 +++++++++----- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/main/java/io/jenkins/plugins/checks/api/ChecksAction.java b/src/main/java/io/jenkins/plugins/checks/api/ChecksAction.java index 11bffb8a..2ea8bf23 100644 --- a/src/main/java/io/jenkins/plugins/checks/api/ChecksAction.java +++ b/src/main/java/io/jenkins/plugins/checks/api/ChecksAction.java @@ -33,7 +33,7 @@ public class ChecksAction implements Serializable { */ @SuppressFBWarnings("NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE") public ChecksAction(@CheckForNull final String label, @CheckForNull final String description, - @CheckForNull final String identifier) { + @CheckForNull final String identifier) { this.label = label; this.description = description; this.identifier = identifier; diff --git a/src/main/java/io/jenkins/plugins/checks/steps/PublishChecksStep.java b/src/main/java/io/jenkins/plugins/checks/steps/PublishChecksStep.java index 08be4d5e..5ee76f3d 100644 --- a/src/main/java/io/jenkins/plugins/checks/steps/PublishChecksStep.java +++ b/src/main/java/io/jenkins/plugins/checks/steps/PublishChecksStep.java @@ -231,21 +231,24 @@ ChecksDetails extractChecksDetails() throws IOException, InterruptedException { */ public static class StepChecksAction implements Serializable { private static final long serialVersionUID = 1L; - private final ChecksAction action; + private ChecksAction action; /** * Creates an instance that wraps a newly constructed {@link ChecksAction} with according parameters. * * @param label * label of the action to display in the checks report on SCMs - * @param description - * description for the action * @param identifier * identifier for the action, useful to identify which action is requested by users */ @DataBoundConstructor - public StepChecksAction(final String label, final String description, final String identifier) { - action = new ChecksAction(label, description, identifier); + public StepChecksAction(final String label, final String identifier) { + action = new ChecksAction(label, StringUtils.EMPTY, identifier); + } + + @DataBoundSetter + public void setDescription(final String description) { + action = new ChecksAction(getLabel(), description, getIdentifier()); } public String getLabel() { diff --git a/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepTest.java b/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepTest.java index 4305be1e..32634809 100644 --- a/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepTest.java +++ b/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepTest.java @@ -11,6 +11,7 @@ import java.io.IOException; import java.util.Arrays; import java.util.Collections; +import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static io.jenkins.plugins.checks.assertions.Assertions.assertThat; @@ -86,13 +87,16 @@ void shouldPublishCheckWithSetValues() throws IOException, InterruptedException PublishChecksStep step = createPublishChecksStep("a failed build", ChecksStatus.IN_PROGRESS, ChecksConclusion.FAILURE); - step.setActions(Arrays.asList( - new PublishChecksStep.StepChecksAction("label-1", "description-1", "identifier-1"), - new PublishChecksStep.StepChecksAction("label-2", "description-2", "identifier-2"))); + List actions = Arrays.asList( + new PublishChecksStep.StepChecksAction("label-1", "identifier-1"), + new PublishChecksStep.StepChecksAction("label-2", "identifier-2")); + actions.get(1).setDescription("description-2"); + + step.setActions(actions); assertThat(step.getActions().stream().map(PublishChecksStep.StepChecksAction::getLabel)) .containsExactlyInAnyOrder("label-1", "label-2"); assertThat(step.getActions().stream().map(PublishChecksStep.StepChecksAction::getDescription)) - .containsExactlyInAnyOrder("description-1", "description-2"); + .containsExactlyInAnyOrder(StringUtils.EMPTY, "description-2"); assertThat(step.getActions().stream().map(PublishChecksStep.StepChecksAction::getIdentifier)) .containsExactlyInAnyOrder("identifier-1", "identifier-2"); @@ -111,7 +115,7 @@ void shouldPublishCheckWithSetValues() throws IOException, InterruptedException .withText("a failed build") .build()) .withActions(Arrays.asList( - new ChecksAction("label-1", "description-1", "identifier-1"), + new ChecksAction("label-1", "", "identifier-1"), new ChecksAction("label-2", "description-2", "identifier-2"))) .build()); } From 950ac92cb160944c4f514e60ad96c884ef86a80d Mon Sep 17 00:00:00 2001 From: Kezhi Xiong Date: Sun, 21 Feb 2021 14:46:43 +0800 Subject: [PATCH 07/12] Add help docs --- README.md | 10 ++++++- .../checks/steps/PublishChecksStep.java | 29 ++++++++++++------- .../StepChecksAction/config.jelly | 16 ++++++++++ .../StepChecksAction/help-description.html | 3 ++ .../StepChecksAction/help-identifier.html | 5 ++++ .../StepChecksAction/help-label.html | 3 ++ .../steps/PublishChecksStep/config.jelly | 12 ++++++++ .../steps/PublishChecksStep/config.properties | 1 + 8 files changed, 68 insertions(+), 11 deletions(-) create mode 100644 src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/config.jelly create mode 100644 src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-description.html create mode 100644 src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-identifier.html create mode 100644 src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-label.html diff --git a/README.md b/README.md index 68764ab6..e2a436bd 100644 --- a/README.md +++ b/README.md @@ -38,9 +38,17 @@ If enabled, the statuses will be published in different stages of a Jenkins buil - publishChecks: you can publish checks directly in the pipeline script instead of depending on consumer plugins: ``` -publishChecks name: 'example', title: 'Pipeline Check', summary: 'check through pipeline', text: 'you can publish checks in pipeline script', detailsURL: 'https://github.com/jenkinsci/checks-api-plugin#pipeline-usage' +publishChecks name: 'example', title: 'Pipeline Check', summary: 'check through pipeline', + text: 'you can publish checks in pipeline script', + detailsURL: 'https://github.com/jenkinsci/checks-api-plugin#pipeline-usage', + actions: [[label:'an-user-request-action', description:'actions allow users to request pre-defined behaviours', identifier:'an unique identifier']] ``` +To use customized actions, you may need to define them on your own. +For instance, if you want to add GitHub checks actions which are basically buttons on the checks report, +you may need to extend [GHEventSubscriber](https://github.com/jenkinsci/github-plugin/blob/master/src/main/java/org/jenkinsci/plugins/github/extension/GHEventsSubscriber.java) to handle the user requests, +see [the handler](https://github.com/jenkinsci/github-checks-plugin/blob/ea060be67dad522ab6c31444fc4274955ac6e918/src/main/java/io/jenkins/plugins/checks/github/CheckRunGHEventSubscriber.java) for re-run requests as an example. + - withChecks: you can inject the check's name into the closure for other steps to use: ``` diff --git a/src/main/java/io/jenkins/plugins/checks/steps/PublishChecksStep.java b/src/main/java/io/jenkins/plugins/checks/steps/PublishChecksStep.java index 5ee76f3d..f886644f 100644 --- a/src/main/java/io/jenkins/plugins/checks/steps/PublishChecksStep.java +++ b/src/main/java/io/jenkins/plugins/checks/steps/PublishChecksStep.java @@ -3,8 +3,7 @@ import edu.hm.hafner.util.VisibleForTesting; import edu.umd.cs.findbugs.annotations.NonNull; import hudson.Extension; -import hudson.model.Run; -import hudson.model.TaskListener; +import hudson.model.*; import hudson.util.ListBoxModel; import io.jenkins.plugins.checks.api.*; import org.apache.commons.lang3.StringUtils; @@ -229,9 +228,11 @@ ChecksDetails extractChecksDetails() throws IOException, InterruptedException { /** * A simple wrapper for {@link ChecksAction} to allow users add checks actions by {@link PublishChecksStep}. */ - public static class StepChecksAction implements Serializable { + public static class StepChecksAction extends AbstractDescribableImpl implements Serializable { private static final long serialVersionUID = 1L; - private ChecksAction action; + private final String label; + private final String identifier; + private String description = StringUtils.EMPTY; /** * Creates an instance that wraps a newly constructed {@link ChecksAction} with according parameters. @@ -243,28 +244,36 @@ public static class StepChecksAction implements Serializable { */ @DataBoundConstructor public StepChecksAction(final String label, final String identifier) { - action = new ChecksAction(label, StringUtils.EMPTY, identifier); + this.label = label; + this.identifier = identifier; } @DataBoundSetter public void setDescription(final String description) { - action = new ChecksAction(getLabel(), description, getIdentifier()); + this.description = description; } public String getLabel() { - return action.getLabel().orElse(StringUtils.EMPTY); + return label; } public String getDescription() { - return action.getDescription().orElse(StringUtils.EMPTY); + return description; } public String getIdentifier() { - return action.getIdentifier().orElse(StringUtils.EMPTY); + return identifier; } public ChecksAction getAction() { - return action; + return new ChecksAction(label, description, identifier); + } + + /** + * Descriptor for {@link StepChecksAction}, required for Pipeline Snippet Generator. + */ + @Extension + public static class StepChecksActionDescriptor extends Descriptor { } } } diff --git a/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/config.jelly b/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/config.jelly new file mode 100644 index 00000000..158216a6 --- /dev/null +++ b/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/config.jelly @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-description.html b/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-description.html new file mode 100644 index 00000000..192c9bf8 --- /dev/null +++ b/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-description.html @@ -0,0 +1,3 @@ +
+ Detailed description for the action's purpose, functionality, and so on. +
\ No newline at end of file diff --git a/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-identifier.html b/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-identifier.html new file mode 100644 index 00000000..eed71f8d --- /dev/null +++ b/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-identifier.html @@ -0,0 +1,5 @@ +
+ The unique identifier for the action. Since for SCM platforms like GitHub, this is the only field that would be + sent back to your Jenkins instance when an action is requested, so you may need to use this field to bear more + information besides the basic type of the action. +
\ No newline at end of file diff --git a/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-label.html b/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-label.html new file mode 100644 index 00000000..4f32e4cc --- /dev/null +++ b/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-label.html @@ -0,0 +1,3 @@ +
+ The label to be displayed on the checks report for this action. +
diff --git a/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/config.jelly b/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/config.jelly index 4930968a..da19de7f 100644 --- a/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/config.jelly +++ b/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/config.jelly @@ -29,4 +29,16 @@ + +
+ + +
+ +
+
+
+
+
+ diff --git a/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/config.properties b/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/config.properties index 1907e359..741e2164 100644 --- a/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/config.properties +++ b/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/config.properties @@ -5,3 +5,4 @@ title.text=Text title.detailsURL=Details URL title.status=Status title.conclusion=Conclusion +title.actions=Actions From 73ec26345498f5b6258be6a43fc046d8e14fb0a9 Mon Sep 17 00:00:00 2001 From: Kezhi Xiong Date: Sun, 21 Feb 2021 15:04:28 +0800 Subject: [PATCH 08/12] Remove unused serializable for ChecksAction --- README.md | 4 ++-- pom.xml | 6 ------ .../java/io/jenkins/plugins/checks/api/ChecksAction.java | 5 +---- .../steps/PublishChecksStep/StepChecksAction/config.jelly | 2 +- .../StepChecksAction/help-description.html | 2 +- .../PublishChecksStep/StepChecksAction/help-identifier.html | 2 +- 6 files changed, 6 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index e2a436bd..2defe75c 100644 --- a/README.md +++ b/README.md @@ -44,10 +44,10 @@ publishChecks name: 'example', title: 'Pipeline Check', summary: 'check through actions: [[label:'an-user-request-action', description:'actions allow users to request pre-defined behaviours', identifier:'an unique identifier']] ``` -To use customized actions, you may need to define them on your own. +*To use customized actions, you may need to define them on your own. For instance, if you want to add GitHub checks actions which are basically buttons on the checks report, you may need to extend [GHEventSubscriber](https://github.com/jenkinsci/github-plugin/blob/master/src/main/java/org/jenkinsci/plugins/github/extension/GHEventsSubscriber.java) to handle the user requests, -see [the handler](https://github.com/jenkinsci/github-checks-plugin/blob/ea060be67dad522ab6c31444fc4274955ac6e918/src/main/java/io/jenkins/plugins/checks/github/CheckRunGHEventSubscriber.java) for re-run requests as an example. +see [the handler](https://github.com/jenkinsci/github-checks-plugin/blob/ea060be67dad522ab6c31444fc4274955ac6e918/src/main/java/io/jenkins/plugins/checks/github/CheckRunGHEventSubscriber.java) for re-run requests as an example.* - withChecks: you can inject the check's name into the closure for other steps to use: diff --git a/pom.xml b/pom.xml index 78d375f8..44d7661d 100644 --- a/pom.xml +++ b/pom.xml @@ -118,12 +118,6 @@ \d+\.\d+\.\d+ - - true - java.field.serialVersionUIDUnchanged - field io.jenkins.plugins.checks.steps.PublishChecksStep.serialVersionUID - Newly implementing the Serializable will not break the API. - diff --git a/src/main/java/io/jenkins/plugins/checks/api/ChecksAction.java b/src/main/java/io/jenkins/plugins/checks/api/ChecksAction.java index 2ea8bf23..a47a3ae8 100644 --- a/src/main/java/io/jenkins/plugins/checks/api/ChecksAction.java +++ b/src/main/java/io/jenkins/plugins/checks/api/ChecksAction.java @@ -1,6 +1,5 @@ package io.jenkins.plugins.checks.api; -import java.io.Serializable; import java.util.Optional; import edu.umd.cs.findbugs.annotations.CheckForNull; @@ -9,9 +8,7 @@ /** * An action of a check. It can be used to create actions like re-run or automatic formatting. */ -public class ChecksAction implements Serializable { - private static final long serialVersionUID = 1L; - +public class ChecksAction { private final String label; private final String description; private final String identifier; diff --git a/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/config.jelly b/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/config.jelly index 158216a6..8c1cea00 100644 --- a/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/config.jelly +++ b/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/config.jelly @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-description.html b/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-description.html index 192c9bf8..b65027e0 100644 --- a/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-description.html +++ b/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-description.html @@ -1,3 +1,3 @@
Detailed description for the action's purpose, functionality, and so on. -
\ No newline at end of file + diff --git a/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-identifier.html b/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-identifier.html index eed71f8d..279eee63 100644 --- a/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-identifier.html +++ b/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-identifier.html @@ -2,4 +2,4 @@ The unique identifier for the action. Since for SCM platforms like GitHub, this is the only field that would be sent back to your Jenkins instance when an action is requested, so you may need to use this field to bear more information besides the basic type of the action. - \ No newline at end of file + From d7ce64235a95c686baf9f255c85dee09231496b5 Mon Sep 17 00:00:00 2001 From: Kezhi Xiong Date: Sun, 21 Feb 2021 15:27:59 +0800 Subject: [PATCH 09/12] Keep compatibility --- pom.xml | 6 ++++++ .../io/jenkins/plugins/checks/steps/PublishChecksStep.java | 2 ++ 2 files changed, 8 insertions(+) diff --git a/pom.xml b/pom.xml index 44d7661d..118b3bcc 100644 --- a/pom.xml +++ b/pom.xml @@ -118,6 +118,12 @@ \d+\.\d+\.\d+ + + java.field.serialVersionUIDUnchanged + field io.jenkins.plugins.checks.steps.PublishChecksStep.serialVersionUID + 1 + Adding actions list with an initial empty value should not break the compatibility. + diff --git a/src/main/java/io/jenkins/plugins/checks/steps/PublishChecksStep.java b/src/main/java/io/jenkins/plugins/checks/steps/PublishChecksStep.java index f886644f..d64318eb 100644 --- a/src/main/java/io/jenkins/plugins/checks/steps/PublishChecksStep.java +++ b/src/main/java/io/jenkins/plugins/checks/steps/PublishChecksStep.java @@ -244,6 +244,8 @@ public static class StepChecksAction extends AbstractDescribableImpl Date: Sun, 21 Feb 2021 17:23:56 +0800 Subject: [PATCH 10/12] Apply docs suggestions from code review. Co-authored-by: Tim Jacomb <21194782+timja@users.noreply.github.com> --- README.md | 6 +++--- .../StepChecksAction/help-description.html | 2 +- .../PublishChecksStep/StepChecksAction/help-identifier.html | 2 +- .../plugins/checks/steps/PublishChecksStep/config.jelly | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 2defe75c..2244705a 100644 --- a/README.md +++ b/README.md @@ -44,9 +44,9 @@ publishChecks name: 'example', title: 'Pipeline Check', summary: 'check through actions: [[label:'an-user-request-action', description:'actions allow users to request pre-defined behaviours', identifier:'an unique identifier']] ``` -*To use customized actions, you may need to define them on your own. -For instance, if you want to add GitHub checks actions which are basically buttons on the checks report, -you may need to extend [GHEventSubscriber](https://github.com/jenkinsci/github-plugin/blob/master/src/main/java/org/jenkinsci/plugins/github/extension/GHEventsSubscriber.java) to handle the user requests, +*To use customized actions, you will need to write a Jenkins plugin +If you want to add GitHub checks actions which are basically buttons on the checks report, +you need to extend [GHEventSubscriber](https://github.com/jenkinsci/github-plugin/blob/master/src/main/java/org/jenkinsci/plugins/github/extension/GHEventsSubscriber.java) to handle the event, see [the handler](https://github.com/jenkinsci/github-checks-plugin/blob/ea060be67dad522ab6c31444fc4274955ac6e918/src/main/java/io/jenkins/plugins/checks/github/CheckRunGHEventSubscriber.java) for re-run requests as an example.* - withChecks: you can inject the check's name into the closure for other steps to use: diff --git a/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-description.html b/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-description.html index b65027e0..ed0104a1 100644 --- a/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-description.html +++ b/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-description.html @@ -1,3 +1,3 @@
- Detailed description for the action's purpose, functionality, and so on. + Detailed description of the action's purpose, functionality, and so on.
diff --git a/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-identifier.html b/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-identifier.html index 279eee63..d41e62d1 100644 --- a/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-identifier.html +++ b/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/StepChecksAction/help-identifier.html @@ -1,5 +1,5 @@
The unique identifier for the action. Since for SCM platforms like GitHub, this is the only field that would be - sent back to your Jenkins instance when an action is requested, so you may need to use this field to bear more + sent back to your Jenkins instance when an action is requested, so you may need to use this field to have more information besides the basic type of the action.
diff --git a/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/config.jelly b/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/config.jelly index da19de7f..bfaa7346 100644 --- a/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/config.jelly +++ b/src/main/resources/io/jenkins/plugins/checks/steps/PublishChecksStep/config.jelly @@ -32,7 +32,7 @@
- +
From 877b4de21fb11974749039c2753563d9f12970e8 Mon Sep 17 00:00:00 2001 From: Kezhi Xiong Date: Sun, 21 Feb 2021 17:28:54 +0800 Subject: [PATCH 11/12] Avoid star import --- .../jenkins/plugins/checks/steps/PublishChecksStep.java | 5 ++++- .../plugins/checks/steps/PublishChecksStepITest.java | 8 ++++++-- .../plugins/checks/steps/PublishChecksStepTest.java | 6 +++++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/jenkins/plugins/checks/steps/PublishChecksStep.java b/src/main/java/io/jenkins/plugins/checks/steps/PublishChecksStep.java index d64318eb..ebea6acb 100644 --- a/src/main/java/io/jenkins/plugins/checks/steps/PublishChecksStep.java +++ b/src/main/java/io/jenkins/plugins/checks/steps/PublishChecksStep.java @@ -3,7 +3,10 @@ import edu.hm.hafner.util.VisibleForTesting; import edu.umd.cs.findbugs.annotations.NonNull; import hudson.Extension; -import hudson.model.*; +import hudson.model.AbstractDescribableImpl; +import hudson.model.Descriptor; +import hudson.model.Run; +import hudson.model.TaskListener; import hudson.util.ListBoxModel; import io.jenkins.plugins.checks.api.*; import org.apache.commons.lang3.StringUtils; diff --git a/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepITest.java b/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepITest.java index 6803ff86..5ef9903c 100644 --- a/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepITest.java +++ b/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepITest.java @@ -1,6 +1,10 @@ package io.jenkins.plugins.checks.steps; -import io.jenkins.plugins.checks.api.*; +import io.jenkins.plugins.checks.api.ChecksAction; +import io.jenkins.plugins.checks.api.ChecksConclusion; +import io.jenkins.plugins.checks.api.ChecksDetails; +import io.jenkins.plugins.checks.api.ChecksOutput; +import io.jenkins.plugins.checks.api.ChecksStatus; import io.jenkins.plugins.checks.util.CapturingChecksPublisher; import io.jenkins.plugins.util.IntegrationTestWithJenkinsPerTest; import org.jenkinsci.plugins.workflow.job.WorkflowJob; @@ -23,7 +27,7 @@ public class PublishChecksStepITest extends IntegrationTestWithJenkinsPerTest { @TestExtension public static final CapturingChecksPublisher.Factory PUBLISHER_FACTORY = new CapturingChecksPublisher.Factory(); - /** + /*PublishChecksStepTest.java* * Tests that the step "publishChecks" can be used in pipeline script. * * @throws IOException if fails get log from run diff --git a/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepTest.java b/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepTest.java index 32634809..f9284282 100644 --- a/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepTest.java +++ b/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepTest.java @@ -2,7 +2,11 @@ import hudson.model.Run; import hudson.model.TaskListener; -import io.jenkins.plugins.checks.api.*; +import io.jenkins.plugins.checks.api.ChecksAction; +import io.jenkins.plugins.checks.api.ChecksConclusion; +import io.jenkins.plugins.checks.api.ChecksDetails; +import io.jenkins.plugins.checks.api.ChecksOutput; +import io.jenkins.plugins.checks.api.ChecksStatus; import org.apache.commons.lang3.StringUtils; import org.jenkinsci.plugins.workflow.steps.StepContext; import org.jenkinsci.plugins.workflow.steps.StepExecution; From 05e909c95c51ae09dcca99f74bbb2f79f0648218 Mon Sep 17 00:00:00 2001 From: Kezhi Xiong Date: Sun, 21 Feb 2021 17:44:51 +0800 Subject: [PATCH 12/12] Fix checkstyle --- .../io/jenkins/plugins/checks/steps/PublishChecksStepITest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepITest.java b/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepITest.java index 5ef9903c..75f2505d 100644 --- a/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepITest.java +++ b/src/test/java/io/jenkins/plugins/checks/steps/PublishChecksStepITest.java @@ -27,7 +27,7 @@ public class PublishChecksStepITest extends IntegrationTestWithJenkinsPerTest { @TestExtension public static final CapturingChecksPublisher.Factory PUBLISHER_FACTORY = new CapturingChecksPublisher.Factory(); - /*PublishChecksStepTest.java* + /** * Tests that the step "publishChecks" can be used in pipeline script. * * @throws IOException if fails get log from run