Skip to content

Commit 390a2f4

Browse files
committed
- Implemented custom Pipeline step (vigilnzScan) and verified execution in Pipeline jobs and added the custom credentials form with token,id,description fields
1 parent 1dfe8d5 commit 390a2f4

File tree

12 files changed

+356
-105
lines changed

12 files changed

+356
-105
lines changed

pom.xml

Lines changed: 104 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,83 +1,118 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
3-
<modelVersion>4.0.0</modelVersion>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
45

5-
<parent>
6-
<groupId>org.jenkins-ci.plugins</groupId>
7-
<artifactId>plugin</artifactId>
8-
<version>5.28</version>
9-
<relativePath />
10-
</parent>
6+
<parent>
7+
<groupId>org.jenkins-ci.plugins</groupId>
8+
<artifactId>plugin</artifactId>
9+
<version>5.28</version>
10+
<relativePath/>
11+
</parent>
12+
13+
<groupId>io.jenkins.plugins</groupId>
14+
<artifactId>vigilnz-security</artifactId>
15+
<version>${revision}${changelist}</version>
16+
<packaging>hpi</packaging>
17+
18+
<!-- Plugin Name -->
19+
<name>Vigilnz Security</name>
20+
<url>https://dev.vigilnz.com/</url>
21+
<licenses>
22+
<license>
23+
<name>MIT License</name>
24+
<url>https://opensource.org/license/mit/</url>
25+
</license>
26+
</licenses>
27+
<scm child.scm.connection.inherit.append.path="false" child.scm.developerConnection.inherit.append.path="false"
28+
child.scm.url.inherit.append.path="false">
29+
<connection>scm:git:https://github.com/${gitHubRepo}</connection>
30+
<developerConnection>scm:git:https://github.com/${gitHubRepo}</developerConnection>
31+
<tag>${scmTag}</tag>
32+
<url>https://github.com/${gitHubRepo}</url>
33+
</scm>
1134

12-
<groupId>io.jenkins.plugins</groupId>
13-
<artifactId>vigilnz-security</artifactId>
14-
<version>${revision}${changelist}</version>
15-
<packaging>hpi</packaging>
35+
<properties>
36+
<revision>1.0</revision>
37+
<changelist>-SNAPSHOT</changelist>
38+
<!-- https://www.jenkins.io/doc/developer/plugin-development/choosing-jenkins-baseline/ -->
39+
<jenkins.baseline>2.516</jenkins.baseline>
40+
<jenkins.version>${jenkins.baseline}.3</jenkins.version>
41+
<gitHubRepo>jenkinsci/${project.artifactId}-plugin</gitHubRepo>
1642

17-
<!-- Plugin Name -->
18-
<name>Vigilnz Security</name>
19-
<url>https://dev.vigilnz.com/</url>
20-
<licenses>
21-
<license>
22-
<name>MIT License</name>
23-
<url>https://opensource.org/license/mit/</url>
24-
</license>
25-
</licenses>
26-
<scm child.scm.connection.inherit.append.path="false" child.scm.developerConnection.inherit.append.path="false" child.scm.url.inherit.append.path="false">
27-
<connection>scm:git:https://github.com/${gitHubRepo}</connection>
28-
<developerConnection>scm:git:https://github.com/${gitHubRepo}</developerConnection>
29-
<tag>${scmTag}</tag>
30-
<url>https://github.com/${gitHubRepo}</url>
31-
</scm>
43+
<spotless.check.skip>false</spotless.check.skip>
44+
<ban-junit4-imports.skip>false</ban-junit4-imports.skip>
45+
<hpi.strictBundledArtifacts>true</hpi.strictBundledArtifacts>
46+
</properties>
3247

33-
<properties>
34-
<revision>1.0</revision>
35-
<changelist>-SNAPSHOT</changelist>
36-
<!-- https://www.jenkins.io/doc/developer/plugin-development/choosing-jenkins-baseline/ -->
37-
<jenkins.baseline>2.516</jenkins.baseline>
38-
<jenkins.version>${jenkins.baseline}.3</jenkins.version>
39-
<gitHubRepo>jenkinsci/${project.artifactId}-plugin</gitHubRepo>
48+
<dependencyManagement>
49+
<dependencies>
50+
<dependency>
51+
<groupId>io.jenkins.tools.bom</groupId>
52+
<artifactId>bom-${jenkins.baseline}.x</artifactId>
53+
<version>5659.vecf9e2dc5a_ed</version>
54+
<type>pom</type>
55+
<scope>import</scope>
56+
</dependency>
4057

41-
<spotless.check.skip>false</spotless.check.skip>
42-
<ban-junit4-imports.skip>false</ban-junit4-imports.skip>
43-
<hpi.strictBundledArtifacts>true</hpi.strictBundledArtifacts>
44-
</properties>
58+
<dependency>
59+
<groupId>org.jenkins-ci.main</groupId>
60+
<artifactId>jenkins-core</artifactId>
61+
<version>${jenkins.version}</version>
62+
<scope>provided</scope>
63+
</dependency>
64+
</dependencies>
65+
</dependencyManagement>
4566

46-
<dependencyManagement>
4767
<dependencies>
48-
<dependency>
49-
<groupId>io.jenkins.tools.bom</groupId>
50-
<artifactId>bom-${jenkins.baseline}.x</artifactId>
51-
<version>5659.vecf9e2dc5a_ed</version>
52-
<type>pom</type>
53-
<scope>import</scope>
54-
</dependency>
68+
<!-- Jenkins core -->
69+
<dependency>
70+
<groupId>org.jenkins-ci.main</groupId>
71+
<artifactId>jenkins-core</artifactId>
72+
<version>${jenkins.version}</version>
73+
<scope>provided</scope>
74+
</dependency>
5575

56-
<dependency>
57-
<groupId>org.jenkins-ci.main</groupId>
58-
<artifactId>jenkins-core</artifactId>
59-
<version>${jenkins.version}</version>
60-
</dependency>
76+
<!-- Credentials plugin -->
77+
<dependency>
78+
<groupId>org.jenkins-ci.plugins</groupId>
79+
<artifactId>credentials</artifactId>
80+
<version>1337.v60b_d7b_c7b_c9f</version>
81+
</dependency>
6182

62-
<dependency>
63-
<groupId>org.jenkins-ci.plugins</groupId>
64-
<artifactId>credentials</artifactId>
65-
<version>1337.v60b_d7b_c7b_c9f</version>
66-
</dependency>
83+
<!-- Pipeline Step API -->
84+
<dependency>
85+
<groupId>org.jenkins-ci.plugins.workflow</groupId>
86+
<artifactId>workflow-step-api</artifactId>
87+
<version>2.24</version>
88+
</dependency>
89+
90+
<!-- Pipeline API -->
91+
<dependency>
92+
<groupId>org.jenkins-ci.plugins.workflow</groupId>
93+
<artifactId>workflow-api</artifactId>
94+
<version>2.47</version>
95+
</dependency>
6796

97+
<!-- Annotation API -->
98+
<dependency>
99+
<groupId>javax.annotation</groupId>
100+
<artifactId>javax.annotation-api</artifactId>
101+
<version>1.3.2</version>
102+
<scope>provided</scope>
103+
</dependency>
68104
</dependencies>
69-
</dependencyManagement>
70105

71-
<repositories>
72-
<repository>
73-
<id>repo.jenkins-ci.org</id>
74-
<url>https://repo.jenkins-ci.org/public/</url>
75-
</repository>
76-
</repositories>
77-
<pluginRepositories>
78-
<pluginRepository>
79-
<id>repo.jenkins-ci.org</id>
80-
<url>https://repo.jenkins-ci.org/public/</url>
81-
</pluginRepository>
82-
</pluginRepositories>
106+
<repositories>
107+
<repository>
108+
<id>repo.jenkins-ci.org</id>
109+
<url>https://repo.jenkins-ci.org/public/</url>
110+
</repository>
111+
</repositories>
112+
<pluginRepositories>
113+
<pluginRepository>
114+
<id>repo.jenkins-ci.org</id>
115+
<url>https://repo.jenkins-ci.org/public/</url>
116+
</pluginRepository>
117+
</pluginRepositories>
83118
</project>
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package io.jenkins.plugins;
2+
3+
import hudson.Extension;
4+
import hudson.model.TaskListener;
5+
import jakarta.annotation.Nonnull;
6+
import org.jenkinsci.plugins.workflow.steps.Step;
7+
import org.jenkinsci.plugins.workflow.steps.StepContext;
8+
import org.jenkinsci.plugins.workflow.steps.StepDescriptor;
9+
import org.jenkinsci.plugins.workflow.steps.StepExecution;
10+
import org.kohsuke.stapler.DataBoundConstructor;
11+
12+
import java.util.Set;
13+
14+
public class PipelineStep extends Step {
15+
16+
private final String token;
17+
private final String targetFile;
18+
19+
@DataBoundConstructor
20+
public PipelineStep(String token, String targetFile) {
21+
this.token = token;
22+
this.targetFile = targetFile;
23+
}
24+
25+
public String getToken() {
26+
return token;
27+
}
28+
29+
public String getTargetFile() {
30+
return targetFile;
31+
}
32+
33+
@Override
34+
public StepExecution start(StepContext context) throws Exception {
35+
return new PipelineStepExecution(this, context);
36+
}
37+
38+
@Extension
39+
public static class DescriptorImpl extends StepDescriptor {
40+
41+
@Override
42+
public String getFunctionName() {
43+
return "vigilnzScan"; // This is the pipeline function name
44+
}
45+
46+
@Nonnull
47+
@Override
48+
public String getDisplayName() {
49+
return "Run Vigilnz Security Scan";
50+
}
51+
52+
@Override
53+
public Set<? extends Class<?>> getRequiredContext() {
54+
return Set.of(TaskListener.class);
55+
}
56+
}
57+
58+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package io.jenkins.plugins;
2+
3+
import com.cloudbees.plugins.credentials.CredentialsProvider;
4+
import hudson.model.Run;
5+
import hudson.model.TaskListener;
6+
import org.jenkinsci.plugins.workflow.steps.StepContext;
7+
import org.jenkinsci.plugins.workflow.steps.StepExecution;
8+
9+
public class PipelineStepExecution extends StepExecution {
10+
private final transient PipelineStep step;
11+
12+
public PipelineStepExecution(PipelineStep step, StepContext context) {
13+
super(context);
14+
this.step = step;
15+
}
16+
17+
@Override
18+
public boolean start() throws Exception {
19+
// getContext().get(TaskListener.class)
20+
// .getLogger()
21+
// .println("Option1: " + step.getToken() + ", Option2: " + step.getTargetFile());
22+
// // Add your custom logic here
23+
// getContext().onSuccess(null);
24+
// return true;
25+
TaskListener listener = getContext().get(TaskListener.class);
26+
Run<?, ?> run = getContext().get(Run.class);
27+
TokenCredentials creds =
28+
CredentialsProvider.findCredentialById(
29+
step.getToken(),
30+
TokenCredentials.class,
31+
run
32+
);
33+
listener.getLogger().println("Credentials : " + creds);
34+
35+
if (creds != null) {
36+
listener.getLogger().println("Token ID: " + creds.getTokenId());
37+
listener.getLogger().println("Description: " + creds.getTokenDescription());
38+
listener.getLogger().println("Token Value: " + creds.getToken().getPlainText());
39+
} else {
40+
listener.getLogger().println("No Vigilnz Token credential found");
41+
}
42+
43+
getContext().onSuccess(null);
44+
return true;
45+
}
46+
}

src/main/java/io/jenkins/plugins/SecurityCheckBuilder.java

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
package io.jenkins.plugins;
22

3+
import com.cloudbees.plugins.credentials.CredentialsProvider;
34
import hudson.Extension;
45
import hudson.Launcher;
56
import hudson.model.AbstractBuild;
67
import hudson.model.BuildListener;
8+
import hudson.model.Item;
9+
import hudson.security.ACL;
710
import hudson.tasks.BuildStepDescriptor;
811
import hudson.tasks.Builder;
912
import hudson.util.FormValidation;
13+
import hudson.util.ListBoxModel;
1014
import hudson.util.Secret;
15+
import org.kohsuke.stapler.AncestorInPath;
1116
import org.kohsuke.stapler.DataBoundConstructor;
12-
import org.kohsuke.stapler.ForwardToView;
13-
import org.kohsuke.stapler.HttpResponse;
1417
import org.kohsuke.stapler.QueryParameter;
1518

1619
import java.io.IOException;
20+
import java.util.Collections;
1721

1822
// This file for Jenkins FreeStyle Job Method
1923
public class SecurityCheckBuilder extends Builder {
@@ -35,11 +39,6 @@ public String getTargetFile() {
3539
return targetFile;
3640
}
3741

38-
public HttpResponse doAddToken() {
39-
return new ForwardToView(this, "addToken.jelly");
40-
}
41-
42-
4342
// this function trigger when user click the build button
4443
@Override
4544
public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener)
@@ -55,9 +54,23 @@ public static class DescriptorImpl extends BuildStepDescriptor<Builder> {
5554

5655
@Override
5756
public String getDisplayName() {
58-
return "Invoke Vigilnz Security Task"; // 👈 This appears in dropdown
57+
return "Invoke Vigilnz Security Task"; // This appears in dropdown
58+
}
59+
60+
public ListBoxModel doFillTokenItems(@AncestorInPath Item project) {
61+
ListBoxModel items = new ListBoxModel();
62+
63+
for (TokenCredentials c : CredentialsProvider.lookupCredentials(
64+
TokenCredentials.class,
65+
project,
66+
ACL.SYSTEM,
67+
Collections.emptyList())) {
68+
items.add(c.getTokenDescription(), c.getId());
69+
}
70+
return items;
5971
}
6072

73+
6174
@Override
6275
public boolean isApplicable(Class jobType) {
6376
return true;

0 commit comments

Comments
 (0)