From e82c3f5bcb5039f9ddcf6ff5a86fd0407bc4de2e Mon Sep 17 00:00:00 2001 From: dzaitsev Date: Wed, 7 May 2025 19:27:36 +0300 Subject: [PATCH] pipelines zip and gdrive upload updated --- build/jenkins/GDriveUpload | 210 ++++++++++++++++--------------------- 1 file changed, 92 insertions(+), 118 deletions(-) diff --git a/build/jenkins/GDriveUpload b/build/jenkins/GDriveUpload index 24e7cea..278e03b 100644 --- a/build/jenkins/GDriveUpload +++ b/build/jenkins/GDriveUpload @@ -1,158 +1,132 @@ pipeline { - agent { label 'Win10-BuildMachine' } - - tools { - git 'Default' - } - - parameters { - string(name: 'buildPath', defaultValue: 'C:/Jenkins/workspace/AzaionSuite/suite', description: 'Path to folder containing zip builds.') - } + agent any environment { - RCLONE_CONFIG = 'C:/Program Files/rclone/rclone.conf' - GOOGLE_DRIVE_FOLDER = 'AzaionSuiteBuilds' + GOOGLE_DRIVE_FOLDER = 'AzaionSuiteBuilds' // Hardcoded folder name + LATEST_ZIP_FILENAME = '' // Will be set during the "Find Latest Zip" stage } stages { + stage('Declarative: Checkout SCM') { + steps { + checkout scm + } + } + + stage('Declarative: Tool Install') { + steps { + // Ensure required tools are available, like Git, PowerShell, etc. + echo "Installing tools if necessary" + } + } + stage('Initialize Workspace') { steps { - echo 'Initializing workspace on Windows agent...' - powershell ''' - $uploadDir = "temp_upload" - if (-Not (Test-Path $uploadDir)) { - New-Item -ItemType Directory -Path $uploadDir | Out-Null - } - ''' + echo "Initializing workspace on Windows agent..." + // Initialization steps for workspace } } stage('Find Latest Zip') { steps { script { - echo "Finding latest zip file in: ${params.buildPath}" - dir("${params.buildPath}") { - def output = powershell(returnStdout: true, script: ''' - $pattern = "AzaionSuite*-*-*.zip" - $zipFiles = Get-ChildItem -Filter $pattern | Sort-Object Name -Descending - if ($zipFiles.Count -gt 0) { - $latestZip = $zipFiles[0].Name - Write-Output "::SET-ENV::LATEST_ZIP_FILENAME=$latestZip" - } else { - Write-Output "::SET-ENV::LATEST_ZIP_FILENAME=" - } - ''').trim() - - def match = output =~ /::SET-ENV::LATEST_ZIP_FILENAME=(.+)/ - if (!match || !match[0][1]?.trim()) { - echo "⚠️ No ZIP files matching the pattern were found. Skipping upload and cleanup stages." - env.LATEST_ZIP_FILENAME = '' - } else { - def zipFileName = match[0][1] - echo "✅ Latest zip file selected: ${zipFileName}" - env.LATEST_ZIP_FILENAME = zipFileName - } + echo "Finding latest zip file in: C:/Jenkins/workspace/Azaion/suite" + dir('C:/Jenkins/workspace/Azaion/suite') { + def latestZip = sh(script: 'ls -t *.zip | head -n 1', returnStdout: true).trim() + env.LATEST_ZIP_FILENAME = latestZip + echo "✅ Latest zip file selected: ${env.LATEST_ZIP_FILENAME}" } } } } stage('Upload If Not Exists & Always Remove Local') { - when { - expression { return env.LATEST_ZIP_FILENAME?.trim() } - } steps { echo "Checking Google Drive for existing ZIP and uploading if needed..." powershell """ - \$fileName = "${env.LATEST_ZIP_FILENAME}" - \$folder = "${env.GOOGLE_DRIVE_FOLDER}" - \$rcloneRemote = "AzaionGoogleDrive:\$folder" - \$localFilePath = "${params.buildPath}/\$fileName" - - Write-Output "Checking for existing files in: \$rcloneRemote" - \$existingFiles = rclone lsf --files-only \$rcloneRemote - Write-Output "Existing files:" - Write-Output \$existingFiles - - if (\$existingFiles -match "^\$fileName\$") { - Write-Output "File '\$fileName' already exists on Google Drive. Skipping upload." + # Check if file exists on Google Drive + \$existingFiles = rclone lsf --files-only AzaionGoogleDrive:${GOOGLE_DRIVE_FOLDER} + if (\$existingFiles -contains "${LATEST_ZIP_FILENAME}") { + Write-Output "File ${LATEST_ZIP_FILENAME} already exists on Google Drive, skipping upload." } else { - Write-Output "Uploading '\$fileName' to Google Drive..." - rclone copy "\$localFilePath" \$rcloneRemote --progress --drive-chunk-size 64M - Write-Output "Upload complete." + Write-Output "Uploading ${LATEST_ZIP_FILENAME} to Google Drive..." + rclone copy C:/Jenkins/workspace/Azaion/suite/${LATEST_ZIP_FILENAME} AzaionGoogleDrive:${GOOGLE_DRIVE_FOLDER} } - if (Test-Path \$localFilePath) { - Remove-Item -Force \$localFilePath - Write-Output "Local file deleted: \$localFilePath" + # Always remove the local file after uploading + Remove-Item "C:/Jenkins/workspace/Azaion/suite/${LATEST_ZIP_FILENAME}" + """ + } + } + + stage('Cleanup Older Files on Google Drive') { + steps { + echo "Cleaning up older files on Google Drive..." + powershell """ + # Check if folder exists + if (-not (Test-Path "AzaionGoogleDrive:${GOOGLE_DRIVE_FOLDER}")) { + Write-Error "Google Drive folder ${GOOGLE_DRIVE_FOLDER} not found!" + exit 1 + } + + # List all files in the Google Drive folder + Write-Output "Listing all files in the folder ${GOOGLE_DRIVE_FOLDER} on Google Drive..." + \$files = rclone lsf --files-only AzaionGoogleDrive:${GOOGLE_DRIVE_FOLDER} + Write-Output "Files found on Google Drive:" + Write-Output \$files + + # Split files by line and exclude the latest zip file + \$filesArray = \$files -split "`n" | Where-Object { \$_ -ne "" } + \$latestFile = "${LATEST_ZIP_FILENAME}" + \$filesArray = \$filesArray | Where-Object { \$_ -ne \$latestFile } + + # If more than 3 files exist, delete the oldest ones + if (\$filesArray.Count -gt 3) { + \$filesSorted = \$filesArray | Sort-Object -Descending + \$filesToDelete = \$filesSorted | Select-Object -Skip 3 + + Write-Output "Files to delete (older than 3 latest):" + Write-Output \$filesToDelete + + if (\$filesToDelete.Count -gt 0) { + # Create temporary delete list file + \$tempFile = [System.IO.Path]::GetTempFileName() + \$filesToDelete | Set-Content -Path \$tempFile -Encoding utf8 + + Write-Output "Contents of temporary delete list file (\$tempFile):" + Get-Content \$tempFile + + # Delete files listed for removal + foreach (\$file in \$filesToDelete) { + Write-Output "Deleting \$file..." + rclone deletefile AzaionGoogleDrive:${GOOGLE_DRIVE_FOLDER}/\$file + } + + Remove-Item -Path \$tempFile + } else { + Write-Output "No files to delete." + } } else { - Write-Output "Local file already deleted or not found." + Write-Output "No files found on Google Drive to clean up." } """ } } -stage('Cleanup Older Files on Google Drive') { - when { - expression { return env.LATEST_ZIP_FILENAME?.trim() } - } - steps { - echo "Cleaning up older files on Google Drive..." - powershell """ - Write-Output "Listing all files in the folder ${params.GOOGLE_DRIVE_FOLDER} on Google Drive..." - \$files = rclone lsf --files-only AzaionGoogleDrive:${params.GOOGLE_DRIVE_FOLDER} - Write-Output "Files found on Google Drive:" - Write-Output \$files - - \$filesArray = \$files -split "`n" | Where-Object { \$_ -ne "" } - # Exclude the latest zip file from deletion - \$latestFile = "${env.LATEST_ZIP_FILENAME}" - \$filesArray = \$filesArray | Where-Object { \$_ -ne \$latestFile } - - if (\$filesArray.Count -gt 3) { - \$filesSorted = \$filesArray | Sort-Object -Descending - \$filesToDelete = \$filesSorted | Select-Object -Skip 3 - - Write-Output "Files to delete (older than 3 latest):" - Write-Output \$filesToDelete - - if (\$filesToDelete.Count -gt 0) { - \$tempFile = [System.IO.Path]::GetTempFileName() - \$filesToDelete | Set-Content -Path \$tempFile -Encoding utf8 - - Write-Output "Contents of temporary delete list file (\$tempFile):" - Get-Content \$tempFile - - foreach (\$file in \$filesToDelete) { - Write-Output "Deleting \$file..." - rclone deletefile AzaionGoogleDrive:${params.GOOGLE_DRIVE_FOLDER}/\$file - } - - Remove-Item -Path \$tempFile - } else { - Write-Output "No files to delete." - } - } else { - Write-Output "No files found on Google Drive to clean up." + stage('Declarative: Post Actions') { + steps { + echo "Executing post-build cleanup..." + // Clean up any resources after the pipeline run } - """ - } -} + } } post { - always { - echo 'Executing post-build cleanup...' - powershell ''' - $uploadDir = "temp_upload" - if (Test-Path $uploadDir) { - Remove-Item -Recurse -Force $uploadDir - } - ''' - } - failure { - echo 'Pipeline failed. Check logs for details.' + echo "Pipeline failed. Check logs for details." + } + success { + echo "Pipeline completed successfully." } } }