From 92dd3c9613e068bd20ee33dd97544783376e3847 Mon Sep 17 00:00:00 2001 From: Hubert Plociniczak Date: Mon, 9 Sep 2024 10:16:54 +0200 Subject: [PATCH] Add retries when fetching tableau artifacts in sbt (#10984) * Add retries when fetching tableau artifacts in sbt Seeing frequent network failures when fetching tableau artifacts e.g., https://github.com/enso-org/enso/actions/runs/10705660288/job/29681570936#step:7:918 Network failures are OK but we shouldn't kill builds immediately because of that. Let's try harder. * update codeowners * use backoff * fighting with sbt --- .github/CODEOWNERS | 2 +- build.sbt | 49 +++++++++++++++++++++++++++++++++++++-------- project/plugins.sbt | 1 + 3 files changed, 43 insertions(+), 9 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 2a5a19f702a..de2e21c8cbc 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -30,7 +30,7 @@ Cargo.toml /build.sbt @4e6 @jaroslavtulach @hubertp @Akirathan /distribution/ @4e6 @jdunkerley @radeusgd @GregoryTravis @AdRiley @marthasharkey /engine/ @4e6 @jaroslavtulach @hubertp @Akirathan -/project/ @4e6 @jaroslavtulach @hubertp +/project/ @4e6 @jaroslavtulach @hubertp @Akirathan /tools/ @4e6 @jaroslavtulach @radeusgd @hubertp # Enso Libraries diff --git a/build.sbt b/build.sbt index 29b84244671..7bc80a41789 100644 --- a/build.sbt +++ b/build.sbt @@ -3583,14 +3583,47 @@ lazy val `std-tableau` = project val unmanagedPath = unmanagedDirectory.toPath IO.withTemporaryDirectory( tmp => { - val files = IO.unzipURL( - unmanagedExternalZip.value, - tmp, - f => - f.endsWith(".jar") && !f.contains("gradle") && !f.contains( - "javadoc" - ) && !f.contains("jna") - ) + import scala.concurrent.ExecutionContext.Implicits.global + implicit val filesNotEmptySuccess: retry.Success[Set[File]] = + retry.Success(!_.isEmpty) + import scala.concurrent.duration._ + val future = retry.Backoff(4, 1.second).apply { () => + scala.concurrent.Future { + try { + IO.unzipURL( + unmanagedExternalZip.value, + tmp, + f => + f.endsWith(".jar") && !f.contains("gradle") && !f + .contains( + "javadoc" + ) && !f.contains("jna") + ) + } catch { + case _: java.net.SocketException | + _: java.net.ConnectException => + Set.empty[File] + } + } + } + future.onComplete { result => + if (result.isFailure || result.get.isEmpty) { + logger.log( + Level.Error, + "Failed to fetch any external artifacts for tableau" + ) + } + } + val files = scala.concurrent.Await.result(future, 60.seconds) + if (files.isEmpty) { + logger.log( + Level.Error, + "Failed to fetch any external artifacts for tableau" + ) + throw new IllegalStateException( + "Failed to fetch any external artifacts" + ) + } files.map { f => IO.move(f, unmanagedPath.resolve(f.getName).toFile) Attributed.blank(unmanagedPath.resolve(f.getName).toFile) diff --git a/project/plugins.sbt b/project/plugins.sbt index bcc4fed8a8e..9e2a74b2060 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -8,5 +8,6 @@ libraryDependencies += "io.circe" %% "circe-yaml" % "0 libraryDependencies += "commons-io" % "commons-io" % "2.12.0" libraryDependencies += "nl.gn0s1s" %% "bump" % "0.1.3" libraryDependencies += "com.google.googlejavaformat" % "google-java-format" % "1.18.1" +libraryDependencies += "com.softwaremill.retry" %% "retry" % "0.3.6" scalacOptions ++= Seq("-deprecation", "-feature")