Skip to content

Commit 7f99190

Browse files
committed
Manage antora versions using package.json
See spring-projectsgh-40132
1 parent 10260c0 commit 7f99190

File tree

4 files changed

+65
-34
lines changed

4 files changed

+65
-34
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,4 @@ secrets.yml
4040
.gradletasknamecache
4141
.sts4-cache
4242
.git-hooks/
43+
node_modules

antora/package.json

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"scripts": {
3+
"antora": "node npm/antora.js"
4+
},
5+
"dependencies": {
6+
"@antora/cli": "3.2.0-alpha.4",
7+
"@antora/site-generator": "3.2.0-alpha.4",
8+
"@antora/atlas-extension": "1.0.0-alpha.2",
9+
"@springio/antora-extensions": "1.8.2",
10+
"@springio/antora-xref-extension": "1.0.0-alpha.3",
11+
"@springio/antora-zip-contents-collector-extension": "1.0.0-alpha.2",
12+
"@asciidoctor/tabs": "1.0.0-beta.6",
13+
"@springio/asciidoctor-extensions": "1.0.0-alpha.10"
14+
}
15+
}

buildSrc/src/main/java/org/springframework/boot/build/AntoraConventions.java

+41-18
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,25 @@
1717
package org.springframework.boot.build;
1818

1919
import java.io.File;
20+
import java.util.HashMap;
2021
import java.util.LinkedHashMap;
2122
import java.util.List;
2223
import java.util.Map;
2324

2425
import com.github.gradle.node.NodeExtension;
26+
import com.github.gradle.node.npm.task.NpmInstallTask;
2527
import io.spring.gradle.antora.GenerateAntoraYmlPlugin;
2628
import io.spring.gradle.antora.GenerateAntoraYmlTask;
2729
import org.antora.gradle.AntoraExtension;
2830
import org.antora.gradle.AntoraPlugin;
2931
import org.antora.gradle.AntoraTask;
3032
import org.gradle.api.Project;
31-
import org.gradle.api.file.RegularFile;
32-
import org.gradle.api.file.RegularFileProperty;
3333
import org.gradle.api.logging.LogLevel;
3434
import org.gradle.api.plugins.JavaBasePlugin;
35-
import org.gradle.api.provider.Provider;
35+
import org.gradle.api.tasks.Copy;
3636
import org.gradle.api.tasks.TaskContainer;
3737

3838
import org.springframework.boot.build.antora.AntoraAsciidocAttributes;
39-
import org.springframework.boot.build.antora.Extensions;
4039
import org.springframework.boot.build.antora.GenerateAntoraPlaybook;
4140
import org.springframework.boot.build.bom.BomExtension;
4241
import org.springframework.boot.build.constraints.ExtractVersionConstraints;
@@ -51,8 +50,6 @@ public class AntoraConventions {
5150

5251
private static final String DEPENDENCIES_PATH = ":spring-boot-project:spring-boot-dependencies";
5352

54-
private static final String ANTORA_VERSION = "3.2.0-alpha.4";
55-
5653
private static final String ANTORA_SOURCE_DIR = "src/docs/antora";
5754

5855
private static final List<String> NAV_FILES = List.of("nav.adoc", "local-nav.adoc");
@@ -67,18 +64,42 @@ private void apply(Project project, AntoraPlugin antoraPlugin) {
6764
TaskContainer tasks = project.getTasks();
6865
GenerateAntoraPlaybook generateAntoraPlaybookTask = tasks.create("generateAntoraPlaybook",
6966
GenerateAntoraPlaybook.class);
67+
configureGenerateAntoraPlaybookTask(project, generateAntoraPlaybookTask);
68+
Copy copyAntoraPackageJsonTask = tasks.create("copyAntoraPackageJson", Copy.class);
69+
configureCopyAntoraPackageJsonTask(project, copyAntoraPackageJsonTask);
70+
NpmInstallTask npmInstallTask = tasks.create("antoraNpmInstall", NpmInstallTask.class);
71+
configureNpmInstallTask(project, npmInstallTask, copyAntoraPackageJsonTask);
7072
tasks.withType(GenerateAntoraYmlTask.class, (generateAntoraYmlTask) -> configureGenerateAntoraYmlTask(project,
7173
generateAntoraYmlTask, dependencyVersionsTask));
7274
tasks.withType(AntoraTask.class,
73-
(antoraTask) -> configureAntoraTask(project, antoraTask, generateAntoraPlaybookTask));
74-
project.getExtensions().configure(AntoraExtension.class, (antoraExtension) -> {
75-
RegularFileProperty outputFile = generateAntoraPlaybookTask.getOutputFile();
76-
configureAntoraExtension(project, antoraExtension, outputFile);
77-
});
75+
(antoraTask) -> configureAntoraTask(project, antoraTask, npmInstallTask, generateAntoraPlaybookTask));
76+
project.getExtensions()
77+
.configure(AntoraExtension.class, (antoraExtension) -> configureAntoraExtension(project, antoraExtension));
7878
project.getExtensions()
7979
.configure(NodeExtension.class, (nodeExtension) -> configureNodeExtension(project, nodeExtension));
8080
}
8181

82+
private void configureGenerateAntoraPlaybookTask(Project project,
83+
GenerateAntoraPlaybook generateAntoraPlaybookTask) {
84+
File nodeProjectDir = getNodeProjectDir(project.getBuildDir());
85+
generateAntoraPlaybookTask.getOutputFile().set(new File(nodeProjectDir, "antora-playbook.yml"));
86+
}
87+
88+
private void configureCopyAntoraPackageJsonTask(Project project, Copy copyAntoraPackageJsonTask) {
89+
copyAntoraPackageJsonTask
90+
.from(project.getRootProject().file("antora"), (spec) -> spec.include("package.json", "package-lock.json"))
91+
.into(getNodeProjectDir(project.getBuildDir()));
92+
}
93+
94+
private void configureNpmInstallTask(Project project, NpmInstallTask npmInstallTask, Copy copyAntoraPackageJson) {
95+
npmInstallTask.dependsOn(copyAntoraPackageJson);
96+
Map<String, String> environment = new HashMap<>();
97+
environment.put("npm_config_omit", "optional");
98+
environment.put("npm_config_update_notifier", "false");
99+
npmInstallTask.getEnvironment().set(environment);
100+
npmInstallTask.getNpmCommand().set(List.of("ci"));
101+
}
102+
82103
private ExtractVersionConstraints addDependencyVersionsTask(Project project) {
83104
return project.getTasks()
84105
.create("dependencyVersions", ExtractVersionConstraints.class,
@@ -121,22 +142,19 @@ private Map<String, String> getAsciidocAttributes(Project project,
121142
return attributes.get();
122143
}
123144

124-
private void configureAntoraTask(Project project, AntoraTask antoraTask,
145+
private void configureAntoraTask(Project project, AntoraTask antoraTask, NpmInstallTask npmInstallTask,
125146
GenerateAntoraPlaybook generateAntoraPlaybookTask) {
126147
antoraTask.setGroup("Documentation");
127-
antoraTask.getDependsOn().add(generateAntoraPlaybookTask);
148+
antoraTask.dependsOn(npmInstallTask, generateAntoraPlaybookTask);
149+
antoraTask.setPlaybook("antora-playbook.yml");
128150
project.getPlugins()
129151
.withType(JavaBasePlugin.class,
130152
(javaBasePlugin) -> project.getTasks()
131153
.getByName(JavaBasePlugin.CHECK_TASK_NAME)
132154
.dependsOn(antoraTask));
133155
}
134156

135-
private void configureAntoraExtension(Project project, AntoraExtension antoraExtension,
136-
Provider<RegularFile> playbook) {
137-
antoraExtension.getVersion().convention(ANTORA_VERSION);
138-
antoraExtension.getPackages().convention(Extensions.packages());
139-
antoraExtension.getPlaybook().convention(playbook.map(RegularFile::getAsFile));
157+
private void configureAntoraExtension(Project project, AntoraExtension antoraExtension) {
140158
if (project.getGradle().getStartParameter().getLogLevel() != LogLevel.DEBUG) {
141159
antoraExtension.getOptions().add("--quiet");
142160
}
@@ -149,6 +167,11 @@ private void configureNodeExtension(Project project, NodeExtension nodeExtension
149167
File buildDir = project.getBuildDir();
150168
nodeExtension.getWorkDir().set(buildDir.toPath().resolve(".gradle/nodejs").toFile());
151169
nodeExtension.getNpmWorkDir().set(buildDir.toPath().resolve(".gradle/npm").toFile());
170+
nodeExtension.getNodeProjectDir().set(getNodeProjectDir(buildDir));
171+
}
172+
173+
private File getNodeProjectDir(File buildDir) {
174+
return buildDir.toPath().resolve(".gradle/nodeproject").toFile();
152175
}
153176

154177
}

buildSrc/src/main/java/org/springframework/boot/build/antora/Extensions.java

+8-16
Original file line numberDiff line numberDiff line change
@@ -39,21 +39,20 @@ public final class Extensions {
3939
private static final List<Extension> antora;
4040
static {
4141
List<Extension> extensions = new ArrayList<>();
42-
extensions.add(new Extension("@springio/antora-extensions", "1.8.2", ROOT_COMPONENT_EXTENSION,
42+
extensions.add(new Extension("@springio/antora-extensions", ROOT_COMPONENT_EXTENSION,
4343
"@springio/antora-extensions/static-page-extension"));
44-
extensions.add(new Extension("@springio/antora-xref-extension", "1.0.0-alpha.3"));
45-
extensions.add(new Extension("@springio/antora-zip-contents-collector-extension", "1.0.0-alpha.3"));
44+
extensions.add(new Extension("@springio/antora-xref-extension"));
45+
extensions.add(new Extension("@springio/antora-zip-contents-collector-extension"));
4646
antora = List.copyOf(extensions);
4747
}
4848

4949
private static final List<Extension> asciidoc;
5050
static {
5151
List<Extension> extensions = new ArrayList<>();
52-
extensions.add(new Extension("@asciidoctor/tabs", "1.0.0-beta.6"));
53-
extensions
54-
.add(new Extension("@springio/asciidoctor-extensions", "1.0.0-alpha.10", "@springio/asciidoctor-extensions",
55-
"@springio/asciidoctor-extensions/configuration-properties-extension",
56-
"@springio/asciidoctor-extensions/section-ids-extension"));
52+
extensions.add(new Extension("@asciidoctor/tabs"));
53+
extensions.add(new Extension("@springio/asciidoctor-extensions", "@springio/asciidoctor-extensions",
54+
"@springio/asciidoctor-extensions/configuration-properties-extension",
55+
"@springio/asciidoctor-extensions/section-ids-extension"));
5756
asciidoc = List.copyOf(extensions);
5857
}
5958

@@ -62,13 +61,6 @@ public final class Extensions {
6261
private Extensions() {
6362
}
6463

65-
public static Map<String, String> packages() {
66-
Map<String, String> packages = new TreeMap<>();
67-
antora.stream().forEach((extension) -> packages.put(extension.name(), extension.version()));
68-
asciidoc.stream().forEach((extension) -> packages.put(extension.name(), extension.version()));
69-
return Collections.unmodifiableMap(packages);
70-
}
71-
7264
static List<Map<String, Object>> antora(Consumer<AntoraExtensionsConfiguration> extensions) {
7365
AntoraExtensionsConfiguration result = new AntoraExtensionsConfiguration(
7466
antora.stream().flatMap(Extension::names).sorted().toList());
@@ -80,7 +72,7 @@ static List<String> asciidoc() {
8072
return asciidoc.stream().flatMap(Extension::names).sorted().toList();
8173
}
8274

83-
private record Extension(String name, String version, String... includeNames) {
75+
private record Extension(String name, String... includeNames) {
8476

8577
Stream<String> names() {
8678
return (this.includeNames.length != 0) ? Arrays.stream(this.includeNames) : Stream.of(this.name);

0 commit comments

Comments
 (0)