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); }
private static bool DoBuild( IActivityMonitor m, ISolutionDriver driver, CSVersion targetVersion, out bool tagCreated) { tagCreated = false; try { var git = driver.GitRepository; if (targetVersion.PackageQuality == PackageQuality.Release) { if (!git.SwitchDevelopToMaster(m)) { return(false); } driver = driver.GetCurrentBranchDriver(); } if (!git.SetVersionTag(m, targetVersion)) { return(false); } tagCreated = true; if (!driver.Build(m, withUnitTest: true, withZeroBuilder: true, withPushToRemote: false)) { return(false); } return(true); } catch (Exception ex) { m.Error("Build failed.", ex); return(false); } }
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); }
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);
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); }