public void RunFor(string description, Func <Func <ProjectInfo, string, bool> > filterFactory, TimeSpan delayBetween = default(TimeSpan), int maxNumberOfDeployments = int.MaxValue) { var projectInfos = GetProjectInfos(); var projectEnvsQ = from p in projectInfos from e in p.EnvironmentIds select new { ProjectInfo = p, EnvironmentId = e, }; var projectEnvs = projectEnvsQ.ToArray(); for (var cnt = 1; cnt <= maxNumberOfDeployments; cnt++) { var filter = filterFactory(); var filteredItems = projectEnvs.Where(e => filter(e.ProjectInfo, e.EnvironmentId)).ToArray(); var item = filteredItems[_rnd.Next(0, filteredItems.Length)]; if (item.ProjectInfo.LatestRelease == null || ChanceOfANewRelease.Get()) { CreateRelease(item.ProjectInfo); } CreateDeployment(item.ProjectInfo, item.EnvironmentId); Log.Write(cnt % 10 == 0 ? LogEventLevel.Information : LogEventLevel.Verbose, "{description}: {n} deployments", description, cnt); Thread.Sleep(delayBetween); } }
public void RunOncePerProjectFor(string description, Func <Func <ProjectInfo, string, bool> > filterFactory, TimeSpan delayBetween = default(TimeSpan)) { var projectInfos = GetProjectInfos(); var projectEnvsQ = from p in projectInfos from e in p.EnvironmentIds select new { ProjectInfo = p, EnvironmentId = e, }; var projectEnvs = projectEnvsQ.ToArray(); var filter = filterFactory(); var filteredItems = projectEnvs.Where(e => filter(e.ProjectInfo, e.EnvironmentId)).ToArray(); var cnt = 0; filteredItems.AsParallel() .WithDegreeOfParallelism(10) .ForAll(item => { if (item.ProjectInfo.LatestRelease == null || ChanceOfANewRelease.Get()) { CreateRelease(item.ProjectInfo); } CreateDeployment(item.ProjectInfo, item.EnvironmentId); Interlocked.Increment(ref cnt); Log.Write(cnt % 10 == 0 ? LogEventLevel.Information : LogEventLevel.Verbose, "{description}: {n} deployments", description, cnt); Thread.Sleep(delayBetween); }); }