Skip to content

Commit 820ce4e

Browse files
Merge branch '6.3.x'
2 parents f0f47b5 + 25ddc2a commit 820ce4e

File tree

2 files changed

+103
-44
lines changed

2 files changed

+103
-44
lines changed

buildSrc/src/main/java/org/springframework/security/CheckExpectedBranchVersionPlugin.java

+52-22
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,23 @@
1616

1717
package org.springframework.security;
1818

19-
import java.io.ByteArrayOutputStream;
20-
import java.io.IOException;
21-
2219
import org.gradle.api.DefaultTask;
2320
import org.gradle.api.Plugin;
2421
import org.gradle.api.Project;
22+
import org.gradle.api.Task;
23+
import org.gradle.api.file.RegularFileProperty;
2524
import org.gradle.api.plugins.JavaBasePlugin;
25+
import org.gradle.api.provider.Property;
26+
import org.gradle.api.tasks.CacheableTask;
27+
import org.gradle.api.tasks.Input;
28+
import org.gradle.api.tasks.OutputFile;
2629
import org.gradle.api.tasks.TaskAction;
30+
import org.gradle.api.tasks.TaskExecutionException;
2731
import org.gradle.api.tasks.TaskProvider;
32+
import org.gradle.api.tasks.VerificationException;
33+
34+
import java.io.IOException;
35+
import java.nio.file.Files;
2836

2937
/**
3038
* @author Marcus da Coregio
@@ -36,38 +44,60 @@ public void apply(Project project) {
3644
TaskProvider<CheckExpectedBranchVersionTask> checkExpectedBranchVersionTask = project.getTasks().register("checkExpectedBranchVersion", CheckExpectedBranchVersionTask.class, (task) -> {
3745
task.setGroup("Build");
3846
task.setDescription("Check if the project version matches the branch version");
47+
task.onlyIf("skipCheckExpectedBranchVersion property is false or not present", CheckExpectedBranchVersionPlugin::skipPropertyFalseOrNotPresent);
48+
task.getVersion().convention(project.provider(() -> project.getVersion().toString()));
49+
task.getBranchName().convention(project.getProviders().exec(execSpec -> execSpec.setCommandLine("git", "symbolic-ref", "--short", "HEAD")).getStandardOutput().getAsText());
50+
task.getOutputFile().convention(project.getLayout().getBuildDirectory().file("check-expected-branch-version"));
3951
});
4052
project.getTasks().named(JavaBasePlugin.CHECK_TASK_NAME, checkTask -> checkTask.dependsOn(checkExpectedBranchVersionTask));
4153
}
4254

43-
public static class CheckExpectedBranchVersionTask extends DefaultTask {
55+
private static boolean skipPropertyFalseOrNotPresent(Task task) {
56+
return task.getProject()
57+
.getProviders()
58+
.gradleProperty("skipCheckExpectedBranchVersion")
59+
.orElse("false")
60+
.map("false"::equalsIgnoreCase)
61+
.get();
62+
}
63+
64+
@CacheableTask
65+
public static abstract class CheckExpectedBranchVersionTask extends DefaultTask {
66+
67+
@Input
68+
abstract Property<String> getVersion();
69+
70+
@Input
71+
abstract Property<String> getBranchName();
72+
73+
@OutputFile
74+
abstract RegularFileProperty getOutputFile();
4475

4576
@TaskAction
46-
public void run() throws IOException {
47-
Project project = getProject();
48-
if (project.hasProperty("skipCheckExpectedBranchVersion")) {
49-
return;
50-
}
51-
String version = (String) project.getVersion();
52-
String branchVersion = getBranchVersion(project);
77+
public void run() {
78+
String version = getVersion().get();
79+
String branchVersion = getBranchName().map(String::trim).get();
5380
if (!branchVersion.matches("^[0-9]+\\.[0-9]+\\.x$")) {
54-
System.out.println("Branch version does not match *.x, ignoring");
81+
String msg = String.format("Branch version [%s] does not match *.x, ignoring", branchVersion);
82+
getLogger().warn(msg);
83+
writeExpectedVersionOutput(msg);
5584
return;
5685
}
5786
if (!versionsMatch(version, branchVersion)) {
58-
throw new IllegalStateException(String.format("Project version [%s] does not match branch version [%s]. " +
59-
"Please verify that the branch contains the right version.", version, branchVersion));
87+
String msg = String.format("Project version [%s] does not match branch version [%s]. " +
88+
"Please verify that the branch contains the right version.", version, branchVersion);
89+
writeExpectedVersionOutput(msg);
90+
throw new VerificationException(msg);
6091
}
92+
93+
writeExpectedVersionOutput(version);
6194
}
6295

63-
private static String getBranchVersion(Project project) throws IOException {
64-
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
65-
project.exec((exec) -> {
66-
exec.commandLine("git", "symbolic-ref", "--short", "HEAD");
67-
exec.setErrorOutput(System.err);
68-
exec.setStandardOutput(baos);
69-
});
70-
return baos.toString();
96+
private void writeExpectedVersionOutput(String fileContent) {
97+
try {
98+
Files.writeString(getOutputFile().get().getAsFile().toPath(), fileContent);
99+
} catch (IOException e) {
100+
throw new TaskExecutionException(this, e);
71101
}
72102
}
73103

buildSrc/src/main/java/org/springframework/security/convention/versions/VerifyDependenciesVersionsPlugin.java

+51-22
Original file line numberDiff line numberDiff line change
@@ -19,52 +19,81 @@
1919
import org.gradle.api.DefaultTask;
2020
import org.gradle.api.Plugin;
2121
import org.gradle.api.Project;
22+
import org.gradle.api.artifacts.Dependency;
2223
import org.gradle.api.artifacts.MinimalExternalModuleDependency;
2324
import org.gradle.api.artifacts.VersionCatalog;
2425
import org.gradle.api.artifacts.VersionCatalogsExtension;
26+
import org.gradle.api.file.RegularFile;
27+
import org.gradle.api.file.RegularFileProperty;
2528
import org.gradle.api.plugins.JavaBasePlugin;
29+
import org.gradle.api.provider.Property;
30+
import org.gradle.api.provider.Provider;
31+
import org.gradle.api.tasks.CacheableTask;
32+
import org.gradle.api.tasks.Input;
33+
import org.gradle.api.tasks.OutputFile;
2634
import org.gradle.api.tasks.TaskAction;
35+
import org.gradle.api.tasks.TaskExecutionException;
2736
import org.gradle.api.tasks.TaskProvider;
37+
import org.gradle.api.tasks.VerificationException;
38+
39+
import java.io.File;
40+
import java.io.IOException;
41+
import java.nio.file.Files;
42+
import java.util.Optional;
2843

2944
public class VerifyDependenciesVersionsPlugin implements Plugin<Project> {
3045

3146
@Override
3247
public void apply(Project project) {
48+
VersionCatalog versionCatalog = project.getExtensions().getByType(VersionCatalogsExtension.class).named("libs");
49+
Optional<Provider<MinimalExternalModuleDependency>> oauth2OidcSdk = versionCatalog.findLibrary("com-nimbusds-oauth2-oidc-sdk");
50+
Optional<Provider<MinimalExternalModuleDependency>> nimbusJoseJwt = versionCatalog.findLibrary("com-nimbusds-nimbus-jose-jwt");
51+
52+
if (oauth2OidcSdk.isEmpty()) {
53+
throw new VerificationException("Library [com-nimbusds-oauth2-oidc-sdk] does not exist in the version catalog named libs.");
54+
}
55+
56+
if (nimbusJoseJwt.isEmpty()) {
57+
throw new VerificationException("Library [com-nimbusds-nimbus-jose-jwt] does not exist in the version catalog named libs.");
58+
}
59+
3360
TaskProvider<VerifyDependenciesVersionsTask> verifyDependenciesVersionsTaskProvider = project.getTasks().register("verifyDependenciesVersions", VerifyDependenciesVersionsTask.class, (task) -> {
3461
task.setGroup("Verification");
3562
task.setDescription("Verify that specific dependencies are using the same version");
36-
VersionCatalog versionCatalog = project.getExtensions().getByType(VersionCatalogsExtension.class).named("libs");
37-
MinimalExternalModuleDependency oauth2OidcSdk = versionCatalog.findLibrary("com-nimbusds-oauth2-oidc-sdk").get().get();
38-
MinimalExternalModuleDependency nimbusJoseJwt = versionCatalog.findLibrary("com-nimbusds-nimbus-jose-jwt").get().get();
39-
task.setOauth2OidcSdkVersion(oauth2OidcSdk.getVersion());
40-
task.setExpectedNimbusJoseJwtVersion(nimbusJoseJwt.getVersion());
63+
task.getOauth2OidcSdkVersion().convention(oauth2OidcSdk.get().map(Dependency::getVersion));
64+
task.getExpectedNimbusJoseJwtVersion().convention(nimbusJoseJwt.get().map(Dependency::getVersion));
65+
task.getOutputFile().convention(project.getLayout().getBuildDirectory().file("verify-dependencies-versions"));
4166
});
4267
project.getTasks().named(JavaBasePlugin.CHECK_TASK_NAME, checkTask -> checkTask.dependsOn(verifyDependenciesVersionsTaskProvider));
4368
}
4469

45-
public static class VerifyDependenciesVersionsTask extends DefaultTask {
70+
@CacheableTask
71+
public abstract static class VerifyDependenciesVersionsTask extends DefaultTask {
4672

47-
private String oauth2OidcSdkVersion;
73+
@Input
74+
abstract Property<String> getOauth2OidcSdkVersion();
4875

49-
private String expectedNimbusJoseJwtVersion;
76+
@Input
77+
abstract Property<String> getExpectedNimbusJoseJwtVersion();
5078

51-
public void setOauth2OidcSdkVersion(String oauth2OidcSdkVersion) {
52-
this.oauth2OidcSdkVersion = oauth2OidcSdkVersion;
53-
}
54-
55-
public void setExpectedNimbusJoseJwtVersion(String expectedNimbusJoseJwtVersion) {
56-
this.expectedNimbusJoseJwtVersion = expectedNimbusJoseJwtVersion;
57-
}
79+
@OutputFile
80+
abstract RegularFileProperty getOutputFile();
5881

5982
@TaskAction
60-
public void verify() {
61-
String transitiveNimbusJoseJwtVersion = TransitiveDependencyLookupUtils.lookupJwtVersion(this.oauth2OidcSdkVersion);
62-
if (!transitiveNimbusJoseJwtVersion.equals(this.expectedNimbusJoseJwtVersion)) {
63-
String message = String.format("Found transitive nimbus-jose-jwt:%s in oauth2-oidc-sdk:%s, but the project contains a different version of nimbus-jose-jwt [%s]. Please align the versions.", transitiveNimbusJoseJwtVersion, this.oauth2OidcSdkVersion, this.expectedNimbusJoseJwtVersion);
64-
throw new IllegalStateException(message);
83+
public void verify() {
84+
String oauth2OidcSdkVersion = this.getOauth2OidcSdkVersion().get();
85+
String transitiveNimbusJoseJwtVersion = TransitiveDependencyLookupUtils.lookupJwtVersion(oauth2OidcSdkVersion);
86+
String expectedNimbusJoseJwtVersion = this.getExpectedNimbusJoseJwtVersion().get();
87+
if (!transitiveNimbusJoseJwtVersion.equals(expectedNimbusJoseJwtVersion)) {
88+
String message = String.format("Found transitive nimbus-jose-jwt:%s in oauth2-oidc-sdk:%s, but the project contains a different version of nimbus-jose-jwt [%s]. Please align the versions.", transitiveNimbusJoseJwtVersion, oauth2OidcSdkVersion, expectedNimbusJoseJwtVersion);
89+
throw new VerificationException(message);
90+
}
91+
String message = String.format("Found transitive nimbus-jose-jwt:%s in oauth2-oidc-sdk:%s, the project contains expected version of nimbus-jose-jwt [%s]. Verified all versions align.", transitiveNimbusJoseJwtVersion, oauth2OidcSdkVersion, expectedNimbusJoseJwtVersion);
92+
try {
93+
Files.writeString(getOutputFile().get().getAsFile().toPath(), message);
94+
} catch (IOException e) {
95+
throw new TaskExecutionException(this, e);
6596
}
6697
}
67-
6898
}
69-
7099
}

0 commit comments

Comments
 (0)