From 3c0d3fa0359dab0cd985bd43e5a1f2d4ef825f47 Mon Sep 17 00:00:00 2001 From: alexandrabain <115022231+alexandrabain@users.noreply.github.com> Date: Wed, 23 Jul 2025 10:28:35 -0400 Subject: [PATCH] NAS-136793 / TEN-2441 Correction to Publish-ISO pipeline file creation (#890) * Correction to Publish-ISO pipeline file creation * Temporary change to avoid repush * Correction to sort * Correction to sort * Adding logging to check which builds are being added * Adding debug to investigate why file is not being updated * Removing the skip parameter --- jenkins/Publish-ISO | 163 +++++++++++++++++++++++++++++++------------- 1 file changed, 114 insertions(+), 49 deletions(-) diff --git a/jenkins/Publish-ISO b/jenkins/Publish-ISO index 03affa9..bc2198f 100644 --- a/jenkins/Publish-ISO +++ b/jenkins/Publish-ISO @@ -18,53 +18,118 @@ pipeline { sh 'ssh jenkins@staging.sys.ixsystems.net mkdir -p /zdata/update.sys.truenas.net/scale/TrueNAS-SCALE-Goldeye-Nightlies || true' sh 'scp upload/files/manifest.json upload/files/TrueNAS-SCALE-*.update jenkins@staging.sys.ixsystems.net:/zdata/update.sys.truenas.net/scale/TrueNAS-SCALE-Goldeye-Nightlies/' } - } - stage('Update Releases JSON') { - steps { - script { - // Download existing releases.json if it exists - sh '''scp jenkins@staging.sys.ixsystems.net:/zdata/update.sys.truenas.net/scale/TrueNAS-SCALE-Goldeye-Nightlies/releases.json upload/files/releases.json || echo "{}" > upload/files/releases.json''' - - // Read manifest.json and extract information - def manifestContent = readFile('upload/files/manifest.json') - def manifest = readJSON text: manifestContent - - // Read existing releases.json - def existingReleasesContent = readFile('upload/files/releases.json') - def existingReleases = readJSON text: existingReleasesContent - - // Add new release entry to existing releases dictionary - // Copy all manifest fields and add profile - def releaseEntry = [:] - manifest.each { key, value -> - releaseEntry[key] = value - } - releaseEntry.profile = 'DEVELOPER' - existingReleases[manifest.version] = releaseEntry - - // Keep only the last 30 entries by date - if (existingReleases.size() > 30) { - // Sort entries by date and keep only the 30 most recent - def sortedEntries = existingReleases.sort { a, b -> - Date.parse("yyyy-MM-dd'T'HH:mm:ss'Z'", b.value.date).compareTo( - Date.parse("yyyy-MM-dd'T'HH:mm:ss'Z'", a.value.date) - ) - } - def recentEntries = sortedEntries.take(30) - existingReleases = [:] - recentEntries.each { entry -> - existingReleases[entry.key] = entry.value - } - } - - // Write updated releases.json - writeJSON file: 'upload/files/releases.json', json: existingReleases, pretty: 4 - - // Upload updated releases.json - sh '''scp upload/files/releases.json jenkins@staging.sys.ixsystems.net:/zdata/update.sys.truenas.net/scale/TrueNAS-SCALE-Goldeye-Nightlies/''' - sh 'rm -rf upload/files' - } - } - } + } + stage('Update Releases JSON') { + steps { + script { + // Download existing releases.json if it exists + sh '''scp jenkins@staging.sys.ixsystems.net:/zdata/update.sys.truenas.net/scale/TrueNAS-SCALE-Goldeye-Nightlies/releases.json upload/files/releases.json || echo "{}" > upload/files/releases.json''' + + // Read manifest.json and extract information + def manifestContent = readFile('upload/files/manifest.json') + def manifest = readJSON text: manifestContent + + // Read existing releases.json + def existingReleasesContent = readFile('upload/files/releases.json') + def existingReleases = readJSON text: existingReleasesContent + + // Add new release entry to existing releases dictionary + // Copy all manifest fields and add profile + def releaseEntry = [:] + manifest.each { key, value -> + releaseEntry[key] = value + } + releaseEntry.profile = 'DEVELOPER' + existingReleases[manifest.version] = releaseEntry + + echo "Adding new build to releases.json: ${manifest.version} (date: ${manifest.date})" + + // Keep only the last 30 entries by date + if (existingReleases.size() > 30) { + // Convert map to list of entries with dates + def entriesList = [] + existingReleases.each { version, data -> + entriesList.add([version: version, data: data, dateStr: data.date]) + } + + // Manual bubble sort (Jenkins-safe, no closures or comparators) + for (int i = 0; i < entriesList.size() - 1; i++) { + for (int j = 0; j < entriesList.size() - i - 1; j++) { + // Compare dates as strings (ISO 8601 format is lexicographically sortable) + if (entriesList[j].dateStr < entriesList[j + 1].dateStr) { + // Swap entries + def temp = entriesList[j] + entriesList[j] = entriesList[j + 1] + entriesList[j + 1] = temp + } + } + } + + // Keep only the first 30 entries + def maxEntries = Math.min(30, entriesList.size()) + def recentEntries = entriesList[0..(maxEntries - 1)] + + echo "Total builds before cleanup: ${entriesList.size()}" + echo "Keeping the ${maxEntries} most recent builds" + + // Log which builds are being removed + if (entriesList.size() > 30) { + echo "Removing ${entriesList.size() - 30} old builds:" + for (int i = 30; i < entriesList.size(); i++) { + echo " - Removing: ${entriesList[i].version} (date: ${entriesList[i].dateStr})" + } + } + + // Rebuild the releases map + existingReleases = [:] + recentEntries.each { entry -> + existingReleases[entry.version] = entry.data + } + } + + // Log final list of builds in releases.json + echo "\nFinal releases.json will contain ${existingReleases.size()} builds:" + def sortedVersions = [] + existingReleases.each { version, data -> + sortedVersions.add([version: version, date: data.date]) + } + // Sort for display + for (int i = 0; i < sortedVersions.size() - 1; i++) { + for (int j = 0; j < sortedVersions.size() - i - 1; j++) { + if (sortedVersions[j].date < sortedVersions[j + 1].date) { + def temp = sortedVersions[j] + sortedVersions[j] = sortedVersions[j + 1] + sortedVersions[j + 1] = temp + } + } + } + sortedVersions.each { build -> + echo " - ${build.version} (date: ${build.date})" + } + + // Write updated releases.json + writeJSON file: 'upload/files/releases.json', json: existingReleases, pretty: 4 + + // Verify the file was written + sh 'ls -la upload/files/releases.json' + echo "releases.json file size: " + sh 'wc -c upload/files/releases.json' + + // Show first few lines of the file for verification + echo "First 10 lines of releases.json:" + sh 'head -10 upload/files/releases.json' + + // Upload updated releases.json + echo "Uploading releases.json to staging server..." + sh '''scp upload/files/releases.json jenkins@staging.sys.ixsystems.net:/zdata/update.sys.truenas.net/scale/TrueNAS-SCALE-Goldeye-Nightlies/''' + + // Verify upload succeeded + echo "Verifying remote file..." + sh '''ssh jenkins@staging.sys.ixsystems.net "ls -la /zdata/update.sys.truenas.net/scale/TrueNAS-SCALE-Goldeye-Nightlies/releases.json"''' + + sh 'rm -rf upload/files' + } + } + } } -} +} \ No newline at end of file