From 2b58ae24a4ccca1642a1c4a8881348dca21d4792 Mon Sep 17 00:00:00 2001 From: Markus Winter Date: Sat, 4 Mar 2023 03:36:18 +0100 Subject: [PATCH] [JENKINS-69573] retrieve sources in tmpdir and rename In case the retrieve of the library sources from the scm fails, we end up with a corrupted cache directory that is only cleaned when the cache expires. To avoid this fetch the sources into a tmp directory and rename to the actual cache dir once completed. --- .../plugins/workflow/libs/LibraryAdder.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/workflow/libs/LibraryAdder.java b/src/main/java/org/jenkinsci/plugins/workflow/libs/LibraryAdder.java index 9ff64777..227cb8b0 100644 --- a/src/main/java/org/jenkinsci/plugins/workflow/libs/LibraryAdder.java +++ b/src/main/java/org/jenkinsci/plugins/workflow/libs/LibraryAdder.java @@ -239,8 +239,19 @@ static List retrieve(@NonNull LibraryRecord record, @NonNull LibraryRetriev if (retrieve) { listener.getLogger().println("Caching library " + name + "@" + version); - versionCacheDir.mkdirs(); - retriever.retrieve(name, version, changelog, versionCacheDir, run, listener); + FilePath tmpVersionCacheDir = new FilePath(LibraryCachingConfiguration.getGlobalLibrariesCacheDir(), record.getDirectoryName() + "@tmp"); + try { + if (tmpVersionCacheDir.exists()) { + tmpVersionCacheDir.deleteRecursive(); + } + tmpVersionCacheDir.mkdirs(); + retriever.retrieve(name, version, changelog, tmpVersionCacheDir, run, listener); + tmpVersionCacheDir.renameTo(versionCacheDir); + } finally { + if (tmpVersionCacheDir.exists()) { + tmpVersionCacheDir.deleteRecursive(); + } + } } retrieveLock.readLock().lock(); } finally {