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