Use a Jenkins lock to prevent concurrent publishing
This resource lock needs not be registered globally in Jenkins; if
it doesn't exist, the "Lockable Resources" plug-in will use an
ephemeral lock that exists as long as there are builds referencing
it. [1] The EGit Jenkins does have this plug-in installed.
Still use separate tmp directories per build; the Jenkins lock will
protect only concurrent builds; other things that might concurrently
do things with these directories might still interfere.
[1] https://plugins.jenkins.io/lockable-resources/
Change-Id: I2b6c4e854d57b0cf6aaa301cff1f35acb5ec23cd
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
diff --git a/src/org/eclipse/egit/jenkins/Tools.groovy b/src/org/eclipse/egit/jenkins/Tools.groovy
index dac863e..084b87b 100644
--- a/src/org/eclipse/egit/jenkins/Tools.groovy
+++ b/src/org/eclipse/egit/jenkins/Tools.groovy
@@ -108,26 +108,30 @@
def void publishUpdateSite(String genie, String credentials, String sourceDirectory, String publishDirectory, String extraSource = null) {
def buildNumber = script.currentBuild.number;
script.sshagent ([credentials]) {
- script.sh """
- ssh ${genie}@projects-storage.eclipse.org rm -rf ${publishDirectory}-tmp${buildNumber}
- ssh ${genie}@projects-storage.eclipse.org mkdir -p ${publishDirectory}-tmp${buildNumber}
- scp -r ${sourceDirectory}/* ${genie}@projects-storage.eclipse.org:${publishDirectory}-tmp${buildNumber}
- """
- if (extraSource) {
+ // Serialize concurrently running jobs to not overwrite the publishDirectory concurrently
+ def lockName = "${genie}-projects-storage-eclipse-org-" + publishDirectory.replace('/', '-')
+ script.lock(lockName) {
script.sh """
- scp ${extraSource} ${genie}@projects-storage.eclipse.org:${publishDirectory}-tmp${buildNumber}/
- """
+ ssh ${genie}@projects-storage.eclipse.org rm -rf ${publishDirectory}-tmp${buildNumber}
+ ssh ${genie}@projects-storage.eclipse.org mkdir -p ${publishDirectory}-tmp${buildNumber}
+ scp -r ${sourceDirectory}/* ${genie}@projects-storage.eclipse.org:${publishDirectory}-tmp${buildNumber}
+ """
+ if (extraSource) {
+ script.sh """
+ scp ${extraSource} ${genie}@projects-storage.eclipse.org:${publishDirectory}-tmp${buildNumber}/
+ """
+ }
+ // Remove former -old directory. There shouldn't be one, but let's be sure.
+ // Ensure the publishDirectory exists before moving it to -old.
+ // Then rename -tmp and remove -old.
+ script.sh """
+ ssh ${genie}@projects-storage.eclipse.org rm -rf ${publishDirectory}-old
+ ssh ${genie}@projects-storage.eclipse.org mkdir -p ${publishDirectory}
+ ssh ${genie}@projects-storage.eclipse.org mv ${publishDirectory} ${publishDirectory}-old
+ ssh ${genie}@projects-storage.eclipse.org mv ${publishDirectory}-tmp${buildNumber} ${publishDirectory}
+ ssh ${genie}@projects-storage.eclipse.org rm -rf ${publishDirectory}-old
+ """
}
- // Remove former -old directory. There shouldn't be one, but let's be sure.
- // Ensure the publishDirectory exists before moving it to -old.
- // Then rename -tmp and remove -old.
- script.sh """
- ssh ${genie}@projects-storage.eclipse.org rm -rf ${publishDirectory}-old
- ssh ${genie}@projects-storage.eclipse.org mkdir -p ${publishDirectory}
- ssh ${genie}@projects-storage.eclipse.org mv ${publishDirectory} ${publishDirectory}-old
- ssh ${genie}@projects-storage.eclipse.org mv ${publishDirectory}-tmp${buildNumber} ${publishDirectory}
- ssh ${genie}@projects-storage.eclipse.org rm -rf ${publishDirectory}-old
- """
}
}