<# .NOTES =========================================================================== Created with: SAPIEN Technologies, Inc., PowerShell Studio 2019 v5.6.157 Created on: 3/14/2025 12:29 PM Created by: danielc Organization: Filename: =========================================================================== .DESCRIPTION A description of the file. #> function Start-IISAppRemote { param ( [string]$RemoteServer = "KCI-APP01", # Remote machine name or IP [string]$AppPoolName = "Tracking", [string]$SiteName = "Tracking", # Optional username [string]$CredentialUser = "", [securestring]$CredentialPassword # Optional password ) # Create credentials if username and password are provided if ($CredentialUser -and $CredentialPassword) { $Credential = New-Object System.Management.Automation.PSCredential ($CredentialUser, $CredentialPassword) } else { $Credential = $null } # Define script block for remote execution $ScriptBlock = { param ($AppPoolName, $SiteName) Import-Module WebAdministration -ErrorAction Stop Write-Host "Starting IIS Application Pool: $AppPoolName" if ((Get-WebAppPoolState -Name $AppPoolName).Value -ne "Started") { Start-WebAppPool -Name $AppPoolName Write-Host "Application Pool '$AppPoolName' started successfully." } else { Write-Host "Application Pool '$AppPoolName' is already running." } Write-Host "Starting IIS Site: $SiteName" if ((Get-WebSiteState -Name $SiteName).Value -ne "Started") { Start-WebSite -Name $SiteName Write-Host "IIS Site '$SiteName' started successfully." } else { Write-Host "IIS Site '$SiteName' is already running." } } # Execute on remote server if ($Credential) { Invoke-Command -ComputerName $RemoteServer -Credential $Credential -ScriptBlock $ScriptBlock -ArgumentList $AppPoolName, $SiteName } else { Invoke-Command -ComputerName $RemoteServer -ScriptBlock $ScriptBlock -ArgumentList $AppPoolName, $SiteName } } function Deploy-ZipRemote { param ( [string]$RemoteServer = "KCI-APP01", # Remote machine name or IP [string]$TransferFolder = "\\KCI-SYN-CL01\PC Transfer\", # Local folder containing zip [string]$RemoteDeployPath = "C:\inetpub\tracking\", # Remote target path [string]$ZipFileName = "zzip.zip", [string]$CredentialUser = "", [securestring]$CredentialPassword ) # Create credentials if provided if ($CredentialUser -and $CredentialPassword) { $Credential = New-Object System.Management.Automation.PSCredential ($CredentialUser, $CredentialPassword) } else { $Credential = $null } $LocalZipPath = Join-Path -Path $TransferFolder -ChildPath $ZipFileName $RemoteZipPath = Join-Path -Path $RemoteDeployPath -ChildPath $ZipFileName Write-Host "Copying ZIP file to remote server..." # Copy ZIP file using PowerShell Remoting (or direct UNC path if available) if ($Credential) { Copy-Item -Path $LocalZipPath -Destination "\\$RemoteServer\$($RemoteDeployPath.Replace(':', '$'))" -Credential $Credential -Force } else { Copy-Item -Path $LocalZipPath -Destination "\\$RemoteServer\$($RemoteDeployPath.Replace(':', '$'))" -Force } Write-Host "Extracting ZIP file on remote server..." # Run the extraction on the remote machine $ScriptBlock = { param ($RemoteZipPath, $RemoteDeployPath) if (-Not (Test-Path $RemoteZipPath)) { Write-Host "Error: ZIP file not found at $RemoteZipPath" return } Expand-Archive -Path $RemoteZipPath -DestinationPath $RemoteDeployPath -Force Write-Host "ZIP extracted to $RemoteDeployPath" # Optionally, delete the ZIP after extraction Remove-Item -Path $RemoteZipPath -Force -ErrorAction SilentlyContinue Write-Host "ZIP file deleted after extraction." } if ($Credential) { Invoke-Command -ComputerName $RemoteServer -Credential $Credential -ScriptBlock $ScriptBlock -ArgumentList $RemoteZipPath, $RemoteDeployPath } else { Invoke-Command -ComputerName $RemoteServer -ScriptBlock $ScriptBlock -ArgumentList $RemoteZipPath, $RemoteDeployPath } Write-Host "Deployment completed on $RemoteServer." } function Clear-RemoteDirectory { param ( [string]$RemoteServer = "KCI-APP01", # Remote machine name or IP [string]$TargetDirectory = "C:\inetpub\tracking\", # Directory to clear [string]$CredentialUser = "", # Optional username [securestring]$CredentialPassword # Optional password ) # Create credentials if username and password are provided if ($CredentialUser -and $CredentialPassword) { $Credential = New-Object System.Management.Automation.PSCredential ($CredentialUser, $CredentialPassword) } else { $Credential = $null } # Define script block for remote execution $ScriptBlock = { param ($TargetDirectory) if (Test-Path $TargetDirectory) { Write-Host "Clearing all items from: $TargetDirectory" # Remove all files and subdirectories Get-ChildItem -Path $TargetDirectory -Recurse -Force | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue # Confirm cleanup if (-Not (Get-ChildItem -Path $TargetDirectory -Force)) { Write-Host "Cleanup successful: $TargetDirectory is now empty." } else { Write-Host "Warning: Some files may not have been removed." } } else { Write-Host "Error: Directory $TargetDirectory does not exist." } } # Execute on remote server if ($Credential) { Invoke-Command -ComputerName $RemoteServer -Credential $Credential -ScriptBlock $ScriptBlock -ArgumentList $TargetDirectory } else { Invoke-Command -ComputerName $RemoteServer -ScriptBlock $ScriptBlock -ArgumentList $TargetDirectory } } function Stop-IISAppRemote { param ( [string]$RemoteServer = "KCI-APP01", # Remote machine name or IP [string]$AppPoolName = "Tracking", [string]$SiteName = "Tracking", [string]$CredentialUser = "", [securestring]$CredentialPassword ) # Create credentials if username and password are provided if ($CredentialUser -and $CredentialPassword) { $Credential = New-Object System.Management.Automation.PSCredential ($CredentialUser, $CredentialPassword) } else { $Credential = $null } # Run IIS stop commands on the remote machine $ScriptBlock = { param ($AppPoolName, $SiteName) Import-Module WebAdministration -ErrorAction Stop Write-Host "Stopping IIS Application Pool: $AppPoolName" if ((Get-WebAppPoolState -Name $AppPoolName).Value -ne "Stopped") { Stop-WebAppPool -Name $AppPoolName Write-Host "Application Pool '$AppPoolName' stopped successfully." } else { Write-Host "Application Pool '$AppPoolName' is already stopped." } Write-Host "Stopping IIS Site: $SiteName" if ((Get-WebSiteState -Name $SiteName).Value -ne "Stopped") { Stop-WebSite -Name $SiteName Write-Host "IIS Site '$SiteName' stopped successfully." } else { Write-Host "IIS Site '$SiteName' is already stopped." } } # Execute on remote server if ($Credential) { Invoke-Command -ComputerName $RemoteServer -Credential $Credential -ScriptBlock $ScriptBlock -ArgumentList $AppPoolName, $SiteName } else { Invoke-Command -ComputerName $RemoteServer -ScriptBlock $ScriptBlock -ArgumentList $AppPoolName, $SiteName } } function Cleanup { param ( [string]$DeployRoot = "F:\Development\CICD_TESTS\Tracking\", [string]$RemoteFile = "\\KCI-SYN-CL01\PC Transfer\zzip.zip", [string]$RepoDir = "test", [string]$ZipFileName = "zzip.zip" ) $RepoPath = Join-Path -Path $DeployRoot -ChildPath $RepoDir $ZipFilePath = Join-Path -Path $DeployRoot -ChildPath $ZipFileName Write-Host "Starting cleanup..." # Kill any processes using the folder Write-Host "Checking for processes using the folder..." Get-Process | Where-Object { $_.Path -like "$RepoPath\*" } | Stop-Process -Force -ErrorAction SilentlyContinue # Use Remove-Item with error handling if (Test-Path $RepoPath) { Write-Host "Removing directory: $RepoPath" Try { Remove-Item -Path $RepoPath -Recurse -Force -Confirm:$false -ErrorAction Stop Remove-Item -Path $RemoteFile -Recurse -Force -Confirm:$false -ErrorAction Stop Write-Host "Successfully deleted: $RepoPath" } Catch { Write-Host "Warning: Unable to delete using Remove-Item. Trying RD command..." Start-Process -NoNewWindow -Wait -FilePath "cmd.exe" -ArgumentList "/c RD /S /Q `"$RepoPath`"" -ErrorAction SilentlyContinue } } # Delete the ZIP file if (Test-Path $ZipFilePath) { Write-Host "Deleting file: $ZipFilePath" Try { Remove-Item -Path $ZipFilePath -Force -Confirm:$false -ErrorAction Stop Write-Host "Successfully deleted: $ZipFilePath" } Catch { Write-Host "Warning: Unable to delete ZIP file. It may be in use." } } Write-Host "Force cleanup complete." } function Zip-Repo { param ( [string]$DeployRoot = "F:\Development\CICD_TESTS\Tracking\", [string]$RepoDir = "test", [string]$ZipFileName = "zzip.zip", [string]$TransferFolder = "\\KCI-SYN-CL01\PC Transfer\" ) $RepoPath = Join-Path -Path $DeployRoot -ChildPath $RepoDir $ZipFilePath = Join-Path -Path $DeployRoot -ChildPath $ZipFileName $TransferZipPath = Join-Path -Path $TransferFolder -ChildPath $ZipFileName # Ensure the repository exists if (-Not (Test-Path $RepoPath)) { Write-Host "Error: Repository folder not found at $RepoPath" return } Write-Host "Zipping repository contents..." Compress-Archive -Path "$RepoPath\*" -DestinationPath $ZipFilePath -Force Write-Host "Copying ZIP to transfer folder..." if (-Not (Test-Path $TransferFolder)) { New-Item -ItemType Directory -Path $TransferFolder -Force } Copy-Item -Path $ZipFilePath -Destination $TransferZipPath -Force Write-Host "Zipping complete! ZIP saved to: $TransferZipPath" } # Define the Clone-Repo function function Clone-Repo { param ( [string]$DeployRoot = "F:\Development\CICD_TESTS\Tracking\", [string]$RepoURL = "https://dcovington:_3ggUSA6YELP@onefortheroadgit.sytes.net/dcovington/tracking_kits", [string]$RepoDir = "test" ) $RepoPath = Join-Path -Path $DeployRoot -ChildPath $RepoDir $SparseCheckoutFile = "$RepoPath\.git\info\sparse-checkout" $ConfigFilePath = "$RepoPath\App\app.config.asp" $ImportServicePath = "$RepoPath\ImportService\TrackingDataImport.vbs" Write-Host "Initializing Git repository..." Start-Process -NoNewWindow -Wait -FilePath "git" -ArgumentList "init $RepoPath" Start-Sleep -Seconds 2.5 Write-Host "Setting current directory to $RepoPath" Set-Location -Path $RepoPath Write-Host "Adding remote repository..." Start-Process -NoNewWindow -Wait -FilePath "git" -ArgumentList "remote add -f origin $RepoURL" Write-Host "Enabling sparse checkout..." Start-Process -NoNewWindow -Wait -FilePath "git" -ArgumentList "config core.sparseCheckout true" Write-Host "Writing sparse checkout paths..." $SparseCheckoutPaths = @( "App/", "Data/arrow ne.jpg", "Data/Label_Report.rep", "Data/png-transparent-arrow-arrow-angle-triangle-black-thumbnail.jpg", "Data/purple_envelope_sample_Page_1.jpg", "Data/purple_envelope_sample_Page_2.jpg", "Data/Custom Office Copies Proof.rep", "Data/Proofs.rep", "dist/", "MVC/", "Dependancies/", "ImportService/", "index.asp" # "web.config" ) # Ensure the directory exists if (-Not (Test-Path "$RepoPath\.git\info")) { New-Item -ItemType Directory -Path "$RepoPath\.git\info" -Force } # Write sparse checkout paths $SparseCheckoutPaths | Set-Content -Path $SparseCheckoutFile -Force Write-Host "Pulling latest changes from master..." Start-Process -NoNewWindow -Wait -FilePath "git" -ArgumentList "pull origin master" # Wait for file existence Write-Host "Waiting for app.config.asp to be available..." while (-Not (Test-Path $ConfigFilePath)) { Start-Sleep -Milliseconds 250 } Write-Host "Updating app.config.asp..." $configContent = Get-Content -Path $ConfigFilePath -Raw $updatedConfigContent = $configContent -replace "dev = true", "dev = false" $updatedConfigContent | Set-Content -Path $ConfigFilePath -Force Write-Host "Updating ImportService.vbs..." $ImportServiceScript = Get-Content -Path $ImportServicePath -Raw $updatedImportServiceScript = $ImportServiceScript -replace 'Dim dev:dev = "local"', 'Dim dev:dev = false' $updatedImportServiceScript | Set-Content -Path $ImportServicePath -Force Write-Host "Repository cloned and configured successfully." } # Run the function Clone-Repo Zip-Repo Stop-IISAppRemote Clear-RemoteDirectory Deploy-ZipRemote Start-IISAppRemote Cleanup