Skip to content

Commit 02cf65b

Browse files
authored
Merge branch 'master' into JENKINS-69731-scm-BRANCH_NAME
2 parents c1082b9 + 7e233b5 commit 02cf65b

File tree

9 files changed

+216
-18
lines changed

9 files changed

+216
-18
lines changed

Jenkinsfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
buildPlugin(
22
useContainerAgent: true,
33
configurations: [
4-
[platform: 'linux', jdk: 17],
5-
[platform: 'windows', jdk: 11],
4+
[platform: 'linux', jdk: 21],
5+
[platform: 'windows', jdk: 17],
66
])

pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
<parent>
2929
<groupId>org.jenkins-ci.plugins</groupId>
3030
<artifactId>plugin</artifactId>
31-
<version>4.71</version>
31+
<version>4.74</version>
3232
<relativePath/>
3333
</parent>
3434
<groupId>io.jenkins.plugins</groupId>
@@ -71,7 +71,7 @@
7171
<dependency>
7272
<groupId>io.jenkins.tools.bom</groupId>
7373
<artifactId>bom-2.361.x</artifactId>
74-
<version>1883.vcb_768a_7c3610</version>
74+
<version>2102.v854b_fec19c92</version>
7575
<scope>import</scope>
7676
<type>pom</type>
7777
</dependency>
@@ -82,7 +82,7 @@
8282
<dependency>
8383
<groupId>org.apache.ivy</groupId>
8484
<artifactId>ivy</artifactId>
85-
<version>2.5.1</version>
85+
<version>2.5.2</version>
8686
</dependency>
8787

8888
<!-- required plugins -->

src/main/java/org/jenkinsci/plugins/workflow/libs/LibraryAdder.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import edu.umd.cs.findbugs.annotations.NonNull;
5353
import java.util.regex.Pattern;
5454
import org.apache.commons.io.IOUtils;
55+
import org.apache.commons.lang.StringUtils;
5556
import org.jenkinsci.plugins.workflow.cps.CpsFlowExecution;
5657
import org.jenkinsci.plugins.workflow.cps.GlobalVariable;
5758
import org.jenkinsci.plugins.workflow.cps.GlobalVariableSet;
@@ -210,7 +211,10 @@ static List<URL> retrieve(@NonNull LibraryRecord record, @NonNull LibraryRetriev
210211
shouldCache = false;
211212
}
212213

213-
if(shouldCache) {
214+
//If the included versions is blank/null, cache irrespective
215+
//else check if that version is included and then cache only that version
216+
217+
if((shouldCache && cachingConfiguration.isIncluded(version)) || (shouldCache && StringUtils.isBlank(cachingConfiguration.getIncludedVersionsStr()))) {
214218
retrieveLock.readLock().lockInterruptibly();
215219
try {
216220
CacheStatus cacheStatus = getCacheStatus(cachingConfiguration, versionCacheDir);
@@ -220,8 +224,8 @@ static List<URL> retrieve(@NonNull LibraryRecord record, @NonNull LibraryRetriev
220224
try {
221225
boolean retrieve = false;
222226
switch (getCacheStatus(cachingConfiguration, versionCacheDir)) {
223-
case VALID:
224-
listener.getLogger().println("Library " + name + "@" + version + " is cached. Copying from home.");
227+
case VALID:
228+
listener.getLogger().println("Library " + name + "@" + version + " is cached. Copying from home.");
225229
break;
226230
case DOES_NOT_EXIST:
227231
retrieve = true;
@@ -236,20 +240,20 @@ static List<URL> retrieve(@NonNull LibraryRecord record, @NonNull LibraryRetriev
236240
retrieve = true;
237241
break;
238242
}
239-
243+
240244
if (retrieve) {
241-
listener.getLogger().println("Caching library " + name + "@" + version);
245+
listener.getLogger().println("Caching library " + name + "@" + version);
242246
versionCacheDir.mkdirs();
243247
retriever.retrieve(name, version, changelog, versionCacheDir, run, listener);
244248
}
245249
retrieveLock.readLock().lock();
246250
} finally {
247-
retrieveLock.writeLock().unlock();
251+
retrieveLock.writeLock().unlock();
248252
}
249253
} else {
250-
listener.getLogger().println("Library " + name + "@" + version + " is cached. Copying from home.");
254+
listener.getLogger().println("Library " + name + "@" + version + " is cached. Copying from home.");
251255
}
252-
256+
253257
lastReadFile.touch(System.currentTimeMillis());
254258
versionCacheDir.withSuffix("-name.txt").write(name, "UTF-8");
255259
versionCacheDir.copyRecursiveTo(libDir);

src/main/java/org/jenkinsci/plugins/workflow/libs/LibraryCachingConfiguration.java

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@
22

33
import hudson.Extension;
44
import hudson.FilePath;
5+
import hudson.RestrictedSince;
56
import hudson.model.AbstractDescribableImpl;
67
import hudson.model.Descriptor;
78
import hudson.util.FormValidation;
89
import jenkins.model.Jenkins;
10+
import org.kohsuke.accmod.Restricted;
11+
import org.kohsuke.accmod.restrictions.NoExternalUse;
912
import org.kohsuke.stapler.DataBoundConstructor;
13+
import org.kohsuke.stapler.DataBoundSetter;
1014
import org.kohsuke.stapler.QueryParameter;
1115

1216
import java.io.IOException;
@@ -29,6 +33,7 @@ public final class LibraryCachingConfiguration extends AbstractDescribableImpl<L
2933

3034
private int refreshTimeMinutes;
3135
private String excludedVersionsStr;
36+
private String includedVersionsStr;
3237

3338
private static final String VERSIONS_SEPARATOR = " ";
3439
public static final String GLOBAL_LIBRARIES_DIR = "global-libraries-cache";
@@ -37,6 +42,17 @@ public final class LibraryCachingConfiguration extends AbstractDescribableImpl<L
3742
@DataBoundConstructor public LibraryCachingConfiguration(int refreshTimeMinutes, String excludedVersionsStr) {
3843
this.refreshTimeMinutes = refreshTimeMinutes;
3944
this.excludedVersionsStr = excludedVersionsStr;
45+
this.includedVersionsStr = "";
46+
}
47+
48+
/*
49+
* Visible for testing ...
50+
*/
51+
@Restricted(NoExternalUse.class)
52+
LibraryCachingConfiguration(int refreshTimeMinutes, String excludedVersionsStr, String includedVersionsStr) {
53+
this.refreshTimeMinutes = refreshTimeMinutes;
54+
this.excludedVersionsStr = excludedVersionsStr;
55+
this.includedVersionsStr = includedVersionsStr;
4056
}
4157

4258
public int getRefreshTimeMinutes() {
@@ -54,6 +70,17 @@ public Boolean isRefreshEnabled() {
5470
public String getExcludedVersionsStr() {
5571
return excludedVersionsStr;
5672
}
73+
public String getIncludedVersionsStr() {
74+
if(StringUtils.isBlank(includedVersionsStr)){
75+
return null;
76+
}
77+
return includedVersionsStr;
78+
}
79+
80+
@DataBoundSetter
81+
public void setIncludedVersionsStr(String includedVersionsStr) {
82+
this.includedVersionsStr = includedVersionsStr;
83+
}
5784

5885
private List<String> getExcludedVersions() {
5986
if (excludedVersionsStr == null) {
@@ -62,6 +89,13 @@ private List<String> getExcludedVersions() {
6289
return Arrays.asList(excludedVersionsStr.split(VERSIONS_SEPARATOR));
6390
}
6491

92+
private List<String> getIncludedVersions() {
93+
if (includedVersionsStr == null) {
94+
return Collections.emptyList();
95+
}
96+
return Arrays.asList(includedVersionsStr.split(VERSIONS_SEPARATOR));
97+
}
98+
6599
public Boolean isExcluded(String version) {
66100
// exit early if the version passed in is null or empty
67101
if (StringUtils.isBlank(version)) {
@@ -78,6 +112,22 @@ public Boolean isExcluded(String version) {
78112
return false;
79113
}
80114

115+
public Boolean isIncluded(String version) {
116+
// exit early if the version passed in is null or empty
117+
if (StringUtils.isBlank(version)) {
118+
return false;
119+
}
120+
for (String it : getIncludedVersions()) {
121+
// works on empty or null included versions
122+
// and if the version contains the inclusion thus it can be
123+
// anywhere in the string.
124+
if (StringUtils.isNotBlank(it) && version.contains(it)){
125+
return true;
126+
}
127+
}
128+
return false;
129+
}
130+
81131
@Override public String toString() {
82132
return "LibraryCachingConfiguration{refreshTimeMinutes=" + refreshTimeMinutes + ", excludedVersions="
83133
+ excludedVersionsStr + '}';
@@ -129,6 +179,5 @@ public FormValidation doClearCache(@QueryParameter String name, @QueryParameter
129179
}
130180
return FormValidation.ok("The cache dir was deleted successfully.");
131181
}
132-
133182
}
134183
}

src/main/resources/org/jenkinsci/plugins/workflow/libs/LibraryCachingConfiguration/config.jelly

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ THE SOFTWARE.
3131
<f:entry title="${%Versions to exclude}" field="excludedVersionsStr">
3232
<f:textbox />
3333
</f:entry>
34+
<f:entry title="${%Versions to include}" field="includedVersionsStr">
35+
<f:textbox />
36+
</f:entry>
3437
<j:if test="${h.hasPermission(app.ADMINISTER)}">
3538
<f:entry title="${%Force clear cache}" field="forceDelete">
3639
<f:checkbox/>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<div>
2+
Space separated list of versions to include to allow caching via substring search using .contains() method. Ex: "release/ master".
3+
</div>
4+
<div>
5+
Note: Excluded versions will always take precedence over included versions
6+
</div>

src/test/java/org/jenkinsci/plugins/workflow/libs/GlobalLibrariesTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ public class GlobalLibrariesTest {
5757
assertEquals(Collections.emptyList(), gl.getLibraries());
5858
LibraryConfiguration foo = new LibraryConfiguration("foo", new SCMSourceRetriever(new SubversionSCMSource("foo", "https://phony.jenkins.io/foo/")));
5959
LibraryConfiguration bar = new LibraryConfiguration("bar", new SCMSourceRetriever(new GitSCMSource(null, "https://phony.jenkins.io/bar.git", "", "origin", "+refs/heads/*:refs/remotes/origin/*", "*", "", true)));
60+
LibraryCachingConfiguration cachingConfiguration = new LibraryCachingConfiguration(120, "develop", "master stable");
61+
foo.setCachingConfiguration(cachingConfiguration);
6062
bar.setDefaultVersion("master");
6163
bar.setImplicit(true);
6264
bar.setAllowVersionOverride(false);
@@ -72,6 +74,14 @@ public class GlobalLibrariesTest {
7274
r.assertEqualDataBoundBeans(Arrays.asList(foo, bar), libs);
7375
libs = gl.getLibraries();
7476
r.assertEqualDataBoundBeans(Arrays.asList(foo, bar), libs);
77+
boolean noFoo = true;
78+
for (LibraryConfiguration lib : libs) {
79+
if ("foo".equals(lib.getName())) {
80+
noFoo = false;
81+
r.assertEqualDataBoundBeans(lib.getCachingConfiguration(), cachingConfiguration);
82+
}
83+
}
84+
assertFalse("Missing a library called foo (should not happen)", noFoo);
7585
}
7686

7787
@Issue("SECURITY-1422")

0 commit comments

Comments
 (0)