private async Task <ExitCode> ProcessPackagesAsync( IEnumerable <string> packageSpecifications, NuGetPackageConfiguration packageConfiguration, ILogger logger, CancellationToken cancellationToken) { var packager = new NuGetPackager(logger); foreach (string packageSpecification in packageSpecifications) { ExitCode packageResult = await packager.CreatePackageAsync( packageSpecification, packageConfiguration, cancellationToken : cancellationToken); if (!packageResult.IsSuccess) { logger.WriteError($"Could not create NuGet package from specification '{packageSpecification}'"); return(packageResult); } } return(ExitCode.Success); }
public async Task <ExitCode> ExecuteAsync( ILogger logger, IReadOnlyCollection <IVariable> buildVariables, CancellationToken cancellationToken) { bool enabled = buildVariables.GetBooleanByKey(WellKnownVariables.NuGetPackageEnabled, true); if (!enabled) { logger.WriteWarning( $"NuGet Packer is disabled (build variable '{WellKnownVariables.NuGetPackageEnabled}' is set to false"); return(ExitCode.Success); } _excludedNuSpecFiles = buildVariables.GetVariableValueOrDefault( WellKnownVariables.NuGetPackageExcludesCommaSeparated, string.Empty) .Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries) .SafeToReadOnlyCollection(); _pathLookupSpecification = DefaultPaths.DefaultPathLookupSpecification; string packageDirectory = PackageDirectory(); IVariable artifacts = buildVariables.Require(WellKnownVariables.Artifacts).ThrowIfEmptyValue(); string packagesDirectory = Path.Combine(artifacts.Value, "packages"); string vcsRootDir = buildVariables.Require(WellKnownVariables.SourceRoot).ThrowIfEmptyValue().Value; NuGetPackageConfiguration packageConfiguration = NuGetPackager.GetNuGetPackageConfiguration(logger, buildVariables, packagesDirectory, vcsRootDir); IReadOnlyCollection <string> packageSpecifications = GetPackageSpecifications( logger, vcsRootDir, packageDirectory); if (!packageSpecifications.Any()) { logger.Write("Could not find any NuGet specifications to create NuGet packages from"); return(ExitCode.Success); } logger.Write($"Found {packageSpecifications.Count} NuGet specifications to create NuGet packages from"); ExitCode result = await ProcessPackagesAsync(packageSpecifications, packageConfiguration, logger, cancellationToken); return(result); }
public static NuGetPackageConfiguration GetNuGetPackageConfiguration( ILogger logger, IReadOnlyCollection <IVariable> buildVariables, string packagesDirectory, string vcsRootDir) { IVariable version = buildVariables.Require(WellKnownVariables.Version).ThrowIfEmptyValue(); IVariable releaseBuild = buildVariables.Require(WellKnownVariables.ReleaseBuild).ThrowIfEmptyValue(); IVariable branchName = buildVariables.Require(WellKnownVariables.BranchLogicalName).ThrowIfEmptyValue(); string configuration = buildVariables.Require(WellKnownVariables.Configuration).ThrowIfEmptyValue().Value; IVariable tempDirectory = buildVariables.Require(WellKnownVariables.TempDirectory).ThrowIfEmptyValue(); string nuGetExePath = buildVariables.Require(WellKnownVariables.ExternalTools_NuGet_ExePath) .ThrowIfEmptyValue() .Value; string suffix = buildVariables.GetVariableValueOrDefault(WellKnownVariables.NuGetPackageArtifactsSuffix, "build"); bool buildNumberEnabled = buildVariables.GetBooleanByKey( WellKnownVariables.BuildNumberInNuGetPackageArtifactsEnabled, true); bool keepBinaryAndSourcePackagesTogetherEnabled = buildVariables.GetBooleanByKey( WellKnownVariables.NuGetKeepBinaryAndSymbolPackagesTogetherEnabled, true); bool branchNameEnabled = buildVariables.GetBooleanByKey(WellKnownVariables.NuGetPackageIdBranchNameEnabled, false); string packageIdOverride = buildVariables.GetVariableValueOrDefault(WellKnownVariables.NuGetPackageIdOverride, null); bool nuGetSymbolPackagesEnabled = buildVariables.GetBooleanByKey(WellKnownVariables.NuGetSymbolPackagesEnabled, true); string nuGetPackageVersionOverride = buildVariables.GetVariableValueOrDefault(WellKnownVariables.NuGetPackageVersionOverride, null); bool allowManifestReWrite = buildVariables.GetBooleanByKey(WellKnownVariables.NuGetAllowManifestReWrite, false); bool buildPackagesOnAnyBranch = buildVariables.GetBooleanByKey(WellKnownVariables.NuGetCreatePackagesOnAnyBranchEnabled, false); if (!buildPackagesOnAnyBranch) { if (branchName.Value.Equals("master", StringComparison.InvariantCultureIgnoreCase)) { logger.WriteWarning( $"NuGet package creation is not supported on 'master' branch. To force NuGet package creation, set environment variable '{WellKnownVariables.NuGetCreatePackagesOnAnyBranchEnabled}' to value 'true'"); // return ExitCode.Success; } } else { logger.WriteVerbose( $"Flag '{WellKnownVariables.NuGetCreatePackagesOnAnyBranchEnabled}' is set to true, creating NuGet packages"); } Maybe <BranchName> branchNameMayBe = BranchName.TryParse(branchName.Value); if (!branchNameMayBe.HasValue) { throw new InvalidOperationException("The branchname could not be found"); } bool isReleaseBuild = IsReleaseBuild(releaseBuild.Value, branchNameMayBe.Value); logger.WriteVerbose( $"Based on branch {branchName.Value} and release build flags {releaseBuild.Value}, the build is considered {(isReleaseBuild ? "release" : "not release")}"); if (configuration.Equals("debug", StringComparison.InvariantCultureIgnoreCase) && isReleaseBuild) { logger.Write( "The current configuration is 'debug' but the build indicates that this is a release build, using 'release' configuration instead"); configuration = "release"; } if (!Directory.Exists(packagesDirectory)) { Directory.CreateDirectory(packagesDirectory); } if (!File.Exists(nuGetExePath)) { logger.WriteError($"The NuGet.exe path {nuGetExePath} was not found or NuGet could not be downloaded"); // return ExitCode.Failure; } logger.WriteVerbose($"Scanning directory '{vcsRootDir}' for .nuspec files"); var packageConfiguration = new NuGetPackageConfiguration( configuration, version.Value, packagesDirectory, nuGetExePath, suffix, branchNameEnabled, packageIdOverride, nuGetPackageVersionOverride, allowManifestReWrite, nuGetSymbolPackagesEnabled, keepBinaryAndSourcePackagesTogetherEnabled, isReleaseBuild, branchName.Value, buildNumberEnabled, tempDirectory.Value); return(packageConfiguration); }
public async Task <ExitCode> CreatePackageAsync( string packageSpecificationPath, NuGetPackageConfiguration packageConfiguration, bool ignoreWarnings = false, CancellationToken cancellationToken = default) { _logger.WriteDebug($"Using NuGet package configuration {packageConfiguration}"); NuSpec nuSpec = NuSpec.Parse(packageSpecificationPath); string properties = GetProperties(packageConfiguration.Configuration); if (!string.IsNullOrWhiteSpace(packageConfiguration.PackageIdOverride)) { _logger.Write($"Using NuGet package id override '{packageConfiguration.PackageIdOverride}'"); } string packageId = !string.IsNullOrWhiteSpace(packageConfiguration.PackageIdOverride) ? packageConfiguration.PackageIdOverride : NuGetPackageIdHelper.CreateNugetPackageId( nuSpec.PackageId, packageConfiguration.IsReleaseBuild, packageConfiguration.BranchName, packageConfiguration.BranchNameEnabled); if (string.IsNullOrWhiteSpace(packageConfiguration.PackageIdOverride)) { _logger.Write($"Using NuGet package ID {packageId}"); } else { _logger.Write($"Using NuGet package version override '{packageConfiguration.PackageIdOverride}'"); } var nuGetVersioningSettings = new NuGetVersioningSettings { MaxZeroPaddingLength = 5, SemVerVersion = 1 }; string nuGetPackageVersion = !string.IsNullOrWhiteSpace(packageConfiguration.NuGetPackageVersionOverride) ? packageConfiguration.NuGetPackageVersionOverride : NuGetVersionHelper.GetVersion( packageConfiguration.Version, packageConfiguration.IsReleaseBuild, packageConfiguration.Suffix, packageConfiguration.BuildNumberEnabled, packageConfiguration.PackageBuildMetadata, _logger, nuGetVersioningSettings); _logger.Write( string.IsNullOrWhiteSpace(packageConfiguration.NuGetPackageVersionOverride) ? $"Using NuGet package version {nuGetPackageVersion}" : $"Using NuGet package version override '{packageConfiguration.NuGetPackageVersionOverride}'"); var nuSpecInfo = new FileInfo(packageSpecificationPath); // ReSharper disable AssignNullToNotNullAttribute string nuSpecFileCopyPath = Path.Combine(nuSpecInfo.DirectoryName, $"{Guid.NewGuid()}-{nuSpecInfo.Name}"); // ReSharper restore AssignNullToNotNullAttribute var nuSpecCopy = new NuSpec(packageId, nuGetPackageVersion, nuSpecInfo.FullName); string nuSpecTempDirectory = Path.Combine(packageConfiguration.TempPath, "nuspecs"); if (!Directory.Exists(nuSpecTempDirectory)) { Directory.CreateDirectory(nuSpecTempDirectory); } _logger.WriteVerbose($"Saving new nuspec '{nuSpecFileCopyPath}'"); nuSpecCopy.Save(nuSpecFileCopyPath); var removedTags = new List <string>(); if (packageConfiguration.AllowManifestReWrite) { _logger.WriteVerbose($"Rewriting manifest in NuSpec '{nuSpecFileCopyPath}'"); var manitestReWriter = new ManitestReWriter(); ManifestReWriteResult manifestReWriteResult = manitestReWriter.Rewrite(nuSpecFileCopyPath); removedTags.AddRange(manifestReWriteResult.RemoveTags); } else { _logger.WriteVerbose("Rewriting manifest disabled"); } _logger.WriteVerbose( $"Created nuspec content: {Environment.NewLine}{File.ReadAllText(nuSpecFileCopyPath)}"); ExitCode result = await ExecuteNuGetPackAsync( packageConfiguration.NuGetExePath, packageConfiguration.PackagesDirectory, _logger, nuSpecFileCopyPath, properties, nuSpecCopy, removedTags, cancellationToken : cancellationToken, ignoreWarnings : ignoreWarnings); return(result); }