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
-				"""
 		}
 	}