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); }
/// <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()); }
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); }
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); } } }
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); }
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); } }
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); }
/// <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);
/// <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);
/// <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); }
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); }