Exemplo n.º 1
0
        public void Start(int projectVersionId, Action <int> projectBuildStarted, Action <int, bool> projectBuildComplete)
        {
            AspNetDeployEntities entities = new AspNetDeployEntities();

            ProjectVersion projectVersion = entities.ProjectVersion
                                            .Include("Properties")
                                            .First(pv => pv.Id == projectVersionId);


            SourceControlVersion sourceControlVersion = entities.SourceControlVersion
                                                        .Include("Properties")
                                                        .First(scv => scv.Id == projectVersion.SourceControlVersionId);

            IDictionary <int, DateTime> buildTiming = new Dictionary <int, DateTime>();

            BuildManager buildManager = Factory.GetInstance <BuildManager>();

            buildManager.Build(
                sourceControlVersion.Id,
                projectVersionId,
                projectVersionBuildId =>
            {
                projectBuildStarted(projectVersionBuildId);

                if (buildTiming.ContainsKey(projectVersionBuildId))
                {
                    buildTiming.Remove(projectVersionBuildId);
                }

                ProjectVersion projectVersionBuild = entities.ProjectVersion
                                                     .Include("Properties")
                                                     .First(pv => pv.Id == projectVersionBuildId);

                projectVersionBuild.SetStringProperty("LastBuildStartDate", DateTime.UtcNow.ToString(CultureInfo.InvariantCulture));
                entities.SaveChanges();

                buildTiming[projectVersionBuildId] = DateTime.UtcNow;
            },
                (projectVersionBuildId, isSuccess) =>
            {
                projectBuildComplete(projectVersionBuildId, isSuccess);

                ProjectVersion projectVersionBuild = entities.ProjectVersion
                                                     .Include("Properties")
                                                     .First(pv => pv.Id == projectVersionBuildId);

                projectVersionBuild.SetStringProperty("LastBuildRevision", sourceControlVersion.GetStringProperty("Revision"));
                projectVersionBuild.SetStringProperty("LastBuildDate", DateTime.UtcNow.ToString(CultureInfo.InvariantCulture));
                projectVersionBuild.SetStringProperty("LastBuildResult", isSuccess ? "Done" : "Error");
                projectVersionBuild.SetStringProperty("LastBuildDuration", (DateTime.UtcNow - buildTiming[projectVersionBuildId]).TotalSeconds.ToString(CultureInfo.InvariantCulture));

                entities.SaveChanges();
            });



            entities.SaveChanges();
        }
Exemplo n.º 2
0
        private IDictionary <Machine, MachinePublication> CreateMachinePublications(IList <Machine> affectedMachines, Publication publication, AspNetDeployEntities entities)
        {
            IDictionary <Machine, MachinePublication> machinePublications = new Dictionary <Machine, MachinePublication>();

            foreach (Machine machine in affectedMachines)
            {
                MachinePublication machinePublication = entities.MachinePublication.FirstOrDefault(mp => mp.MachineId == machine.Id && mp.PublicationId == publication.Id);

                if (machinePublication == null)
                {
                    machinePublication = new MachinePublication
                    {
                        Publication = publication,
                        Machine     = machine,
                        CreatedDate = DateTime.UtcNow
                    };

                    entities.MachinePublication.Add(machinePublication);
                    entities.SaveChanges();
                }

                machinePublications.Add(machine, machinePublication);
            }

            return(machinePublications);
        }
Exemplo n.º 3
0
        private void RecordException(AspNetDeployEntities entities, ExceptionEntry parentException, Exception exception)
        {
            ExceptionEntry exceptionEntry = new ExceptionEntry();

            exceptionEntry.Message    = exception.Message;
            exceptionEntry.Source     = exception.Source;
            exceptionEntry.StackTrace = exception.StackTrace;
            exceptionEntry.TypeName   = exception.GetType().FullName;
            entities.ExceptionEntry.Add(exceptionEntry);

            if (parentException != null)
            {
                parentException.InnerExceptionEntry = exceptionEntry;
            }
            else
            {
                AspNetDeployExceptionEntry aspNetDeployExceptionEntry = new AspNetDeployExceptionEntry();
                aspNetDeployExceptionEntry.TimeStamp      = DateTime.UtcNow;
                aspNetDeployExceptionEntry.ExceptionEntry = exceptionEntry;
                entities.AspNetDeployExceptionEntry.Add(aspNetDeployExceptionEntry);
            }

            if (exception.InnerException != null)
            {
                this.RecordException(entities, exceptionEntry, exception.InnerException);
            }

            entities.SaveChanges();
        }
Exemplo n.º 4
0
        public void Start(int publicationId, Action <int> machineDeploymentStarted, Action <int, bool> machineDeploymentComplete)
        {
            AspNetDeployEntities entities = new AspNetDeployEntities();

            Publication publication = entities.Publication
                                      .Include("Package.BundleVersion.Properties")
                                      .Include("Environment")
                                      .First(p => p.Id == publicationId);

            DeploymentManager deploymentManager = Factory.GetInstance <DeploymentManager>();

            DateTime deploymentStart = DateTime.UtcNow;

            deploymentManager.Deploy(
                publication.Id,
                machineId =>
            {
                machineDeploymentStarted(machineId);
            },
                (machineId, isSuccess) =>
            {
                machineDeploymentComplete(machineId, isSuccess);
            });

            publication.Package.BundleVersion.SetStringProperty("LastPublicationAttemptPackage", publication.PackageId.ToString());
            publication.Package.BundleVersion.SetStringProperty("LastDeploymentDuration-e" + publication.EnvironmentId, (DateTime.UtcNow - deploymentStart).TotalSeconds.ToString(CultureInfo.InvariantCulture));

            entities.SaveChanges();
        }
Exemplo n.º 5
0
        public void Start(int bundleId)
        {
            AspNetDeployEntities entities = new AspNetDeployEntities();

            BundleVersion bundleVersion = entities.BundleVersion
                                          .Include("ProjectVersions.Properties")
                                          .Include("ProjectVersions.SourceControlVersion.Properties")
                                          .Include("Properties")
                                          .First(bv => bv.Id == bundleId);

            DateTime packageStart = DateTime.UtcNow;

            PackageManager packageManager = Factory.GetInstance <PackageManager>();

            packageManager.PackageBundle(bundleId);

            foreach (ProjectVersion projectVersion in bundleVersion.ProjectVersions)
            {
                projectVersion.SetStringProperty("LastPackageRevision", projectVersion.SourceControlVersion.GetStringProperty("Revision"));
                projectVersion.SetStringProperty("LastPackageDate", DateTime.UtcNow.ToString(CultureInfo.InvariantCulture));
            }

            bundleVersion.SetStringProperty("LastPackageDuration", (DateTime.UtcNow - packageStart).TotalSeconds.ToString(CultureInfo.InvariantCulture));

            entities.SaveChanges();
        }
        public void Log(Exception exception, int?userId)
        {
            AspNetDeployEntities entities = new AspNetDeployEntities();

            AspNetDeployExceptionEntry aspNetDeployExceptionEntry = new AspNetDeployExceptionEntry();

            aspNetDeployExceptionEntry.TimeStamp      = DateTime.UtcNow;
            aspNetDeployExceptionEntry.UserId         = userId;
            aspNetDeployExceptionEntry.ExceptionEntry = this.CreateAndSaveExceptionEntryRecursive(entities, null, exception);
            entities.AspNetDeployExceptionEntry.Add(aspNetDeployExceptionEntry);

            entities.SaveChanges();
        }
        public UpdateAndParseResult UpdateAndParse(int sourceControlVersionId)
        {
            AspNetDeployEntities entities             = new AspNetDeployEntities();
            SourceControlVersion sourceControlVersion = entities.SourceControlVersion
                                                        .Include("Properties")
                                                        .Include("Revisions")
                                                        .Include("SourceControl.Properties")
                                                        .First(svc => svc.Id == sourceControlVersionId);

            SourceControl sourceControl = sourceControlVersion.SourceControl;

            string            sourcesFolder     = this.pathServices.GetSourceControlVersionPath(sourceControl.Id, sourceControlVersion.Id);
            LoadSourcesResult loadSourcesResult = this.LoadSources(sourceControlVersion, sourcesFolder);

            if (loadSourcesResult.RevisionId == sourceControlVersion.GetStringProperty("Revision"))
            {
                return(new UpdateAndParseResult());
            }

            sourceControlVersion.SetStringProperty("Revision", loadSourcesResult.RevisionId);

            Revision previousRevision = sourceControlVersion.Revisions.OrderByDescending(r => r.CreatedDate).FirstOrDefault();

            Revision newRevision = new Revision
            {
                CreatedDate    = DateTime.UtcNow,
                Name           = loadSourcesResult.RevisionId,
                ParentRevision = previousRevision
            };

            sourceControlVersion.Revisions.Add(newRevision);

            LoadSourcesInfoResult loadSourcesInfoResult = this.LoadSourcesInfo(sourceControlVersion, sourcesFolder);

            newRevision.RevisionInfos = loadSourcesInfoResult.SourcesInfos.Select(i => new RevisionInfo
            {
                Author      = i.Author,
                CreatedDate = i.CreatedDate,
                Message     = i.Message
            }).ToList();

            entities.SaveChanges();

            this.projectParsingService.UpdateProjects(sourceControlVersionId);

            return(new UpdateAndParseResult
            {
                HasChanges = true,
                Projects = entities.Project.Where(p => p.SourceControlId == sourceControlVersion.Id).Select(p => p.Id).ToList()
            });
        }
        private static void ScheduleAutoDeployToTest(AspNetDeployEntities entities)
        {
            List <BundleVersion> bundleVersions = entities.BundleVersion
                                                  .Include("Properties")
                                                  .Include("Packages.Publications.Environment")
                                                  .Include("ProjectVersions.SourceControlVersion.Properties")
                                                  .Where(bv => !bv.IsDeleted)
                                                  .ToList();

            List <BundleVersion> bundleVersionsWithAutoDeploy = bundleVersions
                                                                .Where(bv =>
                                                                       bv.GetIntProperty("AutoDeployToEnvironment") > 0 &&
                                                                       bv.Packages.Any() &&
                                                                       bv.ProjectVersions.All(pv => pv.SourceControlVersion.ArchiveState == SourceControlVersionArchiveState.Normal))
                                                                .ToList();

            bundleVersionsWithAutoDeploy.ForEach(bundleVersion =>
            {
                int deployToEnvironmentId = bundleVersion.GetIntProperty("AutoDeployToEnvironment");

                if (bundleVersion.Packages.Any(p => p.Publications.Any(pub => pub.EnvironmentId == deployToEnvironmentId && pub.State == PublicationState.Queued)))
                {
                    return;
                }

                if (TaskRunnerContext.GetBundleVersionState(bundleVersion.Id) != BundleState.Idle)
                {
                    return;
                }

                Package latestPackage = bundleVersion.Packages.OrderByDescending(p => p.CreatedDate).First();
                List <Publication> latestPackagePublications = latestPackage.Publications.OrderByDescending(p => p.CreatedDate).ToList();

                if (latestPackagePublications.Count == 0)
                {
                    Publication publication   = new Publication();
                    publication.CreatedDate   = DateTime.UtcNow;
                    publication.EnvironmentId = deployToEnvironmentId;
                    publication.Package       = latestPackage;
                    publication.State         = PublicationState.Queued;

                    entities.Publication.Add(publication);
                }
            });

            entities.SaveChanges();
        }
Exemplo n.º 9
0
        private void LogMachinePublicationStep(MachinePublication machinePublication, DeploymentStep deploymentStep, AspNetDeployEntities entities, MachinePublicationLogEvent @event, IExceptionInfo lastException = null)
        {
            MachinePublicationLog machinePublicationLog = new MachinePublicationLog();

            machinePublicationLog.CreatedDate        = DateTime.UtcNow;
            machinePublicationLog.MachinePublication = machinePublication;
            machinePublicationLog.Event            = @event;
            machinePublicationLog.DeploymentStepId = deploymentStep.Id;
            entities.MachinePublicationLog.Add(machinePublicationLog);

            if (lastException != null)
            {
                this.RecordException(entities, null, lastException, machinePublicationLog);
            }

            entities.SaveChanges();
        }
        public ArhiveResult Archive(int sourceControlVersionId)
        {
            AspNetDeployEntities entities = new AspNetDeployEntities();

            SourceControlVersion sourceControlVersion = entities.SourceControlVersion
                                                        .Include("Properties")
                                                        .First(sc => sc.Id == sourceControlVersionId);

            ISourceControlRepository repository = this.sourceControlRepositoryFactory.Create(sourceControlVersion.SourceControl.Type);
            string sourcesFolder = this.pathServices.GetSourceControlVersionPath(sourceControlVersion.SourceControlId, sourceControlVersion.Id);

            repository.Archive(sourceControlVersion, sourcesFolder);

            sourceControlVersion.ArchiveState = SourceControlVersionArchiveState.Archived;
            entities.SaveChanges();

            return(new ArhiveResult()
            {
                IsSuccess = true
            });
        }
Exemplo n.º 11
0
        public void Build(List <ProjectVersion> projectVersions)
        {
            ProjectVersion activeProjectVersion = null;

            try
            {
                foreach (ProjectVersion projectVersion in projectVersions.Distinct())
                {
                    activeProjectVersion = projectVersion;

                    projectVersion.SetStringProperty("LastBuildResult", "Not started");
                    entities.SaveChanges();

                    BuildJob job = new BuildJob();
                    job.Start(
                        projectVersion.Id,
                        projectId => TaskRunnerContext.SetProjectVersionState(projectId, ProjectState.Building),
                        (projectId, isSuccess) =>
                    {
                        TaskRunnerContext.SetProjectVersionState(projectId, isSuccess ? ProjectState.Idle : ProjectState.Error);
                    });
                }
            }
            catch (Exception e)
            {
                AspNetDeployException aspNetDeployException = new AspNetDeployException("Build project failed", e);
                aspNetDeployException.Data.Add("SourceControl version Id", activeProjectVersion.SourceControlVersion.Id);
                aspNetDeployException.Data.Add("Solution file", activeProjectVersion.SolutionFile);

                Factory.GetInstance <ILoggingService>().Log(aspNetDeployException, null);

                if (e.IsCritical())
                {
                    throw;
                }
            }
        }
Exemplo n.º 12
0
        public void PackageBundle(int bundleVersionId)
        {
            AspNetDeployEntities entities = new AspNetDeployEntities();

            BundleVersion bundleVersion = entities.BundleVersion
                                          .Include("Bundle")
                                          .Include("Packages")
                                          .Include("ProjectVersions.Project")
                                          .Include("ProjectVersions.SourceControlVersion.SourceControl")
                                          .First(bv => bv.Id == bundleVersionId);

            Package package = new Package
            {
                BundleVersion = bundleVersion,
                CreatedDate   = DateTime.UtcNow
            };

            entities.Package.Add(package);

            using (ZipFile zipFile = new ZipFile(Encoding.UTF8))
            {
                zipFile.AlternateEncoding      = Encoding.UTF8;
                zipFile.AlternateEncodingUsage = ZipOption.Always;

                foreach (ProjectVersion projectVersion in bundleVersion.ProjectVersions)
                {
                    string sourcesFolder      = this.pathServices.GetSourceControlVersionPath(projectVersion.SourceControlVersion.SourceControl.Id, projectVersion.SourceControlVersion.Id);
                    string projectPackagePath = this.pathServices.GetProjectPackagePath(projectVersion.Id, projectVersion.SourceControlVersion.GetStringProperty("Revision"));
                    string projectPath        = Path.Combine(sourcesFolder, projectVersion.ProjectFile);

                    IProjectPackager projectPackager = projectPackagerFactory.Create(projectVersion.ProjectType);

                    if (projectPackager == null) // no need to package
                    {
                        projectVersion.SetStringProperty("LastPackageDuration", "0");
                        entities.SaveChanges();
                        continue;
                    }

                    if (!File.Exists(projectPackagePath))
                    {
                        DateTime packageStartDate = DateTime.UtcNow;
                        projectPackager.Package(projectPath, projectPackagePath);
                        projectVersion.SetStringProperty("LastPackageDuration", (DateTime.UtcNow - packageStartDate).TotalSeconds.ToString(CultureInfo.InvariantCulture));
                        entities.SaveChanges();
                    }

                    zipFile.AddFile(projectPackagePath, "/");

                    PackageEntry packageEntry = new PackageEntry
                    {
                        Package        = package,
                        ProjectVersion = projectVersion,
                        Revision       = projectVersion.SourceControlVersion.GetStringProperty("Revision")
                    };

                    entities.PackageEntry.Add(packageEntry);
                }

                zipFile.Save(this.pathServices.GetBundlePackagePath(bundleVersionId, package.Id));
            }

            package.PackageDate = DateTime.UtcNow;
            entities.SaveChanges();

            foreach (ProjectVersion projectVersion in bundleVersion.ProjectVersions)
            {
                string projectPackagePath = this.pathServices.GetProjectPackagePath(projectVersion.Id, projectVersion.SourceControlVersion.GetStringProperty("Revision"));
                File.Delete(projectPackagePath);
            }
        }
Exemplo n.º 13
0
 private void ChangeMachinePublication(MachinePublication machinePublication, MachinePublicationState result, AspNetDeployEntities entities)
 {
     machinePublication.State = result;
     entities.SaveChanges();
 }
Exemplo n.º 14
0
 private void ChangePublicationResult(Publication publication, PublicationState result, AspNetDeployEntities entities)
 {
     publication.State = result;
     entities.SaveChanges();
 }
Exemplo n.º 15
0
        private static void BuildProjects(AspNetDeployEntities entities)
        {
            List <BundleVersion> bundleVersions = entities.BundleVersion
                                                  .Include("Properties")
                                                  .Include("ProjectVersions.SourceControlVersion.Properties")
                                                  .ToList();

            foreach (BundleVersion bundleVersion in bundleVersions)
            {
                List <ProjectVersion> projectVersions = bundleVersion.ProjectVersions.Where(pv =>
                                                                                            (
                                                                                                pv.ProjectType.HasFlag(ProjectType.Database) ||
                                                                                                pv.ProjectType.HasFlag(ProjectType.WindowsApplication) ||
                                                                                                pv.ProjectType.HasFlag(ProjectType.Service) ||
                                                                                                pv.ProjectType.HasFlag(ProjectType.Console) ||
                                                                                                pv.ProjectType.HasFlag(ProjectType.Web) ||
                                                                                                pv.ProjectType.HasFlag(ProjectType.GulpFile) ||
                                                                                                pv.ProjectType.HasFlag(ProjectType.Test)
                                                                                            ))
                                                        .ToList();

                IList <ProjectVersion> errorProjects = projectVersions.Where(pv => pv.GetStringProperty("LastBuildResult") == "Error").ToList();

                foreach (ProjectVersion projectVersion in errorProjects)
                {
                    TaskRunnerContext.SetProjectVersionState(projectVersion.Id, ProjectState.Error);
                }

                List <ProjectVersion> projectVersionsToRebuild = projectVersions.Where(pv => pv.SourceControlVersion.GetStringProperty("Revision") != pv.GetStringProperty("LastBuildRevision")).ToList();

                if (projectVersionsToRebuild.Count == 0)
                {
                    if (errorProjects.Count > 0)
                    {
                        TaskRunnerContext.SetBundleVersionState(bundleVersion.Id, BundleState.Error);
                    }

                    continue;
                }

                List <BundleVersion> affectedBundleVersions = projectVersionsToRebuild
                                                              .SelectMany(pv => pv.BundleVersions)
                                                              .Where(bv => !bv.IsDeleted)
                                                              .ToList();

                DateTime buildStartDate = DateTime.UtcNow;

                foreach (BundleVersion affectedBundleVersion in affectedBundleVersions)
                {
                    TaskRunnerContext.SetBundleVersionState(affectedBundleVersion.Id, BundleState.Building);
                }

                bundleVersion.SetStringProperty("LastBuildStartDate", DateTime.UtcNow.ToString(CultureInfo.InvariantCulture));
                entities.SaveChanges();

                ProjectsBuildStrategy buildStrategy = new ProjectsBuildStrategy(entities);
                buildStrategy.Build(projectVersionsToRebuild);

                bool buildFailed = projectVersionsToRebuild.Any(pv => pv.GetStringProperty("LastBuildResult") == "Error");

                foreach (BundleVersion affectedBundleVersion in affectedBundleVersions)
                {
                    if (buildFailed)
                    {
                        TaskRunnerContext.SetBundleVersionState(affectedBundleVersion.Id, BundleState.Error);
                        continue;
                    }

                    TaskRunnerContext.SetBundleVersionState(affectedBundleVersion.Id, BundleState.Idle);
                }

                if (bundleVersion.ProjectVersions.All(pv => TaskRunnerContext.GetProjectVersionState(pv.Id) == ProjectState.Idle))
                {
                    bundleVersion.SetStringProperty("LastBuildDuration", (DateTime.UtcNow - buildStartDate).TotalSeconds.ToString(CultureInfo.InvariantCulture));
                }

                entities.SaveChanges();
            }
        }