| @@ -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.