From b9f6fae8efef828749775dbe8cf534c2109cc76b Mon Sep 17 00:00:00 2001 From: "Greg L. Turnquist" Date: Mon, 29 Aug 2022 10:49:30 -0500 Subject: [PATCH] Introduce retry option for git push. --- Jenkinsfile | 1 + .../data/release/TimedCommand.java | 31 +++++++++++++++++++ .../release/issues/github/GitHubCommands.java | 9 +++--- 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 6e9457e..25af33a 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -40,6 +40,7 @@ pipeline { PASSPHRASE = credentials('spring-gpg-passphrase') KEYRING = credentials('spring-signing-secring.gpg') SONATYPE = credentials('oss-login') + GPG_KEYNAME = credentials('spring-data-release-gpg-keyname') } steps { diff --git a/src/main/java/org/springframework/data/release/TimedCommand.java b/src/main/java/org/springframework/data/release/TimedCommand.java index 0dfd75d..f9bbb6f 100644 --- a/src/main/java/org/springframework/data/release/TimedCommand.java +++ b/src/main/java/org/springframework/data/release/TimedCommand.java @@ -65,4 +65,35 @@ public abstract class TimedCommand implements ExecutionProcessor, CommandMarker watch.stop(); System.out.println(String.format("Took: %.2f sec.", watch.getTotalTimeSeconds())); } + + /** + * Means to retry commands more than once to ensure they are completed. If any exception is thrown at any time, it + * will fall out and try again. + * + * @param action command(s) that need to be run + * @param maxTimes number of times to attempt + */ + protected void retry(Runnable action, int maxTimes) { + + int maxAttempts = maxTimes; + + Exception lastException = null; + + while (maxAttempts > 0) { + try { + action.run(); + return; + } catch (Exception e) { + lastException = e; + maxAttempts--; + } + } + + if (lastException != null) { + throw new RuntimeException(lastException); + } else { + throw new RuntimeException("Unable to complete the action within " + maxTimes + " attempts!"); + } + } + } diff --git a/src/main/java/org/springframework/data/release/issues/github/GitHubCommands.java b/src/main/java/org/springframework/data/release/issues/github/GitHubCommands.java index 41367e9..2761388 100644 --- a/src/main/java/org/springframework/data/release/issues/github/GitHubCommands.java +++ b/src/main/java/org/springframework/data/release/issues/github/GitHubCommands.java @@ -61,10 +61,11 @@ public class GitHubCommands extends TimedCommand { @CliCommand(value = "github push") public void push(@CliOption(key = "", mandatory = true) TrainIteration iteration) { - git.push(iteration); - git.pushTags(iteration.getTrain()); - - createOrUpdateRelease(iteration); + retry(() -> { + git.push(iteration); + git.pushTags(iteration.getTrain()); + createOrUpdateRelease(iteration); + }, 2); } @CliCommand(value = "github create release")