mirror of
https://github.com/MAKS-IT-COM/uscheduler.git
synced 2026-04-01 00:32:10 +02:00
166 lines
5.5 KiB
PowerShell
166 lines
5.5 KiB
PowerShell
#requires -Version 7.0
|
|
#requires -PSEdition Core
|
|
|
|
if (-not (Get-Command Write-Log -ErrorAction SilentlyContinue)) {
|
|
$loggingModulePath = Join-Path (Split-Path $PSScriptRoot -Parent) "Logging.psm1"
|
|
if (Test-Path $loggingModulePath -PathType Leaf) {
|
|
Import-Module $loggingModulePath -Force
|
|
}
|
|
}
|
|
|
|
if (-not (Get-Command Get-CurrentBranch -ErrorAction SilentlyContinue)) {
|
|
$gitToolsModulePath = Join-Path (Split-Path $PSScriptRoot -Parent) "GitTools.psm1"
|
|
if (Test-Path $gitToolsModulePath -PathType Leaf) {
|
|
Import-Module $gitToolsModulePath -Force
|
|
}
|
|
}
|
|
|
|
if (-not (Get-Command Get-PluginStage -ErrorAction SilentlyContinue) -or -not (Get-Command Test-IsPublishPlugin -ErrorAction SilentlyContinue)) {
|
|
$pluginSupportModulePath = Join-Path $PSScriptRoot "PluginSupport.psm1"
|
|
if (Test-Path $pluginSupportModulePath -PathType Leaf) {
|
|
Import-Module $pluginSupportModulePath -Force
|
|
}
|
|
}
|
|
|
|
if (-not (Get-Command New-DotNetReleaseContext -ErrorAction SilentlyContinue)) {
|
|
$dotNetProjectSupportModulePath = Join-Path $PSScriptRoot "DotNetProjectSupport.psm1"
|
|
if (Test-Path $dotNetProjectSupportModulePath -PathType Leaf) {
|
|
Import-Module $dotNetProjectSupportModulePath -Force
|
|
}
|
|
}
|
|
|
|
function Assert-WorkingTreeClean {
|
|
param(
|
|
[Parameter(Mandatory = $true)]
|
|
[bool]$IsReleaseBranch
|
|
)
|
|
|
|
$gitStatus = Get-GitStatusShort
|
|
if ($gitStatus) {
|
|
if ($IsReleaseBranch) {
|
|
Write-Error "Working directory has uncommitted changes. Commit or stash them before releasing."
|
|
Write-Log -Level "WARN" -Message "Uncommitted files:"
|
|
$gitStatus | ForEach-Object { Write-Log -Level "WARN" -Message " $_" }
|
|
exit 1
|
|
}
|
|
|
|
Write-Log -Level "WARN" -Message " Uncommitted changes detected (allowed on dev branch)."
|
|
return
|
|
}
|
|
|
|
Write-Log -Level "OK" -Message " Working directory is clean."
|
|
}
|
|
|
|
function Initialize-ReleaseStageContext {
|
|
param(
|
|
[Parameter(Mandatory = $true)]
|
|
[object[]]$RemainingPlugins,
|
|
|
|
[Parameter(Mandatory = $true)]
|
|
[psobject]$SharedSettings,
|
|
|
|
[Parameter(Mandatory = $true)]
|
|
[string]$ArtifactsDirectory,
|
|
|
|
[Parameter(Mandatory = $true)]
|
|
[string]$Version
|
|
)
|
|
|
|
Write-Log -Level "STEP" -Message "Verifying tag is pushed to remote..."
|
|
$remoteTagExists = Test-RemoteTagExists -Tag $SharedSettings.Tag -Remote "origin"
|
|
if (-not $remoteTagExists) {
|
|
Write-Log -Level "WARN" -Message " Tag $($SharedSettings.Tag) not found on remote. Pushing..."
|
|
Push-TagToRemote -Tag $SharedSettings.Tag -Remote "origin"
|
|
}
|
|
else {
|
|
Write-Log -Level "OK" -Message " Tag exists on remote."
|
|
}
|
|
|
|
if (-not $SharedSettings.PSObject.Properties['ReleaseDir'] -or [string]::IsNullOrWhiteSpace([string]$SharedSettings.ReleaseDir)) {
|
|
$SharedSettings | Add-Member -NotePropertyName ReleaseDir -NotePropertyValue $ArtifactsDirectory -Force
|
|
}
|
|
}
|
|
|
|
function New-EngineContext {
|
|
param(
|
|
[Parameter(Mandatory = $true)]
|
|
[object[]]$Plugins,
|
|
|
|
[Parameter(Mandatory = $true)]
|
|
[string]$ScriptDir,
|
|
|
|
[Parameter(Mandatory = $true)]
|
|
[string]$UtilsDir
|
|
)
|
|
|
|
$dotNetContext = New-DotNetReleaseContext -Plugins $Plugins -ScriptDir $ScriptDir
|
|
|
|
$currentBranch = Get-CurrentBranch
|
|
$releaseBranches = @(
|
|
$Plugins |
|
|
Where-Object { Test-IsPublishPlugin -Plugin $_ } |
|
|
ForEach-Object { Get-PluginBranches -Plugin $_ } |
|
|
Where-Object { -not [string]::IsNullOrWhiteSpace($_) } |
|
|
Select-Object -Unique
|
|
)
|
|
|
|
$isReleaseBranch = $releaseBranches -contains $currentBranch
|
|
$isNonReleaseBranch = -not $isReleaseBranch
|
|
|
|
Assert-WorkingTreeClean -IsReleaseBranch:$isReleaseBranch
|
|
|
|
$version = $dotNetContext.Version
|
|
|
|
if ($isReleaseBranch) {
|
|
$tag = Get-CurrentCommitTag -Version $version
|
|
|
|
if ($tag -notmatch '^v(\d+\.\d+\.\d+)$') {
|
|
Write-Error "Tag '$tag' does not match expected format 'vX.Y.Z' (e.g., v$version)."
|
|
exit 1
|
|
}
|
|
|
|
$tagVersion = $Matches[1]
|
|
if ($tagVersion -ne $version) {
|
|
Write-Error "Tag version ($tagVersion) does not match the project version ($version)."
|
|
Write-Log -Level "WARN" -Message " Either update the tag or the project version."
|
|
exit 1
|
|
}
|
|
|
|
Write-Log -Level "OK" -Message " Tag found: $tag (matches project version)"
|
|
}
|
|
else {
|
|
$tag = "v$version"
|
|
Write-Log -Level "INFO" -Message " Using version from the package project (no tag required on non-release branches)."
|
|
}
|
|
|
|
return [pscustomobject]@{
|
|
ScriptDir = $ScriptDir
|
|
UtilsDir = $UtilsDir
|
|
CurrentBranch = $currentBranch
|
|
Version = $version
|
|
Tag = $tag
|
|
ProjectFiles = $dotNetContext.ProjectFiles
|
|
ArtifactsDirectory = $dotNetContext.ArtifactsDirectory
|
|
IsReleaseBranch = $isReleaseBranch
|
|
IsNonReleaseBranch = $isNonReleaseBranch
|
|
ReleaseBranches = $releaseBranches
|
|
NonReleaseBranches = @()
|
|
PublishCompleted = $false
|
|
}
|
|
}
|
|
|
|
function Get-PreferredReleaseBranch {
|
|
param(
|
|
[Parameter(Mandatory = $true)]
|
|
[psobject]$EngineContext
|
|
)
|
|
|
|
if ($EngineContext.ReleaseBranches.Count -gt 0) {
|
|
return $EngineContext.ReleaseBranches[0]
|
|
}
|
|
|
|
return "main"
|
|
}
|
|
|
|
Export-ModuleMember -Function Assert-WorkingTreeClean, Initialize-ReleaseStageContext, New-EngineContext, Get-PreferredReleaseBranch
|