Skip to content

Commit 63252db

Browse files
committed
build: Extract Gradle helper methods to classes and move to buildSrc
- Add org.example.JenkinsPlugins class for Jenkins plugin resolution methods
1 parent f24938f commit 63252db

File tree

2 files changed

+213
-98
lines changed

2 files changed

+213
-98
lines changed

build.gradle

Lines changed: 51 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import groovy.transform.Field
2-
import java.nio.file.Paths
1+
import org.example.JenkinsPlugins
2+
33

44
plugins {
55
id 'groovy'
@@ -10,6 +10,8 @@ plugins {
1010
group = 'org.example'
1111
version = '1.0-SNAPSHOT'
1212

13+
JenkinsPlugins.create(project)
14+
1315
java {
1416
toolchain {
1517
setLanguageVersion JavaLanguageVersion.of(11)
@@ -41,20 +43,10 @@ configurations {
4143
}
4244

4345
dependencies {
44-
implementationDependencies.each { String dependency ->
45-
implementation dependency
46-
}
47-
testImplementationDependencies.each { String dependency ->
48-
testImplementation dependency
49-
}
50-
jenkinsPlugins.values().each { String pluginGAV ->
51-
testPlugins pluginGAV
52-
}
53-
54-
/* JUnit5 dependencies */
55-
testImplementation platform('org.junit:junit-bom:5.9.2')
56-
testImplementation 'org.junit.jupiter:junit-jupiter'
57-
testRuntimeOnly 'org.junit.vintage:junit-vintage-engine'
46+
implementationDependencies delegate
47+
testImplementationDependencies delegate
48+
jenkinsPluginDependencies delegate
49+
junit5Dependencies delegate
5850
}
5951

6052
idea {
@@ -99,36 +91,22 @@ tasks.register('resolveTestPlugins', Copy) {
9991
final String destinationDir = "${sourceSets.test.output.resourcesDir}/test-dependencies"
10092

10193
doFirst {
102-
configurations.testPlugins
94+
Set<ResolvedArtifact> resolvedArtifacts = configurations.testPlugins
10395
.resolvedConfiguration
10496
.resolvedArtifacts
105-
.each { ResolvedArtifact artifact ->
106-
if (artifact.extension ==~ '[hj]pi') {
107-
addPluginMapping artifact
108-
}
109-
}
97+
JenkinsPlugins.get().registerResolvedPlugins(resolvedArtifacts)
11098
}
11199

112100
from configurations.testPlugins {
113101
rename { String filePath ->
114-
getPluginsMapping(
115-
Paths.get(filePath).getFileName().toString()
116-
)
117-
.fileName
102+
JenkinsPlugins.get().pluginFileNameForJenkinsInstance(filePath)
118103
}
119104
}
120105
include '*.hpi', '*.jpi'
121106
into destinationDir
122107

123108
doLast {
124-
new File(destinationDir, 'index').setText(
125-
pluginsMapping
126-
.values()
127-
.collect { JenkinsPlugin plugin -> plugin.name }
128-
.toSorted()
129-
.join('\n'),
130-
'UTF-8'
131-
)
109+
JenkinsPlugins.get().generatePluginsIndex("${destinationDir}/index")
132110
}
133111
}
134112

@@ -140,89 +118,64 @@ tasks.named('wrapper') {
140118

141119
/* Helpers */
142120

143-
Map<String, String> getJenkinsPlugins() {
144-
property("jenkinsPluginVersions.$jenkinsVersion")
145-
.tokenize()
146-
.collate(2)
147-
.findAll { def (String module, String version) = it
148-
!module.startsWith('#')
149-
}
150-
.collectEntries { def (String module, String version) = it
151-
[(module.replaceAll(/:$/, '')): version]
152-
}
153-
.collectEntries { String module, version ->
154-
String pluginName = module.split(':').last()
155-
[(pluginName): "$module:$version".toString()]
156-
}
157-
}
158-
159-
@Field
160-
final Map<String, JenkinsPlugin> pluginsMapping = [:]
161-
162-
void addPluginMapping(ResolvedArtifact artifact) {
163-
pluginsMapping[artifact.file.name] = new JenkinsPlugin(artifact.name, artifact.extension)
164-
}
165-
166-
Map<String, JenkinsPlugin> getPluginsMapping() {
167-
pluginsMapping
168-
}
169-
170-
JenkinsPlugin getPluginsMapping(String fileName) {
171-
getPluginsMapping()[fileName]
172-
}
173-
174-
String getTestHarnessVersion() {
175-
property("testHarnessVersion.$jenkinsVersion")
176-
}
177-
178-
List<String> getImplementationDependencies() {
179-
List<String> result = [
121+
void implementationDependencies(DependencyHandler context) {
122+
List<String> dependencies = [
180123
"org.codehaus.groovy:groovy-all:2.4.21",
181-
"org.jenkins-ci.main:jenkins-core:$jenkinsVersion",
182-
jenkinsPlugins['job-dsl-core'],
124+
"org.jenkins-ci.main:jenkins-core:${JenkinsPlugins.get().jenkinsVersion}",
125+
JenkinsPlugins.get()['job-dsl-core'],
183126
]
184-
switch (jenkinsVersion) {
127+
switch (JenkinsPlugins.get().jenkinsVersion) {
185128
case '2.277.4':
186-
result << 'com.cloudbees:groovy-cps:1.22'
129+
dependencies << 'com.cloudbees:groovy-cps:1.22'
187130
break
188131
case '2.346.3':
189-
result << jenkinsPlugins['workflow-cps']
132+
dependencies << JenkinsPlugins.get()['workflow-cps']
190133
break
191134
default:
192-
throw new IllegalArgumentException("Unrecognized Jenkins version: $jenkinsVersion")
135+
throw new IllegalArgumentException("Unrecognized Jenkins version: ${JenkinsPlugins.get().jenkinsVersion}")
136+
}
137+
138+
dependencies.each { String dependency ->
139+
context.implementation dependency
193140
}
194-
result
195141
}
196142

197-
List<String> getTestImplementationDependencies() {
198-
List<String> result = [
143+
static void jenkinsPluginDependencies(DependencyHandler context) {
144+
JenkinsPlugins.get().each { String dependency ->
145+
context.testPlugins dependency
146+
}
147+
}
148+
149+
static void junit5Dependencies(DependencyHandler context) {
150+
context.with {
151+
testImplementation platform('org.junit:junit-bom:5.9.2')
152+
testImplementation 'org.junit.jupiter:junit-jupiter'
153+
testRuntimeOnly 'org.junit.vintage:junit-vintage-engine'
154+
}
155+
}
156+
157+
static void testImplementationDependencies(DependencyHandler context) {
158+
List<String> dependencies = [
199159
"com.lesfurets:jenkins-pipeline-unit:1.19",
200160
"org.spockframework:spock-core:1.3-groovy-2.4",
201-
"org.jenkins-ci.main:jenkins-test-harness:${testHarnessVersion}",
202-
"org.jenkins-ci.main:jenkins-war:$jenkinsVersion",
203-
jenkinsPlugins['job-dsl'],
204-
"${jenkinsPlugins['job-dsl']}@jar",
205-
"${jenkinsPlugins['structs']}@jar",
161+
"org.jenkins-ci.main:jenkins-test-harness:${JenkinsPlugins.get().testHarnessVersion}",
162+
"org.jenkins-ci.main:jenkins-war:${JenkinsPlugins.get().jenkinsVersion}",
163+
JenkinsPlugins.get()['job-dsl'],
164+
"${JenkinsPlugins.get()['job-dsl']}@jar",
165+
"${JenkinsPlugins.get()['structs']}@jar",
206166
]
207-
switch (jenkinsVersion) {
167+
switch (JenkinsPlugins.get().jenkinsVersion) {
208168
case '2.277.4':
209-
result << 'cglib:cglib-nodep:2.2.2'
210-
result << "${jenkinsPlugins['script-security']}@jar"
169+
dependencies << 'cglib:cglib-nodep:2.2.2'
170+
dependencies << "${JenkinsPlugins.get()['script-security']}@jar"
211171
break
212172
case '2.346.3':
213173
break
214174
default:
215-
throw new IllegalArgumentException("Unrecognized Jenkins version: $jenkinsVersion")
175+
throw new IllegalArgumentException("Unrecognized Jenkins version: ${JenkinsPlugins.get().jenkinsVersion}")
216176
}
217-
result
218-
}
219-
220-
class JenkinsPlugin {
221-
final String name
222-
final String fileName
223177

224-
JenkinsPlugin(String name, String extension) {
225-
this.name = name
226-
this.fileName = "${name}.${extension}"
178+
dependencies.each { String dependency ->
179+
context.testImplementation dependency
227180
}
228181
}
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
package org.example
2+
3+
import java.nio.file.Paths
4+
import org.gradle.api.Project
5+
import org.gradle.api.artifacts.ResolvedArtifact
6+
7+
8+
final class JenkinsPlugins {
9+
private static JenkinsPlugins instance
10+
private final Project project
11+
private final List<JenkinsPlugin> plugins = []
12+
13+
14+
/* Constructors and initializers */
15+
16+
private JenkinsPlugins(Project project) {
17+
this.project = project
18+
}
19+
20+
static void create(Project project) {
21+
if (!instance) {
22+
instance = new JenkinsPlugins(project)
23+
} else {
24+
if (instance.project != project) {
25+
throw new IllegalArgumentException("org.example.JenkinsPlugins instance already exists for project ${instance.project}")
26+
} else {
27+
println "WARNING: Multiple events of creating instance of org.example.JenkinsPlugins for the same project detected"
28+
}
29+
}
30+
}
31+
32+
static JenkinsPlugins get() {
33+
if (!instance) {
34+
throw new IllegalStateException("org.example.JenkinsPlugins is not initialized")
35+
}
36+
instance
37+
}
38+
39+
40+
/* Public API */
41+
42+
String getJenkinsVersion() {
43+
project.property('jenkinsVersion')
44+
}
45+
46+
String getTestHarnessVersion() {
47+
project.property("testHarnessVersion.$jenkinsVersion")
48+
}
49+
50+
List<String> all() {
51+
ArrayList.copyOf(getDeclaredJenkinsPlugins().values())
52+
}
53+
54+
String getAt(String name) {
55+
getDeclaredJenkinsPlugins()[name]
56+
}
57+
58+
void each(Closure body) {
59+
all().each(body)
60+
}
61+
62+
/*
63+
ResolvedArtifact:
64+
name: workflow-job
65+
moduleVersion:
66+
id: org.jenkins-ci.plugins.workflow:workflow-job:2.41
67+
group: org.jenkins-ci.plugins.workflow
68+
name: workflow-job
69+
version: 2.41
70+
71+
*/
72+
void registerResolvedPlugins(Set<ResolvedArtifact> resolvedArtifacts) {
73+
resolvedArtifacts
74+
.findAll { ResolvedArtifact artifact -> artifact.extension ==~ /[hj]pi/ }
75+
.each { ResolvedArtifact artifact ->
76+
JenkinsPlugin plugin = new JenkinsPlugin(artifact)
77+
plugins << plugin
78+
}
79+
}
80+
81+
void generatePluginsIndex(String destinationFileName) {
82+
new File(destinationFileName).setText(
83+
getPluginsIndex().join('\n'),
84+
'UTF-8'
85+
)
86+
}
87+
88+
String pluginFileNameForJenkinsInstance(String filePath) {
89+
plugins.find { JenkinsPlugin plugin ->
90+
plugin.originalFileName == Paths.get(filePath).getFileName().toString()
91+
}
92+
.fileNameForJenkinsInstance
93+
}
94+
95+
96+
/* Private part */
97+
98+
private Map<String, String> getJenkinsPluginVersionsFromProperties() {
99+
project.property("jenkinsPluginVersions.$jenkinsVersion")
100+
.tokenize()
101+
.collate(2)
102+
.findAll {
103+
def (String module, String version) = it
104+
!module.startsWith('#')
105+
}
106+
.collectEntries {
107+
def (String module, String version) = it
108+
[(module.replaceAll(/:$/, '')): version]
109+
}
110+
}
111+
112+
private Map<String, String> getDeclaredJenkinsPlugins() {
113+
getJenkinsPluginVersionsFromProperties()
114+
.collectEntries { String module, version ->
115+
String pluginName = module.split(':').last()
116+
[(pluginName): "$module:$version"]
117+
}
118+
}
119+
120+
private List<String> getPluginsIndex() {
121+
plugins
122+
.collect { JenkinsPlugin plugin -> plugin.name }
123+
.toSorted()
124+
}
125+
126+
private class JenkinsPlugin {
127+
final ResolvedArtifact artifact
128+
129+
JenkinsPlugin(ResolvedArtifact artifact) {
130+
this.artifact = artifact
131+
}
132+
133+
String getName() {
134+
artifact.name
135+
}
136+
137+
String getOriginalFileName() {
138+
artifact.file.name
139+
}
140+
141+
String getFileNameForJenkinsInstance() {
142+
"${artifact.name}.${artifact.extension}"
143+
}
144+
145+
private String getVersion() {
146+
artifact.moduleVersion.id.version
147+
}
148+
149+
private String getResolvedModuleVersion() {
150+
artifact.moduleVersion
151+
}
152+
153+
private String getDeclaredPluginVersion() {
154+
getDeclaredJenkinsPlugins()[name]
155+
}
156+
157+
String toString() {
158+
"{name=$name, version=$version, declaredPluginVersion=$declaredPluginVersion, resolvedModuleVersion=$resolvedModuleVersion, originalFileName=$originalFileName, fileNameForJenkinsInstance=$fileNameForJenkinsInstance"
159+
}
160+
}
161+
162+
}

0 commit comments

Comments
 (0)