diff --git a/projects/spring-cloud/src/main/resources/application.yml b/projects/spring-cloud/src/main/resources/application.yml index 8ac51437..a040863f 100644 --- a/projects/spring-cloud/src/main/resources/application.yml +++ b/projects/spring-cloud/src/main/resources/application.yml @@ -104,7 +104,7 @@ releaser: antora: spring-docs-actions-url: https://github.com/ryanjbaxter/spring-doc-actions spring-docs-actions-tag: v0.0.16 - sync-antora-docs-command: "./jenkins.sh --docs-username {{ssh-username}} --docs-ssh-key-path {{ssh-key-path}} --docs-host docs-ip.spring.io --docs-ssh-host-key {{host-key}} --site-path {{site-path}} --github-repository {{github-repo}}" + sync-antora-docs-command: "./spring-docs-action-runner.sh --docs-username {{ssh-username}} --docs-ssh-key-path {{ssh-key-path}} --docs-host docs-ip.spring.io --docs-ssh-host-key {{host-key}} --site-path {{site-path}} --github-repository {{github-repo}}" meta-release: enabled: false release-train-project-name: spring-cloud-release diff --git a/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/COMMIT_EDITMSG b/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/COMMIT_EDITMSG index 263d6d50..d0d15f93 100644 --- a/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/COMMIT_EDITMSG +++ b/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/COMMIT_EDITMSG @@ -1 +1 @@ -making jenkins.sh executable +removing jenkins.sh diff --git a/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/index b/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/index index ea4dc90c..35a2def9 100644 Binary files a/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/index and b/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/index differ diff --git a/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/logs/HEAD b/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/logs/HEAD index 676d9b6f..429a0398 100644 --- a/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/logs/HEAD +++ b/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/logs/HEAD @@ -6,3 +6,4 @@ c7c3fa38fd33170e7fbb15541066ebe746ba1ad6 18c66e805702c81fc2099cb09d2490f099581f3 b460e89cc9afdb4ecc7c1c3e4e0e1dae0cac7e63 9858d6e0d948d69e62cca0e393dfb21cfb4d7781 Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> 1715712689 -0400 commit: adding jenkins.sh 9858d6e0d948d69e62cca0e393dfb21cfb4d7781 ba9d397eb47402a7e9d00a6e529285341a35168b Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> 1715712751 -0400 commit: removed runme ba9d397eb47402a7e9d00a6e529285341a35168b 3c1914e048ad43880aecf0ce0ad4d3a5220df39b Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> 1715712928 -0400 commit: making jenkins.sh executable +3c1914e048ad43880aecf0ce0ad4d3a5220df39b 018554f12b64fc2fb8a0ea306455c8d0da30b891 Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> 1716557772 -0400 commit: removing jenkins.sh diff --git a/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/logs/refs/heads/main b/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/logs/refs/heads/main index 676d9b6f..429a0398 100644 --- a/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/logs/refs/heads/main +++ b/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/logs/refs/heads/main @@ -6,3 +6,4 @@ c7c3fa38fd33170e7fbb15541066ebe746ba1ad6 18c66e805702c81fc2099cb09d2490f099581f3 b460e89cc9afdb4ecc7c1c3e4e0e1dae0cac7e63 9858d6e0d948d69e62cca0e393dfb21cfb4d7781 Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> 1715712689 -0400 commit: adding jenkins.sh 9858d6e0d948d69e62cca0e393dfb21cfb4d7781 ba9d397eb47402a7e9d00a6e529285341a35168b Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> 1715712751 -0400 commit: removed runme ba9d397eb47402a7e9d00a6e529285341a35168b 3c1914e048ad43880aecf0ce0ad4d3a5220df39b Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> 1715712928 -0400 commit: making jenkins.sh executable +3c1914e048ad43880aecf0ce0ad4d3a5220df39b 018554f12b64fc2fb8a0ea306455c8d0da30b891 Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> 1716557772 -0400 commit: removing jenkins.sh diff --git a/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/objects/01/8554f12b64fc2fb8a0ea306455c8d0da30b891 b/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/objects/01/8554f12b64fc2fb8a0ea306455c8d0da30b891 new file mode 100644 index 00000000..9e05b4fd Binary files /dev/null and b/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/objects/01/8554f12b64fc2fb8a0ea306455c8d0da30b891 differ diff --git a/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/objects/3f/51ebc9b6a3f84f7e58ffd9097ee9b648f2d1b6 b/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/objects/3f/51ebc9b6a3f84f7e58ffd9097ee9b648f2d1b6 new file mode 100644 index 00000000..5622effb Binary files /dev/null and b/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/objects/3f/51ebc9b6a3f84f7e58ffd9097ee9b648f2d1b6 differ diff --git a/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/objects/50/6e0407dfb53853723a2f3f24a0086d53bdb05c b/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/objects/50/6e0407dfb53853723a2f3f24a0086d53bdb05c new file mode 100644 index 00000000..2de7b179 Binary files /dev/null and b/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/objects/50/6e0407dfb53853723a2f3f24a0086d53bdb05c differ diff --git a/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/objects/a8/8e84ce082bf3ebbcfe497949499e99c6cb2c10 b/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/objects/a8/8e84ce082bf3ebbcfe497949499e99c6cb2c10 new file mode 100644 index 00000000..49762c8a Binary files /dev/null and b/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/objects/a8/8e84ce082bf3ebbcfe497949499e99c6cb2c10 differ diff --git a/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/objects/ae/f500da0cf73a881df5e7d7ddf0d6533d5f2610 b/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/objects/ae/f500da0cf73a881df5e7d7ddf0d6533d5f2610 new file mode 100644 index 00000000..0532386f Binary files /dev/null and b/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/objects/ae/f500da0cf73a881df5e7d7ddf0d6533d5f2610 differ diff --git a/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/refs/heads/main b/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/refs/heads/main index 263eb1b9..94153cac 100644 --- a/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/refs/heads/main +++ b/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/refs/heads/main @@ -1 +1 @@ -3c1914e048ad43880aecf0ce0ad4d3a5220df39b +018554f12b64fc2fb8a0ea306455c8d0da30b891 diff --git a/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/refs/tags/v0.0.16 b/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/refs/tags/v0.0.16 index 61a91b64..54306abd 100644 --- a/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/refs/tags/v0.0.16 +++ b/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/git/refs/tags/v0.0.16 @@ -1 +1 @@ -76ba2479a8e84ab5431193251c8804efb4736575 +aef500da0cf73a881df5e7d7ddf0d6533d5f2610 diff --git a/projects/spring-cloud/src/test/resources/projects/spring-docs-actions/rsync-antora-reference/src/jenkins.sh b/projects/spring-cloud/src/test/resources/spring-docs-action-runner.sh similarity index 100% rename from projects/spring-cloud/src/test/resources/projects/spring-docs-actions/rsync-antora-reference/src/jenkins.sh rename to projects/spring-cloud/src/test/resources/spring-docs-action-runner.sh diff --git a/releaser-core/src/main/java/releaser/internal/ReleaserProperties.java b/releaser-core/src/main/java/releaser/internal/ReleaserProperties.java index 9a33fbce..ddea821f 100644 --- a/releaser-core/src/main/java/releaser/internal/ReleaserProperties.java +++ b/releaser-core/src/main/java/releaser/internal/ReleaserProperties.java @@ -1113,6 +1113,9 @@ public class ReleaserProperties implements Serializable { private String generateReleaseTrainDocsCommand = "bash release_train.sh " + "--retrieveversions --version {{version}} --ghpages --auto"; + /** + * Command to be executed to run Antora. + */ private String runAntoraCommand = "./mvnw antora {{systemProps}}"; /** @@ -1418,6 +1421,11 @@ public class ReleaserProperties implements Serializable { */ private long waitTimeInMinutes = 20; + /** + * Command to be executed to run Antora. + */ + private String runAntoraCommand = "./gradlew antora {{systemProps}}"; + @Override public String getBuildCommand() { return this.buildCommand; @@ -1502,6 +1510,14 @@ public class ReleaserProperties implements Serializable { this.ignoredGradleRegex = ignoredGradleRegex; } + public String getRunAntoraCommand() { + return runAntoraCommand; + } + + public void setRunAntoraCommand(String runAntoraCommand) { + this.runAntoraCommand = runAntoraCommand; + } + @Override public String toString() { return new StringJoiner(", ", Gradle.class.getSimpleName() + "[", "]") @@ -1511,6 +1527,7 @@ public class ReleaserProperties implements Serializable { .add("deployGuidesCommand='" + deployGuidesCommand + "'") .add("publishDocsCommand=" + publishDocsCommand) .add("generateReleaseTrainDocsCommand='" + generateReleaseTrainDocsCommand + "'") + .add("runAntoraCommand='" + runAntoraCommand + "'") .add("systemProperties='" + systemProperties + "'").add("waitTimeInMinutes=" + waitTimeInMinutes) .toString(); } diff --git a/releaser-core/src/main/java/releaser/internal/git/ProjectGitHandler.java b/releaser-core/src/main/java/releaser/internal/git/ProjectGitHandler.java index 5f87cd6a..431893cb 100644 --- a/releaser-core/src/main/java/releaser/internal/git/ProjectGitHandler.java +++ b/releaser-core/src/main/java/releaser/internal/git/ProjectGitHandler.java @@ -136,8 +136,7 @@ public class ProjectGitHandler implements Closeable { public File cloneAndCheckoutSpringDocsActions() { File project = cloneProject(this.properties.getAntora().getSpringDocsActionsUrl()); - // TODO for testing - // checkoutTag(project, this.properties.getAntora().getSpringDocsActionsTag()); + checkoutTag(project, this.properties.getAntora().getSpringDocsActionsTag()); return project; } diff --git a/releaser-core/src/main/java/releaser/internal/project/ProjectCommandExecutor.java b/releaser-core/src/main/java/releaser/internal/project/ProjectCommandExecutor.java index 40f2fbcc..504e6167 100644 --- a/releaser-core/src/main/java/releaser/internal/project/ProjectCommandExecutor.java +++ b/releaser-core/src/main/java/releaser/internal/project/ProjectCommandExecutor.java @@ -37,6 +37,7 @@ import org.slf4j.LoggerFactory; import releaser.internal.ReleaserProperties; import releaser.internal.tech.ReleaserProcessExecutor; +import org.springframework.core.io.ClassPathResource; import org.springframework.util.StringUtils; /** @@ -52,6 +53,13 @@ public class ProjectCommandExecutor { private static final String NEXT_VERSION_MUSTACHE = "{{nextVersion}}"; + private static final String RSYNC_ACTIONS_PROJECT_DIR = "/rsync-antora-reference/src"; + + private static final String SPRING_DOCS_ACTION_RUNNER = "spring-docs-action-runner.sh"; + + private static final String RUNNER_DESTINATION = RSYNC_ACTIONS_PROJECT_DIR + File.separator + + SPRING_DOCS_ACTION_RUNNER; + public void build(ReleaserProperties properties, ProjectVersion originalVersion, ProjectVersion versionFromReleaseTrain) { build(properties, originalVersion, versionFromReleaseTrain, properties.getWorkingDir()); @@ -180,17 +188,32 @@ public class ProjectCommandExecutor { } public void publishAntoraDocs(File antoraDocsProject, File project, ReleaserProperties properties) { - String command = new CommandPicker(properties).publishAntoraDocsCommand(project, properties); - log.info("Executing command for publishing Antora docs " + command + " / " + properties); - String[] commands = command.split(" "); - // TODO fix this hack - for (int i = 0; i < commands.length; i++) { - if (commands[i].contains("{{host-key}}")) { - commands[i] = commands[i].replace("{{host-key}}", - "\"" + properties.getAntora().getSpringDocsSshHostKey()) + "\""; + try { + copyRunnerToActions(antoraDocsProject); + String command = new CommandPicker(properties).publishAntoraDocsCommand(project, properties); + log.info("Executing command for publishing Antora docs " + command + " / " + properties); + String[] commands = command.split(" "); + // TODO fix this hack + for (int i = 0; i < commands.length; i++) { + if (commands[i].contains("{{host-key}}")) { + commands[i] = commands[i].replace("{{host-key}}", + "\"" + properties.getAntora().getSpringDocsSshHostKey()) + "\""; + } } + runCommand(properties, antoraDocsProject.getAbsolutePath() + RSYNC_ACTIONS_PROJECT_DIR, commands); + } + catch (Exception e) { + throw new IllegalStateException(e); + } + } + + public void copyRunnerToActions(File antoraDocsProject) throws IOException { + File destination = new File(antoraDocsProject.getAbsolutePath() + RUNNER_DESTINATION); + if (!destination.exists()) { + ClassPathResource runner = new ClassPathResource(SPRING_DOCS_ACTION_RUNNER); + Files.copy(runner.getInputStream(), destination.toPath()); + destination.setExecutable(true); } - runCommand(properties, antoraDocsProject.getAbsolutePath() + "/rsync-antora-reference/src", commands); } public void publishDocs(ReleaserProperties properties, ProjectVersion originalVersion, @@ -335,7 +358,9 @@ class CommandPicker { } String runAntoraCommand(ProjectVersion version) { - // TODO handle gradle and bash? + if (projectType == ProjectType.GRADLE) { + return gradleCommandWithSystemProps(releaserProperties.getGradle().getRunAntoraCommand()); + } return mavenCommandWithSystemProps(releaserProperties.getMaven().getRunAntoraCommand(), version); } diff --git a/releaser-core/src/main/resources/spring-docs-action-runner.sh b/releaser-core/src/main/resources/spring-docs-action-runner.sh new file mode 100755 index 00000000..47dde0d3 --- /dev/null +++ b/releaser-core/src/main/resources/spring-docs-action-runner.sh @@ -0,0 +1,122 @@ +#!/bin/bash +set -e +set -f + +# Get the current directory +current_dir=$(pwd) + +# Add the current directory to the PATH variable +export PATH=$PATH:$current_dir + +__action_usage() { + echo "usage: action.sh [OPTION]... + + --docs-username=USERNAME the username used to connect to ssh + --docs-host=HOST the host to connect to ssh + --docs-ssh-key-path=KEY the path to the private key used to connect to ssh + --docs-ssh-host-key=HOST_KEY the host key used to connect to ssh + --dry-run signals that rsync should be in dry run mode + --site-path=PATH the local directory path to sync to the server. Default build/site + --github-repository=GH_REPO the github repository (e.g. spring-projects/spring-security) + --httpdocs-path=PATH the optional base httpdocs path (e.g. https://docs.spring.io/spring-security/reference would be /spring-security/reference) + If this is set, then the project must own the directory by ensuring to have a .github-repository file with the + / as the content. The default is to use /\${REPOSITORY_NAME}/reference + from --github-repository +" +} + +__action_usage_error() { + echo "Error: $1" >&2 + __action_usage + exit 1 +} + +__action() { + local docs_username docs_host docs_ssh_key docs_ssh_host_key site_path github_repository httpdocs_path valid_args + local rsync_flag_options='' + if [ ! -z "$BUILD_REFNAME" ]; then + rsync_flag_options="${rsync_flag_options} --build-ref-name $BUILD_REFNAME" + fi + valid_args=$(getopt --options '' --long docs-username:,docs-host:,docs-ssh-key-path:,docs-ssh-host-key:,dry-run,site-path:,github-repository:,httpdocs-path: -- "$@") + if [[ $? -ne 0 ]]; then + __action_usage + exit 1; + fi + + eval set -- "$valid_args" + + while [ : ]; do + case "$1" in + --docs-username) + docs_username="$2" + shift 2 + ;; + --docs-host) + docs_host="$2" + shift 2 + ;; + --docs-ssh-key-path) + docs_ssh_key=$(cat "$2") + shift 2 + ;; + --docs-ssh-host-key) + docs_ssh_host_key="$2" + shift 2 + ;; + --dry-run) + rsync_flag_options="${rsync_flag_options} --dry-run" + shift + ;; + --site-path) + site_path="$2" + shift 2 + ;; + --github-repository) + github_repository="$2" + shift 2 + ;; + --httpdocs-path) + httpdocs_path="$2" + shift 2 + ;; + --) shift; + break + ;; + *) + __action_usage_error "Invalid argument $1 $2" + ;; + esac + done + + if [ -z "$docs_username" ]; then + __action_usage_error "Missing option '--docs-username'" + fi + if [ -z "$docs_host" ]; then + __action_usage_error "Missing option '--docs-host'" + fi + if [ -z "$docs_ssh_key" ]; then + __action_usage_error "Missing option '--docs-ssh-key'" + fi + if [ -z "$docs_ssh_host_key" ]; then + __action_usage_error "Missing option '--docs-ssh-host-key'" + fi + if [ -z "$site_path" ]; then + site_path="build/site" + fi + if [ -z "$github_repository" ]; then + __action_usage_error "Missing option '--github-repository'" + fi + + ( + set -e + set -f + + action.sh --docs-username "$docs_username" --docs-host "$docs_host" --docs-ssh-key "$docs_ssh_key" --docs-ssh-host-key "$docs_ssh_host_key" --site-path "$site_path" --github-repository "$github_repository" $rsync_flag_options + ) + exit_code=$? + + + exit $exit_code +} + +__action "$@"