From a3293e95540e761a2947ad6f5c0540bf855f2b95 Mon Sep 17 00:00:00 2001 From: Daniel Covington Date: Fri, 14 Mar 2025 13:42:45 -0400 Subject: [PATCH] This will deploy the master branch to prod --- CiCd/Tracking_CICD.ps1 | 455 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 455 insertions(+) create mode 100644 CiCd/Tracking_CICD.ps1 diff --git a/CiCd/Tracking_CICD.ps1 b/CiCd/Tracking_CICD.ps1 new file mode 100644 index 0000000..95f9a71 --- /dev/null +++ b/CiCd/Tracking_CICD.ps1 @@ -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 \ No newline at end of file