Skip to content

Commit e4cda96

Browse files
committed
wip: ArgumentsFromParametersFileAttribute via JSON
1 parent 583f905 commit e4cda96

File tree

8 files changed

+67
-97
lines changed

8 files changed

+67
-97
lines changed

.nuke/build.schema.json

+25-8
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,8 @@
4646
"type": "string",
4747
"default": "Secrets must be entered via 'nuke :secrets [profile]'"
4848
},
49-
"SignPathOrganizationId": {
50-
"type": "string"
51-
},
52-
"SignPathPolicySlug": {
53-
"type": "string"
54-
},
55-
"SignPathProjectSlug": {
56-
"type": "string"
49+
"SignPathSettings": {
50+
"$ref": "#/definitions/SignPathSettings"
5751
},
5852
"SlackWebhook": {
5953
"type": "string",
@@ -108,6 +102,29 @@
108102
"VSCode"
109103
]
110104
},
105+
"SignPathSettings": {
106+
"type": "object",
107+
"properties": {
108+
"OrganizationId": {
109+
"type": [
110+
"null",
111+
"string"
112+
]
113+
},
114+
"ProjectSlug": {
115+
"type": [
116+
"null",
117+
"string"
118+
]
119+
},
120+
"PolicySlug": {
121+
"type": [
122+
"null",
123+
"string"
124+
]
125+
}
126+
}
127+
},
111128
"ExecutableTarget": {
112129
"type": "string",
113130
"enum": [

.nuke/parameters.json

+5-17
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,9 @@
11
{
22
"$schema": "./build.schema.json",
33
"Solution": "nuke-common.sln",
4-
"SignPathOrganizationId": "0fdaf334-6910-41f4-83d2-e58e4cccb087",
5-
"SignPathProjectSlug": "nuke",
6-
"SignPathPolicySlug": "release-signing",
7-
"Data2": [
8-
{
9-
"FirstName": "foo",
10-
"Nested": {
11-
"FirstName": "bar"
12-
}
13-
},
14-
{
15-
"FirstName": "foo2",
16-
"Nested": {
17-
"FirstName": "bar2"
18-
}
19-
}
20-
]
4+
"SignPathSettings": {
5+
"OrganizationId": "0fdaf334-6910-41f4-83d2-e58e4cccb087",
6+
"ProjectSlug": "nuke",
7+
"PolicySlug": "release-signing"
8+
}
219
}

.teamcity/settings.kts

+3-21
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,6 @@ project {
4747
value = "Release",
4848
options = listOf("Debug" to "Debug", "Release" to "Release"),
4949
display = ParameterDisplay.NORMAL)
50-
text (
51-
"env.Data2",
52-
label = "Data2",
53-
value = "Build+Data Build+Data",
54-
allowEmpty = true,
55-
display = ParameterDisplay.NORMAL)
5650
checkbox (
5751
"env.IgnoreFailedSources",
5852
label = "IgnoreFailedSources",
@@ -69,21 +63,9 @@ project {
6963
unchecked = "False",
7064
display = ParameterDisplay.NORMAL)
7165
text (
72-
"env.SignPathOrganizationId",
73-
label = "SignPathOrganizationId",
74-
value = "0fdaf334-6910-41f4-83d2-e58e4cccb087",
75-
allowEmpty = true,
76-
display = ParameterDisplay.NORMAL)
77-
text (
78-
"env.SignPathPolicySlug",
79-
label = "SignPathPolicySlug",
80-
value = "release-signing",
81-
allowEmpty = true,
82-
display = ParameterDisplay.NORMAL)
83-
text (
84-
"env.SignPathProjectSlug",
85-
label = "SignPathProjectSlug",
86-
value = "nuke",
66+
"env.SignPathSettings",
67+
label = "SignPathSettings",
68+
value = "",
8769
allowEmpty = true,
8870
display = ParameterDisplay.NORMAL)
8971
text (

build/Build.cs

-14
Original file line numberDiff line numberDiff line change
@@ -50,20 +50,6 @@ partial class Build
5050
/// - Microsoft VSCode https://nuke.build/vscode
5151
public static int Main() => Execute<Build>(x => ((IPack)x).Pack);
5252

53-
public class Data
54-
{
55-
public string FirstName;
56-
public Data Nested;
57-
}
58-
59-
[Parameter] readonly Data[] Data2;
60-
61-
Target Foo => _ => _
62-
.Executes(() =>
63-
{
64-
Console.WriteLine(Data2);
65-
});
66-
6753
[CI] readonly TeamCity TeamCity;
6854
[CI] readonly AzurePipelines AzurePipelines;
6955
[CI] readonly AppVeyor AppVeyor;

nuke-common.sln.DotSettings

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
2-
<s:String x:Key="/Default/CodeStyle/FileHeader/FileHeaderText/@EntryValue">Copyright $CURRENT_YEAR$ Maintainers of NUKE.&#xD;
2+
<s:String x:Key="/Default/CodeStyle/FileHeader/FileHeaderText/@EntryValue">Copyright ${CurrentDate.Year} Maintainers of NUKE.&#xD;
33
Distributed under the MIT License.&#xD;
44
https://github.com/nuke-build/nuke/blob/master/LICENSE</s:String>
55
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateConstants/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb_AaBb" /&gt;</s:String>
@@ -17,4 +17,5 @@ https://github.com/nuke-build/nuke/blob/master/LICENSE</s:String>
1717
<s:Double x:Key="/Default/Environment/InjectedLayers/InjectedLayerCustomization/=FileA321B7F1C678C84CAFFD23C2D9D03A36/RelativePriority/@EntryValue">3</s:Double>
1818
<s:Boolean x:Key="/Default/Environment/InjectedLayers/InjectedLayerCustomization/=FileA68CFA51EFE4364DA61BFD270E021A11/@KeyIndexDefined">True</s:Boolean>
1919
<s:Double x:Key="/Default/Environment/InjectedLayers/InjectedLayerCustomization/=FileA68CFA51EFE4364DA61BFD270E021A11/RelativePriority/@EntryValue">1</s:Double>
20+
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EFeature_002EServices_002ECodeCleanup_002EFileHeader_002EFileHeaderSettingsMigrate/@EntryIndexedValue">True</s:Boolean>
2021
</wpf:ResourceDictionary>

source/Nuke.Build.Tests/ParameterServiceTest.cs

+18-20
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,11 @@ public void TestNotSupplied(Type destinationType, object expectedValue)
4848
public void TestEnvironmentVariables(string parameter, Type destinationType, object expectedValue)
4949
{
5050
var service = GetService(
51-
new[]
52-
{
51+
[
5352
"-arg1",
5453
"value1",
5554
"-switch1"
56-
},
55+
],
5756
new Dictionary<string, string>
5857
{
5958
{ "arg1", "value2" },
@@ -68,15 +67,14 @@ public void TestEnvironmentVariables(string parameter, Type destinationType, obj
6867
public void TestExpression()
6968
{
7069
var service = GetService(
71-
new[]
72-
{
70+
[
7371
"--string",
7472
"--set",
7573
"1",
7674
"2",
7775
"3",
7876
"--interface-param"
79-
});
77+
]);
8078

8179
var build = new TestBuild();
8280

@@ -98,12 +96,12 @@ public void TestValueSet()
9896
{
9997
var build = new TestBuild();
10098
var verbosities = new[]
101-
{
102-
(nameof(Verbosity.Minimal), Verbosity.Minimal),
103-
(nameof(Verbosity.Normal), Verbosity.Normal),
104-
(nameof(Verbosity.Quiet), Verbosity.Quiet),
105-
(nameof(Verbosity.Verbose), Verbosity.Verbose),
106-
};
99+
{
100+
(nameof(Verbosity.Minimal), Verbosity.Minimal),
101+
(nameof(Verbosity.Normal), Verbosity.Normal),
102+
(nameof(Verbosity.Quiet), Verbosity.Quiet),
103+
(nameof(Verbosity.Verbose), Verbosity.Verbose),
104+
};
107105
ParameterService.GetParameterValueSet(GetMemberInfo(() => NukeBuild.Verbosity), instance: null)
108106
.Should().BeEquivalentTo(verbosities);
109107
ParameterService.GetParameterValueSet(GetMemberInfo(() => build.Verbosities), instance: null)
@@ -118,13 +116,13 @@ public void TestPrecedence()
118116

119117
var environmentVariables = new Dictionary<string, string> { ["string"] = "environmentVariables" };
120118
var commandLineArguments = new ArgumentParser("--string commandLine");
121-
var parameterFileArguments = new ArgumentParser("--string parameterFile");
119+
var parameterFileArguments = new Func<string, Type, object>((_, _) => "parameterFile");
122120
var commitMessageArguments = new ArgumentParser("--string commitMessage");
123121

124122
var service = new ParameterService(() => emptyArguments, () => emptyEnvironmentVariables)
125-
{
126-
ArgumentsFromFilesService = parameterFileArguments
127-
};
123+
{
124+
ArgumentsFromFilesService = parameterFileArguments
125+
};
128126
service.GetParameter("string", typeof(string), separator: null).Should().Be("parameterFile");
129127

130128
service = new ParameterService(() => emptyArguments, () => environmentVariables) { ArgumentsFromFilesService = parameterFileArguments };
@@ -134,10 +132,10 @@ public void TestPrecedence()
134132
service.GetParameter("string", typeof(string), separator: null).Should().Be("commandLine");
135133

136134
service = new ParameterService(() => emptyArguments, () => emptyEnvironmentVariables)
137-
{
138-
ArgumentsFromFilesService = parameterFileArguments,
139-
ArgumentsFromCommitMessageService = commitMessageArguments
140-
};
135+
{
136+
ArgumentsFromFilesService = parameterFileArguments,
137+
ArgumentsFromCommitMessageService = commitMessageArguments
138+
};
141139
service.GetParameter("string", typeof(string), separator: null).Should().Be("commitMessage");
142140
}
143141

source/Nuke.Build/Execution/Extensions/ArgumentsFromParametersFileAttribute.cs

+2-5
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
using Newtonsoft.Json.Linq;
1111
using Nuke.Common.CI;
1212
using Nuke.Common.IO;
13-
using Nuke.Common.ProjectModel;
1413
using Nuke.Common.Utilities;
1514
using Nuke.Common.Utilities.Collections;
1615
using Nuke.Common.ValueInjection;
@@ -76,10 +75,8 @@ string DecryptValue(string profile, string name, string value)
7675

7776
var member = parameterMembers.SingleOrDefault(x => ParameterService.GetParameterMemberName(x).EqualsOrdinalIgnoreCase(parameter));
7877
var scalarType = member?.GetMemberType().GetScalarType();
79-
if (scalarType == typeof(AbsolutePath) ||
80-
typeof(Solution).IsAssignableFrom(scalarType) ||
81-
scalarType == typeof(Project))
82-
return NukeBuild.RootDirectory / property.Value.ToObject<string>();
78+
if (typeof(IAbsolutePathHolder).IsAssignableFrom(scalarType))
79+
return property.Value.ToObject<string>().Apply(x => !PathConstruction.HasPathRoot(x) ? NukeBuild.RootDirectory / x : (AbsolutePath)x);
8380

8481
if ((member?.HasCustomAttribute<SecretAttribute>() ?? false) &&
8582
!BuildServerConfigurationGeneration.IsActive)

source/Nuke.Components/ISignPackages.cs

+12-11
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,19 @@ public interface ISignPackages : INukeBuild
5252
{
5353
public const string SignPath = nameof(SignPath);
5454

55+
public record SignPathSettings(
56+
string OrganizationId,
57+
string ProjectSlug,
58+
string PolicySlug);
59+
60+
[Parameter] SignPathSettings Settings => TryGetValue(() => Settings);
5561
[Parameter] [Secret] string ApiToken => TryGetValue(() => ApiToken);
56-
[Parameter] string OrganizationId => TryGetValue(() => OrganizationId);
57-
[Parameter] string ProjectSlug => TryGetValue(() => ProjectSlug);
58-
[Parameter] string PolicySlug => TryGetValue(() => PolicySlug);
5962

6063
AbsolutePath SignPathTemporaryDirectory => TemporaryDirectory / "signpath";
6164
AbsolutePath SignPathRequestDirectory => SignPathTemporaryDirectory / "signing-request";
6265
AbsolutePath SignPathResponseDirectory => SignPathTemporaryDirectory / "signing-response";
63-
AbsolutePath SignPathRequestArchive => Path.ChangeExtension(SignPathRequestDirectory, ".zip");
64-
AbsolutePath SignPathResponseArchive => Path.ChangeExtension(SignPathResponseDirectory, ".zip");
66+
AbsolutePath SignPathRequestArchive => SignPathRequestDirectory.WithExtension(".zip");
67+
AbsolutePath SignPathResponseArchive => SignPathResponseDirectory.WithExtension(".zip");
6568

6669
IEnumerable<AbsolutePath> SignPathPackages { get; }
6770
bool SignPathReplacePackages => true;
@@ -72,10 +75,8 @@ public interface ISignPackages : INukeBuild
7275
.TryDependsOn<IPack>()
7376
.TryDependentFor<IPublish>()
7477
.OnlyWhenStatic(() => AppVeyor != null)
78+
.Requires(() => Settings)
7579
.Requires(() => ApiToken)
76-
.Requires(() => OrganizationId)
77-
.Requires(() => ProjectSlug)
78-
.Requires(() => PolicySlug)
7980
.Executes(async () =>
8081
{
8182
SignPathRequestDirectory.CreateOrCleanDirectory();
@@ -86,9 +87,9 @@ public interface ISignPackages : INukeBuild
8687

8788
var signingRequestUrl = await GetSigningRequestUrlViaAppVeyor(
8889
ApiToken,
89-
OrganizationId,
90-
ProjectSlug,
91-
PolicySlug);
90+
Settings.OrganizationId,
91+
Settings.ProjectSlug,
92+
Settings.PolicySlug);
9293

9394
ReportSummary(_ => _
9495
.AddPair("Approve/Deny Request", signingRequestUrl.Replace("api/v1", "Web")));

0 commit comments

Comments
 (0)