コード例 #1
0
ファイル: NuGetPacker.cs プロジェクト: forki/Arbor.X
        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);
        }
コード例 #2
0
ファイル: NuGetPacker.cs プロジェクト: forki/Arbor.X
        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);
        }
コード例 #3
0
ファイル: NuGetPackager.cs プロジェクト: forki/Arbor.X
        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);
        }
コード例 #4
0
ファイル: NuGetPackager.cs プロジェクト: forki/Arbor.X
        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);
        }