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