On my current project, we have recently moved to a CI infrastructure that poll and build from multiple branches — using a wildcard. We noticed with the version of the Git plugin we were using, there was a known bug that would kick off multiple builds when polling from multiple branches. This wouldn’t be a big deal except our resources are very constrained, and it would sometimes kick off 5 builds for the same branch all within a second of each other. In order to correct this issue, I created a simple perl script and a Jenkins job, to call the perl script. The logic of the perl script is simple. It compares hashes and uses the REST API to call a Jenkins job.
#!/usr/bin/perl
`git fetch --all`;
@branches = `git branch -a | grep "remotes/origin/Prefix-*"`;
#open file to read
open (INPUT, '<DIR/hash.txt');
#read file
%currentHashes=();
while (<INPUT>){
my($line) = $_;
chomp($line);
@values = split(',', $line);
$currentHashes{"$values[0]"} = "$values[1]";
}
#open file to write
open (OUTPUT, '>DIR/hash.txt');
foreach $branch (@branches){
chomp($branch);
$commit = `git log -n 1 --pretty=format:'%H' $branch`;
$newHashes{"$branch"} = "$commit";
print OUTPUT "$branch,$commit\n";
}
foreach $key (keys %newHashes){
if($newHashes{$key} eq $currentHashes{$key}){
print "the hashes are the same for branch:$key \n";
}else{
print "the hashes are different for branch:$key \n";
#remove spaces
$key =~ s/^[ ]*//g;
#remove remotes/origin
$key =~ s/remotes\/origin\/*//g;
#call jenkins job through rest api
`curl -X POST \"{JENKINS_IP}/job/{SPECIFIC JOB}/buildWithParameters?&GIT_BRANCH_NAME=$key\"`;
}
}
#close files
close (INPUT);
close (OUTPUT);
The corresponding Jenkins job would then need to be a parameterized build that includes the parameter GIT_BRANCH_NAME, for more information on the corresponding Jenkins job, please see the next blog.