diff --git a/pom.xml b/pom.xml index 999432742..caefddac9 100644 --- a/pom.xml +++ b/pom.xml @@ -33,8 +33,8 @@ 999999-SNAPSHOT jenkinsci/pipeline-graph-view-plugin - 2.504 - ${jenkins.baseline}.3 + 2.516 + 2.532 24.2.0 11.3.0 false diff --git a/src/main/frontend/pipeline-console-view/pipeline-console/main/PipelineConsole.tsx b/src/main/frontend/pipeline-console-view/pipeline-console/main/PipelineConsole.tsx index 7568289bf..9dd7f2e40 100644 --- a/src/main/frontend/pipeline-console-view/pipeline-console/main/PipelineConsole.tsx +++ b/src/main/frontend/pipeline-console-view/pipeline-console/main/PipelineConsole.tsx @@ -52,6 +52,12 @@ export default function PipelineConsole() { container={document.getElementById("console-pipeline-overflow-root")} > diff --git a/src/main/frontend/pipeline-console-view/pipeline-console/main/components/stages.scss b/src/main/frontend/pipeline-console-view/pipeline-console/main/components/stages.scss index d57735ec4..d71f54ca1 100644 --- a/src/main/frontend/pipeline-console-view/pipeline-console/main/components/stages.scss +++ b/src/main/frontend/pipeline-console-view/pipeline-console/main/components/stages.scss @@ -1,12 +1,7 @@ .pgv-stages-graph { - --card-background: color-mix( - in srgb, - var(--text-color-secondary) 4%, - var(--background) - ); position: relative; background: var(--card-background); - border: var(--jenkins-border); + border: var(--card-border-width) solid var(--card-border-color); border-radius: var(--form-input-border-radius); overflow: hidden; height: 100%; diff --git a/src/main/frontend/pipeline-console-view/pipeline-console/main/data-tree-view.scss b/src/main/frontend/pipeline-console-view/pipeline-console/main/data-tree-view.scss index 09f98dcc0..134d3f219 100644 --- a/src/main/frontend/pipeline-console-view/pipeline-console/main/data-tree-view.scss +++ b/src/main/frontend/pipeline-console-view/pipeline-console/main/data-tree-view.scss @@ -11,6 +11,7 @@ $pgv-item-padding-inline: 0.7rem; content: ""; position: absolute; inset: 0; + background: var(--input-color); border-radius: var(--form-input-border-radius); // TODO - var fallback can removed after baseline is moved >= 2.496 border: var( diff --git a/src/main/frontend/pipeline-graph-view/app.tsx b/src/main/frontend/pipeline-graph-view/app.tsx index 87491a8c1..e3b2c0ea4 100644 --- a/src/main/frontend/pipeline-graph-view/app.tsx +++ b/src/main/frontend/pipeline-graph-view/app.tsx @@ -16,14 +16,12 @@ export default function App() { }); return ( -
- - - -
+ + + ); } diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/cards/Card.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/cards/Card.java deleted file mode 100644 index 06efcb937..000000000 --- a/src/main/java/io/jenkins/plugins/pipelinegraphview/cards/Card.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.jenkins.plugins.pipelinegraphview.cards; - -public abstract class Card { - public abstract String getTitle(); -} diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/cards/RunDetailsCard.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/cards/RunDetailsCard.java deleted file mode 100644 index 516c4ad55..000000000 --- a/src/main/java/io/jenkins/plugins/pipelinegraphview/cards/RunDetailsCard.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.jenkins.plugins.pipelinegraphview.cards; - -import java.util.List; - -public class RunDetailsCard extends Card { - - private final List items; - - public RunDetailsCard(List items) { - this.items = items; - } - - public List getItems() { - return items; - } - - @Override - public String getTitle() { - return "Details"; - } -} diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/cards/RunDetailsItem.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/cards/RunDetailsItem.java index d9cfe97a2..d63539760 100644 --- a/src/main/java/io/jenkins/plugins/pipelinegraphview/cards/RunDetailsItem.java +++ b/src/main/java/io/jenkins/plugins/pipelinegraphview/cards/RunDetailsItem.java @@ -7,10 +7,6 @@ public sealed interface RunDetailsItem { - RunDetailsItem SEPARATOR = new Separator(); - - record Separator() implements RunDetailsItem {} - final class RunDetail implements RunDetailsItem { private final @NonNull Icon icon; private final @NonNull ItemContent content; @@ -45,12 +41,6 @@ public String icon() { sealed interface Icon { String value(); - record SimpleIcon(@NonNull String value) implements Icon { - public SimpleIcon { - requireNonNull(value); - } - } - record Ionicon(@NonNull String value) implements Icon { public Ionicon(@NonNull String value) { requireNonNull(value); diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/cards/items/TimingRunDetailsItems.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/cards/items/TimingRunDetailsItems.java deleted file mode 100644 index 862204750..000000000 --- a/src/main/java/io/jenkins/plugins/pipelinegraphview/cards/items/TimingRunDetailsItems.java +++ /dev/null @@ -1,42 +0,0 @@ -package io.jenkins.plugins.pipelinegraphview.cards.items; - -import hudson.Util; -import io.jenkins.plugins.pipelinegraphview.Messages; -import io.jenkins.plugins.pipelinegraphview.cards.RunDetailsItem; -import io.jenkins.plugins.pipelinegraphview.cards.RunDetailsItem.Icon.Ionicon; -import io.jenkins.plugins.pipelinegraphview.cards.RunDetailsItem.ItemContent; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import jenkins.metrics.impl.TimeInQueueAction; -import org.jenkinsci.plugins.workflow.job.WorkflowRun; - -public class TimingRunDetailsItems { - - public static List get(WorkflowRun run) { - List runDetailsItems = new ArrayList<>(); - - long startedTime = Math.abs(run.getTime().getTime() - new Date().getTime()); - RunDetailsItem startedItem = new RunDetailsItem.RunDetail( - new Ionicon("time-outline"), ItemContent.of(Messages.startedAgo(Util.getTimeSpanString(startedTime)))); - runDetailsItems.add(startedItem); - - TimeInQueueAction timeInQueueAction = run.getAction(TimeInQueueAction.class); - - if (timeInQueueAction != null) { - RunDetailsItem queuedItem = new RunDetailsItem.RunDetail( - new Ionicon("hourglass-outline"), - ItemContent.of( - Messages.queued(Util.getTimeSpanString(timeInQueueAction.getQueuingDurationMillis())))); - - runDetailsItems.add(queuedItem); - } - - RunDetailsItem timerItem = new RunDetailsItem.RunDetail( - new Ionicon("timer-outline"), ItemContent.of(Messages.took(run.getDurationString()))); - - runDetailsItems.add(timerItem); - - return runDetailsItems; - } -} diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/cards/items/UpstreamCauseRunDetailsItem.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/cards/items/UpstreamCauseRunDetailsItem.java deleted file mode 100644 index 3904adaa2..000000000 --- a/src/main/java/io/jenkins/plugins/pipelinegraphview/cards/items/UpstreamCauseRunDetailsItem.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.jenkins.plugins.pipelinegraphview.cards.items; - -import hudson.model.Cause; -import hudson.model.CauseAction; -import io.jenkins.plugins.pipelinegraphview.Messages; -import io.jenkins.plugins.pipelinegraphview.PipelineGraphDisplayURLProvider; -import io.jenkins.plugins.pipelinegraphview.cards.RunDetailsItem; -import io.jenkins.plugins.pipelinegraphview.cards.RunDetailsItem.Icon.Ionicon; -import io.jenkins.plugins.pipelinegraphview.cards.RunDetailsItem.ItemContent; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import org.jenkinsci.plugins.workflow.job.WorkflowRun; - -public class UpstreamCauseRunDetailsItem { - - public static Optional get(WorkflowRun run) { - CauseAction causeAction = run.getAction(CauseAction.class); - if (causeAction == null) { - return Optional.empty(); - } - List causes = causeAction.getCauses(); - return causes.stream() - .filter(cause -> cause instanceof Cause.UpstreamCause) - .map(upstreamCause -> (Cause.UpstreamCause) upstreamCause) - .map(Cause.UpstreamCause::getUpstreamRun) - .filter(Objects::nonNull) - .map(upstreamRun -> ItemContent.of( - new PipelineGraphDisplayURLProvider().getRunURL(upstreamRun), - Messages.cause_upstream(upstreamRun.getDisplayName()))) - .map( - content -> new RunDetailsItem.RunDetail(new Ionicon("play-circle-outline"), content)) - .findAny(); - } -} diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/cards/items/UserIdCauseRunDetailsItem.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/cards/items/UserIdCauseRunDetailsItem.java deleted file mode 100644 index 0bd9d513d..000000000 --- a/src/main/java/io/jenkins/plugins/pipelinegraphview/cards/items/UserIdCauseRunDetailsItem.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.jenkins.plugins.pipelinegraphview.cards.items; - -import hudson.model.Cause; -import hudson.model.CauseAction; -import hudson.model.User; -import hudson.tasks.UserAvatarResolver; -import io.jenkins.plugins.pipelinegraphview.Messages; -import io.jenkins.plugins.pipelinegraphview.cards.RunDetailsItem; -import io.jenkins.plugins.pipelinegraphview.cards.RunDetailsItem.Icon.SimpleIcon; -import io.jenkins.plugins.pipelinegraphview.cards.RunDetailsItem.ItemContent; -import java.util.HashMap; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import org.jenkinsci.plugins.workflow.job.WorkflowRun; - -public class UserIdCauseRunDetailsItem { - - public static Optional get(WorkflowRun run) { - CauseAction causeAction = run.getAction(CauseAction.class); - if (causeAction == null) { - return Optional.empty(); - } - List causes = causeAction.getCauses(); - return causes.stream() - .filter(cause -> cause instanceof Cause.UserIdCause) - .map(userIdCause -> (Cause.UserIdCause) userIdCause) - .map(userIdCause -> User.get(userIdCause.getUserId(), false, new HashMap<>())) - .filter(Objects::nonNull) - .map(user -> new RunDetailsItem.RunDetail( - new SimpleIcon(UserAvatarResolver.resolve(user, "48x48")), - ItemContent.of(Messages.cause_user(user.getDisplayName())))) - .findAny(); - } -} diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/consoleview/PipelineConsoleViewAction.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/consoleview/PipelineConsoleViewAction.java index 0ed25545d..2c0de9ed8 100644 --- a/src/main/java/io/jenkins/plugins/pipelinegraphview/consoleview/PipelineConsoleViewAction.java +++ b/src/main/java/io/jenkins/plugins/pipelinegraphview/consoleview/PipelineConsoleViewAction.java @@ -4,7 +4,6 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.Plugin; import hudson.console.AnnotatedLargeText; -import hudson.model.Action; import hudson.model.BallColor; import hudson.model.Item; import hudson.model.ParametersDefinitionProperty; @@ -14,15 +13,11 @@ import hudson.util.HttpResponses; import io.jenkins.plugins.pipelinegraphview.Messages; import io.jenkins.plugins.pipelinegraphview.PipelineGraphViewConfiguration; -import io.jenkins.plugins.pipelinegraphview.cards.RunDetailsCard; import io.jenkins.plugins.pipelinegraphview.cards.RunDetailsItem; import io.jenkins.plugins.pipelinegraphview.cards.items.ArtifactRunDetailsItem; import io.jenkins.plugins.pipelinegraphview.cards.items.ChangesRunDetailsItem; import io.jenkins.plugins.pipelinegraphview.cards.items.SCMRunDetailsItems; import io.jenkins.plugins.pipelinegraphview.cards.items.TestResultRunDetailsItem; -import io.jenkins.plugins.pipelinegraphview.cards.items.TimingRunDetailsItems; -import io.jenkins.plugins.pipelinegraphview.cards.items.UpstreamCauseRunDetailsItem; -import io.jenkins.plugins.pipelinegraphview.cards.items.UserIdCauseRunDetailsItem; import io.jenkins.plugins.pipelinegraphview.utils.PipelineGraph; import io.jenkins.plugins.pipelinegraphview.utils.PipelineGraphApi; import io.jenkins.plugins.pipelinegraphview.utils.PipelineNodeUtil; @@ -35,9 +30,9 @@ import java.util.List; import java.util.concurrent.TimeUnit; import jenkins.model.Jenkins; +import jenkins.model.Tab; import net.sf.json.JSONObject; import net.sf.json.JsonConfig; -import org.jenkins.ui.icon.IconSpec; import org.jenkinsci.plugins.pipeline.modeldefinition.actions.RestartDeclarativePipelineAction; import org.jenkinsci.plugins.workflow.cps.replay.ReplayAction; import org.jenkinsci.plugins.workflow.flow.FlowExecution; @@ -53,7 +48,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class PipelineConsoleViewAction implements Action, IconSpec { +public class PipelineConsoleViewAction extends Tab { public static final long LOG_THRESHOLD = 150 * 1024; // 150KB public static final String URL_NAME = "pipeline-overview"; public static final int CACHE_AGE = (int) TimeUnit.DAYS.toSeconds(1); @@ -71,6 +66,7 @@ public class PipelineConsoleViewAction implements Action, IconSpec { private final PipelineStepApi stepApi; public PipelineConsoleViewAction(WorkflowRun target) { + super(target); this.run = target; this.graphApi = new PipelineGraphApi(this.run); this.stepApi = new PipelineStepApi(this.run); @@ -78,7 +74,7 @@ public PipelineConsoleViewAction(WorkflowRun target) { @Override public String getDisplayName() { - return "Pipeline Overview"; + return "Stages"; } @Override @@ -318,24 +314,12 @@ private static long parseIntWithDefault(String s, long defaultValue) { } @SuppressWarnings("unused") - public RunDetailsCard getRunDetailsCard() { - + public List getRunDetailsItems() { List runDetailsItems = new ArrayList<>(SCMRunDetailsItems.get(run)); - - if (!runDetailsItems.isEmpty()) { - runDetailsItems.add(RunDetailsItem.SEPARATOR); - } - - UpstreamCauseRunDetailsItem.get(run).ifPresent(runDetailsItems::add); - UserIdCauseRunDetailsItem.get(run).ifPresent(runDetailsItems::add); - - runDetailsItems.addAll(TimingRunDetailsItems.get(run)); - ChangesRunDetailsItem.get(run).ifPresent(runDetailsItems::add); TestResultRunDetailsItem.get(run).ifPresent(runDetailsItems::add); ArtifactRunDetailsItem.get(run).ifPresent(runDetailsItems::add); - - return new RunDetailsCard(runDetailsItems); + return runDetailsItems; } public boolean isShowGraphOnBuildPage() { @@ -516,13 +500,8 @@ public BallColor getIconColor() { return run.getIconColor(); } - @Override - public String getIconClassName() { - return "symbol-git-network-outline plugin-ionicons-api"; - } - @Override public String getIconFileName() { - return null; + return "symbol-git-network-outline plugin-ionicons-api"; } } diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/consoleview/PipelineConsoleViewActionFactory.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/consoleview/PipelineConsoleViewActionFactory.java index 7ba96e4ba..58c358a14 100644 --- a/src/main/java/io/jenkins/plugins/pipelinegraphview/consoleview/PipelineConsoleViewActionFactory.java +++ b/src/main/java/io/jenkins/plugins/pipelinegraphview/consoleview/PipelineConsoleViewActionFactory.java @@ -8,7 +8,7 @@ import jenkins.model.TransientActionFactory; import org.jenkinsci.plugins.workflow.job.WorkflowRun; -@Extension +@Extension(ordinal = Integer.MAX_VALUE - 1) public class PipelineConsoleViewActionFactory extends TransientActionFactory { @Override diff --git a/src/main/resources/components/taglib b/src/main/resources/components/taglib new file mode 100644 index 000000000..e69de29bb diff --git a/src/main/resources/components/temporary-wrapper.jelly b/src/main/resources/components/temporary-wrapper.jelly new file mode 100644 index 000000000..0427ceb2f --- /dev/null +++ b/src/main/resources/components/temporary-wrapper.jelly @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + ${it.buildDisplayName} + + + + + + + + + + + + +
+ +
+ +
+
+
+ + +