From 280f31167740b6520e8a7f7ee080f06c9b5aed59 Mon Sep 17 00:00:00 2001 From: Marcus Da Coregio Date: Thu, 16 Feb 2023 09:41:50 -0300 Subject: [PATCH] Update Antora Plugin to 1.0.0 Issue gh-2234 --- .github/actions/algolia-config.json | 20 --- .github/actions/algolia-deploy.sh | 20 --- .github/actions/algolia-docsearch-scraper.sh | 21 --- .github/actions/dispatch.sh | 5 - .github/workflows/algolia-index.yml | 16 --- .github/workflows/antora-generate.yml | 31 ----- .github/workflows/deploy-docs.yml | 30 ++++ .github/workflows/deploy-reference.yml | 33 ----- .github/workflows/rebuild-search-index.yml | 20 +++ buildSrc/build.gradle | 5 + .../gradle/antora/AntoraVersionPlugin.java | 71 ++++++++++ .../gradle/antora/AntoraVersionUtils.java | 55 ++++++++ .../gradle/antora/CheckAntoraVersionTask.java | 96 +++++++++++++ .../antora/UpdateAntoraVersionTask.java | 130 ++++++++++++++++++ spring-session-docs/antora-playbook.yml | 27 ---- spring-session-docs/antora.yml | 13 +- .../cached-antora-playbook.yml | 35 +++++ spring-session-docs/local-antora-playbook.yml | 26 ---- .../spring-session-docs.gradle | 111 ++++++++------- 19 files changed, 507 insertions(+), 258 deletions(-) delete mode 100644 .github/actions/algolia-config.json delete mode 100755 .github/actions/algolia-deploy.sh delete mode 100755 .github/actions/algolia-docsearch-scraper.sh delete mode 100755 .github/actions/dispatch.sh delete mode 100644 .github/workflows/algolia-index.yml delete mode 100644 .github/workflows/antora-generate.yml create mode 100644 .github/workflows/deploy-docs.yml delete mode 100644 .github/workflows/deploy-reference.yml create mode 100644 .github/workflows/rebuild-search-index.yml create mode 100644 buildSrc/src/main/java/org/springframework/gradle/antora/AntoraVersionPlugin.java create mode 100644 buildSrc/src/main/java/org/springframework/gradle/antora/AntoraVersionUtils.java create mode 100644 buildSrc/src/main/java/org/springframework/gradle/antora/CheckAntoraVersionTask.java create mode 100644 buildSrc/src/main/java/org/springframework/gradle/antora/UpdateAntoraVersionTask.java delete mode 100644 spring-session-docs/antora-playbook.yml create mode 100644 spring-session-docs/cached-antora-playbook.yml delete mode 100644 spring-session-docs/local-antora-playbook.yml diff --git a/.github/actions/algolia-config.json b/.github/actions/algolia-config.json deleted file mode 100644 index 6fdbf5b3..00000000 --- a/.github/actions/algolia-config.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "index_name": "session-docs", - "start_urls": [ - "https://docs.spring.io/spring-session/reference/" - ], - "selectors": { - "lvl0": { - "selector": "//nav[@class='crumbs']//li[@class='crumb'][last()-1]", - "type": "xpath", - "global": true, - "default_value": "Home" - }, - "lvl1": ".doc h1", - "lvl2": ".doc h2", - "lvl3": ".doc h3", - "lvl4": ".doc h4", - "text": ".doc p, .doc td.content, .doc th.tableblock" - } -} - diff --git a/.github/actions/algolia-deploy.sh b/.github/actions/algolia-deploy.sh deleted file mode 100755 index 35021f18..00000000 --- a/.github/actions/algolia-deploy.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -HOST="$1" -HOST_PATH="$2" -SSH_PRIVATE_KEY="$3" -SSH_KNOWN_HOST="$4" - - -if [ "$#" -ne 4 ]; then - echo -e "not enough arguments USAGE:\n\n$0 \$HOST \$HOST_PATH \$SSH_PRIVATE_KEY \$SSH_KNOWN_HOSTS \n\n" >&2 - exit 1 -fi - -# Use a non-default path to avoid overriding when testing locally -SSH_PRIVATE_KEY_PATH=~/.ssh/github-actions-docs -install -m 600 -D /dev/null "$SSH_PRIVATE_KEY_PATH" -echo "$SSH_PRIVATE_KEY" > "$SSH_PRIVATE_KEY_PATH" -echo "$SSH_KNOWN_HOST" > ~/.ssh/known_hosts -rsync --delete -avze "ssh -i $SSH_PRIVATE_KEY_PATH" spring-session-docs/build/site/ "$HOST:$HOST_PATH" -rm -f "$SSH_PRIVATE_KEY_PATH" diff --git a/.github/actions/algolia-docsearch-scraper.sh b/.github/actions/algolia-docsearch-scraper.sh deleted file mode 100755 index 2bb9ce17..00000000 --- a/.github/actions/algolia-docsearch-scraper.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -### -# Docs -# config.json https://docsearch.algolia.com/docs/config-file -# Run the crawler https://docsearch.algolia.com/docs/run-your-own/#run-the-crawl-from-the-docker-image - -### USAGE -if [ "$#" -ne 3 ]; then - echo -e "not enough arguments USAGE:\n\n$0 \$ALGOLIA_APPLICATION_ID \$ALGOLIA_API_KEY \$CONFIG_FILE\n\n" >&2 - exit 1 -fi - -# Script Parameters -APPLICATION_ID=$1 -API_KEY=$2 -CONFIG_FILE=$3 - -#### Script -script_dir=$(dirname $0) -docker run -e "APPLICATION_ID=$APPLICATION_ID" -e "API_KEY=$API_KEY" -e "CONFIG=$(cat $CONFIG_FILE | jq -r tostring)" algolia/docsearch-scraper diff --git a/.github/actions/dispatch.sh b/.github/actions/dispatch.sh deleted file mode 100755 index 955e9cbb..00000000 --- a/.github/actions/dispatch.sh +++ /dev/null @@ -1,5 +0,0 @@ -REPOSITORY_REF="$1" -TOKEN="$2" - -curl -H "Accept: application/vnd.github.everest-preview+json" -H "Authorization: token ${TOKEN}" --request POST --data '{"event_type": "request-build-reference"}' https://api.github.com/repos/${REPOSITORY_REF}/dispatches -echo "Requested Build for $REPOSITORY_REF" diff --git a/.github/workflows/algolia-index.yml b/.github/workflows/algolia-index.yml deleted file mode 100644 index dfc2295a..00000000 --- a/.github/workflows/algolia-index.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: Update Algolia Index - -on: - schedule: - - cron: '0 10 * * *' # Once per day at 10am UTC - workflow_dispatch: # Manual trigger - -jobs: - update: - name: Update Algolia Index - runs-on: ubuntu-latest - steps: - - name: Checkout Source - uses: actions/checkout@v2 - - name: Update Index - run: ${GITHUB_WORKSPACE}/.github/actions/algolia-docsearch-scraper.sh "${{ secrets.ALGOLIA_APPLICATION_ID }}" "${{ secrets.ALGOLIA_WRITE_API_KEY }}" "${GITHUB_WORKSPACE}/.github/actions/algolia-config.json" diff --git a/.github/workflows/antora-generate.yml b/.github/workflows/antora-generate.yml deleted file mode 100644 index 2a5bed58..00000000 --- a/.github/workflows/antora-generate.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Generate Antora Files and Request Build - -on: - workflow_dispatch: # Manual trigger - push: - branches-ignore: - - 'gh-pages' - -env: - GH_ACTIONS_REPO_TOKEN: ${{ secrets.GH_ACTIONS_REPO_TOKEN }} - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Checkout Source - uses: actions/checkout@v2 - - name: Generate antora.yml - run: ./gradlew :spring-session-docs:generateAntora - - name: Extract Branch Name - id: extract_branch_name - run: echo "##[set-output name=generated_branch_name;]$(echo ${GITHUB_REPOSITORY}/${GITHUB_REF##*/})" - - name: Push generated antora files to the spring-generated-docs - uses: JamesIves/github-pages-deploy-action@4.1.4 - with: - branch: ${{ steps.extract_branch_name.outputs.generated_branch_name }} # The branch the action should deploy to. - folder: "spring-session-docs/build/generateAntora" # The folder the action should deploy. - repository-name: "spring-io/spring-generated-docs" - token: ${{ secrets.GH_ACTIONS_REPO_TOKEN }} - - name: Dispatch Build Request - run: ${GITHUB_WORKSPACE}/.github/actions/dispatch.sh 'spring-projects/spring-session' "$GH_ACTIONS_REPO_TOKEN" diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml new file mode 100644 index 00000000..88ffdac9 --- /dev/null +++ b/.github/workflows/deploy-docs.yml @@ -0,0 +1,30 @@ +name: Deploy Docs +on: + push: + branches-ignore: [ gh-pages ] + tags: '**' + repository_dispatch: + types: request-build-reference # legacy + workflow_dispatch: + +permissions: read-all +jobs: + build: + runs-on: ubuntu-latest + if: github.repository_owner == 'spring-projects' + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + ref: docs-build + fetch-depth: 1 + - name: Dispatch (partial build) + if: github.ref_type == 'branch' + env: + GH_TOKEN: ${{ secrets.GH_ACTIONS_REPO_TOKEN }} + run: gh workflow run deploy-docs.yml -r $(git rev-parse --abbrev-ref HEAD) -f build-refname=${{ github.ref_name }} + - name: Dispatch (full build) + if: github.ref_type == 'tag' + env: + GH_TOKEN: ${{ secrets.GH_ACTIONS_REPO_TOKEN }} + run: gh workflow run deploy-docs.yml -r $(git rev-parse --abbrev-ref HEAD) diff --git a/.github/workflows/deploy-reference.yml b/.github/workflows/deploy-reference.yml deleted file mode 100644 index 757d2f51..00000000 --- a/.github/workflows/deploy-reference.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Build & Deploy Reference - -on: - repository_dispatch: - types: request-build-reference - schedule: - - cron: '0 10 * * *' # Once per day at 10am UTC - workflow_dispatch: # Manual trigger - -jobs: - deploy: - name: deploy - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - cache: gradle - - name: Validate Gradle wrapper - uses: gradle/wrapper-validation-action@e6e38bacfdf1a337459f332974bb2327a31aaf4b - - name: Build with Gradle - run: ./gradlew :spring-session-docs:antora --stacktrace - - name: Cleanup Gradle Cache - # Remove some files from the Gradle cache, so they aren't cached by GitHub Actions. - # Restoring these files from a GitHub Actions cache might cause problems for future builds. - run: | - rm -f ~/.gradle/caches/modules-2/modules-2.lock - rm -f ~/.gradle/caches/modules-2/gc.properties - - name: Deploy - run: ${GITHUB_WORKSPACE}/.github/actions/algolia-deploy.sh "${{ secrets.DOCS_USERNAME }}@${{ secrets.DOCS_HOST }}" "/opt/www/domains/spring.io/docs/htdocs/spring-session/reference/" "${{ secrets.DOCS_SSH_KEY }}" "${{ secrets.DOCS_SSH_HOST_KEY }}" diff --git a/.github/workflows/rebuild-search-index.yml b/.github/workflows/rebuild-search-index.yml new file mode 100644 index 00000000..960328e9 --- /dev/null +++ b/.github/workflows/rebuild-search-index.yml @@ -0,0 +1,20 @@ +name: Rebuild Search Index +on: + schedule: + - cron: '0 10 * * *' # Once per day at 10am UTC + workflow_dispatch: +permissions: read-all +jobs: + build: + if: github.repository_owner == 'spring-projects' + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + ref: docs-build + fetch-depth: 1 + - name: Dispatch + env: + GH_TOKEN: ${{ secrets.GH_ACTIONS_REPO_TOKEN }} + run: gh workflow run rebuild-search-index.yml -r $(git rev-parse --abbrev-ref HEAD) diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index ff07b96a..b35a7fc8 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -26,6 +26,10 @@ sourceSets { gradlePlugin { plugins { + checkAntoraVersion { + id = "org.springframework.antora.check-version" + implementationClass = "org.springframework.gradle.antora.AntoraVersionPlugin" + } managementConfiguration { id = "io.spring.convention.management-configuration" implementationClass = "io.spring.gradle.convention.ManagementConfigurationPlugin" @@ -54,6 +58,7 @@ configurations { dependencies { implementation 'com.google.code.gson:gson:2.8.8' implementation 'net.sourceforge.saxon:saxon:9.1.0.8' + implementation 'org.yaml:snakeyaml:1.30' implementation localGroovy() implementation 'io.github.gradle-nexus:publish-plugin:1.1.0' diff --git a/buildSrc/src/main/java/org/springframework/gradle/antora/AntoraVersionPlugin.java b/buildSrc/src/main/java/org/springframework/gradle/antora/AntoraVersionPlugin.java new file mode 100644 index 00000000..9a1f95d5 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/gradle/antora/AntoraVersionPlugin.java @@ -0,0 +1,71 @@ +package org.springframework.gradle.antora; + +import org.gradle.api.Action; +import org.gradle.api.GradleException; +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.Task; +import org.gradle.api.tasks.TaskProvider; +import org.gradle.language.base.plugins.LifecycleBasePlugin; + +public class AntoraVersionPlugin implements Plugin { + public static final String ANTORA_CHECK_VERSION_TASK_NAME = "antoraCheckVersion"; + + @Override + public void apply(Project project) { + TaskProvider antoraCheckVersion = project.getTasks().register(ANTORA_CHECK_VERSION_TASK_NAME, CheckAntoraVersionTask.class, new Action() { + @Override + public void execute(CheckAntoraVersionTask antoraCheckVersion) { + antoraCheckVersion.setGroup(LifecycleBasePlugin.VERIFICATION_GROUP); + antoraCheckVersion.setDescription("Checks the antora.yml version properties match the Gradle version"); + antoraCheckVersion.getAntoraVersion().convention(project.provider(() -> getDefaultAntoraVersion(project))); + antoraCheckVersion.getAntoraPrerelease().convention(project.provider(() -> getDefaultAntoraPrerelease(project))); + antoraCheckVersion.getAntoraDisplayVersion().convention(project.provider(() -> getDefaultAntoraDisplayVersion(project))); + antoraCheckVersion.getAntoraYmlFile().fileProvider(project.provider(() -> project.file("antora.yml"))); + } + }); + project.getPlugins().withType(LifecycleBasePlugin.class, new Action() { + @Override + public void execute(LifecycleBasePlugin lifecycleBasePlugin) { + project.getTasks().named(LifecycleBasePlugin.CHECK_TASK_NAME).configure(new Action() { + @Override + public void execute(Task check) { + check.dependsOn(antoraCheckVersion); + } + }); + } + }); + project.getTasks().register("antoraUpdateVersion", UpdateAntoraVersionTask.class, new Action() { + @Override + public void execute(UpdateAntoraVersionTask antoraUpdateVersion) { + antoraUpdateVersion.setGroup("Release"); + antoraUpdateVersion.setDescription("Updates the antora.yml version properties to match the Gradle version"); + antoraUpdateVersion.getAntoraYmlFile().fileProvider(project.provider(() -> project.file("antora.yml"))); + } + }); + } + + private static String getDefaultAntoraVersion(Project project) { + String projectVersion = getProjectVersion(project); + return AntoraVersionUtils.getDefaultAntoraVersion(projectVersion); + } + + private static String getDefaultAntoraPrerelease(Project project) { + String projectVersion = getProjectVersion(project); + return AntoraVersionUtils.getDefaultAntoraPrerelease(projectVersion); + } + + private static String getDefaultAntoraDisplayVersion(Project project) { + String projectVersion = getProjectVersion(project); + return AntoraVersionUtils.getDefaultAntoraDisplayVersion(projectVersion); + } + + private static String getProjectVersion(Project project) { + Object projectVersion = project.getVersion(); + if (projectVersion == null) { + throw new GradleException("Please define antoraVersion and antoraPrerelease on " + ANTORA_CHECK_VERSION_TASK_NAME + " or provide a Project version so they can be defaulted"); + } + return String.valueOf(projectVersion); + } + +} diff --git a/buildSrc/src/main/java/org/springframework/gradle/antora/AntoraVersionUtils.java b/buildSrc/src/main/java/org/springframework/gradle/antora/AntoraVersionUtils.java new file mode 100644 index 00000000..9bb17b55 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/gradle/antora/AntoraVersionUtils.java @@ -0,0 +1,55 @@ +/* + * Copyright 2019-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.gradle.antora; + +public class AntoraVersionUtils { + + public static String getDefaultAntoraVersion(String projectVersion) { + int preReleaseIndex = getSnapshotIndex(projectVersion); + return isSnapshot(projectVersion) ? projectVersion.substring(0, preReleaseIndex) : projectVersion; + } + + public static String getDefaultAntoraPrerelease(String projectVersion) { + if (isSnapshot(projectVersion)) { + int preReleaseIndex = getSnapshotIndex(projectVersion); + return projectVersion.substring(preReleaseIndex); + } + if (isPreRelease(projectVersion)) { + return Boolean.TRUE.toString(); + } + return null; + } + + public static String getDefaultAntoraDisplayVersion(String projectVersion) { + if (!isSnapshot(projectVersion) && isPreRelease(projectVersion)) { + return getDefaultAntoraVersion(projectVersion); + } + return null; + } + + private static boolean isSnapshot(String projectVersion) { + return getSnapshotIndex(projectVersion) >= 0; + } + + private static int getSnapshotIndex(String projectVersion) { + return projectVersion.lastIndexOf("-SNAPSHOT"); + } + + private static boolean isPreRelease(String projectVersion) { + return projectVersion.lastIndexOf("-") >= 0; + } +} diff --git a/buildSrc/src/main/java/org/springframework/gradle/antora/CheckAntoraVersionTask.java b/buildSrc/src/main/java/org/springframework/gradle/antora/CheckAntoraVersionTask.java new file mode 100644 index 00000000..aeaf9b86 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/gradle/antora/CheckAntoraVersionTask.java @@ -0,0 +1,96 @@ +package org.springframework.gradle.antora; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; + +import org.gradle.api.DefaultTask; +import org.gradle.api.GradleException; +import org.gradle.api.file.RegularFileProperty; +import org.gradle.api.provider.Property; +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.InputFile; +import org.gradle.api.tasks.Optional; +import org.gradle.api.tasks.TaskAction; +import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.constructor.Constructor; +import org.yaml.snakeyaml.representer.Representer; + +public abstract class CheckAntoraVersionTask extends DefaultTask { + + @TaskAction + public void check() throws FileNotFoundException { + File antoraYmlFile = getAntoraYmlFile().getAsFile().get(); + String expectedAntoraVersion = getAntoraVersion().get(); + String expectedAntoraPrerelease = getAntoraPrerelease().getOrElse(null); + String expectedAntoraDisplayVersion = getAntoraDisplayVersion().getOrElse(null); + + Representer representer = new Representer(); + representer.getPropertyUtils().setSkipMissingProperties(true); + + Yaml yaml = new Yaml(new Constructor(AntoraYml.class), representer); + AntoraYml antoraYml = yaml.load(new FileInputStream(antoraYmlFile)); + + String actualAntoraPrerelease = antoraYml.getPrerelease(); + boolean preReleaseMatches = antoraYml.getPrerelease() == null && expectedAntoraPrerelease == null || + (actualAntoraPrerelease != null && actualAntoraPrerelease.equals(expectedAntoraPrerelease)); + String actualAntoraDisplayVersion = antoraYml.getDisplay_version(); + boolean displayVersionMatches = antoraYml.getDisplay_version() == null && expectedAntoraDisplayVersion == null || + (actualAntoraDisplayVersion != null && actualAntoraDisplayVersion.equals(expectedAntoraDisplayVersion)); + String actualAntoraVersion = antoraYml.getVersion(); + if (!preReleaseMatches || + !displayVersionMatches || + !expectedAntoraVersion.equals(actualAntoraVersion)) { + throw new GradleException("The Gradle version of '" + getProject().getVersion() + "' should have version: '" + + expectedAntoraVersion + "' prerelease: '" + expectedAntoraPrerelease + "' display_version: '" + + expectedAntoraDisplayVersion + "' defined in " + antoraYmlFile + " but got version: '" + + actualAntoraVersion + "' prerelease: '" + actualAntoraPrerelease + "' display_version: '" + actualAntoraDisplayVersion + "'"); + } + } + + @InputFile + public abstract RegularFileProperty getAntoraYmlFile(); + + @Input + public abstract Property getAntoraVersion(); + + @Input + @Optional + public abstract Property getAntoraPrerelease(); + + @Input + @Optional + public abstract Property getAntoraDisplayVersion(); + + public static class AntoraYml { + private String version; + + private String prerelease; + + private String display_version; + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getPrerelease() { + return prerelease; + } + + public void setPrerelease(String prerelease) { + this.prerelease = prerelease; + } + + public String getDisplay_version() { + return display_version; + } + + public void setDisplay_version(String display_version) { + this.display_version = display_version; + } + } +} diff --git a/buildSrc/src/main/java/org/springframework/gradle/antora/UpdateAntoraVersionTask.java b/buildSrc/src/main/java/org/springframework/gradle/antora/UpdateAntoraVersionTask.java new file mode 100644 index 00000000..46a2d4f4 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/gradle/antora/UpdateAntoraVersionTask.java @@ -0,0 +1,130 @@ +/* + * Copyright 2019-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.gradle.antora; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.IOException; + +import org.gradle.api.DefaultTask; +import org.gradle.api.file.RegularFileProperty; +import org.gradle.api.tasks.InputFile; +import org.gradle.api.tasks.TaskAction; +import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.constructor.Constructor; +import org.yaml.snakeyaml.nodes.NodeTuple; +import org.yaml.snakeyaml.nodes.Tag; +import org.yaml.snakeyaml.representer.Representer; + +public abstract class UpdateAntoraVersionTask extends DefaultTask { + + @TaskAction + public void update() throws IOException { + String projectVersion = getProject().getVersion().toString(); + File antoraYmlFile = getAntoraYmlFile().getAsFile().get(); + String updatedAntoraVersion = AntoraVersionUtils.getDefaultAntoraVersion(projectVersion); + String updatedAntoraPrerelease = AntoraVersionUtils.getDefaultAntoraPrerelease(projectVersion); + String updatedAntoraDisplayVersion = AntoraVersionUtils.getDefaultAntoraDisplayVersion(projectVersion); + + Representer representer = new Representer(); + representer.getPropertyUtils().setSkipMissingProperties(true); + + Yaml yaml = new Yaml(new Constructor(AntoraYml.class), representer); + AntoraYml antoraYml = yaml.load(new FileInputStream(antoraYmlFile)); + + System.out.println("Updating the version parameters in " + antoraYmlFile.getName() + " to version: " + + updatedAntoraVersion + ", prerelease: " + updatedAntoraPrerelease + ", display_version: " + + updatedAntoraDisplayVersion); + antoraYml.setVersion(updatedAntoraVersion); + antoraYml.setPrerelease(updatedAntoraPrerelease); + antoraYml.setDisplay_version(updatedAntoraDisplayVersion); + + FileWriter outputWriter = new FileWriter(antoraYmlFile); + getYaml().dump(antoraYml, outputWriter); + } + + @InputFile + public abstract RegularFileProperty getAntoraYmlFile(); + + public static class AntoraYml { + + private String name; + + private String version; + + private String prerelease; + + private String display_version; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getPrerelease() { + return prerelease; + } + + public void setPrerelease(String prerelease) { + this.prerelease = prerelease; + } + + public String getDisplay_version() { + return display_version; + } + + public void setDisplay_version(String display_version) { + this.display_version = display_version; + } + + } + + private Yaml getYaml() { + Representer representer = new Representer() { + @Override + protected NodeTuple representJavaBeanProperty(Object javaBean, + org.yaml.snakeyaml.introspector.Property property, Object propertyValue, Tag customTag) { + // Don't write out null values + if (propertyValue == null) { + return null; + } + else { + return super.representJavaBeanProperty(javaBean, property, propertyValue, customTag); + } + } + }; + representer.addClassTag(AntoraYml.class, Tag.MAP); + DumperOptions ymlOptions = new DumperOptions(); + ymlOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + ymlOptions.setDefaultScalarStyle(DumperOptions.ScalarStyle.SINGLE_QUOTED); + return new Yaml(representer, ymlOptions); + } + +} diff --git a/spring-session-docs/antora-playbook.yml b/spring-session-docs/antora-playbook.yml deleted file mode 100644 index 5d3a60f1..00000000 --- a/spring-session-docs/antora-playbook.yml +++ /dev/null @@ -1,27 +0,0 @@ -site: - title: Spring Session - url: https://docs.spring.io/spring-session/reference/ -asciidoc: - attributes: - page-pagination: true -content: - sources: - - url: https://github.com/spring-io/spring-generated-docs - branches: [spring-projects/spring-session/*] - - url: https://github.com/spring-projects/spring-session - branches: [main,3.0.x,2.6.x] - tags: [ '3.0.*', '2.7.*', '2.6.*','!2.6.0-M*','!2.6.0-RC*','!2.7.0-M1','!3.0.0-M1'] - start_path: spring-session-docs -urls: - latest_version_segment_strategy: redirect:to - latest_version_segment: '' - redirect_facility: httpd -ui: - bundle: - url: https://github.com/spring-io/antora-ui-spring/releases/download/latest/ui-bundle.zip - snapshot: true - -antora: - extensions: - - require: ./antora/extensions/version-fix.js - - require: ./antora/extensions/major-minor-segment.js diff --git a/spring-session-docs/antora.yml b/spring-session-docs/antora.yml index 5c7c055f..b185f18b 100644 --- a/spring-session-docs/antora.yml +++ b/spring-session-docs/antora.yml @@ -1,3 +1,12 @@ name: ROOT -version: '2.7.1' -prerelease: '-SNAPSHOT' +version: true +title: Documentation +nav: + - modules/ROOT/nav.adoc +ext: + collector: + run: + command: gradlew -q -PbuildSrc.skipTests=true "-Dorg.gradle.jvmargs=-Xmx3g -XX:+HeapDumpOnOutOfMemoryError" :spring-session-docs:generateAntoraYml + local: true + scan: + dir: ./build/generated-antora-resources diff --git a/spring-session-docs/cached-antora-playbook.yml b/spring-session-docs/cached-antora-playbook.yml new file mode 100644 index 00000000..56cfa016 --- /dev/null +++ b/spring-session-docs/cached-antora-playbook.yml @@ -0,0 +1,35 @@ +# PACKAGES antora@3.2.0-alpha.2 @antora/atlas-extension:1.0.0-alpha.1 @antora/collector-extension@1.0.0-alpha.3 @springio/antora-extensions@1.0.0 @asciidoctor/tabs@1.0.0-beta.3 @opendevise/antora-release-line-extension@1.0.0 +# +# The purpose of this Antora playbook is to build the docs in the current branch. +antora: + extensions: + - '@antora/collector-extension' + - id: '@antora/atlas-extension' + require: '@antora/atlas-extension' + enabled: false + - '@opendevise/antora-release-line-extension' + - require: '@springio/antora-extensions/tabs-migration-extension' + unwrap_example_block: always +site: + title: Spring Session Reference +content: + sources: + - url: ./.. + branches: HEAD + start_path: spring-session-docs + worktrees: true +asciidoc: + attributes: + hide-uri-scheme: '@' + page-pagination: '' + primary-site-url: https://docs.spring.io/spring-session/reference + tabs-sync-option: '@' + extensions: + - '@asciidoctor/tabs' + sourcemap: true +urls: + latest_version_segment: '' +ui: + bundle: + url: https://github.com/spring-io/antora-ui-spring/releases/download/latest/ui-bundle.zip + snapshot: true diff --git a/spring-session-docs/local-antora-playbook.yml b/spring-session-docs/local-antora-playbook.yml deleted file mode 100644 index d36554ec..00000000 --- a/spring-session-docs/local-antora-playbook.yml +++ /dev/null @@ -1,26 +0,0 @@ -site: - title: Spring - url: https://docs.spring.io/spring-session/reference/ -asciidoc: - attributes: - page-pagination: true -content: - sources: - - url: ../../spring-io/spring-generated-docs - branches: [spring-projects/spring-session/*] - - url: ../../spring-projects/spring-session - branches: [main] - start_path: spring-session-docs -urls: - latest_version_segment_strategy: redirect:to - latest_version_segment: '' - redirect_facility: httpd -ui: - bundle: - url: https://github.com/spring-io/antora-ui-spring/releases/download/latest/ui-bundle.zip - snapshot: true - -antora: - extensions: - - require: ./antora/extensions/version-fix.js - - require: ./antora/extensions/major-minor-segment.js diff --git a/spring-session-docs/spring-session-docs.gradle b/spring-session-docs/spring-session-docs.gradle index 20af1e58..dfb6da8c 100644 --- a/spring-session-docs/spring-session-docs.gradle +++ b/spring-session-docs/spring-session-docs.gradle @@ -1,5 +1,6 @@ plugins { - id "io.github.rwinch.antora" version "0.0.2" + id 'org.antora' version '1.0.0' + id 'io.spring.antora.generate-antora-yml' version '0.0.1' } apply plugin: 'io.spring.convention.docs' @@ -28,16 +29,54 @@ dependencies { } antora { - antoraVersion = "3.0.1" - arguments = ["--fetch"] + playbook = 'cached-antora-playbook.yml' + playbookProvider { + repository = 'spring-projects/spring-session' + branch = 'docs-build' + path = 'lib/antora/templates/per-branch-antora-playbook.yml' + checkLocalBranch = true + } + options = [clean: true, fetch: !project.gradle.startParameter.offline, stacktrace: true] } -tasks.antora { - environment = [ - "ALGOLIA_API_KEY" : "82c7ead946afbac3cf98c32446154691", - "ALGOLIA_APP_ID" : "244V8V9FGG", - "ALGOLIA_INDEX_NAME" : "session-docs" - ] +tasks.named("generateAntoraYml") { + asciidocAttributes = project.provider( { generateAttributes() } ) +} + +def generateAttributes() { + def dollar = '$' + def ghTag = snapshotBuild ? 'main' : project.version + def ghUrl = "https://github.com/spring-projects/spring-session/tree/${ghTag.toString()}" + def snapshotBuild = project.version.contains("SNAPSHOT") + def milestoneBuild = project.version.contains("-M") + def releaseBuild = (!snapshotBuild && !milestoneBuild) + def springBootVersion = "2.7.0" + def downloadUrl = "https://github.com/spring-projects/spring-session/archive/${ghTag}.zip" + def ghSamplesUrl = "$ghUrl/spring-session-samples/" + def samplesDir = "example${dollar}spring-session-samples/" + def sessionJdbcMainResourcesDir = "example${dollar.toString()}session-jdbc-main-resources-dir/" + def springSessionDataMongoDbDir = "example${dollar.toString()}spring-session-data-mongodb-dir/" + def docsTestDir = "example${dollar.toString()}java/" + def websocketdocTestDir = "example${dollar.toString()}java/docs/websocket/" + def docsTestResourcesDir = "example${dollar.toString()}resources/" + def indexdocTests = "example${dollar.toString()}java/docs/IndexDocTests.java" + + return [ + 'download-url': downloadUrl.toString(), + 'gh-samples-url': ghSamplesUrl.toString(), + 'samples-dir': samplesDir.toString(), + 'session-jdbc-main-resources-dir': sessionJdbcMainResourcesDir.toString(), + 'spring-session-data-mongodb-dir': springSessionDataMongoDbDir.toString(), + 'docs-test-dir': docsTestDir.toString(), + 'websocketdoc-test-dir': websocketdocTestDir.toString(), + 'docs-test-resources-dir': docsTestResourcesDir.toString(), + 'indexdoc-tests': indexdocTests.toString(), + 'spring-session-version': project.version, + 'version-milestone': milestoneBuild, + 'version-release': releaseBuild, + 'version-snapshot': snapshotBuild, + 'spring-boot-version': springBootVersion + ] + resolvedVersions(project.configurations.testRuntimeClasspath) } sourceSets { @@ -51,58 +90,16 @@ sourceSets { } } -tasks.register("generateAntora") { - group = "Documentation" - description = "Generates the antora.yml for dynamic properties" - doLast { - def dollar = '$' - def ghTag = snapshotBuild ? 'main' : project.version - def ghUrl = "https://github.com/spring-projects/spring-session/tree/$ghTag" - def versions = resolvedVersions(project.configurations.testRuntimeClasspath) - def ymlVersions = "" - versions.call().each { name, version -> - ymlVersions += """ - ${name}: ${version}""" - } - def outputFile = new File("$buildDir/generateAntora/antora.yml") - outputFile.getParentFile().mkdirs() - outputFile.createNewFile() - def antoraYmlText = file("antora.yml").getText() - outputFile.setText("""$antoraYmlText -title: Spring Session -start_page: ROOT:index.adoc -nav: - - modules/ROOT/nav.adoc - -asciidoc: - attributes: - download-url: "https://github.com/spring-projects/spring-session/archive/${ghTag}.zip" - gh-samples-url: "$ghUrl/spring-session-samples/" - samples-dir: "example${dollar}spring-session-samples/" - session-jdbc-main-resources-dir: "example${dollar}session-jdbc-main-resources-dir/" - spring-session-data-mongodb-dir: "example${dollar}spring-session-data-mongodb-dir/" - docs-test-dir: "example${dollar}java/" - websocketdoc-test-dir: 'example${dollar}java/docs/websocket/' - docs-test-resources-dir: "example${dollar}resources/" - indexdoc-tests: "example${dollar}java/docs/IndexDocTests.java" - spring-session-version: ${project.version} - version-milestone: $milestoneBuild - version-release: $releaseBuild - version-snapshot: $snapshotBuild - spring-boot-version: ${springBootVersion} -${ymlVersions} -""") - } -} - repositories { - maven { url "https://repo.spring.io/release" } + mavenCentral() + maven { url 'https://repo.spring.io/release' } + maven { url 'https://repo.spring.io/milestone' } + maven { url 'https://repo.spring.io/snapshot' } } def resolvedVersions(Configuration configuration) { - return { - configuration.resolvedConfiguration + return configuration.resolvedConfiguration .resolvedArtifacts .collectEntries { [(it.name + "-version"): it.moduleVersion.id.version] } - } + }