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
This commit is contained in:
alexandrabain
2025-07-23 10:28:35 -04:00
committed by GitHub
parent a5f5ee6163
commit 3c0d3fa035

View File

@@ -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'
}
}
}
}
}
}