210 lines
7.5 KiB
PowerShell

# Build script for GestoreTrimestrale
param(
[string]$LocalWorkspace = "C:\TFS Fideuram\TP_SEI_Project\root",
[switch]$SkipTests,
[switch]$RunApp
)
# Start logging to file
$logFile = Join-Path $PSScriptRoot "arm_build.txt"
Start-Transcript -Path $logFile -Force
# Function to handle errors
function Write-ErrorAndExit {
param([string]$ErrorMessage)
Write-Error $ErrorMessage
Stop-Transcript
exit 1
}
# Validate paths
$AppConfigTest = Join-Path $LocalWorkspace "ContrattoSEI\GestoreTrimestrale.Test\app.config"
$AppConfigApp = Join-Path $LocalWorkspace "ContrattoSEI\GestoreTrimestrale\app.config"
$Solution = Join-Path $LocalWorkspace "ContrattoSEI\GestoreTrimestrale\GestoreTrimestrale.sln"
$TestDll = Join-Path $LocalWorkspace "ContrattoSEI\GestoreTrimestrale.Test\bin\Debug\GestoreTrimestrale.Test.dll"
$ProjectExe = Join-Path $LocalWorkspace "ContrattoSEI\GestoreTrimestrale\bin\Debug\GestoreTrimestrale.exe"
# Check .NET Framework versions and SDK
function Test-NetFramework {
param([string]$Version)
# Check for .NET Framework 4.x installations
$netKey = "HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"
if (-not (Test-Path $netKey)) {
Write-Warning ".NET Framework 4.x runtime not found. Please install from: https://dotnet.microsoft.com/download/dotnet-framework"
return $false
}
# Check for Developer Pack/SDK
$sdkPaths = @(
"${env:ProgramFiles(x86)}\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools",
"${env:ProgramFiles(x86)}\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools",
"${env:ProgramFiles(x86)}\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.1 Tools",
"${env:ProgramFiles(x86)}\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7 Tools",
"${env:ProgramFiles(x86)}\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.2 Tools",
"${env:ProgramFiles(x86)}\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools",
"${env:ProgramFiles(x86)}\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools",
"${env:ProgramFiles(x86)}\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.5.1 Tools",
"${env:ProgramFiles(x86)}\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.5 Tools"
)
$sdkFound = $false
foreach ($path in $sdkPaths) {
if (Test-Path $path) {
Write-Host "Found .NET Framework SDK at: $path" -ForegroundColor Green
$sdkFound = $true
break
}
}
if (-not $sdkFound) {
Write-Warning ".NET Framework Developer Pack/SDK not found. Please install from: https://dotnet.microsoft.com/download/visual-studio-sdks"
return $false
}
return $true
}
$requiredVersions = @("4.0", "4.5")
foreach ($version in $requiredVersions) {
if (-not (Test-NetFramework $version)) {
Write-ErrorAndExit ".NET Framework $version or later is required but not installed. Please install from: https://dotnet.microsoft.com/download/dotnet-framework"
}
}
# Validate Visual Studio 2022 installation
$vsPath = 'C:\Program Files\Microsoft Visual Studio\2022\Enterprise'
if (-not (Test-Path $vsPath)) {
$vsPath = 'C:\Program Files\Microsoft Visual Studio\2022\Professional'
if (-not (Test-Path $vsPath)) {
$vsPath = 'C:\Program Files\Microsoft Visual Studio\2022\Community'
if (-not (Test-Path $vsPath)) {
Write-ErrorAndExit "Visual Studio 2022 not found in any standard installation paths"
}
}
}
Write-Host "Setting up Visual Studio environment..." -ForegroundColor Yellow
try {
# Find development tools
$devEnvPath = Join-Path $vsPath 'Common7\IDE\devenv.com'
$msBuildPath = Join-Path $vsPath 'MSBuild\Current\Bin\MSBuild.exe'
if (-not (Test-Path $msBuildPath)) {
$msBuildPath = Join-Path $vsPath 'MSBuild\Current\Bin\amd64\MSBuild.exe'
if (-not (Test-Path $msBuildPath)) {
Write-ErrorAndExit "MSBuild not found in expected paths"
}
}
# Clean solution first
if (Test-Path $devEnvPath) {
Write-Host "Cleaning solution..." -ForegroundColor Yellow
& $devEnvPath $Solution /Clean
}
# Set up environment
$vcvarsPath = Join-Path $vsPath 'VC\Auxiliary\Build\vcvars64.bat'
$tempFile = [System.IO.Path]::GetTempFileName()
cmd /c "\"$vcvarsPath\" && set > \"$tempFile\""
Get-Content $tempFile | ForEach-Object {
if ($_ -match "=") {
$v = $_.split("=")
Set-Item -Force -Path "ENV:\$($v[0])" -value "$($v[1])"
}
}
Remove-Item $tempFile -ErrorAction SilentlyContinue
} catch {
Write-ErrorAndExit "Failed to set up Visual Studio environment: $_"
}
# Check for Azure DevOps/TFS module
$tfModule = Get-Module -Name "Microsoft.TeamFoundation.PowerShell" -ListAvailable -ErrorAction SilentlyContinue
if ($tfModule) {
try {
Import-Module "Microsoft.TeamFoundation.PowerShell" -ErrorAction Stop
# Update TFS workspace
Write-Host "Updating TFS workspace..." -ForegroundColor Yellow
Update-TfsWorkspace -Force -Recurse $LocalWorkspace
} catch {
Write-Warning "TFS operations will be skipped: $_"
}
} else {
Write-Warning "TFS/Azure DevOps PowerShell module not found. TFS operations will be skipped."
}
# Update configuration files
Write-Host "Updating configuration files..." -ForegroundColor Yellow
try {
if (Test-Path $AppConfigTest) {
(Get-Content $AppConfigTest).replace('c:\', 'c:\') | Set-Content $AppConfigTest
}
if (Test-Path $AppConfigApp) {
(Get-Content $AppConfigApp).replace('c:\', 'c:\') | Set-Content $AppConfigApp
}
} catch {
Write-ErrorAndExit "Failed to update configuration files: $_"
}
# Build solution
Write-Host "Building solution..." -ForegroundColor Yellow
# Download latest NuGet if not found
Write-Host "Setting up NuGet..." -ForegroundColor Yellow
$nugetPath = "$env:LOCALAPPDATA\NuGet\nuget.exe"
if (-not (Test-Path $nugetPath)) {
$nugetFolder = Split-Path $nugetPath -Parent
if (-not (Test-Path $nugetFolder)) {
New-Item -ItemType Directory -Path $nugetFolder | Out-Null
}
Invoke-WebRequest -Uri "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe" -OutFile $nugetPath
}
# Restore and Build
Write-Host "Restoring NuGet packages..." -ForegroundColor Yellow
& $nugetPath restore $Solution
Write-Host "Building solution..." -ForegroundColor Yellow
# Build with original framework versions
$buildOutput = & $msBuildPath $Solution /p:Configuration=Debug /nologo /p:Platform="Any CPU" /t:Clean,Rebuild /m /verbosity:detailed 2>&1
$buildOutput | ForEach-Object { Write-Host $_ }
if ($LASTEXITCODE -ne 0) {
Write-ErrorAndExit "Build failed with exit code: $LASTEXITCODE"
}
# Run tests if not skipped
if (-not $SkipTests) {
Write-Host "Running tests..." -ForegroundColor Yellow
$tests = @(
"FlushFilesWaitingForZIP",
"SetUpZipCases_DoNotUse",
"ProcessCanComplete",
"ZipIntegrity",
"NumberOfPackedPDFIsOK"
)
foreach ($test in $tests) {
Write-Host "Running test: $test" -ForegroundColor Cyan
vstest.console.exe $TestDll /Tests:$test
if ($LASTEXITCODE -ne 0) {
Write-ErrorAndExit "Test '$test' failed with exit code: $LASTEXITCODE"
}
}
}
# Run application if requested
if ($RunApp) {
Write-Host "Launching application..." -ForegroundColor Yellow
try {
Start-Process -FilePath $ProjectExe -Wait
} catch {
Write-ErrorAndExit "Failed to launch application: $_"
}
}
# Stop logging
Stop-Transcript
Write-Host "Build process completed successfully!" -ForegroundColor Green