Add new code to sync antora docs

This commit is contained in:
Ryan Baxter
2024-05-09 13:22:54 -04:00
parent da4085d156
commit 583ddab1d7
88 changed files with 1350 additions and 13 deletions

View File

@@ -101,6 +101,10 @@ releaser:
all-versions-file-url: https://raw.githubusercontent.com/spring-io/start.spring.io/main/start-site/src/main/resources/application.yml
bom-name: spring-cloud
# fixed-versions:
antora:
spring-docs-actions-url: https://github.com/spring-io/spring-doc-actions
spring-docs-actions-tag: v0.0.16
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

View File

@@ -0,0 +1,16 @@
*~
#*
*#
.#*
.classpath
.project
.settings/
.springBeans
target/
_site/
.idea
*.iml
*.ipr
.factorypath
*.swp
/consul

View File

@@ -0,0 +1 @@
removing jenkins.sh

View File

@@ -0,0 +1 @@
ref: refs/heads/main

View File

@@ -0,0 +1,7 @@
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true

View File

@@ -0,0 +1 @@
Unnamed repository; edit this file 'description' to name the repository.

View File

@@ -0,0 +1,15 @@
#!/bin/sh
#
# An example hook script to check the commit log message taken by
# applypatch from an e-mail message.
#
# The hook should exit with non-zero status after issuing an
# appropriate message if it wants to stop the commit. The hook is
# allowed to edit the commit message file.
#
# To enable this hook, rename this file to "applypatch-msg".
. git-sh-setup
commitmsg="$(git rev-parse --git-path hooks/commit-msg)"
test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"}
:

View File

@@ -0,0 +1,24 @@
#!/bin/sh
#
# An example hook script to check the commit log message.
# Called by "git commit" with one argument, the name of the file
# that has the commit message. The hook should exit with non-zero
# status after issuing an appropriate message if it wants to stop the
# commit. The hook is allowed to edit the commit message file.
#
# To enable this hook, rename this file to "commit-msg".
# Uncomment the below to add a Signed-off-by line to the message.
# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
# hook is more suited to it.
#
# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
# This example catches duplicate Signed-off-by lines.
test "" = "$(grep '^Signed-off-by: ' "$1" |
sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
echo >&2 Duplicate Signed-off-by lines.
exit 1
}

View File

@@ -0,0 +1,174 @@
#!/usr/bin/perl
use strict;
use warnings;
use IPC::Open2;
# An example hook script to integrate Watchman
# (https://facebook.github.io/watchman/) with git to speed up detecting
# new and modified files.
#
# The hook is passed a version (currently 2) and last update token
# formatted as a string and outputs to stdout a new update token and
# all files that have been modified since the update token. Paths must
# be relative to the root of the working tree and separated by a single NUL.
#
# To enable this hook, rename this file to "query-watchman" and set
# 'git config core.fsmonitor .git/hooks/query-watchman'
#
my ($version, $last_update_token) = @ARGV;
# Uncomment for debugging
# print STDERR "$0 $version $last_update_token\n";
# Check the hook interface version
if ($version ne 2) {
die "Unsupported query-fsmonitor hook version '$version'.\n" .
"Falling back to scanning...\n";
}
my $git_work_tree = get_working_dir();
my $retry = 1;
my $json_pkg;
eval {
require JSON::XS;
$json_pkg = "JSON::XS";
1;
} or do {
require JSON::PP;
$json_pkg = "JSON::PP";
};
launch_watchman();
sub launch_watchman {
my $o = watchman_query();
if (is_work_tree_watched($o)) {
output_result($o->{clock}, @{$o->{files}});
}
}
sub output_result {
my ($clockid, @files) = @_;
# Uncomment for debugging watchman output
# open (my $fh, ">", ".git/watchman-output.out");
# binmode $fh, ":utf8";
# print $fh "$clockid\n@files\n";
# close $fh;
binmode STDOUT, ":utf8";
print $clockid;
print "\0";
local $, = "\0";
print @files;
}
sub watchman_clock {
my $response = qx/watchman clock "$git_work_tree"/;
die "Failed to get clock id on '$git_work_tree'.\n" .
"Falling back to scanning...\n" if $? != 0;
return $json_pkg->new->utf8->decode($response);
}
sub watchman_query {
my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty')
or die "open2() failed: $!\n" .
"Falling back to scanning...\n";
# In the query expression below we're asking for names of files that
# changed since $last_update_token but not from the .git folder.
#
# To accomplish this, we're using the "since" generator to use the
# recency index to select candidate nodes and "fields" to limit the
# output to file names only. Then we're using the "expression" term to
# further constrain the results.
my $last_update_line = "";
if (substr($last_update_token, 0, 1) eq "c") {
$last_update_token = "\"$last_update_token\"";
$last_update_line = qq[\n"since": $last_update_token,];
}
my $query = <<" END";
["query", "$git_work_tree", {$last_update_line
"fields": ["name"],
"expression": ["not", ["dirname", ".git"]]
}]
END
# Uncomment for debugging the watchman query
# open (my $fh, ">", ".git/watchman-query.json");
# print $fh $query;
# close $fh;
print CHLD_IN $query;
close CHLD_IN;
my $response = do {local $/; <CHLD_OUT>};
# Uncomment for debugging the watch response
# open ($fh, ">", ".git/watchman-response.json");
# print $fh $response;
# close $fh;
die "Watchman: command returned no output.\n" .
"Falling back to scanning...\n" if $response eq "";
die "Watchman: command returned invalid output: $response\n" .
"Falling back to scanning...\n" unless $response =~ /^\{/;
return $json_pkg->new->utf8->decode($response);
}
sub is_work_tree_watched {
my ($output) = @_;
my $error = $output->{error};
if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) {
$retry--;
my $response = qx/watchman watch "$git_work_tree"/;
die "Failed to make watchman watch '$git_work_tree'.\n" .
"Falling back to scanning...\n" if $? != 0;
$output = $json_pkg->new->utf8->decode($response);
$error = $output->{error};
die "Watchman: $error.\n" .
"Falling back to scanning...\n" if $error;
# Uncomment for debugging watchman output
# open (my $fh, ">", ".git/watchman-output.out");
# close $fh;
# Watchman will always return all files on the first query so
# return the fast "everything is dirty" flag to git and do the
# Watchman query just to get it over with now so we won't pay
# the cost in git to look up each individual file.
my $o = watchman_clock();
$error = $output->{error};
die "Watchman: $error.\n" .
"Falling back to scanning...\n" if $error;
output_result($o->{clock}, ("/"));
$last_update_token = $o->{clock};
eval { launch_watchman() };
return 0;
}
die "Watchman: $error.\n" .
"Falling back to scanning...\n" if $error;
return 1;
}
sub get_working_dir {
my $working_dir;
if ($^O =~ 'msys' || $^O =~ 'cygwin') {
$working_dir = Win32::GetCwd();
$working_dir =~ tr/\\/\//;
} else {
require Cwd;
$working_dir = Cwd::cwd();
}
return $working_dir;
}

View File

@@ -0,0 +1,8 @@
#!/bin/sh
#
# An example hook script to prepare a packed repository for use over
# dumb transports.
#
# To enable this hook, rename this file to "post-update".
exec git update-server-info

View File

@@ -0,0 +1,14 @@
#!/bin/sh
#
# An example hook script to verify what is about to be committed
# by applypatch from an e-mail message.
#
# The hook should exit with non-zero status after issuing an
# appropriate message if it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-applypatch".
. git-sh-setup
precommit="$(git rev-parse --git-path hooks/pre-commit)"
test -x "$precommit" && exec "$precommit" ${1+"$@"}
:

View File

@@ -0,0 +1,49 @@
#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments. The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".
if git rev-parse --verify HEAD >/dev/null 2>&1
then
against=HEAD
else
# Initial commit: diff against an empty tree object
against=$(git hash-object -t tree /dev/null)
fi
# If you want to allow non-ASCII filenames set this variable to true.
allownonascii=$(git config --type=bool hooks.allownonascii)
# Redirect output to stderr.
exec 1>&2
# Cross platform projects tend to avoid non-ASCII filenames; prevent
# them from being added to the repository. We exploit the fact that the
# printable range starts at the space character and ends with tilde.
if [ "$allownonascii" != "true" ] &&
# Note that the use of brackets around a tr range is ok here, (it's
# even required, for portability to Solaris 10's /usr/bin/tr), since
# the square bracket bytes happen to fall in the designated range.
test $(git diff-index --cached --name-only --diff-filter=A -z $against |
LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
then
cat <<\EOF
Error: Attempt to add a non-ASCII file name.
This can cause problems if you want to work with people on other platforms.
To be portable it is advisable to rename the file.
If you know what you are doing you can disable this check using:
git config hooks.allownonascii true
EOF
exit 1
fi
# If there are whitespace errors, print the offending file names and fail.
exec git diff-index --check --cached $against --

View File

@@ -0,0 +1,13 @@
#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git merge" with no arguments. The hook should
# exit with non-zero status after issuing an appropriate message to
# stderr if it wants to stop the merge commit.
#
# To enable this hook, rename this file to "pre-merge-commit".
. git-sh-setup
test -x "$GIT_DIR/hooks/pre-commit" &&
exec "$GIT_DIR/hooks/pre-commit"
:

View File

@@ -0,0 +1,53 @@
#!/bin/sh
# An example hook script to verify what is about to be pushed. Called by "git
# push" after it has checked the remote status, but before anything has been
# pushed. If this script exits with a non-zero status nothing will be pushed.
#
# This hook is called with the following parameters:
#
# $1 -- Name of the remote to which the push is being done
# $2 -- URL to which the push is being done
#
# If pushing without using a named remote those arguments will be equal.
#
# Information about the commits which are being pushed is supplied as lines to
# the standard input in the form:
#
# <local ref> <local oid> <remote ref> <remote oid>
#
# This sample shows how to prevent push of commits where the log message starts
# with "WIP" (work in progress).
remote="$1"
url="$2"
zero=$(git hash-object --stdin </dev/null | tr '[0-9a-f]' '0')
while read local_ref local_oid remote_ref remote_oid
do
if test "$local_oid" = "$zero"
then
# Handle delete
:
else
if test "$remote_oid" = "$zero"
then
# New branch, examine all commits
range="$local_oid"
else
# Update to existing branch, examine new commits
range="$remote_oid..$local_oid"
fi
# Check for WIP commit
commit=$(git rev-list -n 1 --grep '^WIP' "$range")
if test -n "$commit"
then
echo >&2 "Found WIP commit in $local_ref, not pushing"
exit 1
fi
fi
done
exit 0

View File

@@ -0,0 +1,169 @@
#!/bin/sh
#
# Copyright (c) 2006, 2008 Junio C Hamano
#
# The "pre-rebase" hook is run just before "git rebase" starts doing
# its job, and can prevent the command from running by exiting with
# non-zero status.
#
# The hook is called with the following parameters:
#
# $1 -- the upstream the series was forked from.
# $2 -- the branch being rebased (or empty when rebasing the current branch).
#
# This sample shows how to prevent topic branches that are already
# merged to 'next' branch from getting rebased, because allowing it
# would result in rebasing already published history.
publish=next
basebranch="$1"
if test "$#" = 2
then
topic="refs/heads/$2"
else
topic=`git symbolic-ref HEAD` ||
exit 0 ;# we do not interrupt rebasing detached HEAD
fi
case "$topic" in
refs/heads/??/*)
;;
*)
exit 0 ;# we do not interrupt others.
;;
esac
# Now we are dealing with a topic branch being rebased
# on top of master. Is it OK to rebase it?
# Does the topic really exist?
git show-ref -q "$topic" || {
echo >&2 "No such branch $topic"
exit 1
}
# Is topic fully merged to master?
not_in_master=`git rev-list --pretty=oneline ^master "$topic"`
if test -z "$not_in_master"
then
echo >&2 "$topic is fully merged to master; better remove it."
exit 1 ;# we could allow it, but there is no point.
fi
# Is topic ever merged to next? If so you should not be rebasing it.
only_next_1=`git rev-list ^master "^$topic" ${publish} | sort`
only_next_2=`git rev-list ^master ${publish} | sort`
if test "$only_next_1" = "$only_next_2"
then
not_in_topic=`git rev-list "^$topic" master`
if test -z "$not_in_topic"
then
echo >&2 "$topic is already up to date with master"
exit 1 ;# we could allow it, but there is no point.
else
exit 0
fi
else
not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"`
/usr/bin/perl -e '
my $topic = $ARGV[0];
my $msg = "* $topic has commits already merged to public branch:\n";
my (%not_in_next) = map {
/^([0-9a-f]+) /;
($1 => 1);
} split(/\n/, $ARGV[1]);
for my $elem (map {
/^([0-9a-f]+) (.*)$/;
[$1 => $2];
} split(/\n/, $ARGV[2])) {
if (!exists $not_in_next{$elem->[0]}) {
if ($msg) {
print STDERR $msg;
undef $msg;
}
print STDERR " $elem->[1]\n";
}
}
' "$topic" "$not_in_next" "$not_in_master"
exit 1
fi
<<\DOC_END
This sample hook safeguards topic branches that have been
published from being rewound.
The workflow assumed here is:
* Once a topic branch forks from "master", "master" is never
merged into it again (either directly or indirectly).
* Once a topic branch is fully cooked and merged into "master",
it is deleted. If you need to build on top of it to correct
earlier mistakes, a new topic branch is created by forking at
the tip of the "master". This is not strictly necessary, but
it makes it easier to keep your history simple.
* Whenever you need to test or publish your changes to topic
branches, merge them into "next" branch.
The script, being an example, hardcodes the publish branch name
to be "next", but it is trivial to make it configurable via
$GIT_DIR/config mechanism.
With this workflow, you would want to know:
(1) ... if a topic branch has ever been merged to "next". Young
topic branches can have stupid mistakes you would rather
clean up before publishing, and things that have not been
merged into other branches can be easily rebased without
affecting other people. But once it is published, you would
not want to rewind it.
(2) ... if a topic branch has been fully merged to "master".
Then you can delete it. More importantly, you should not
build on top of it -- other people may already want to
change things related to the topic as patches against your
"master", so if you need further changes, it is better to
fork the topic (perhaps with the same name) afresh from the
tip of "master".
Let's look at this example:
o---o---o---o---o---o---o---o---o---o "next"
/ / / /
/ a---a---b A / /
/ / / /
/ / c---c---c---c B /
/ / / \ /
/ / / b---b C \ /
/ / / / \ /
---o---o---o---o---o---o---o---o---o---o---o "master"
A, B and C are topic branches.
* A has one fix since it was merged up to "next".
* B has finished. It has been fully merged up to "master" and "next",
and is ready to be deleted.
* C has not merged to "next" at all.
We would want to allow C to be rebased, refuse A, and encourage
B to be deleted.
To compute (1):
git rev-list ^master ^topic next
git rev-list ^master next
if these match, topic has not merged in next at all.
To compute (2):
git rev-list master..topic
if this is empty, it is fully merged to "master".
DOC_END

View File

@@ -0,0 +1,24 @@
#!/bin/sh
#
# An example hook script to make use of push options.
# The example simply echoes all push options that start with 'echoback='
# and rejects all pushes when the "reject" push option is used.
#
# To enable this hook, rename this file to "pre-receive".
if test -n "$GIT_PUSH_OPTION_COUNT"
then
i=0
while test "$i" -lt "$GIT_PUSH_OPTION_COUNT"
do
eval "value=\$GIT_PUSH_OPTION_$i"
case "$value" in
echoback=*)
echo "echo from the pre-receive-hook: ${value#*=}" >&2
;;
reject)
exit 1
esac
i=$((i + 1))
done
fi

View File

@@ -0,0 +1,42 @@
#!/bin/sh
#
# An example hook script to prepare the commit log message.
# Called by "git commit" with the name of the file that has the
# commit message, followed by the description of the commit
# message's source. The hook's purpose is to edit the commit
# message file. If the hook fails with a non-zero status,
# the commit is aborted.
#
# To enable this hook, rename this file to "prepare-commit-msg".
# This hook includes three examples. The first one removes the
# "# Please enter the commit message..." help message.
#
# The second includes the output of "git diff --name-status -r"
# into the message, just before the "git status" output. It is
# commented because it doesn't cope with --amend or with squashed
# commits.
#
# The third example adds a Signed-off-by line to the message, that can
# still be edited. This is rarely a good idea.
COMMIT_MSG_FILE=$1
COMMIT_SOURCE=$2
SHA1=$3
/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE"
# case "$COMMIT_SOURCE,$SHA1" in
# ,|template,)
# /usr/bin/perl -i.bak -pe '
# print "\n" . `git diff --cached --name-status -r`
# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;;
# *) ;;
# esac
# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE"
# if test -z "$COMMIT_SOURCE"
# then
# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE"
# fi

View File

@@ -0,0 +1,78 @@
#!/bin/sh
# An example hook script to update a checked-out tree on a git push.
#
# This hook is invoked by git-receive-pack(1) when it reacts to git
# push and updates reference(s) in its repository, and when the push
# tries to update the branch that is currently checked out and the
# receive.denyCurrentBranch configuration variable is set to
# updateInstead.
#
# By default, such a push is refused if the working tree and the index
# of the remote repository has any difference from the currently
# checked out commit; when both the working tree and the index match
# the current commit, they are updated to match the newly pushed tip
# of the branch. This hook is to be used to override the default
# behaviour; however the code below reimplements the default behaviour
# as a starting point for convenient modification.
#
# The hook receives the commit with which the tip of the current
# branch is going to be updated:
commit=$1
# It can exit with a non-zero status to refuse the push (when it does
# so, it must not modify the index or the working tree).
die () {
echo >&2 "$*"
exit 1
}
# Or it can make any necessary changes to the working tree and to the
# index to bring them to the desired state when the tip of the current
# branch is updated to the new commit, and exit with a zero status.
#
# For example, the hook can simply run git read-tree -u -m HEAD "$1"
# in order to emulate git fetch that is run in the reverse direction
# with git push, as the two-tree form of git read-tree -u -m is
# essentially the same as git switch or git checkout that switches
# branches while keeping the local changes in the working tree that do
# not interfere with the difference between the branches.
# The below is a more-or-less exact translation to shell of the C code
# for the default behaviour for git's push-to-checkout hook defined in
# the push_to_deploy() function in builtin/receive-pack.c.
#
# Note that the hook will be executed from the repository directory,
# not from the working tree, so if you want to perform operations on
# the working tree, you will have to adapt your code accordingly, e.g.
# by adding "cd .." or using relative paths.
if ! git update-index -q --ignore-submodules --refresh
then
die "Up-to-date check failed"
fi
if ! git diff-files --quiet --ignore-submodules --
then
die "Working directory has unstaged changes"
fi
# This is a rough translation of:
#
# head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX
if git cat-file -e HEAD 2>/dev/null
then
head=HEAD
else
head=$(git hash-object -t tree --stdin </dev/null)
fi
if ! git diff-index --quiet --cached --ignore-submodules $head --
then
die "Working directory has staged changes"
fi
if ! git read-tree -u -m "$commit"
then
die "Could not update working tree to new HEAD"
fi

View File

@@ -0,0 +1,77 @@
#!/bin/sh
# An example hook script to validate a patch (and/or patch series) before
# sending it via email.
#
# The hook should exit with non-zero status after issuing an appropriate
# message if it wants to prevent the email(s) from being sent.
#
# To enable this hook, rename this file to "sendemail-validate".
#
# By default, it will only check that the patch(es) can be applied on top of
# the default upstream branch without conflicts in a secondary worktree. After
# validation (successful or not) of the last patch of a series, the worktree
# will be deleted.
#
# The following config variables can be set to change the default remote and
# remote ref that are used to apply the patches against:
#
# sendemail.validateRemote (default: origin)
# sendemail.validateRemoteRef (default: HEAD)
#
# Replace the TODO placeholders with appropriate checks according to your
# needs.
validate_cover_letter () {
file="$1"
# TODO: Replace with appropriate checks (e.g. spell checking).
true
}
validate_patch () {
file="$1"
# Ensure that the patch applies without conflicts.
git am -3 "$file" || return
# TODO: Replace with appropriate checks for this patch
# (e.g. checkpatch.pl).
true
}
validate_series () {
# TODO: Replace with appropriate checks for the whole series
# (e.g. quick build, coding style checks, etc.).
true
}
# main -------------------------------------------------------------------------
if test "$GIT_SENDEMAIL_FILE_COUNTER" = 1
then
remote=$(git config --default origin --get sendemail.validateRemote) &&
ref=$(git config --default HEAD --get sendemail.validateRemoteRef) &&
worktree=$(mktemp --tmpdir -d sendemail-validate.XXXXXXX) &&
git worktree add -fd --checkout "$worktree" "refs/remotes/$remote/$ref" &&
git config --replace-all sendemail.validateWorktree "$worktree"
else
worktree=$(git config --get sendemail.validateWorktree)
fi || {
echo "sendemail-validate: error: failed to prepare worktree" >&2
exit 1
}
unset GIT_DIR GIT_WORK_TREE
cd "$worktree" &&
if grep -q "^diff --git " "$1"
then
validate_patch "$1"
else
validate_cover_letter "$1"
fi &&
if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL"
then
git config --unset-all sendemail.validateWorktree &&
trap 'git worktree remove -ff "$worktree"' EXIT &&
validate_series
fi

View File

@@ -0,0 +1,128 @@
#!/bin/sh
#
# An example hook script to block unannotated tags from entering.
# Called by "git receive-pack" with arguments: refname sha1-old sha1-new
#
# To enable this hook, rename this file to "update".
#
# Config
# ------
# hooks.allowunannotated
# This boolean sets whether unannotated tags will be allowed into the
# repository. By default they won't be.
# hooks.allowdeletetag
# This boolean sets whether deleting tags will be allowed in the
# repository. By default they won't be.
# hooks.allowmodifytag
# This boolean sets whether a tag may be modified after creation. By default
# it won't be.
# hooks.allowdeletebranch
# This boolean sets whether deleting branches will be allowed in the
# repository. By default they won't be.
# hooks.denycreatebranch
# This boolean sets whether remotely creating branches will be denied
# in the repository. By default this is allowed.
#
# --- Command line
refname="$1"
oldrev="$2"
newrev="$3"
# --- Safety check
if [ -z "$GIT_DIR" ]; then
echo "Don't run this script from the command line." >&2
echo " (if you want, you could supply GIT_DIR then run" >&2
echo " $0 <ref> <oldrev> <newrev>)" >&2
exit 1
fi
if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
echo "usage: $0 <ref> <oldrev> <newrev>" >&2
exit 1
fi
# --- Config
allowunannotated=$(git config --type=bool hooks.allowunannotated)
allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch)
denycreatebranch=$(git config --type=bool hooks.denycreatebranch)
allowdeletetag=$(git config --type=bool hooks.allowdeletetag)
allowmodifytag=$(git config --type=bool hooks.allowmodifytag)
# check for no description
projectdesc=$(sed -e '1q' "$GIT_DIR/description")
case "$projectdesc" in
"Unnamed repository"* | "")
echo "*** Project description file hasn't been set" >&2
exit 1
;;
esac
# --- Check types
# if $newrev is 0000...0000, it's a commit to delete a ref.
zero=$(git hash-object --stdin </dev/null | tr '[0-9a-f]' '0')
if [ "$newrev" = "$zero" ]; then
newrev_type=delete
else
newrev_type=$(git cat-file -t $newrev)
fi
case "$refname","$newrev_type" in
refs/tags/*,commit)
# un-annotated tag
short_refname=${refname##refs/tags/}
if [ "$allowunannotated" != "true" ]; then
echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2
echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
exit 1
fi
;;
refs/tags/*,delete)
# delete tag
if [ "$allowdeletetag" != "true" ]; then
echo "*** Deleting a tag is not allowed in this repository" >&2
exit 1
fi
;;
refs/tags/*,tag)
# annotated tag
if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1
then
echo "*** Tag '$refname' already exists." >&2
echo "*** Modifying a tag is not allowed in this repository." >&2
exit 1
fi
;;
refs/heads/*,commit)
# branch
if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then
echo "*** Creating a branch is not allowed in this repository" >&2
exit 1
fi
;;
refs/heads/*,delete)
# delete branch
if [ "$allowdeletebranch" != "true" ]; then
echo "*** Deleting a branch is not allowed in this repository" >&2
exit 1
fi
;;
refs/remotes/*,commit)
# tracking branch
;;
refs/remotes/*,delete)
# delete tracking branch
if [ "$allowdeletebranch" != "true" ]; then
echo "*** Deleting a tracking branch is not allowed in this repository" >&2
exit 1
fi
;;
*)
# Anything else (is there anything else?)
echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
exit 1
;;
esac
# --- Finished
exit 0

View File

@@ -0,0 +1,6 @@
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~

View File

@@ -0,0 +1,9 @@
0000000000000000000000000000000000000000 0d0095113b5be7f4fcdfc972268318ec902c5f13 Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> 1715194973 -0400 commit (initial): initial commit
0d0095113b5be7f4fcdfc972268318ec902c5f13 c7c3fa38fd33170e7fbb15541066ebe746ba1ad6 Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> 1715202289 -0400 commit: moving action.sh
c7c3fa38fd33170e7fbb15541066ebe746ba1ad6 18c66e805702c81fc2099cb09d2490f099581f34 Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> 1715260171 -0400 commit: changing permissions
18c66e805702c81fc2099cb09d2490f099581f34 193a7a691db1f7529bbd1d7f7f4947209622486c Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> 1715263189 -0400 commit: updating action
193a7a691db1f7529bbd1d7f7f4947209622486c b460e89cc9afdb4ecc7c1c3e4e0e1dae0cac7e63 Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> 1715364505 -0400 commit: adding setup_ssh.sh
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

View File

@@ -0,0 +1,9 @@
0000000000000000000000000000000000000000 0d0095113b5be7f4fcdfc972268318ec902c5f13 Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> 1715194973 -0400 commit (initial): initial commit
0d0095113b5be7f4fcdfc972268318ec902c5f13 c7c3fa38fd33170e7fbb15541066ebe746ba1ad6 Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> 1715202289 -0400 commit: moving action.sh
c7c3fa38fd33170e7fbb15541066ebe746ba1ad6 18c66e805702c81fc2099cb09d2490f099581f34 Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> 1715260171 -0400 commit: changing permissions
18c66e805702c81fc2099cb09d2490f099581f34 193a7a691db1f7529bbd1d7f7f4947209622486c Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> 1715263189 -0400 commit: updating action
193a7a691db1f7529bbd1d7f7f4947209622486c b460e89cc9afdb4ecc7c1c3e4e0e1dae0cac7e63 Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> 1715364505 -0400 commit: adding setup_ssh.sh
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

View File

@@ -0,0 +1,2 @@
x<01><>K
<EFBFBD>0<14>a<EFBFBD><59>%I<><49> ".<2E>$<24><><46>)<29><>u N?8?<3F>K<EFBFBD> H<><48><EFBFBD><EFBFBD><EFBFBD>9t<39><74>!%<25><>;<3B><>;<1D><>ܶ<01>=<05>3<EFBFBD><33>!e<><65>~<7E><><15><70><D6B2>1W{<7B><>]<5D><><EFBFBD><EFBFBD><EFBFBD>)<29>2<EFBFBD><32>#<23>a M<><4D> +<2B>@<40><><EFBFBD>W<><57><EFBFBD><EFBFBD><EFBFBD>'<27><>(<28>s,я<><D18F><EFBFBD>7<EFBFBD><37>K]

View File

@@ -0,0 +1,2 @@
x=<3D>M<0E> <14>]s
<EFBFBD>F<EFBFBD>{<7B>Gc<>G<EFBFBD><06><><EFBFBD>FJCi#<23>]<5D><>|<7C>|3<><14>8D7<44>6S0<53><30>V<19><1C>Z<EFBFBD>q<EFBFBD><71>N<EFBFBD><4E>Fh<46>F!<21><>jI.<2E><>m a<>$W<><57>g<><67>y<EFBFBD><79>><3E><><EFBFBD>ݾs<DDBE><17><02>8<EFBFBD><38>&<26>c<EFBFBD>m<EFBFBD>iesL~y6<><36><EFBFBD>9Vu<56>z$<24><06><>'.8'$<14><><EFBFBD><18><><EFBFBD><07>6<>

View File

@@ -0,0 +1 @@
x<01><>Kn<4B> <14><><EFBFBD>Y<05><>py

View File

@@ -0,0 +1 @@
x<01><>An<41> <10><><EFBFBD>9<EFBFBD><39><EFBFBD>Z006HU<15><08><>0<EFBFBD><30>U <16>Rs<52>Ҟ<EFBFBD><D29E><EFBFBD>-~=<3D>۶v<DBB6>ſ<EFBFBD><C5BF>3P4V <0C>Y"s<0E>H<16>,D<><44>ɚ<14><><EFBFBD>-<2D><0E><><g<>i<EFBFBD>(<28>\uuH肾<48>AC<41>S|<7C>[m<><6D><EFBFBD><1F><>s<EFBFBD>7B<37><42>Nm<4E>W<EFBFBD><57><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>~N׵ߎ8I<38><49><EFBFBD>,<2C>p<EFBFBD><70>x<>Nk5t\<5C>

View File

@@ -0,0 +1,3 @@
x<01><>An<41> <10><><EFBFBD>9<EFBFBD><39><EFBFBD>Z0<5A><01><><EFBFBD><1C>7<18><><EFBFBD>i<EFBFBD>#<23><><EFBFBD><EFBFBD>uz<75><7A><EFBFBD><EFBFBD>-~=^<5E>en<65>ɼ<EFBFBD>*<02><><EFBFBD>آi )j<1C><><EFBFBD> Ğ<><C49E><EFBFBD>8<EFBFBD>8<18><>T<EFBFBD><06><>d<17>F
<EFBFBD><06><><17> <09><>ΐ<EFBFBD><CE90><EFBFBD>Y<EFBFBD>ަ<EFBFBD><DEA6><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>Ѥ‡G<EFBFBD>ޝ<EFBFBD>a<EFBFBD><EFBFBD>g_<EFBFBD>&u<><75>Z<EFBFBD>~{v<><76>M{<7B>x]><3E><04><>ye<79>];<3B>ա<EFBFBD><D5A1>W<EFBFBD><1F>j<EFBFBD><6A><EFBFBD>\<5C>*<2A>ح<EFBFBD>&<26><><EFBFBD><EFBFBD>(<28>D<EFBFBD>?<3F>^[

View File

@@ -0,0 +1,2 @@
x=<3D>M<0E> <14>]s
<EFBFBD>F<EFBFBD><EFBFBD>Gc<>G<EFBFBD>@_k<5F>-

View File

@@ -0,0 +1,2 @@
x=<3D>A<0E> D]s
<EFBFBD>F<EFBFBD>A<EFBFBD><EFBFBD>c<<3C>7(Hk<48>-

View File

@@ -0,0 +1,2 @@
x=<3D>M
<EFBFBD>0<14>]<5D>ً<>%͏<11><08> i<1F><>6%}-<2D><>Fᛡ<EE868F>s<EFBFBD><73>!<21>[<5B>1<EFBFBD><31><EFBFBD><0E>vTp<54>;<3B>`<60>(<28>Φ<EFBFBD>24F<34>sdT<16>m<EFBFBD><6D><EFBFBD>U<><02><><EFBFBD><EFBFBD>c<EFBFBD><63>f~o<><6F>b<EFBFBD>VFsec<65><63>۶b^Ŝ2.<2E>"<22><><EFBFBD>[Uw<55>g<EFBFBD>qR9 <0B><1A><><EFBFBD>𽶇4<F0BDB687>W><3E>6<>

View File

@@ -0,0 +1 @@
x<01><>QN<51> <10>q<EFBFBD><1B>a<EFBFBD>c<>G<EFBFBD>0<1D>5[<5B>Pj<50><6A><EFBFBD><EFBFBD> ~<7E><><EFBFBD>><3E>۶v<DBB6>)<<3C>&<02><><EFBFBD><EFBFBD><05><><EFBFBD><EFBFBD>c<EFBFBD><1A>e<EFBFBD><05> 1Y<31><59>1<EFBFBD>[lR:<3A><><18><>&<26>$S<><53><EFBFBD><EFBFBD>a"<1A>#<23><01>]<5D>Fţ/<2F><><EFBFBD>=<16><>?]<1A>:<3A><><EFBFBD>s;<3B>+<2B><><EFBFBD><EFBFBD>KۇR<DB87>ܮ<EFBFBD><DCAE><EFBFBD><EFBFBD><EFBFBD>H<03><>

View File

@@ -0,0 +1,3 @@
x<01>TMo<4D>0 ݹ<><DDB9><EFBFBD><EFBFBD><16>n<EFBFBD>G<EFBFBD><1D>"<22>-<10><><EFBFBD><EFBFBD>̹JI <20>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD>K<EFBFBD>8۰]
$<1F><><EFBFBD>X<EFBFBD><58>*f<>߽}<7D>*<2A><><EFBFBD><EFBFBD>P<EFBFBD><15>
<EFBFBD>b<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>|e$<06><>[Vz<1B>@5<>5<EFBFBD>U<EFBFBD>?S<>W<EFBFBD><08>n<07><>c<1D>G<EFBFBD>~<7E>k><3E>o<EFBFBD>oZ,M뻺<4D>z5<7A><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ə<<3C>N<03>

View File

@@ -0,0 +1 @@
018554f12b64fc2fb8a0ea306455c8d0da30b891

View File

@@ -0,0 +1 @@
aef500da0cf73a881df5e7d7ddf0d6533d5f2610

View File

@@ -0,0 +1,12 @@
#!/bin/bash
set -e
set -f
setup_ssh.sh
echo "Synced docs"
echo 'Synced docs' > /tmp/executed_docs
exit_code=$?
exit $exit_code

View File

@@ -0,0 +1,3 @@
#!/bin/bash
echo "Setup ssh"

View File

@@ -0,0 +1,9 @@
#!/bin/bash
# Get the current directory
current_dir=$(pwd)
# Add the current directory to the PATH variable
export PATH=$PATH:$current_dir
action.sh "$@"

View File

@@ -90,6 +90,15 @@ public class Releaser {
return this.projectGitHandler.cloneProjectFromOrg(projectName);
}
public ExecutionResult buildAntoraDocs(File project) {
String currentBranch = projectGitHandler.currentBranch(project);
projectGitHandler.cloneAndCheckoutDocsBuild(project);
this.projectCommandExecutor.runAntora(this.releaserProperties, originalVersion(project),
new ProjectVersion(project), project.getAbsolutePath());
projectGitHandler.checkout(project, currentBranch);
return ExecutionResult.success();
}
public Projects retrieveVersionsFromBom() {
return this.projectPomUpdater.retrieveVersionsFromReleaseTrainBom();
}
@@ -122,6 +131,12 @@ public class Releaser {
return ExecutionResult.success();
}
public ExecutionResult runAntoraBuild(ReleaserProperties properties, ProjectVersion originalVersion,
ProjectVersion versionFromBom) {
this.projectCommandExecutor.runAntora(properties, originalVersion, versionFromBom, properties.getWorkingDir());
return ExecutionResult.success();
}
public ExecutionResult commitAndPushTags(File project, ProjectVersion changedVersion) {
this.projectGitHandler.commitAndTagIfApplicable(project, changedVersion);
log.info("\nCommit was made and tag was pushed successfully");
@@ -135,9 +150,9 @@ public class Releaser {
return ExecutionResult.success();
}
public ExecutionResult publishDocs(ReleaserProperties properties, ProjectVersion originalVersion,
ProjectVersion changedVersion) {
this.projectCommandExecutor.publishDocs(properties, originalVersion, changedVersion);
public ExecutionResult publishDocs(ReleaserProperties properties, File project) {
File springDocsActionsProject = this.projectGitHandler.cloneAndCheckoutSpringDocsActions();
this.projectCommandExecutor.publishAntoraDocs(springDocsActionsProject, project, properties);
log.info("\nThe docs were published successfully");
return ExecutionResult.success();
}

View File

@@ -78,6 +78,8 @@ public class ReleaserProperties implements Serializable {
private Versions versions = new Versions();
private Antora antora = new Antora();
private boolean commercial = false;
/**
@@ -208,12 +210,21 @@ public class ReleaserProperties implements Serializable {
this.commercial = commercial;
}
public Antora getAntora() {
return antora;
}
public void setAntora(Antora antora) {
this.antora = antora;
}
@Override
public String toString() {
return "ReleaserProperties{" + "workingDir='" + this.workingDir + '\'' + ", git=" + this.git + ", pom="
+ this.pom + ", maven=" + this.maven + ", gradle=" + this.gradle + ", sagan=" + this.sagan
+ ", fixedVersions=" + this.fixedVersions + ", metaRelease=" + this.metaRelease + ", template="
+ this.template + ", versions=" + this.versions + ", commercial=" + this.commercial + '}';
+ this.template + ", versions=" + this.versions + ", commercial=" + this.commercial + ", antora="
+ this.antora + '}';
}
public ReleaserProperties copy() {
@@ -436,6 +447,87 @@ public class ReleaserProperties implements Serializable {
}
public static class Antora implements Serializable {
/**
* URL to Spring Docs Actions repo.
*/
private String springDocsActionsUrl;
/**
* Command to sync Antora docs.
*/
private String syncAntoraDocsCommand;
/**
* Tag for Spring Docs Actions repo.
*/
private String springDocsActionsTag;
private String springDocsSshUsername;
private String springDocsSshKeyPath;
private String springDocsSshHostKey;
public String getSpringDocsActionsUrl() {
return springDocsActionsUrl;
}
public void setSpringDocsActionsUrl(String springDocsActionsUrl) {
this.springDocsActionsUrl = springDocsActionsUrl;
}
public String getSpringDocsActionsTag() {
return springDocsActionsTag;
}
public void setSpringDocsActionsTag(String springDocsActionsTag) {
this.springDocsActionsTag = springDocsActionsTag;
}
public String getSyncAntoraDocsCommand() {
return syncAntoraDocsCommand;
}
public void setSyncAntoraDocsCommand(String syncAntoraDocsCommand) {
this.syncAntoraDocsCommand = syncAntoraDocsCommand;
}
public String getSpringDocsSshUsername() {
return springDocsSshUsername;
}
public void setSpringDocsSshUsername(String springDocsSshUsername) {
this.springDocsSshUsername = springDocsSshUsername;
}
public String getSpringDocsSshKeyPath() {
return springDocsSshKeyPath;
}
public void setSpringDocsSshKeyPath(String springDocsSshKeyPath) {
this.springDocsSshKeyPath = springDocsSshKeyPath;
}
public String getSpringDocsSshHostKey() {
return springDocsSshHostKey;
}
public void setSpringDocsSshHostKey(String springDocsSshHostKey) {
this.springDocsSshHostKey = springDocsSshHostKey;
}
@Override
public String toString() {
return "Antora{" + "springDocsActionsUrl='" + springDocsActionsUrl + '\'' + ", syncAntoraDocsCommand='"
+ syncAntoraDocsCommand + '\'' + ", springDocsActionsTag='" + springDocsActionsTag + '\''
+ ", springDocsSshUsername='" + springDocsSshUsername + '\'' + ", springDocsSshKey='"
+ springDocsSshKeyPath + '\'' + ", springDocsSshHostKey='" + springDocsSshHostKey + '\'' + '}';
}
}
public static class Git implements Serializable {
/**
@@ -1021,6 +1113,11 @@ 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}}";
/**
* Additional system properties that should be passed to the build / deploy
* commands. If present in other commands "{{systemProps}}" will be substituted
@@ -1101,12 +1198,20 @@ public class ReleaserProperties implements Serializable {
this.systemProperties = systemProperties;
}
public String getRunAntoraCommand() {
return runAntoraCommand;
}
public void setRunAntoraCommand(String runAntoraCommand) {
this.runAntoraCommand = runAntoraCommand;
}
@Override
public String toString() {
return "Maven{" + "buildCommand='" + this.buildCommand + '\'' + ", deployCommand='" + this.deployCommand
+ '\'' + ", publishDocsCommand=" + this.publishDocsCommand + "generateReleaseTrainDocsCommand='"
+ this.generateReleaseTrainDocsCommand + '\'' + ", waitTimeInMinutes=" + this.waitTimeInMinutes
+ '}';
+ this.generateReleaseTrainDocsCommand + '\'' + ", runAntoraCommand= " + runAntoraCommand
+ ", waitTimeInMinutes=" + this.waitTimeInMinutes + '}';
}
}
@@ -1316,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;
@@ -1400,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() + "[", "]")
@@ -1409,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();
}

View File

@@ -184,6 +184,21 @@ class GitRepo {
}
}
void checkoutTag(String tagName) {
try (Git git = this.gitFactory.open(file(this.basedir))) {
Optional<ObjectId> tagId = findTagIdByName(tagName, false);
if (tagId.isPresent()) {
git.checkout().setName(tagId.get().getName()).call();
}
else {
throw new IllegalStateException("Tag with name [" + tagName + "] not found");
}
}
catch (Exception e) {
throw new IllegalStateException(e);
}
}
/**
* Attempt to retrieve a tag id from a name, prepending the name with /refs/tags/.
*/

View File

@@ -130,6 +130,16 @@ public class ProjectGitHandler implements Closeable {
this.properties.getGit().getSpringProjectBranch());
}
public void cloneAndCheckoutDocsBuild(File project) {
checkout(project, "docs-build");
}
public File cloneAndCheckoutSpringDocsActions() {
File project = cloneProject(this.properties.getAntora().getSpringDocsActionsUrl());
checkoutTag(project, this.properties.getAntora().getSpringDocsActionsTag());
return project;
}
private File cloneAndCheckOut(String springProjectUrl, String springProjectUrlBranch) {
File clonedProject = cloneProject(springProjectUrl);
checkout(clonedProject, springProjectUrlBranch);
@@ -146,12 +156,7 @@ public class ProjectGitHandler implements Closeable {
* @return location of the cloned project
*/
public File cloneProjectFromOrg(String projectName) {
String orgUrl = this.properties.getMetaRelease().getGitOrgUrl();
String fullUrl = orgUrl.endsWith("/") ? (orgUrl + projectName)
: (orgUrl + "/" + addCommercialSuffix(projectName) + suffixNonHttpRepo(orgUrl));
if (log.isDebugEnabled()) {
log.debug("Full url of the project is [{}]", fullUrl);
}
String fullUrl = createRepoUrlFromProject(projectName);
File clonedProject = cloneProject(fullUrl);
if (log.isDebugEnabled()) {
log.debug("Successfully cloned the project to [{}]", clonedProject);
@@ -192,6 +197,16 @@ public class ProjectGitHandler implements Closeable {
return findAndCheckOutBranchForVersion(clonedProject, versions);
}
private String createRepoUrlFromProject(String projectName) {
String orgUrl = this.properties.getMetaRelease().getGitOrgUrl();
String fullUrl = orgUrl.endsWith("/") ? (orgUrl + projectName)
: (orgUrl + "/" + addCommercialSuffix(projectName) + suffixNonHttpRepo(orgUrl));
if (log.isDebugEnabled()) {
log.debug("Full url of the project is [{}]", fullUrl);
}
return fullUrl;
}
private File findAndCheckOutBranchForVersion(File clonedProject, String[] versions) {
if (log.isDebugEnabled()) {
log.debug("Checking versions {} for project [{}]", versions, clonedProject);
@@ -271,6 +286,11 @@ public class ProjectGitHandler implements Closeable {
return new File(destinationFolder, projectUrl.getHumanishName());
}
public void checkoutTag(File project, String tag) {
log.info("checkout tag: " + tag);
gitRepo(project).checkoutTag(tag);
}
public void checkout(File project, String branch) {
log.info("checkout project: " + project + " with branch: " + branch);
gitRepo(project).checkout(branch);

View File

@@ -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());
@@ -96,6 +104,19 @@ public class ProjectCommandExecutor {
}
}
public void runAntora(ReleaserProperties properties, ProjectVersion originalVersion,
ProjectVersion versionFromReleaseTrain, String projectRoot) {
try {
String command = new CommandPicker(properties, projectRoot).runAntoraCommand(versionFromReleaseTrain);
String[] commands = replaceAllPlaceHolders(originalVersion, versionFromReleaseTrain, command).split(" ");
runCommand(properties, projectRoot, commands);
}
catch (Exception e) {
String message = properties + "\n" + originalVersion + "\n" + versionFromReleaseTrain + "\n" + projectRoot;
throw new IllegalStateException(message, e);
}
}
public void generateReleaseTrainDocs(ReleaserProperties properties, String version, String projectRoot) {
try {
String updatedCommand = new CommandPicker(properties, projectRoot)
@@ -166,6 +187,35 @@ public class ProjectCommandExecutor {
return new ReleaserProcessExecutor(workDir);
}
public void publishAntoraDocs(File antoraDocsProject, File project, ReleaserProperties properties) {
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);
}
}
public void publishDocs(ReleaserProperties properties, ProjectVersion originalVersion,
ProjectVersion changedVersion) {
try {
@@ -307,6 +357,27 @@ class CommandPicker {
return bashCommandWithSystemProps(releaserProperties.getBash().getBuildCommand());
}
String runAntoraCommand(ProjectVersion version) {
if (projectType == ProjectType.GRADLE) {
return gradleCommandWithSystemProps(releaserProperties.getGradle().getRunAntoraCommand());
}
return mavenCommandWithSystemProps(releaserProperties.getMaven().getRunAntoraCommand(), version);
}
String publishAntoraDocsCommand(File project, ReleaserProperties properties) {
ProjectVersion version = new ProjectVersion(project);
String repo = properties.getGit().getOrgName() + "/" + version.projectName;
String command = properties.getAntora().getSyncAntoraDocsCommand().replace("{{github-repo}}", repo)
.replace("{{site-path}}", project.getAbsolutePath() + "/target/antora/site");
if (StringUtils.hasText(properties.getAntora().getSpringDocsSshUsername())) {
command = command.replace("{{ssh-username}}", properties.getAntora().getSpringDocsSshUsername());
}
if (StringUtils.hasText(properties.getAntora().getSpringDocsSshKeyPath())) {
command = command.replace("{{ssh-key-path}}", properties.getAntora().getSpringDocsSshKeyPath());
}
return command;
}
String version() {
// makes more sense to use PomReader
if (projectType == ProjectType.GRADLE) {

View File

@@ -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
<OWNER>/<REPOSITORY_NAME> 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 "$@"

View File

@@ -56,7 +56,10 @@ public class PublishDocsReleaseTask implements ReleaseReleaserTask {
@Override
public ExecutionResult runTask(Arguments args) {
return this.releaser.publishDocs(args.properties, args.originalVersion, args.versionFromBom);
if (this.releaser.buildAntoraDocs(args.project).isSuccess()) {
return this.releaser.publishDocs(args.properties, args.project);
}
return ExecutionResult.failure(new RuntimeException("Failed to build Antora docs"));
}
@Override

View File

@@ -35,6 +35,7 @@ public final class TestUtils {
prepareLocalRepo("target/test-classes/projects/", "spring-cloud-consul");
prepareLocalRepo("target/test-classes/projects/", "spring-cloud-build");
prepareLocalRepo("target/test-classes/projects/", "spring-cloud-static-angel");
prepareLocalRepo("target/test-classes/projects/", "spring-docs-actions");
}
private static void prepareLocalRepo(String buildDir, String repoPath) throws IOException {

View File

@@ -39,6 +39,8 @@ public class ArgsBuilder {
private final File tempDirAllTestSample;
private File tempDirSpringDocsActions;
List<String> args = new LinkedList<>();
public ArgsBuilder(File project, File tempDirTestSamplesProject, File tempDirReleaseTrainDocs,
@@ -58,11 +60,13 @@ public class ArgsBuilder {
"releaser.git.documentation-url=" + file("/projects/spring-cloud-static-angel/").toURI(),
"releaser.git.test-samples-project-url=" + tempDirTestSamplesProject.getAbsolutePath(),
"releaser.git.release-train-docs-url=" + tempDirReleaseTrainDocs.getAbsolutePath(),
"releaser.antora.spring-docs-actions-url=" + file("/projects/spring-docs-actions").toURI(),
"releaser.maven.build-command=echo build",
"releaser.maven.deploy-command=echo deploy",
"releaser.maven.deploy-guides-command=echo guides",
"releaser.maven.publish-docs-command=echo docs",
"releaser.maven.generate-release-train-docs-command=echo releaseTrainDocs",
"releaser.maven.run-antora-command=echo antora",
"releaser.working-dir=" + project.getPath(),
"releaser.git.spring-project-url=" + tempDirSpringCloud.getAbsolutePath(),
"releaser.git.release-train-wiki-url=" + tmpGitRepo(tempDirReleaseTrainWiki).getAbsolutePath() + "/",