From e15a25ed13efee6d35f6cf448ce0febcae87ed40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Dalecki?= Date: Sun, 4 Aug 2024 17:38:31 +0200 Subject: [PATCH] Add possiblity to add custom steps with attributes. --- .../CustomStepConfigurationEntityAttribute.cs | 16 ++++++++++ .../AzureDevOpsDownloadSecureFileStep.cs | 30 +++++++++++++++++++ ...reDevOpsDownloadSecureFileStepAttribute.cs | 22 ++++++++++++++ ...ibute=AzurePipelinesAttribute.verified.txt | 6 ++++ .../CI/ConfigurationGenerationTest.cs | 2 ++ .../AzurePipelines/AzurePipelinesAttribute.cs | 10 +++++++ .../AzurePipelineStepAttribute.cs | 15 ++++++++++ .../Configuration/AzurePipelinesStep.cs | 1 + 8 files changed, 102 insertions(+) create mode 100644 source/Nuke.Build/CICD/CustomStepConfigurationEntityAttribute.cs create mode 100644 source/Nuke.Common.Tests/AzurePipelinesAttributes/AzureDevOpsDownloadSecureFileStep.cs create mode 100644 source/Nuke.Common.Tests/AzurePipelinesAttributes/AzureDevOpsDownloadSecureFileStepAttribute.cs create mode 100644 source/Nuke.Common/CI/AzurePipelines/Configuration/AzurePipelineStepAttribute.cs diff --git a/source/Nuke.Build/CICD/CustomStepConfigurationEntityAttribute.cs b/source/Nuke.Build/CICD/CustomStepConfigurationEntityAttribute.cs new file mode 100644 index 000000000..09dfc20c3 --- /dev/null +++ b/source/Nuke.Build/CICD/CustomStepConfigurationEntityAttribute.cs @@ -0,0 +1,16 @@ +// Copyright 2024 Maintainers of NUKE. +// Distributed under the MIT License. +// https://github.com/nuke-build/nuke/blob/master/LICENSE + +using System; +using System.Linq; +using Nuke.Common.Utilities; + +namespace Nuke.Common.CI; + +[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)] +public abstract class CustomStepConfigurationEntityAttribute : Attribute +{ + public abstract T Get(); + +} diff --git a/source/Nuke.Common.Tests/AzurePipelinesAttributes/AzureDevOpsDownloadSecureFileStep.cs b/source/Nuke.Common.Tests/AzurePipelinesAttributes/AzureDevOpsDownloadSecureFileStep.cs new file mode 100644 index 000000000..1d3e0b11a --- /dev/null +++ b/source/Nuke.Common.Tests/AzurePipelinesAttributes/AzureDevOpsDownloadSecureFileStep.cs @@ -0,0 +1,30 @@ +// Copyright 2024 Maintainers of NUKE. +// Distributed under the MIT License. +// https://github.com/nuke-build/nuke/blob/master/LICENSE + +using Nuke.Common.CI.AzurePipelines.Configuration; +using Nuke.Common.Utilities; + +namespace Nuke.Common.Tests.AzurePipelinesAttributes; + +internal sealed class AzureDevOpsDownloadSecureFileStep : AzurePipelinesStep +{ + public AzureDevOpsDownloadSecureFileStep(string fileName) + { + FileName = fileName; + } + + public string FileName { get; } + public override void Write(CustomFileWriter writer) + { + writer.WriteLine("- task: DownloadSecureFile@1"); + using (writer.Indent()) + { + writer.WriteLine("inputs:"); + using (writer.Indent()) + { + writer.WriteLine($"secureFile: '{FileName}'"); + } + } + } +} diff --git a/source/Nuke.Common.Tests/AzurePipelinesAttributes/AzureDevOpsDownloadSecureFileStepAttribute.cs b/source/Nuke.Common.Tests/AzurePipelinesAttributes/AzureDevOpsDownloadSecureFileStepAttribute.cs new file mode 100644 index 000000000..26d578f2e --- /dev/null +++ b/source/Nuke.Common.Tests/AzurePipelinesAttributes/AzureDevOpsDownloadSecureFileStepAttribute.cs @@ -0,0 +1,22 @@ +// Copyright 2024 Maintainers of NUKE. +// Distributed under the MIT License. +// https://github.com/nuke-build/nuke/blob/master/LICENSE + +using Nuke.Common.CI.AzurePipelines.Configuration; + +namespace Nuke.Common.Tests.AzurePipelinesAttributes; + +internal sealed class AzureDevOpsDownloadSecureFileStepAttribute : AzurePipelineStepAttribute +{ + public AzureDevOpsDownloadSecureFileStepAttribute(string fileName) + { + FileName = fileName; + } + + public string FileName { get; } + + public override AzurePipelinesStep Get() + { + return new AzureDevOpsDownloadSecureFileStep(FileName); + } +} diff --git a/source/Nuke.Common.Tests/CI/ConfigurationGenerationTest.Test_testName=null_attribute=AzurePipelinesAttribute.verified.txt b/source/Nuke.Common.Tests/CI/ConfigurationGenerationTest.Test_testName=null_attribute=AzurePipelinesAttribute.verified.txt index 3cd6550cf..236489436 100644 --- a/source/Nuke.Common.Tests/CI/ConfigurationGenerationTest.Test_testName=null_attribute=AzurePipelinesAttribute.verified.txt +++ b/source/Nuke.Common.Tests/CI/ConfigurationGenerationTest.Test_testName=null_attribute=AzurePipelinesAttribute.verified.txt @@ -131,6 +131,9 @@ stages: key: $(Agent.OS) | nuget-packages | **/global.json, **/*.csproj, **/Directory.Packages.props restoreKeys: $(Agent.OS) | nuget-packages path: $(HOME)/.nuget/packages + - task: DownloadSecureFile@1 + inputs: + secureFile: 'securefile.zip' - task: CmdLine@2 displayName: 'Run: Test' inputs: @@ -271,6 +274,9 @@ stages: key: $(Agent.OS) | nuget-packages | **/global.json, **/*.csproj, **/Directory.Packages.props restoreKeys: $(Agent.OS) | nuget-packages path: $(USERPROFILE)/.nuget/packages + - task: DownloadSecureFile@1 + inputs: + secureFile: 'securefile.zip' - task: CmdLine@2 displayName: 'Run: Test' inputs: diff --git a/source/Nuke.Common.Tests/CI/ConfigurationGenerationTest.cs b/source/Nuke.Common.Tests/CI/ConfigurationGenerationTest.cs index c8f5c3146..e65633f72 100644 --- a/source/Nuke.Common.Tests/CI/ConfigurationGenerationTest.cs +++ b/source/Nuke.Common.Tests/CI/ConfigurationGenerationTest.cs @@ -16,6 +16,7 @@ using Nuke.Common.CI.TeamCity; using Nuke.Common.Execution; using Nuke.Common.IO; +using Nuke.Common.Tests.AzurePipelinesAttributes; using Nuke.Common.Tooling; using VerifyXunit; using Xunit; @@ -224,6 +225,7 @@ public class TestBuild : NukeBuild public AbsolutePath TestResultDirectory => OutputDirectory / "test-results"; + [AzureDevOpsDownloadSecureFileStep("securefile.zip")] public Target Test => _ => _ .DependsOn(Compile) .Produces(TestResultDirectory / "*.trx") diff --git a/source/Nuke.Common/CI/AzurePipelines/AzurePipelinesAttribute.cs b/source/Nuke.Common/CI/AzurePipelines/AzurePipelinesAttribute.cs index 05b09523d..1ca6ec2c6 100644 --- a/source/Nuke.Common/CI/AzurePipelines/AzurePipelinesAttribute.cs +++ b/source/Nuke.Common/CI/AzurePipelines/AzurePipelinesAttribute.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Reflection; using JetBrains.Annotations; using Nuke.Common.CI.AzurePipelines.Configuration; using Nuke.Common.Execution; @@ -275,6 +276,15 @@ string GetArtifactPath(AbsolutePath path) // ArtifactRules = rules // }).ToArray(); + var customSteps = executableTarget.Member + .GetCustomAttributes(typeof(AzurePipelineStepAttribute), true) + .ToList(); + + foreach (var customStep in customSteps.Cast()) + { + yield return customStep.Get(); + } + var chainLinkTargets = GetInvokedTargets(executableTarget, relevantTargets).ToArray(); yield return new AzurePipelinesCmdStep { diff --git a/source/Nuke.Common/CI/AzurePipelines/Configuration/AzurePipelineStepAttribute.cs b/source/Nuke.Common/CI/AzurePipelines/Configuration/AzurePipelineStepAttribute.cs new file mode 100644 index 000000000..2d584f532 --- /dev/null +++ b/source/Nuke.Common/CI/AzurePipelines/Configuration/AzurePipelineStepAttribute.cs @@ -0,0 +1,15 @@ +// Copyright 2024 Maintainers of NUKE. +// Distributed under the MIT License. +// https://github.com/nuke-build/nuke/blob/master/LICENSE + +using System; +using System.Linq; +using JetBrains.Annotations; + +namespace Nuke.Common.CI.AzurePipelines.Configuration; + +[PublicAPI] +public abstract class AzurePipelineStepAttribute : CustomStepConfigurationEntityAttribute +{ + +} diff --git a/source/Nuke.Common/CI/AzurePipelines/Configuration/AzurePipelinesStep.cs b/source/Nuke.Common/CI/AzurePipelines/Configuration/AzurePipelinesStep.cs index a5cf00bb5..93bdfab15 100644 --- a/source/Nuke.Common/CI/AzurePipelines/Configuration/AzurePipelinesStep.cs +++ b/source/Nuke.Common/CI/AzurePipelines/Configuration/AzurePipelinesStep.cs @@ -5,6 +5,7 @@ using System; using System.Linq; using JetBrains.Annotations; +using Nuke.Common.Utilities; namespace Nuke.Common.CI.AzurePipelines.Configuration;