| @@ -0,0 +1,455 @@ | |||||
| <# | |||||
| .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/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 = "prod"' | |||||
| $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 | |||||
Powered by TurnKey Linux.