Beispiel #1
0
        protected override (SVersion Version, bool MustBuild) PrepareBuild(
            IActivityMonitor m,
            DependentSolution s,
            ISolutionDriver driver,
            IReadOnlyList <UpdatePackageInfo> upgrades)
        {
            IReleaseSolutionInfo info = _roadmap.ReleaseInfos[s.Index];
            var targetVersion         = info.CurrentReleaseInfo.Version;

            if (upgrades.Count > 0)
            {
                if (!driver.UpdatePackageDependencies(m, upgrades))
                {
                    return(null, false);
                }
                var upText = upgrades.Select(u => u.PackageUpdate.ToString()).Concatenate();
                var msg    = info.CurrentReleaseInfo.Level == ReleaseLevel.None
                            ? $"Not released (keeping version {targetVersion}). Upgrading release dependencies: {upText}."
                            : $"Releasing {targetVersion}. Upgrading release dependencies: {upText}." + Environment.NewLine
                             + Environment.NewLine
                             + info.ReleaseNote;
                if (!driver.GitRepository.Commit(m, msg))
                {
                    return(null, false);
                }
            }
            _commits[s.Index] = driver.GitRepository.Head.CommitSha;
            return(targetVersion, info.CurrentReleaseInfo.Level != ReleaseLevel.None);
        }
Beispiel #2
0
 /// <summary>
 /// Gets the set of upgrades that must be applied to the build projects of a solution.
 /// This is used by Build for Develop and Local builders but ReleaseBuilder upgrades
 /// the build project dependencies from its PrepareBuild.
 /// </summary>
 /// <param name="s">The solution.</param>
 /// <returns>The build project upgrades that must be applied.</returns>
 protected IReadOnlyCollection <UpdatePackageInfo> GetBuildProjectUpgrades(DependentSolution s)
 {
     return(DependentSolutionContext.DependencyContext.BuildProjectsInfo.ZeroBuildProjects
            .Where(z => z.Project.Solution == s)
            .SelectMany(z => z.UpgradePackages
                        .Select(a => new UpdatePackageInfo(
                                    z.Project,
                                    a.Type,
                                    a.Name,
                                    _packagesVersion[a])))
            .ToList());
 }
Beispiel #3
0
 protected override BuildState Build(IActivityMonitor m, DependentSolution s, ISolutionDriver driver, IReadOnlyList <UpdatePackageInfo> upgrades, SVersion sVersion, IReadOnlyCollection <UpdatePackageInfo> buildProjectsUpgrade)
 {
     if (!driver.UpdatePackageDependencies(m, buildProjectsUpgrade))
     {
         return(BuildState.Failed);
     }
     if (!driver.GitRepository.AmendCommit(m, null, date => _commitTimes[s.Index]))
     {
         return(BuildState.Failed);
     }
     return(driver.Build(m, withUnitTest: _withUnitTest, withZeroBuilder: true, withPushToRemote: false)
             ? BuildState.Succeed
             : BuildState.Failed);
 }
Beispiel #4
0
 internal ReleaseSolutionInfo(
     IGitRepository repository,
     DependentSolution solution,
     CommitVersionInfo versionInfo,
     XElement previous = null)
 {
     Debug.Assert(repository != null && solution != null && versionInfo != null);
     Solution           = solution;
     _repository        = repository;
     _commitVersionInfo = versionInfo;
     if (previous != null)
     {
         ReleaseNote = previous.Element("ReleaseNote").Value;
         var releaseInfoXml = previous.Element("ReleaseInfo");
         if (releaseInfoXml != null)
         {
             _releaseInfo = _previouslyResolvedInfo = new ReleaseInfo(releaseInfoXml);
         }
     }
 }
Beispiel #5
0
 protected override BuildState Build(IActivityMonitor m, DependentSolution s, ISolutionDriver driver, IReadOnlyList <UpdatePackageInfo> upgrades, SVersion sVersion, IReadOnlyCollection <UpdatePackageInfo> buildProjectsUpgrade)
 {
     if (_commits[s.Index] != driver.GitRepository.Head.CommitSha)
     {
         m.Error($"Commit changed between PrepareBuild call and this Build. Build canceled.");
         return(BuildState.Failed);
     }
     if (!driver.UpdatePackageDependencies(m, buildProjectsUpgrade))
     {
         return(BuildState.Failed);
     }
     if (driver.GitRepository.CanAmendCommit)
     {
         if (!driver.GitRepository.AmendCommit(m))
         {
             return(BuildState.Failed);
         }
     }
     else
     {
         if (!driver.GitRepository.Commit(m, "Required Build commit (for CI): build dependencies changed."))
         {
             return(BuildState.Failed);
         }
         var currentSha = driver.GitRepository.Head.CommitSha;
         if (_commits[s.Index] != currentSha)
         {
             m.Warn("A required commit has been created because build dependencies changed whereas normal ones didn't and commit cannot be amended. Build will be be retried.");
             _commits[s.Index] = currentSha;
             return(BuildState.MustRetry);
         }
     }
     if (sVersion == null)
     {
         m.Trace("Retry mode: skipping actual build.");
         return(BuildState.MustRetry);
     }
     return(driver.Build(m, _withUnitTest, withZeroBuilder: true, withPushToRemote: false)
             ? BuildState.Succeed
             : BuildState.Failed);
 }
Beispiel #6
0
        protected override BuildState Build(
            IActivityMonitor m,
            DependentSolution s,
            ISolutionDriver driver,
            IReadOnlyList <UpdatePackageInfo> upgrades,
            SVersion sVersion,
            IReadOnlyCollection <UpdatePackageInfo> buildProjectsUpgrade)
        {
            IReleaseSolutionInfo info = _roadmap.ReleaseInfos[s.Index];

            Debug.Assert((sVersion == null) == (info.CurrentReleaseInfo.Level == ReleaseLevel.None));
            var targetVersion = info.CurrentReleaseInfo.Version;

            Debug.Assert(sVersion == null || sVersion == targetVersion);

            if (_commits[s.Index] != driver.GitRepository.Head.CommitSha)
            {
                m.Error($"Commit changed between CreateBuildResult call and this Build. Build canceled.");
                return(BuildState.Failed);
            }
            if (sVersion == null)
            {
                m.Info($"Build skipped for {s.Solution.Name}.");
                return(BuildState.Succeed);
            }
            else
            {
                bool buildResult = DoBuild(m, driver, targetVersion, out bool tagCreated);
                if (!buildResult && tagCreated)
                {
                    driver.GitRepository.ClearVersionTag(m, targetVersion);
                }
                if (targetVersion.PackageQuality == PackageQuality.Release)
                {
                    buildResult &= driver.GitRepository.SwitchMasterToDevelop(m);
                }
                return(buildResult ? BuildState.Succeed : BuildState.Failed);
            }
        }
Beispiel #7
0
        protected override (SVersion Version, bool MustBuild) PrepareBuild(IActivityMonitor m, DependentSolution s, ISolutionDriver driver, IReadOnlyList <UpdatePackageInfo> upgrades)
        {
            if (!driver.UpdatePackageDependencies(m, upgrades))
            {
                return(null, false);
            }

            // Note that a commit is not necessarily created here if the dependencies have not changed!
            // (When working folder is up-to-date.)
            var upText = upgrades.Select(u => u.PackageUpdate.ToString()).Concatenate(Environment.NewLine);
            var msg    = $"CI build: Upgrading dependencies:{Environment.NewLine}{Environment.NewLine}{upText}.";

            if (!driver.GitRepository.Commit(m, msg))
            {
                return(null, false);
            }
            _commits[s.Index] = driver.GitRepository.Head.CommitSha;
            return(driver.GitRepository.GetCommitVersionInfo(m).AssemblyBuildInfo.Version, true);
        }
Beispiel #8
0
 /// <summary>
 /// Builds the solution.
 /// </summary>
 /// <param name="m">The monitor to use.</param>
 /// <param name="s">The solution.</param>
 /// <param name="driver">The solution driver.</param>
 /// <param name="upgrades">The set of required package upgrades.</param>
 /// <param name="sVersion">The version computed by <see cref="PrepareBuild"/>.</param>
 /// <param name="buildProjectsUpgrade">The build projects upgrades.</param>
 /// <returns>The build state.</returns>
 protected abstract BuildState Build(IActivityMonitor m, DependentSolution s, ISolutionDriver driver, IReadOnlyList <UpdatePackageInfo> upgrades, SVersion sVersion, IReadOnlyCollection <UpdatePackageInfo> buildProjectsUpgrade);
Beispiel #9
0
 /// <summary>
 /// Must prepare the build (typically by applying the <paramref name="upgrades"/>) and returns
 /// a version for the solution (or null on error).
 /// </summary>
 /// <param name="m">The monitor to use.</param>
 /// <param name="s">The solution.</param>
 /// <param name="driver">The solution driver.</param>
 /// <param name="upgrades">The set of required package upgrades.</param>
 /// <returns>The version (or null if an error occurred) and whether the build must be actually done or skipped.</returns>
 protected abstract (SVersion Version, bool MustBuild) PrepareBuild(IActivityMonitor m, DependentSolution s, ISolutionDriver driver, IReadOnlyList <UpdatePackageInfo> upgrades);
Beispiel #10
0
 /// <summary>
 /// Called whenever the final version is already set by a version tag on the commit point.
 /// We consider this version to be already released.
 /// </summary>
 /// <param name="m">The monitor to use.</param>
 /// <param name="solution">The solution.</param>
 /// <param name="version">The tagged version.</param>
 /// <param name="isContentTag">False if it the tag is on the commit point, true if the tag is a content tag.</param>
 /// <returns>True to continue, false to cancel the current session.</returns>
 public bool OnAlreadyReleased(IActivityMonitor m, DependentSolution solution, CSVersion version, bool isContentTag)
 {
     Console.WriteLine("=========");
     Console.WriteLine($"========  {solution.Solution.Name} is already released in version '{version}'.");
     return(true);
 }
Beispiel #11
0
 protected override (SVersion Version, bool MustBuild) PrepareBuild(IActivityMonitor m, DependentSolution s, ISolutionDriver driver, IReadOnlyList <UpdatePackageInfo> upgrades)
 {
     if (!driver.UpdatePackageDependencies(m, upgrades))
     {
         return(null, false);
     }
     if (!driver.GitRepository.AmendCommit(m))
     {
         return(null, false);
     }
     _commitTimes[s.Index] = driver.GitRepository.Head.CommitDate;
     return(driver.GitRepository.GetCommitVersionInfo(m).AssemblyBuildInfo.Version, true);
 }