diff --git a/src/Dockerfile b/src/Dockerfile index 420fa0e..d29af13 100755 --- a/src/Dockerfile +++ b/src/Dockerfile @@ -3,8 +3,8 @@ WORKDIR /app EXPOSE 80 EXPOSE 443 -RUN apt-get -y update -RUN apt-get install -y libsecret-1-0 +#RUN apt-get -y update +#RUN apt-get install -y libsecret-1-0 FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /src diff --git a/src/Nox.Cli.Plugins/Nox.Cli.Plugin.AzDevOps/AzDevopsAuthorizeEnvironmentPipeline_v1.cs b/src/Nox.Cli.Plugins/Nox.Cli.Plugin.AzDevOps/AzDevopsAuthorizeEnvironmentPipeline_v1.cs index 61591fd..b3ca021 100644 --- a/src/Nox.Cli.Plugins/Nox.Cli.Plugin.AzDevOps/AzDevopsAuthorizeEnvironmentPipeline_v1.cs +++ b/src/Nox.Cli.Plugins/Nox.Cli.Plugin.AzDevOps/AzDevopsAuthorizeEnvironmentPipeline_v1.cs @@ -63,7 +63,6 @@ public NoxActionMetaData Discover() public Task BeginAsync(IDictionary inputs) { - var connection = inputs.Value("connection"); _server = inputs.Value("server"); _pat = inputs.Value("personal-access-token"); _projectId = inputs.Value("project-id"); diff --git a/src/Nox.Cli.Plugins/Nox.Cli.Plugin.File/Helpers/CopyHelper.cs b/src/Nox.Cli.Plugins/Nox.Cli.Plugin.File/Helpers/CopyHelper.cs index 2031b34..802f2c5 100644 --- a/src/Nox.Cli.Plugins/Nox.Cli.Plugin.File/Helpers/CopyHelper.cs +++ b/src/Nox.Cli.Plugins/Nox.Cli.Plugin.File/Helpers/CopyHelper.cs @@ -11,7 +11,8 @@ public static bool CopyFile(string sourcePath, string targetPath, bool isOverwri var createDate = System.IO.File.GetCreationTime(targetPath); System.IO.File.Delete(targetPath); System.IO.File.Copy(sourcePath, targetPath); - System.IO.File.SetCreationTime(targetPath, createDate); + System.IO.File.SetCreationTime(targetPath, createDate); + return true; } return false; diff --git a/src/Nox.Cli.Server/Nox.Cli.Server.csproj b/src/Nox.Cli.Server/Nox.Cli.Server.csproj index 00f76e9..df426a2 100755 --- a/src/Nox.Cli.Server/Nox.Cli.Server.csproj +++ b/src/Nox.Cli.Server/Nox.Cli.Server.csproj @@ -74,5 +74,6 @@ .dockerignore + \ No newline at end of file diff --git a/src/Nox.Cli.Server/appsettings.Production.json b/src/Nox.Cli.Server/appsettings.Production.json index bb48893..72dbab0 100644 --- a/src/Nox.Cli.Server/appsettings.Production.json +++ b/src/Nox.Cli.Server/appsettings.Production.json @@ -6,5 +6,22 @@ "Microsoft": "Debug", "Microsoft.AspNetCore": "Debug" } + }, + "AzureAd": { + "Instance": "https://login.microsoftonline.com/", + "TenantId": "88155c28-f750-4013-91d3-8347ddb3daa7", + "ClientId": "750b96e1-e772-48f8-b6b3-84bac1961d9b", + "Scopes": "access_as_user" + }, + "ServerSecretResolver": { + "TenantId": "88155c28-f750-4013-91d3-8347ddb3daa7", + "ClientId": "750b96e1-e772-48f8-b6b3-84bac1961d9b", + "ClientSecret": "DoM8Q~xfHyKasa~MHTuPGXoPZbYj.B1pIWOvzc7K" + }, + "NoxScriptsUrl": "https://noxorg.dev", + "ElasticApm": { + "ServerUrl": "http://localhost:8200", + "SecretToken": "", + "TransactionSampleRate": "1.0" } } \ No newline at end of file diff --git a/src/Nox.Cli.Variables/ArgumentVariableResolver.cs b/src/Nox.Cli.Variables/ArgumentVariableResolver.cs index b986254..eb6a07d 100755 --- a/src/Nox.Cli.Variables/ArgumentVariableResolver.cs +++ b/src/Nox.Cli.Variables/ArgumentVariableResolver.cs @@ -1,6 +1,29 @@ +using Spectre.Console.Cli; + namespace Nox.Cli.Variables; -public class ArgumentVariableResolver +public static class ArgumentVariableResolver { + public static void ResolveNoxArgumentVariables(this IDictionary variables, IRemainingArguments arguments) + { + var keys = variables + .Where(kv => kv.Value == null) + .Select(kv => kv.Key) + .Where(e => e.StartsWith("args.", StringComparison.OrdinalIgnoreCase)) + .Select(e => e[5..]) + .ToArray(); + + + + foreach (var key in keys) + { + var value = ResolveArgumentValue(key, arguments); + variables[$"args.{key}"] = value; + } + } + private static bool ResolveArgumentValue(string argument, IRemainingArguments arguments) + { + return arguments.Parsed.Any(a => a.Key == "--" + argument); + } } \ No newline at end of file diff --git a/src/Nox.Cli.Variables/ClientVariableProvider.cs b/src/Nox.Cli.Variables/ClientVariableProvider.cs index 57678d7..5be4264 100755 --- a/src/Nox.Cli.Variables/ClientVariableProvider.cs +++ b/src/Nox.Cli.Variables/ClientVariableProvider.cs @@ -6,6 +6,7 @@ using Nox.Cli.Configuration; using Nox.Cli.Variables.Secrets; using Nox.Solution; +using Spectre.Console.Cli; using YamlDotNet.Serialization; using YamlDotNet.Serialization.NamingConventions; @@ -13,7 +14,7 @@ namespace Nox.Cli.Variables; public class ClientVariableProvider: IClientVariableProvider { - private readonly Regex _variableRegex = new(@"\$\{\{\s*(?\b(vars|solution|steps|server|env|runner|cache)[\w\.\-_:]+)\s*\}\}", RegexOptions.Compiled | RegexOptions.IgnoreCase, TimeSpan.FromSeconds(1)); + private readonly Regex _variableRegex = new(@"\$\{\{\s*(?\b(vars|solution|steps|server|env|runner|cache|args)[\w\.\-_:]+)\s*\}\}", RegexOptions.Compiled | RegexOptions.IgnoreCase, TimeSpan.FromSeconds(1)); private readonly Dictionary _variables; private readonly IOrgSecretResolver _orgSecretResolver; @@ -21,10 +22,12 @@ public class ClientVariableProvider: IClientVariableProvider private readonly INoxCliCache? _cache; private readonly ILocalTaskExecutorConfiguration? _lteConfig; private readonly List _serverVariables; + private readonly IRemainingArguments _arguments; public ClientVariableProvider( WorkflowConfiguration workflow, IOrgSecretResolver orgSecretResolver, + IRemainingArguments arguments, NoxSolution? projectConfig = null, ILocalTaskExecutorConfiguration? lteConfig = null, INoxCliCache? cache = null) @@ -35,6 +38,7 @@ public ClientVariableProvider( _projectConfig = projectConfig; _lteConfig = lteConfig; _cache = cache; + _arguments = arguments; Initialize(workflow); } @@ -146,6 +150,7 @@ public void SetProjectConfiguration(NoxSolution projectConfig) public async Task ResolveAll() { _variables.ResolveRunnerVariables(); + _variables.ResolveNoxArgumentVariables(_arguments); await ResolveForServer(); } diff --git a/src/Nox.Cli/Actions/NoxWorkflowContext.cs b/src/Nox.Cli/Actions/NoxWorkflowContext.cs index afbfac6..ea840f9 100755 --- a/src/Nox.Cli/Actions/NoxWorkflowContext.cs +++ b/src/Nox.Cli/Actions/NoxWorkflowContext.cs @@ -10,6 +10,7 @@ using Nox.Cli.Variables.Secrets; using Nox.Secrets.Abstractions; using Nox.Solution; +using Spectre.Console.Cli; using Environment = System.Environment; namespace Nox.Cli.Actions; @@ -45,11 +46,12 @@ public NoxWorkflowContext( IOrgSecretResolver orgSecretResolver, INoxCliCacheManager cacheManager, ILocalTaskExecutorConfiguration? lteConfig, - INoxSecretsResolver? secretsResolver) + INoxSecretsResolver? secretsResolver, + IRemainingArguments arguments) { WorkflowId = Guid.NewGuid(); _workflow = workflow; - _varProvider = new ClientVariableProvider(workflow, orgSecretResolver, projectConfig, lteConfig, cacheManager.Cache); + _varProvider = new ClientVariableProvider(workflow, orgSecretResolver, arguments, projectConfig, lteConfig, cacheManager.Cache); _cacheManager = cacheManager; _secretsResolver = secretsResolver; _jobs = ParseWorkflow(); diff --git a/src/Nox.Cli/Actions/NoxWorkflowExecutor.cs b/src/Nox.Cli/Actions/NoxWorkflowExecutor.cs index 9d06122..5df9c96 100755 --- a/src/Nox.Cli/Actions/NoxWorkflowExecutor.cs +++ b/src/Nox.Cli/Actions/NoxWorkflowExecutor.cs @@ -59,7 +59,7 @@ public async Task Execute(WorkflowConfiguration workflow, IRemainingArgume var workflowCtx = _console.Status() .Spinner(Spinner.Known.Clock) - .Start("Verifying the workflow script...", _ => new NoxWorkflowContext(workflow, _noxConfig, _orgSecretResolver, _cacheManager, _lteConfig, _noxSecretsResolver)); + .Start("Verifying the workflow script...", _ => new NoxWorkflowContext(workflow, _noxConfig, _orgSecretResolver, _cacheManager, _lteConfig, _noxSecretsResolver, arguments)); while (workflowCtx.CurrentJob != null) { @@ -454,7 +454,6 @@ private async Task ProcessForEachJob(NoxWorkflowContext context, bool forc } return true; } - } diff --git a/src/Nox.Cli/Properties/launchSettings.json b/src/Nox.Cli/Properties/launchSettings.json index e26c4ce..4b07417 100755 --- a/src/Nox.Cli/Properties/launchSettings.json +++ b/src/Nox.Cli/Properties/launchSettings.json @@ -2,7 +2,7 @@ "profiles": { "Nox.Cli": { "commandName": "Project", - "commandLineArgs": "new dop", + "commandLineArgs": "sync ado", "workingDirectory": "/home/jan/demo/CliDemo", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" diff --git a/tests/Plugin.Core.Tests/SnakeNameTests.cs b/tests/Plugin.Core.Tests/SnakeNameTests.cs index 4dd73bf..683d90e 100644 --- a/tests/Plugin.Core.Tests/SnakeNameTests.cs +++ b/tests/Plugin.Core.Tests/SnakeNameTests.cs @@ -29,7 +29,7 @@ public async Task Can_Convert_To_Snake_Name(string sourceValue, string expectedV var cacheMan = Mock.Of(); var lteConfig = Mock.Of(); var secretsResolver = Mock.Of(); - var ctx = new NoxWorkflowContext(wfConfig, sln, orgResolver, cacheMan, lteConfig, secretsResolver); + var ctx = new NoxWorkflowContext(wfConfig, sln, orgResolver, cacheMan, lteConfig, secretsResolver, null!); var result = await plugin.ProcessAsync(ctx); Assert.Single(result); Assert.Equal(expectedValue, result["result"]); diff --git a/tests/Plugin.File.Tests/CopyFileTests.cs b/tests/Plugin.File.Tests/CopyFileTests.cs index 9312f1c..8c5d655 100644 --- a/tests/Plugin.File.Tests/CopyFileTests.cs +++ b/tests/Plugin.File.Tests/CopyFileTests.cs @@ -33,7 +33,7 @@ public async Task Can_copy_a_File_if_destination_folder_does_not_exist() var cacheMan = Mock.Of(); var lteConfig = Mock.Of(); var secretsResolver = Mock.Of(); - var ctx = new NoxWorkflowContext(wfConfig, sln, orgResolver, cacheMan, lteConfig, secretsResolver); + var ctx = new NoxWorkflowContext(wfConfig, sln, orgResolver, cacheMan, lteConfig, secretsResolver, null!); await plugin.ProcessAsync(ctx); Assert.True(System.IO.File.Exists(Path.Combine(path, "new-target/Sample.txt"))); } @@ -60,7 +60,7 @@ public async Task Must_not_copy_if_destination_folder_exists_and_overwrite_not_s var cacheMan = Mock.Of(); var lteConfig = Mock.Of(); var secretsResolver = Mock.Of(); - var ctx = new NoxWorkflowContext(wfConfig, sln, orgResolver, cacheMan, lteConfig, secretsResolver); + var ctx = new NoxWorkflowContext(wfConfig, sln, orgResolver, cacheMan, lteConfig, secretsResolver, null!); await plugin.ProcessAsync(ctx); await plugin.EndAsync(); Assert.True(System.IO.File.Exists(Path.Combine(path, "new-target/Sample.txt"))); @@ -91,7 +91,7 @@ public async Task Can_copy_a_File_if_destination_folder_exists_and_overwrite_spe var cacheMan = Mock.Of(); var lteConfig = Mock.Of(); var secretsResolver = Mock.Of(); - var ctx = new NoxWorkflowContext(wfConfig, sln, orgResolver, cacheMan, lteConfig, secretsResolver); + var ctx = new NoxWorkflowContext(wfConfig, sln, orgResolver, cacheMan, lteConfig, secretsResolver, null!); await plugin.ProcessAsync(ctx); await plugin.EndAsync(); Assert.True(System.IO.File.Exists(Path.Combine(path, "new-target/Sample.txt"))); diff --git a/tests/Plugin.File.Tests/CopyFolderTests.cs b/tests/Plugin.File.Tests/CopyFolderTests.cs index 7ab9990..acfc807 100644 --- a/tests/Plugin.File.Tests/CopyFolderTests.cs +++ b/tests/Plugin.File.Tests/CopyFolderTests.cs @@ -34,7 +34,7 @@ public async Task Can_copy_a_File_if_destination_folder_does_not_exist() var cacheMan = Mock.Of(); var lteConfig = Mock.Of(); var secretsResolver = Mock.Of(); - var ctx = new NoxWorkflowContext(wfConfig, sln, orgResolver, cacheMan, lteConfig, secretsResolver); + var ctx = new NoxWorkflowContext(wfConfig, sln, orgResolver, cacheMan, lteConfig, secretsResolver, null!); await plugin.ProcessAsync(ctx); Assert.True(System.IO.File.Exists(Path.Combine(path, "target/Sample.txt"))); Assert.True(System.IO.File.Exists(Path.Combine(path, "target/child/Sample.txt"))); diff --git a/tests/Plugin.File.Tests/FileRenameTests.cs b/tests/Plugin.File.Tests/FileRenameTests.cs index 8bd1acc..e964b37 100644 --- a/tests/Plugin.File.Tests/FileRenameTests.cs +++ b/tests/Plugin.File.Tests/FileRenameTests.cs @@ -34,7 +34,7 @@ public async Task Can_Rename_a_File() var cacheMan = Mock.Of(); var lteConfig = Mock.Of(); var secretsResolver = Mock.Of(); - var ctx = new NoxWorkflowContext(wfConfig, sln, orgResolver, cacheMan, lteConfig, secretsResolver); + var ctx = new NoxWorkflowContext(wfConfig, sln, orgResolver, cacheMan, lteConfig, secretsResolver, null!); await plugin.ProcessAsync(ctx); Assert.True(System.IO.File.Exists(Path.Combine(path, "Sample-After.txt"))); Assert.False(System.IO.File.Exists(Path.Combine(path, "Sample-Before.txt"))); diff --git a/tests/Plugin.File.Tests/FolderRenameTests.cs b/tests/Plugin.File.Tests/FolderRenameTests.cs index 82808e8..d7d05bb 100644 --- a/tests/Plugin.File.Tests/FolderRenameTests.cs +++ b/tests/Plugin.File.Tests/FolderRenameTests.cs @@ -44,7 +44,7 @@ public async Task Can_Rename_a_Folder() var cacheMan = Mock.Of(); var lteConfig = Mock.Of(); var secretsResolver = Mock.Of(); - var ctx = new NoxWorkflowContext(wfConfig, sln, orgResolver, cacheMan, lteConfig, secretsResolver); + var ctx = new NoxWorkflowContext(wfConfig, sln, orgResolver, cacheMan, lteConfig, secretsResolver, null!); await plugin.ProcessAsync(ctx); Assert.True(System.IO.Directory.Exists(Path.Combine(path, "Sample-After"))); Assert.False(System.IO.Directory.Exists(Path.Combine(path, "Sample-Before"))); diff --git a/tests/Plugin.Git.Tests/InitTests.cs b/tests/Plugin.Git.Tests/InitTests.cs index 76b6097..8f8172b 100644 --- a/tests/Plugin.Git.Tests/InitTests.cs +++ b/tests/Plugin.Git.Tests/InitTests.cs @@ -32,7 +32,7 @@ public async Task Can_initialize_a_local_git_repo() var cacheMan = Mock.Of(); var lteConfig = Mock.Of(); var secretsResolver = Mock.Of(); - var ctx = new NoxWorkflowContext(wfConfig, sln, orgResolver, cacheMan, lteConfig, secretsResolver); + var ctx = new NoxWorkflowContext(wfConfig, sln, orgResolver, cacheMan, lteConfig, secretsResolver, null!); ctx.SetCurrentActionForTests(); await plugin.ProcessAsync(ctx); Assert.Equal(ActionState.Success, ctx.CurrentAction!.State); @@ -59,7 +59,7 @@ public async Task Must_get_warning_if_initializing_more_than_once() var cacheMan = Mock.Of(); var lteConfig = Mock.Of(); var secretsResolver = Mock.Of(); - var ctx = new NoxWorkflowContext(wfConfig, sln, orgResolver, cacheMan, lteConfig, secretsResolver); + var ctx = new NoxWorkflowContext(wfConfig, sln, orgResolver, cacheMan, lteConfig, secretsResolver, null!); ctx.SetCurrentActionForTests(); await plugin.ProcessAsync(ctx); Assert.Equal(ActionState.Success, ctx.CurrentAction!.State); @@ -90,7 +90,7 @@ public async Task Must_not_get_warning_if_initializing_more_than_once_and_suppre var cacheMan = Mock.Of(); var lteConfig = Mock.Of(); var secretsResolver = Mock.Of(); - var ctx = new NoxWorkflowContext(wfConfig, sln, orgResolver, cacheMan, lteConfig, secretsResolver); + var ctx = new NoxWorkflowContext(wfConfig, sln, orgResolver, cacheMan, lteConfig, secretsResolver, null!); ctx.SetCurrentActionForTests(); await plugin.ProcessAsync(ctx); Assert.Equal(ActionState.Success, ctx.CurrentAction!.State); diff --git a/tests/Plugin.Powershell.Tests/PwshTests.cs b/tests/Plugin.Powershell.Tests/PwshTests.cs index bc858f4..c429ef4 100644 --- a/tests/Plugin.Powershell.Tests/PwshTests.cs +++ b/tests/Plugin.Powershell.Tests/PwshTests.cs @@ -28,7 +28,7 @@ public async Task Can_copy_a_File_if_destination_folder_does_not_exist() var cacheMan = Mock.Of(); var lteConfig = Mock.Of(); var secretsResolver = Mock.Of(); - var ctx = new NoxWorkflowContext(wfConfig, sln, orgResolver, cacheMan, lteConfig, secretsResolver); + var ctx = new NoxWorkflowContext(wfConfig, sln, orgResolver, cacheMan, lteConfig, secretsResolver, null!); await plugin.ProcessAsync(ctx); Assert.True(Directory.Exists(".git")); FileHelpers.PurgeFolderRecursive(".git", false);