diff --git a/src/Cake.GitVersioning/GitVersioningAliases.cs b/src/Cake.GitVersioning/GitVersioningAliases.cs index f0713c72d..5a154d873 100644 --- a/src/Cake.GitVersioning/GitVersioningAliases.cs +++ b/src/Cake.GitVersioning/GitVersioningAliases.cs @@ -87,6 +87,7 @@ public static void GitVersioningCloud(this ICakeContext cakeContext, string proj settings.CISystem?.ToString(), settings.AllVariables, settings.CommonVariables, + settings.CloudBuildNumber, settings.AdditionalVariables, false); } diff --git a/src/Cake.GitVersioning/GitVersioningCloudSettings.cs b/src/Cake.GitVersioning/GitVersioningCloudSettings.cs index 9ccf5d32c..de901e28d 100644 --- a/src/Cake.GitVersioning/GitVersioningCloudSettings.cs +++ b/src/Cake.GitVersioning/GitVersioningCloudSettings.cs @@ -30,13 +30,21 @@ public class GitVersioningCloudSettings /// /// Gets or sets a value indicating whether to define ALL version variables as cloud build variables, with a "NBGV_" prefix. /// + /// The default value is . public bool AllVariables { get; set; } /// /// Gets or sets a value indicating whether to define a few common version variables as cloud build variables, with a "Git" prefix. /// + /// The default value is . public bool CommonVariables { get; set; } + /// + /// Gets or sets a value indicating whether to set the cloud build number. + /// + /// The default value is . + public bool CloudBuildNumber { get; set; } = true; + /// /// Gets additional cloud build variables to define. /// diff --git a/src/NerdBank.GitVersioning/Commands/CloudCommand.cs b/src/NerdBank.GitVersioning/Commands/CloudCommand.cs index 518ab254d..b742fac73 100644 --- a/src/NerdBank.GitVersioning/Commands/CloudCommand.cs +++ b/src/NerdBank.GitVersioning/Commands/CloudCommand.cs @@ -69,13 +69,16 @@ public enum CloudCommandError /// /// Controls whether to define common version variables as cloud build variables. /// + /// + /// Controls whether to emit the cloud build variable to set the build number. + /// /// /// Additional cloud build variables to define. /// /// /// Force usage of LibGit2 for accessing the git repository. /// - public void SetBuildVariables(string projectDirectory, IEnumerable metadata, string version, string ciSystem, bool allVars, bool commonVars, IEnumerable> additionalVariables, bool alwaysUseLibGit2) + public void SetBuildVariables(string projectDirectory, IEnumerable metadata, string version, string ciSystem, bool allVars, bool commonVars, bool cloudBuildNumber, IEnumerable> additionalVariables, bool alwaysUseLibGit2) { Requires.NotNull(projectDirectory, nameof(projectDirectory)); Requires.NotNull(additionalVariables, nameof(additionalVariables)); @@ -137,7 +140,10 @@ public void SetBuildVariables(string projectDirectory, IEnumerable metad version = oracle.CloudBuildNumber; } - activeCloudBuild.SetCloudBuildNumber(version, this.stdout, this.stderr); + if (cloudBuildNumber) + { + activeCloudBuild.SetCloudBuildNumber(version, this.stdout, this.stderr); + } foreach (KeyValuePair pair in variables) { diff --git a/src/nbgv/Program.cs b/src/nbgv/Program.cs index 5eaa19cb1..24a018e14 100644 --- a/src/nbgv/Program.cs +++ b/src/nbgv/Program.cs @@ -194,6 +194,7 @@ private static Parser BuildCommandLine() var ciSystem = new Option(new[] { "--ci-system", "-s" }, "Force activation for a particular CI system. If not specified, auto-detection will be used. Supported values are: " + string.Join(", ", CloudProviderNames)).FromAmong(CloudProviderNames); var allVars = new Option(new[] { "--all-vars", "-a" }, "Defines ALL version variables as cloud build variables, with a \"NBGV_\" prefix."); var commonVars = new Option(new[] { "--common-vars", "-c" }, "Defines a few common version variables as cloud build variables, with a \"Git\" prefix (e.g. GitBuildVersion, GitBuildVersionSimple, GitAssemblyInformationalVersion)."); + var skipCloudBuildNumber = new Option(new[] { "--skip-cloud-build-number" }, "Do not emit the cloud build variable to set the build number. This is useful when you want to set other cloud build variables but not the build number."); var define = new Option(new[] { "--define", "-d" }, () => Array.Empty(), "Additional cloud build variables to define. Each should be in the NAME=VALUE syntax.") { Arity = ArgumentArity.OneOrMore, @@ -207,10 +208,11 @@ private static Parser BuildCommandLine() ciSystem, allVars, commonVars, + skipCloudBuildNumber, define, }; - cloud.SetHandler(OnCloudCommand, project, metadata, version, ciSystem, allVars, commonVars, define); + cloud.SetHandler(OnCloudCommand, project, metadata, version, ciSystem, allVars, commonVars, skipCloudBuildNumber, define); } Command prepareRelease; @@ -656,7 +658,7 @@ private static Task OnGetCommitsCommand(string project, bool quiet, string return Task.FromResult((int)ExitCodes.OK); } - private static Task OnCloudCommand(string project, string[] metadata, string version, string ciSystem, bool allVars, bool commonVars, string[] define) + private static Task OnCloudCommand(string project, string[] metadata, string version, string ciSystem, bool allVars, bool commonVars, bool skipCloudBuildNumber, string[] define) { string searchPath = GetSpecifiedOrCurrentDirectoryPath(project); if (!Directory.Exists(searchPath)) @@ -690,7 +692,7 @@ private static Task OnCloudCommand(string project, string[] metadata, strin try { var cloudCommand = new CloudCommand(Console.Out, Console.Error); - cloudCommand.SetBuildVariables(searchPath, metadata, version, ciSystem, allVars, commonVars, additionalVariables, AlwaysUseLibGit2); + cloudCommand.SetBuildVariables(searchPath, metadata, version, ciSystem, allVars, commonVars, !skipCloudBuildNumber, additionalVariables, AlwaysUseLibGit2); } catch (CloudCommand.CloudCommandException ex) { diff --git a/test/Nerdbank.GitVersioning.Tests/CommandTests.cs b/test/Nerdbank.GitVersioning.Tests/CommandTests.cs new file mode 100644 index 000000000..9efe9322b --- /dev/null +++ b/test/Nerdbank.GitVersioning.Tests/CommandTests.cs @@ -0,0 +1,45 @@ +// Copyright (c) .NET Foundation and Contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using Nerdbank.GitVersioning; +using Nerdbank.GitVersioning.Commands; +using Xunit; + +public class CommandTests : RepoTestBase +{ + public CommandTests(ITestOutputHelper logger) + : base(logger) + { + } + + [Theory, CombinatorialData] + public void CloudCommand_CloudBuildNumber(bool setCloudBuildNumber) + { + const string ciSystem = "VisualStudioTeamServices"; + const string buildNumberSyntax = "##vso[build.updatebuildnumber]"; + + var outWriter = new StringWriter(); + var errWriter = new StringWriter(); + + var command = new CloudCommand(outWriter, errWriter); + + command.SetBuildVariables(this.RepoPath, metadata: [], version: "1.2.3.4", ciSystem, allVars: false, commonVars: false, setCloudBuildNumber, additionalVariables: [], alwaysUseLibGit2: false); + + outWriter.Flush(); + errWriter.Flush(); + + if (setCloudBuildNumber) + { + Assert.Contains(buildNumberSyntax, outWriter.ToString()); + } + else + { + Assert.DoesNotContain(buildNumberSyntax, outWriter.ToString()); + } + + Assert.Empty(errWriter.ToString()); + } + + protected override GitContext CreateGitContext(string path, string committish = null) + => GitContext.Create(path, committish, engine: GitContext.Engine.ReadWrite); +}