Leader election (PowerShell) 
This is a small script useful when multiple Jenkins parallel jobs try to acess the same shared resources, in order to decide for a leader. It is the simplest leader election possible, and it works as long as the sleep wait time is long enough for all the parallel jobs to converge to the same point.
The most important part is that the parallel workers do not need to establish quorum and communicate with each other.
The function is the most naive implementation of the consensus in a proof of work blockchain.
#ps1
function Is-Leader {
param( $identifier )
$guid = (New-Guid).Guid
Write-Host "Guid for this worker is $guid"
$basePath = "C:\\Windows\Temp\$windowsVersion"
if (Test-Path $basePath) {
# this means the leader has been previously elected
return $false
}
New-Item -Type Directory -Force $basePath | Out-Null
New-Item -Type File -Force "${basePath}\${guid}" | Out-Null
# the timeout needs to be long enough for all workers to be have started and got to the
# above line
Start-Sleep 10
$bestGuid = (Get-ChildItem -Path $basePath | Sort-Object | Select-Object -First 1).Name
Write-Host "BestGuid is: $bestGuid. Guid for this worker is: ${guid}"
return $bestGuid -eq $guid
}
Is-Leader "unique-resource-name"
That's all, folks!
Tweet