mirror of
https://github.com/Grace-Solutions/PSMinIO.git
synced 2026-07-26 14:58:13 +00:00
90c64d3237
- Reorganized project structure with proper directory separation: * All scripts moved to scripts/ directory (including examples) * All documentation moved to docs/ directory (except README.md) * Centralized version management in Version.ps1 - Implemented centralized version management system: * Version.ps1 provides single source of truth for version information * Automatic yyyy.MM.dd.HHmm versioning based on build time * scripts/Update-Version.ps1 updates all version references * src/Properties/AssemblyInfo.cs for assembly version information - Enhanced build system: * scripts/Build.ps1 - Full build with validation and packaging * scripts/Quick-Build.ps1 - Fast build handling file locking issues * Removed automatic copy from project file to avoid locking * Integrated version updates into build process - Updated PowerShell Gallery publishing: * scripts/Publish-PSMinIOToGallery.ps1 updated for new structure * docs/POWERSHELL-GALLERY-RELEASE.md comprehensive publishing guide * Module manifest updated with proper metadata and release notes - Updated all documentation and examples: * README.md updated with PowerShell Gallery installation * All example scripts updated with correct import paths * scripts/examples/README.md updated for new location * docs/PROJECT-STRUCTURE.md documents new organization - Version updated to 2025.07.11.1151 with centralized management - All import paths corrected for new structure - Professional project organization following PowerShell best practices
245 lines
7.9 KiB
PowerShell
245 lines
7.9 KiB
PowerShell
# PowerShell Gallery Release Script for PSMinIO
|
||
# This script prepares and publishes the PSMinIO module to PowerShell Gallery
|
||
|
||
[CmdletBinding()]
|
||
param(
|
||
[Parameter(Mandatory = $false)]
|
||
[string]$NuGetApiKey,
|
||
|
||
[Parameter(Mandatory = $false)]
|
||
[switch]$WhatIf,
|
||
|
||
[Parameter(Mandatory = $false)]
|
||
[switch]$Force,
|
||
|
||
[Parameter(Mandatory = $false)]
|
||
[string]$Repository = "PSGallery"
|
||
)
|
||
|
||
# Set error action preference
|
||
$ErrorActionPreference = "Stop"
|
||
|
||
# Define paths
|
||
$ProjectRoot = Split-Path $PSScriptRoot -Parent
|
||
$ModulePath = Join-Path $ProjectRoot "Module\PSMinIO"
|
||
$ManifestPath = Join-Path $ModulePath "PSMinIO.psd1"
|
||
$PublishPath = Join-Path $ProjectRoot "Publish"
|
||
|
||
function Write-Status {
|
||
param([string]$Message, [string]$Type = "Info")
|
||
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
|
||
switch ($Type) {
|
||
"Success" { Write-Host "[$timestamp] ✅ $Message" -ForegroundColor Green }
|
||
"Warning" { Write-Host "[$timestamp] ⚠️ $Message" -ForegroundColor Yellow }
|
||
"Error" { Write-Host "[$timestamp] ❌ $Message" -ForegroundColor Red }
|
||
default { Write-Host "[$timestamp] ℹ️ $Message" -ForegroundColor Cyan }
|
||
}
|
||
}
|
||
|
||
function Test-ModuleStructure {
|
||
Write-Status "Validating module structure..."
|
||
|
||
# Check if manifest exists
|
||
if (-not (Test-Path $ManifestPath)) {
|
||
throw "Module manifest not found at: $ManifestPath"
|
||
}
|
||
|
||
# Test manifest
|
||
try {
|
||
$manifest = Test-ModuleManifest -Path $ManifestPath -ErrorAction Stop
|
||
Write-Status "Module manifest is valid" "Success"
|
||
Write-Status "Module: $($manifest.Name) v$($manifest.Version)"
|
||
Write-Status "Author: $($manifest.Author)"
|
||
Write-Status "Description: $($manifest.Description)"
|
||
return $manifest
|
||
} catch {
|
||
throw "Module manifest validation failed: $($_.Exception.Message)"
|
||
}
|
||
}
|
||
|
||
function Test-RequiredFiles {
|
||
param($Manifest)
|
||
|
||
Write-Status "Checking required files..."
|
||
|
||
$requiredFiles = @(
|
||
"bin\PSMinIO.dll",
|
||
"bin\Minio.dll",
|
||
"types\PSMinIO.Types.ps1xml",
|
||
"types\PSMinIO.Format.ps1xml"
|
||
)
|
||
|
||
foreach ($file in $requiredFiles) {
|
||
$filePath = Join-Path $ModulePath $file
|
||
if (-not (Test-Path $filePath)) {
|
||
throw "Required file missing: $file"
|
||
}
|
||
Write-Status "✓ Found: $file"
|
||
}
|
||
|
||
Write-Status "All required files present" "Success"
|
||
}
|
||
|
||
function Test-ModuleFunctionality {
|
||
Write-Status "Testing module functionality..."
|
||
|
||
try {
|
||
# Import the module
|
||
Import-Module $ManifestPath -Force -ErrorAction Stop
|
||
Write-Status "✓ Module imported successfully"
|
||
|
||
# Test cmdlet availability
|
||
$expectedCmdlets = @(
|
||
'Connect-MinIO',
|
||
'Get-MinIOBucket',
|
||
'New-MinIOBucket',
|
||
'Remove-MinIOBucket',
|
||
'Test-MinIOBucketExists',
|
||
'Get-MinIOObject',
|
||
'New-MinIOObject',
|
||
'New-MinIOObjectChunked',
|
||
'New-MinIOFolder',
|
||
'Get-MinIOObjectContent',
|
||
'Get-MinIOObjectContentChunked',
|
||
'Remove-MinIOObject',
|
||
'Get-MinIOBucketPolicy',
|
||
'Set-MinIOBucketPolicy',
|
||
'Get-MinIOStats'
|
||
)
|
||
|
||
$availableCmdlets = Get-Command -Module PSMinIO | Select-Object -ExpandProperty Name
|
||
|
||
foreach ($cmdlet in $expectedCmdlets) {
|
||
if ($cmdlet -in $availableCmdlets) {
|
||
Write-Status "✓ Cmdlet available: $cmdlet"
|
||
} else {
|
||
throw "Expected cmdlet not found: $cmdlet"
|
||
}
|
||
}
|
||
|
||
Write-Status "All expected cmdlets are available" "Success"
|
||
|
||
# Remove module
|
||
Remove-Module PSMinIO -Force -ErrorAction SilentlyContinue
|
||
|
||
} catch {
|
||
throw "Module functionality test failed: $($_.Exception.Message)"
|
||
}
|
||
}
|
||
|
||
function Prepare-PublishDirectory {
|
||
param($Manifest)
|
||
|
||
Write-Status "Preparing publish directory..."
|
||
|
||
# Clean and create publish directory
|
||
if (Test-Path $PublishPath) {
|
||
Remove-Item $PublishPath -Recurse -Force
|
||
}
|
||
New-Item -ItemType Directory -Path $PublishPath -Force | Out-Null
|
||
|
||
# Create module directory in publish path
|
||
$publishModulePath = Join-Path $PublishPath "PSMinIO"
|
||
New-Item -ItemType Directory -Path $publishModulePath -Force | Out-Null
|
||
|
||
# Copy module files
|
||
Copy-Item -Path "$ModulePath\*" -Destination $publishModulePath -Recurse -Force
|
||
|
||
Write-Status "Module prepared in: $publishModulePath" "Success"
|
||
return $publishModulePath
|
||
}
|
||
|
||
function Test-PowerShellGalleryConnection {
|
||
Write-Status "Testing PowerShell Gallery connection..."
|
||
|
||
try {
|
||
$repo = Get-PSRepository -Name $Repository -ErrorAction Stop
|
||
Write-Status "✓ Repository '$Repository' is available"
|
||
Write-Status " Source: $($repo.SourceLocation)"
|
||
Write-Status " Publish: $($repo.PublishLocation)"
|
||
|
||
if ($repo.InstallationPolicy -eq "Untrusted") {
|
||
Write-Status "Repository is marked as Untrusted - this is normal for PSGallery" "Warning"
|
||
}
|
||
|
||
} catch {
|
||
throw "Failed to connect to repository '$Repository': $($_.Exception.Message)"
|
||
}
|
||
}
|
||
|
||
function Publish-ModuleToGallery {
|
||
param($PublishModulePath, $Manifest)
|
||
|
||
if ($WhatIf) {
|
||
Write-Status "WhatIf: Would publish module to PowerShell Gallery" "Warning"
|
||
Write-Status "Module: $($Manifest.Name) v$($Manifest.Version)"
|
||
Write-Status "Path: $PublishModulePath"
|
||
Write-Status "Repository: $Repository"
|
||
return
|
||
}
|
||
|
||
if (-not $NuGetApiKey) {
|
||
Write-Status "NuGetApiKey not provided. Please provide your PowerShell Gallery API key." "Warning"
|
||
$NuGetApiKey = Read-Host -Prompt "Enter your PowerShell Gallery API Key" -AsSecureString
|
||
$NuGetApiKey = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($NuGetApiKey))
|
||
}
|
||
|
||
Write-Status "Publishing module to PowerShell Gallery..."
|
||
|
||
try {
|
||
$publishParams = @{
|
||
Path = $PublishModulePath
|
||
Repository = $Repository
|
||
NuGetApiKey = $NuGetApiKey
|
||
Force = $Force
|
||
Verbose = $true
|
||
}
|
||
|
||
Publish-Module @publishParams
|
||
|
||
Write-Status "Module published successfully!" "Success"
|
||
Write-Status "It may take a few minutes to appear in search results"
|
||
|
||
} catch {
|
||
throw "Failed to publish module: $($_.Exception.Message)"
|
||
}
|
||
}
|
||
|
||
# Main execution
|
||
try {
|
||
Write-Status "Starting PowerShell Gallery release process for PSMinIO"
|
||
Write-Status "Repository: $Repository"
|
||
Write-Status "WhatIf: $WhatIf"
|
||
|
||
# Step 1: Validate module structure
|
||
$manifest = Test-ModuleStructure
|
||
|
||
# Step 2: Check required files
|
||
Test-RequiredFiles -Manifest $manifest
|
||
|
||
# Step 3: Test module functionality
|
||
Test-ModuleFunctionality
|
||
|
||
# Step 4: Test PowerShell Gallery connection
|
||
Test-PowerShellGalleryConnection
|
||
|
||
# Step 5: Prepare publish directory
|
||
$publishModulePath = Prepare-PublishDirectory -Manifest $manifest
|
||
|
||
# Step 6: Final validation of prepared module
|
||
Write-Status "Final validation of prepared module..."
|
||
$finalManifest = Test-ModuleManifest -Path (Join-Path $publishModulePath "PSMinIO.psd1")
|
||
Write-Status "Final validation successful" "Success"
|
||
|
||
# Step 7: Publish to gallery
|
||
Publish-ModuleToGallery -PublishModulePath $publishModulePath -Manifest $finalManifest
|
||
|
||
Write-Status "PowerShell Gallery release process completed successfully!" "Success"
|
||
Write-Status "Module: PSMinIO v$($finalManifest.Version)"
|
||
Write-Status "Check status at: https://www.powershellgallery.com/packages/PSMinIO"
|
||
|
||
} catch {
|
||
Write-Status "Release process failed: $($_.Exception.Message)" "Error"
|
||
exit 1
|
||
}
|