diff --git a/src/Force-AmendTaggedCommit.bat b/utils/Force-AmendTaggedCommit.bat similarity index 100% rename from src/Force-AmendTaggedCommit.bat rename to utils/Force-AmendTaggedCommit.bat diff --git a/src/Invoke-ReleasePackage.bat b/utils/Invoke-ReleasePackage.bat similarity index 100% rename from src/Invoke-ReleasePackage.bat rename to utils/Invoke-ReleasePackage.bat diff --git a/src/Invoke-TestEngine.bat b/utils/Invoke-TestEngine.bat similarity index 100% rename from src/Invoke-TestEngine.bat rename to utils/Invoke-TestEngine.bat diff --git a/src/Update-RepoUtils.bat b/utils/Update-RepoUtils.bat similarity index 100% rename from src/Update-RepoUtils.bat rename to utils/Update-RepoUtils.bat diff --git a/utils/engines/release/Invoke-ReleasePackage.ps1 b/utils/engines/release/Invoke-ReleasePackage.ps1 new file mode 100644 index 0000000..caf880e --- /dev/null +++ b/utils/engines/release/Invoke-ReleasePackage.ps1 @@ -0,0 +1,80 @@ +#requires -Version 7.0 +#requires -PSEdition Core + +<# +.SYNOPSIS + Plugin-driven release engine entry script. +#> + +$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path +$srcDir = (Resolve-Path (Join-Path $scriptDir '..\..')).Path + +. (Join-Path $srcDir 'modules/Engine/Import-EngineModules.ps1') +Import-EngineModules -Engine Release + +$settings = Get-ScriptSettings -ScriptDir $scriptDir +$configuredPlugins = Get-ConfiguredPlugins -Settings $settings + +Write-Log -Level 'STEP' -Message '==================================================' +Write-Log -Level 'STEP' -Message 'RELEASE ENGINE' +Write-Log -Level 'STEP' -Message '==================================================' + +$plugins = $configuredPlugins +$engineContext = New-EngineContext -Plugins $plugins -ScriptDir $scriptDir -SrcDir $srcDir -Settings $settings +Write-Log -Level 'OK' -Message 'All pre-flight checks passed!' +$sharedPluginSettings = $engineContext + +$releaseStageInitialized = $false +$releaseHadPluginFailures = $false + +if ($plugins.Count -eq 0) { + Write-Log -Level 'WARN' -Message 'No plugins configured in scriptSettings.json.' +} +else { + for ($pluginIndex = 0; $pluginIndex -lt $plugins.Count; $pluginIndex++) { + $plugin = $plugins[$pluginIndex] + + if ((Test-IsPublishPlugin -Plugin $plugin) -and -not $releaseStageInitialized) { + if (Test-PluginRunnable -Plugin $plugin -SharedSettings $sharedPluginSettings -EngineDirectory $scriptDir -WriteLogs:$false) { + $remainingPlugins = @($plugins[$pluginIndex..($plugins.Count - 1)]) + Initialize-ReleaseStageContext -RemainingPlugins $remainingPlugins -SharedSettings $sharedPluginSettings -ArtifactsDirectory $engineContext.artifactsDirectory -Version $engineContext.version + $releaseStageInitialized = $true + } + } + + $pluginSucceeded = Invoke-ConfiguredPlugin -Plugin $plugin -SharedSettings $sharedPluginSettings -EngineDirectory $scriptDir -ContinueOnError:$false + if (-not $pluginSucceeded) { + $releaseHadPluginFailures = $true + break + } + } +} + +if (-not $releaseStageInitialized) { + $noReleasePluginsLogLevel = if ($engineContext.isNonReleaseBranch) { 'INFO' } else { 'WARN' } + Write-Log -Level $noReleasePluginsLogLevel -Message 'No release-stage initialization ran (no enabled publish plugins reached, or none runnable).' +} + +Write-Log -Level 'OK' -Message '==================================================' +if ($releaseHadPluginFailures) { + Write-Log -Level 'ERROR' -Message 'RELEASE FAILED' +} +elseif ($engineContext.PSObject.Properties.Name -contains 'skipPublishPlugins' -and $engineContext.skipPublishPlugins) { + Write-Log -Level 'OK' -Message 'RUN COMPLETE (publish skipped by ReleasePublishGuard)' +} +elseif ($engineContext.isNonReleaseBranch) { + Write-Log -Level 'OK' -Message 'NON-RELEASE RUN COMPLETE' +} +else { + Write-Log -Level 'OK' -Message 'RELEASE COMPLETE' +} +Write-Log -Level 'OK' -Message '==================================================' + +if ($engineContext.isNonReleaseBranch -and -not ($engineContext.PSObject.Properties.Name -contains 'skipPublishPlugins' -and $engineContext.skipPublishPlugins)) { + $preferredReleaseBranch = Get-PreferredReleaseBranch -EngineContext $engineContext + Write-Log -Level 'INFO' -Message "For publish, use an allowed branch (see ReleasePublishGuard.branches), e.g. '$preferredReleaseBranch', and satisfy the guard requirements." +} + +if ($releaseHadPluginFailures) { + exit 1 +} diff --git a/utils/engines/release/custom/.gitkeep b/utils/engines/release/custom/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/utils/engines/release/custom/.gitkeep @@ -0,0 +1 @@ + diff --git a/utils/engines/release/scriptSettings.json b/utils/engines/release/scriptSettings.json new file mode 100644 index 0000000..12c9b66 --- /dev/null +++ b/utils/engines/release/scriptSettings.json @@ -0,0 +1,133 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Release Package Script Settings", + "description": "Invoke-ReleasePackage.ps1 plugin settings for maksit-dapr.", + "plugins": [ + { + "name": "DotNetReleaseVersion", + "stageLabel": "build", + "enabled": true, + "projectFiles": [ + "..\\..\\..\\src\\MaksIT.Dapr\\MaksIT.Dapr.csproj" + ] + }, + { + "name": "DotNetTest", + "stageLabel": "test", + "enabled": true, + "project": "..\\..\\..\\src\\MaksIT.Dapr.Tests", + "resultsDir": "..\\..\\..\\testResults" + }, + { + "name": "QualityGate", + "stageLabel": "qualityGate", + "enabled": true, + "coverageThreshold": 0, + "failOnVulnerabilities": true, + "projectFiles": [ + "..\\..\\..\\src\\MaksIT.Dapr\\MaksIT.Dapr.csproj" + ] + }, + { + "name": "DotNetPack", + "stageLabel": "build", + "enabled": true, + "projectFiles": [ + "..\\..\\..\\src\\MaksIT.Dapr\\MaksIT.Dapr.csproj" + ], + "artifactsDir": "..\\..\\..\\release" + }, + { + "name": "DotNetCreateArchive", + "stageLabel": "build", + "enabled": true, + "zipNamePattern": "maksit.dapr-{version}.zip" + }, + { + "name": "ReleasePublishGuard", + "stageLabel": "release", + "enabled": true, + "branches": [ + "main" + ], + "requireExactTagOnHead": true, + "tagVersionMustMatchDotNetRelease": true, + "whenRequirementsNotMet": "skip", + "requireCleanWorkingTree": false, + "ensureTagOnRemote": true, + "remoteName": "origin" + }, + { + "name": "GitHub", + "stageLabel": "release", + "enabled": true, + "githubToken": "GITHUB_MAKS_IT_COM", + "repository": "https://github.com/MAKS-IT-COM/maksit-core-dapr", + "releaseNotesFile": "..\\..\\..\\CHANGELOG.md", + "releaseTitlePattern": "Release {version}" + }, + { + "name": "DotNetNuGet", + "stageLabel": "release", + "enabled": true, + "nugetApiKey": "NUGET_MAKS_IT", + "source": "https://api.nuget.org/v3/index.json" + }, + { + "name": "NpmReleaseVersion", + "stageLabel": "build", + "enabled": false, + "packageJsonPath": "..\\..\\..\\src\\package.json", + "syncWorkspaceVersions": true + }, + { + "name": "NpmBuild", + "stageLabel": "build", + "enabled": false, + "workspaceRoot": "..\\..\\..\\src", + "useCi": true, + "buildScript": "build" + }, + { + "name": "NpmPublish", + "stageLabel": "release", + "enabled": false, + "npmApiKey": "NPMJS_MAKS_IT", + "registry": "https://registry.npmjs.org", + "access": "public", + "workspaceRoot": "..\\..\\..\\src", + "publishOrder": [] + }, + { + "name": "DotNetDockerPush", + "stageLabel": "release", + "enabled": false, + "registryUrl": "cr.maks-it.com", + "credentialsEnvVar": "CR_MAKS_IT", + "projectName": "my-service", + "contextPath": "..\\..\\..\\src", + "pushLatest": true, + "images": [] + }, + { + "name": "DotNetHelmPush", + "stageLabel": "release", + "enabled": false, + "chartPath": "..\\..\\..\\helm\\my-service", + "ociRepository": "oci://cr.maks-it.com/charts", + "credentialsEnvVar": "CR_MAKS_IT", + "pushLatest": false + }, + { + "name": "DotNetCleanupArtifacts", + "stageLabel": "release", + "enabled": true, + "includePatterns": [ + "*" + ], + "excludePatterns": [ + "*.zip" + ] + } + ] +} diff --git a/src/engines/test/Invoke-TestEngine.ps1 b/utils/engines/test/Invoke-TestEngine.ps1 similarity index 100% rename from src/engines/test/Invoke-TestEngine.ps1 rename to utils/engines/test/Invoke-TestEngine.ps1 diff --git a/src/engines/test/custom/.gitkeep b/utils/engines/test/custom/.gitkeep similarity index 100% rename from src/engines/test/custom/.gitkeep rename to utils/engines/test/custom/.gitkeep diff --git a/src/engines/test/scriptSettings.json b/utils/engines/test/scriptSettings.json similarity index 100% rename from src/engines/test/scriptSettings.json rename to utils/engines/test/scriptSettings.json diff --git a/src/modules/ChangelogSupport.psm1 b/utils/modules/ChangelogSupport.psm1 similarity index 100% rename from src/modules/ChangelogSupport.psm1 rename to utils/modules/ChangelogSupport.psm1 diff --git a/src/modules/Engine/EngineContext.psm1 b/utils/modules/Engine/EngineContext.psm1 similarity index 100% rename from src/modules/Engine/EngineContext.psm1 rename to utils/modules/Engine/EngineContext.psm1 diff --git a/src/modules/Engine/Import-EngineModules.ps1 b/utils/modules/Engine/Import-EngineModules.ps1 similarity index 100% rename from src/modules/Engine/Import-EngineModules.ps1 rename to utils/modules/Engine/Import-EngineModules.ps1 diff --git a/src/modules/Engine/PluginSupport.psm1 b/utils/modules/Engine/PluginSupport.psm1 similarity index 100% rename from src/modules/Engine/PluginSupport.psm1 rename to utils/modules/Engine/PluginSupport.psm1 diff --git a/src/modules/Engine/ReleaseSupport.psm1 b/utils/modules/Engine/ReleaseSupport.psm1 similarity index 100% rename from src/modules/Engine/ReleaseSupport.psm1 rename to utils/modules/Engine/ReleaseSupport.psm1 diff --git a/src/modules/Engine/TestSupport.psm1 b/utils/modules/Engine/TestSupport.psm1 similarity index 100% rename from src/modules/Engine/TestSupport.psm1 rename to utils/modules/Engine/TestSupport.psm1 diff --git a/src/modules/GitTools.psm1 b/utils/modules/GitTools.psm1 similarity index 100% rename from src/modules/GitTools.psm1 rename to utils/modules/GitTools.psm1 diff --git a/src/modules/Logging.psm1 b/utils/modules/Logging.psm1 similarity index 100% rename from src/modules/Logging.psm1 rename to utils/modules/Logging.psm1 diff --git a/src/modules/ScriptConfig.psm1 b/utils/modules/ScriptConfig.psm1 similarity index 100% rename from src/modules/ScriptConfig.psm1 rename to utils/modules/ScriptConfig.psm1 diff --git a/src/modules/TestRunner.psm1 b/utils/modules/TestRunner.psm1 similarity index 100% rename from src/modules/TestRunner.psm1 rename to utils/modules/TestRunner.psm1 diff --git a/src/plugins/DotNet/DotNetCleanupArtifacts.psm1 b/utils/plugins/DotNet/DotNetCleanupArtifacts.psm1 similarity index 100% rename from src/plugins/DotNet/DotNetCleanupArtifacts.psm1 rename to utils/plugins/DotNet/DotNetCleanupArtifacts.psm1 diff --git a/src/plugins/DotNet/DotNetCreateArchive.psm1 b/utils/plugins/DotNet/DotNetCreateArchive.psm1 similarity index 100% rename from src/plugins/DotNet/DotNetCreateArchive.psm1 rename to utils/plugins/DotNet/DotNetCreateArchive.psm1 diff --git a/src/plugins/DotNet/DotNetDockerPush.psm1 b/utils/plugins/DotNet/DotNetDockerPush.psm1 similarity index 100% rename from src/plugins/DotNet/DotNetDockerPush.psm1 rename to utils/plugins/DotNet/DotNetDockerPush.psm1 diff --git a/src/plugins/DotNet/DotNetHelmPush.psm1 b/utils/plugins/DotNet/DotNetHelmPush.psm1 similarity index 100% rename from src/plugins/DotNet/DotNetHelmPush.psm1 rename to utils/plugins/DotNet/DotNetHelmPush.psm1 diff --git a/src/plugins/DotNet/DotNetNuGet.psm1 b/utils/plugins/DotNet/DotNetNuGet.psm1 similarity index 100% rename from src/plugins/DotNet/DotNetNuGet.psm1 rename to utils/plugins/DotNet/DotNetNuGet.psm1 diff --git a/src/plugins/DotNet/DotNetPack.psm1 b/utils/plugins/DotNet/DotNetPack.psm1 similarity index 100% rename from src/plugins/DotNet/DotNetPack.psm1 rename to utils/plugins/DotNet/DotNetPack.psm1 diff --git a/src/plugins/DotNet/DotNetPublish.psm1 b/utils/plugins/DotNet/DotNetPublish.psm1 similarity index 100% rename from src/plugins/DotNet/DotNetPublish.psm1 rename to utils/plugins/DotNet/DotNetPublish.psm1 diff --git a/src/plugins/DotNet/DotNetReleaseVersion.psm1 b/utils/plugins/DotNet/DotNetReleaseVersion.psm1 similarity index 100% rename from src/plugins/DotNet/DotNetReleaseVersion.psm1 rename to utils/plugins/DotNet/DotNetReleaseVersion.psm1 diff --git a/src/plugins/DotNet/DotNetTest.psm1 b/utils/plugins/DotNet/DotNetTest.psm1 similarity index 100% rename from src/plugins/DotNet/DotNetTest.psm1 rename to utils/plugins/DotNet/DotNetTest.psm1 diff --git a/src/plugins/Npm/NpmBuild.psm1 b/utils/plugins/Npm/NpmBuild.psm1 similarity index 100% rename from src/plugins/Npm/NpmBuild.psm1 rename to utils/plugins/Npm/NpmBuild.psm1 diff --git a/src/plugins/Npm/NpmJestTest.psm1 b/utils/plugins/Npm/NpmJestTest.psm1 similarity index 100% rename from src/plugins/Npm/NpmJestTest.psm1 rename to utils/plugins/Npm/NpmJestTest.psm1 diff --git a/src/plugins/Npm/NpmPublish.psm1 b/utils/plugins/Npm/NpmPublish.psm1 similarity index 100% rename from src/plugins/Npm/NpmPublish.psm1 rename to utils/plugins/Npm/NpmPublish.psm1 diff --git a/src/plugins/Npm/NpmReleaseVersion.psm1 b/utils/plugins/Npm/NpmReleaseVersion.psm1 similarity index 100% rename from src/plugins/Npm/NpmReleaseVersion.psm1 rename to utils/plugins/Npm/NpmReleaseVersion.psm1 diff --git a/src/plugins/Platform/CoverageBadges.psm1 b/utils/plugins/Platform/CoverageBadges.psm1 similarity index 100% rename from src/plugins/Platform/CoverageBadges.psm1 rename to utils/plugins/Platform/CoverageBadges.psm1 diff --git a/src/plugins/Platform/GitHub.psm1 b/utils/plugins/Platform/GitHub.psm1 similarity index 100% rename from src/plugins/Platform/GitHub.psm1 rename to utils/plugins/Platform/GitHub.psm1 diff --git a/src/plugins/Platform/QualityGate.psm1 b/utils/plugins/Platform/QualityGate.psm1 similarity index 100% rename from src/plugins/Platform/QualityGate.psm1 rename to utils/plugins/Platform/QualityGate.psm1 diff --git a/src/plugins/Platform/ReleasePublishGuard.psm1 b/utils/plugins/Platform/ReleasePublishGuard.psm1 similarity index 100% rename from src/plugins/Platform/ReleasePublishGuard.psm1 rename to utils/plugins/Platform/ReleasePublishGuard.psm1 diff --git a/src/tools/Force-AmendTaggedCommit/Force-AmendTaggedCommit.ps1 b/utils/tools/Force-AmendTaggedCommit/Force-AmendTaggedCommit.ps1 similarity index 100% rename from src/tools/Force-AmendTaggedCommit/Force-AmendTaggedCommit.ps1 rename to utils/tools/Force-AmendTaggedCommit/Force-AmendTaggedCommit.ps1 diff --git a/src/tools/Force-AmendTaggedCommit/scriptSettings.json b/utils/tools/Force-AmendTaggedCommit/scriptSettings.json similarity index 100% rename from src/tools/Force-AmendTaggedCommit/scriptSettings.json rename to utils/tools/Force-AmendTaggedCommit/scriptSettings.json diff --git a/src/tools/Update-RepoUtils/Update-RepoUtils.ps1 b/utils/tools/Update-RepoUtils/Update-RepoUtils.ps1 similarity index 100% rename from src/tools/Update-RepoUtils/Update-RepoUtils.ps1 rename to utils/tools/Update-RepoUtils/Update-RepoUtils.ps1 diff --git a/src/tools/Update-RepoUtils/scriptSettings.json b/utils/tools/Update-RepoUtils/scriptSettings.json similarity index 100% rename from src/tools/Update-RepoUtils/scriptSettings.json rename to utils/tools/Update-RepoUtils/scriptSettings.json