From 868061aca979b42ea756fb8fc49c5d9a9f0489bd Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Sun, 17 May 2026 11:48:50 -0400 Subject: [PATCH 01/38] DAOS-18348 build: Test updating params Test using a stage to update parameter values from commit pragmas Skip-build-el8: true Skip-build-el9: true Skip-build-leap15: false Skip-test: true Signed-off-by: Phil Henderson --- Jenkinsfile | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 55a3418f689..2eff3b9855e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -417,14 +417,44 @@ pipeline { string(name: 'CI_BUILD_DESCRIPTION', defaultValue: '', description: 'A description of the build') + booleanParam(name: 'CI_BUILD_EL8', defaultValue: true, description: 'Whether or not to build and test on EL 8') + booleanParam(name: 'CI_BUILD_EL9', defaultValue: true, description: 'Whether or not to build and test on EL 9') + booleanParam(name: 'CI_BUILD_LEAP15', defaultValue: true, description: 'Whether or not to build and test on Leap 15') } stages { - stage('Set Description') { - steps { - script { - if (params.CI_BUILD_DESCRIPTION) { - buildDescription params.CI_BUILD_DESCRIPTION + stage('Setup') { + parallel { + stage('Set Description') { + steps { + script { + if (params.CI_BUILD_DESCRIPTION) { + buildDescription params.CI_BUILD_DESCRIPTION + } + } + } + } + stage('Update Parameters with Commit Pragmas') { + steps { + script { + println('Original parameters:') + println("CI_BUILD_EL8: ${params.CI_BUILD_EL8}") + println("CI_BUILD_EL9: ${params.CI_BUILD_EL9}") + println("CI_BUILD_LEAP15: ${params.CI_BUILD_LEAP15}") + if (cachedCommitPragma("Skip-build-el8", false).toLowerCase() == 'true') { + params.CI_BUILD_EL8 = false + } + if (cachedCommitPragma("Skip-build-el9", false).toLowerCase() == 'true') { + params.CI_BUILD_EL9 = false + } + if (cachedCommitPragma("Skip-build-leap15", false).toLowerCase() == 'true') { + params.CI_BUILD_LEAP15 = false + } + println('Updated parameters based on commit pragmas:') + println("CI_BUILD_EL8: ${params.CI_BUILD_EL8}") + println("CI_BUILD_EL9: ${params.CI_BUILD_EL9}") + println("CI_BUILD_LEAP15: ${params.CI_BUILD_LEAP15}") + } } } } From c8f158f45f4747b1636eafe88c75fbed12ec7e5e Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Sun, 17 May 2026 12:01:48 -0400 Subject: [PATCH 02/38] Updates. Skip-build-el8: true Skip-build-el9: true Skip-build-leap15: false Skip-test: true Signed-off-by: Phil Henderson --- Jenkinsfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 2eff3b9855e..6aa1a39bcb4 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -441,13 +441,13 @@ pipeline { println("CI_BUILD_EL8: ${params.CI_BUILD_EL8}") println("CI_BUILD_EL9: ${params.CI_BUILD_EL9}") println("CI_BUILD_LEAP15: ${params.CI_BUILD_LEAP15}") - if (cachedCommitPragma("Skip-build-el8", false).toLowerCase() == 'true') { + if (cachedCommitPragma("Skip-build-el8", 'false').toLowerCase() == 'true') { params.CI_BUILD_EL8 = false } - if (cachedCommitPragma("Skip-build-el9", false).toLowerCase() == 'true') { + if (cachedCommitPragma("Skip-build-el9", 'false').toLowerCase() == 'true') { params.CI_BUILD_EL9 = false } - if (cachedCommitPragma("Skip-build-leap15", false).toLowerCase() == 'true') { + if (cachedCommitPragma("Skip-build-leap15", 'false').toLowerCase() == 'true') { params.CI_BUILD_LEAP15 = false } println('Updated parameters based on commit pragmas:') From 0d4fd4025ad7b4ddd37267172f0dbb9dde776781 Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Thu, 21 May 2026 20:04:17 -0400 Subject: [PATCH 03/38] New approach. Skip-build-el8: true Signed-off-by: Phil Henderson --- Jenkinsfile | 491 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 366 insertions(+), 125 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 50255e2631b..354709ac25c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -23,6 +23,168 @@ /* groovylint-disable-next-line CompileStatic */ job_status_internal = [:] +// Update the defaults for running stages in a PR here +/* groovylint-disable-next-line CompileStatic */ +runStage = [ + 'Cancel Previous Builds': true, + 'Pre-build': true, + 'Python Bandit check': true, + 'Build': true, + 'Build on EL 8': true, + 'Build on EL 9': true, + 'Build on Leap 15': true, + 'Build on EL 9 with Bullseye': true, + 'Unit Tests': true, + 'Unit Test': true, + 'Unit Test bdev': true, + 'NLT': true, + 'NLT with Bullseye': true, + 'Unit Test with memcheck': true, + 'Unit Test bdev with memcheck': true, + 'Test': true, + 'Functional on EL 8.8 with Valgrind': false, + 'Functional on EL 8': false, + 'Functional on EL 9': true, + 'Functional on Leap 15': false, + 'Functional on SLES 15': false, + 'Functional on Ubuntu 20.04': false, + 'Fault injection testing': true, + 'Test RPMs on EL 9.6': true, + 'Test RPMs on Leap 15.5': true, + 'Test Storage Prep on EL 8.8': true, + 'Test Hardware': true, + 'Functional Hardware Medium': false, + 'Functional Hardware Medium MD on SSD': true, + 'Functional Hardware Medium VMD': false, + 'Functional Hardware Medium Verbs Provider': false, + 'Functional Hardware Medium Verbs Provider MD on SSD': true, + 'Functional Hardware Medium UCX Provider': false, + 'Functional Hardware Large': false, + 'Functional Hardware Large MD on SSD': true, +] + +void updateRunStage() { + Map reasons = [:] + + // Handle doc-only changes: Only run default or selected build stages + if (docOnlyChange(target_branch)) { + println("updateRunStage: Detected doc-only change, overwriting defaults") + for (stage in runStage.keySet()) { + if (stage in ['Cancel Previous Builds', 'Pre-build', 'Build'] + || stage.contains('Build')) { + runStage[stage] = params.get(stage, true) + reasons[stage] = "parameter selection/default" + } else { + runStage[stage] = false + reasons[stage] = "doc-only change" + } + } + displayRunStage(reasons) + return + } + + // Handle landing builds + if (startedByLanding()) { + println("updateRunStage: Detected landing build, overwriting defaults") + for (stage in runStage.keySet()) { + if (stage in ['Pre-build', 'Build', 'Unit Tests', 'Test'] + || stage.contains('Build on') + || stage.contains('Unit Test') + || stage.contains('NLT') + || stage.contains('Test RPMs') + || (stage.contains('Functional on') && !stage.contains('Ubuntu'))) { + runStage[stage] = true + } else { + runStage[stage] = false + } + reasons[stage] = "landing build" + } + displayRunStage(reasons) + return + } + + // Handle specific RPM Version + if (params.CI_RPM_TEST_VERSION) { + println("updateRunStage: Detected specific RPM version, overwriting build/RPM test stages") + for (stage in runStage.keySet()) { + if (stage.contains('Build') || stage.contains('Test RPMs')) { + runStage[stage] = false + reasons[stage] = "specific RPM version" + } + } + } + + // Update stage running based on commit pragmas + for (stage in runStage.keySet()) { + List skipPragmas = getStageNameSkipPragmas(stage) + for (pragma in skipPragmas) { + if (cachedCommitPragma(pragma, '').toLowerCase() == 'true') { + runStage[stage] = false + reasons[stage] = "commit pragma ${pragma}: true" + continue + } + if (cachedCommitPragma(pragma, '').toLowerCase() == 'false') { + runStage[stage] = true + reasons[stage] = "commit pragma ${pragma}: false" + continue + } + } + } + displayRunStage(reasons) +} + +void displayRunStage(Map reasons = [:]) { + println("Stage run conditions:") + for (stage in runStage.keySet()) { + String reason = reasons.get(stage, 'default') + if (runStage[stage]) { + echo(" ${stage}: Running (reason: ${reason})") + } else { + echo(" ${stage}: Skipping (reason: ${reason})") + } + } +} + +// Get a list of skip commit pragmas to check for a given stage name +List getStageNameSkipPragmas(String stageName) { + List pragmas = [] + pragmas.add("Skip-${stageName.replaceAll(' ', '-').toLowerCase()}") + if (stageName.contains('Build')) { + pragmas.add('Skip-build') + } + if (stageName.contains('Unit Test') || stageName.contains('NLT')) { + pragmas.add('Skip-unit-tests') + } + if (stageName.contains('Test')) { + pragmas.add('Skip-test') + } + if (stageName.contains('Functional')) { + // Compatibility for commit pragmas that don't match stage names exactly + pragmas[0] = pragmas[0].replace('functional-', 'func-') + pragmas[0] = pragmas[0].replace('func-on-', 'func-test-') + pragmas[0] = pragmas[0].replace('hardware-', 'hw-') + pragmas.add('Skip-func-test') + } + if (stageName.contains('Functional on')) { + pragmas.add('Skip-func-test-vm') + } + if (stageName.contains('Functional Hardware')) { + pragmas.add('Skip-func-hw-test') + } + for distro in ['el', 'leap', 'sles', 'ubuntu'] { + if (pragmas[0].contains("${distro}-")) { + // Compatibility for commit pragmas that don't match stage names exactly + pragmas[0] = pragmas[0].replace("${distro}-", "${distro}") + } + } + + // Compatibility for commit pragmas that don't match stage names exactly + pragmas[0] = pragmas[0].replace('-testing', '-test') + pragmas[0] = pragmas[0].replace('-check', '') + + return pragmas +} + void get_rpm_relval() { env.DAOS_RELVAL = sh(label: 'get git tag', script: '''if [ -n "$GIT_CHECKOUT_DIR" ] && [ -d "$GIT_CHECKOUT_DIR" ]; then @@ -304,84 +466,186 @@ pipeline { string(name: 'CI_UBUNTU20.04_TARGET', defaultValue: '', description: 'Image to used for Ubuntu 20 CI tests. I.e. ubuntu20.04, etc.') - booleanParam(name: 'CI_el8_NOBUILD', - defaultValue: false, - description: 'Do not build sources and RPMs on EL 8') - booleanParam(name: 'CI_el9_NOBUILD', - defaultValue: false, - description: 'Do not build sources and RPMs on EL 9') - booleanParam(name: 'CI_leap15_NOBUILD', - defaultValue: false, - description: 'Do not build sources and RPMs on Leap 15') + booleanParam(name: 'Cancel Previous Builds', + defaultValue: runStage['Cancel Previous Builds'], + description: 'Cancel previous build before running this one.') + booleanParam(name: 'Pre-build', + defaultValue: runStage['Pre-build'], + description: 'Run the pre-build stage.') + booleanParam(name: 'Python Bandit check', + defaultValue: runStage['Python Bandit check'], + description: 'Run the Python Bandit check stage.') + booleanParam(name: 'Build', + defaultValue: runStage['Build'], + description: 'Run the build stage.') + booleanParam(name: 'Build on EL 8', + defaultValue: runStage['Build on EL 8'], + description: 'Run the build on EL 8 stage.') + booleanParam(name: 'Build on EL 9', + defaultValue: runStage['Build on EL 9'], + description: 'Run the build on EL 9 stage.') + booleanParam(name: 'Build on Leap 15', + defaultValue: runStage['Build on Leap 15'], + description: 'Run the build on Leap 15 stage.') + booleanParam(name: 'Build on EL 9 with Bullseye', + defaultValue: runStage['Build on EL 9 with Bullseye'], + description: 'Run the build on EL 9 with Bullseye stage.') + booleanParam(name: 'Unit Tests', + defaultValue: runStage['Unit Tests'], + description: 'Run the Unit Tests stage.') + booleanParam(name: 'Unit Test', + defaultValue: runStage['Unit Test'], + description: 'Run the Unit Test stage.') + booleanParam(name: 'Unit Test bdev', + defaultValue: runStage['Unit Test bdev'], + description: 'Run the Unit Test bdev stage.') + booleanParam(name: 'NLT', + defaultValue: runStage['NLT'], + description: 'Run the NLT stage.') + booleanParam(name: 'NLT with Bullseye', + defaultValue: runStage['NLT with Bullseye'], + description: 'Run the NLT with Bullseye stage.') + booleanParam(name: 'Unit Test with memcheck', + defaultValue: runStage['Unit Test with memcheck'], + description: 'Run the Unit Test with memcheck stage.') + booleanParam(name: 'Unit Test bdev with memcheck', + defaultValue: runStage['Unit Test bdev with memcheck'], + description: 'Run the Unit Test bdev with memcheck stage.') + booleanParam(name: 'Test', + defaultValue: runStage['Test'], + description: 'Run the Test stage.') + booleanParam(name: 'Functional on EL 8.8 with Valgrind', + defaultValue: runStage['Functional on EL 8.8 with Valgrind'], + description: 'Run the Functional on EL 8.8 with Valgrind stage.') + booleanParam(name: 'Functional on EL 8', + defaultValue: runStage['Functional on EL 8'], + description: 'Run the Functional on EL 8 stage.') + booleanParam(name: 'Functional on EL 9', + defaultValue: runStage['Functional on EL 9'], + description: 'Run the Functional on EL 9 stage.') + booleanParam(name: 'Functional on Leap 15', + defaultValue: runStage['Functional on Leap 15'], + description: 'Run the Functional on Leap 15 stage.') + booleanParam(name: 'Functional on Ubuntu 20.04', + defaultValue: runStage['Functional on Ubuntu 20.04'], + description: 'Run the Functional on Ubuntu 20.04 stage.') + booleanParam(name: 'Fault injection testing', + defaultValue: runStage['Fault injection testing'], + description: 'Run the Fault injection testing stage.') + booleanParam(name: 'Test RPMs on EL 9.6', + defaultValue: runStage['Test RPMs on EL 9.6'], + description: 'Run the Test RPMs on EL 9.6 stage.') + booleanParam(name: 'Test RPMs on Leap 15.5', + defaultValue: runStage['Test RPMs on Leap 15.5'], + description: 'Run the Test RPMs on Leap 15.5 stage.') + booleanParam(name: 'Test Storage Prep on EL 8.8', + defaultValue: runStage['Test Storage Prep on EL 8.8'], + description: 'Run the Test Storage Prep on EL 8.8 stage.') + booleanParam(name: 'Test Hardware', + defaultValue: runStage['Test Hardware'], + description: 'Run the Test Hardware stage.') + booleanParam(name: 'Functional Hardware Medium', + defaultValue: runStage['Functional Hardware Medium'], + description: 'Run the Functional Hardware Medium stage.') + booleanParam(name: 'Functional Hardware Medium MD on SSD', + defaultValue: runStage['Functional Hardware Medium MD on SSD'], + description: 'Run the Functional Hardware Medium MD on SSD stage.') + booleanParam(name: 'Functional Hardware Medium VMD', + defaultValue: runStage['Functional Hardware Medium VMD'], + description: 'Run the Functional Hardware Medium VMD stage.') + booleanParam(name: 'Functional Hardware Medium Verbs Provider', + defaultValue: runStage['Functional Hardware Medium Verbs Provider'], + description: 'Run the Functional Hardware Medium Verbs Provider stage.') + booleanParam(name: 'Functional Hardware Medium Verbs Provider MD on SSD', + defaultValue: runStage['Functional Hardware Medium Verbs Provider MD on SSD'], + description: 'Run the Functional Hardware Medium Verbs Provider MD on SSD stage.') + booleanParam(name: 'Functional Hardware Medium UCX Provider', + defaultValue: runStage['Functional Hardware Medium UCX Provider'], + description: 'Run the Functional Hardware Medium UCX Provider stage.') + booleanParam(name: 'Functional Hardware Large', + defaultValue: runStage['Functional Hardware Large'], + description: 'Run the Functional Hardware Large stage.') + booleanParam(name: 'Functional Hardware Large MD on SSD', + defaultValue: runStage['Functional Hardware Large MD on SSD'], + description: 'Run the Functional Hardware Large MD on SSD stage.') + // booleanParam(name: 'CI_el8_NOBUILD', + // defaultValue: false, + // description: 'Do not build sources and RPMs on EL 8') + // booleanParam(name: 'CI_el9_NOBUILD', + // defaultValue: false, + // description: 'Do not build sources and RPMs on EL 9') + // booleanParam(name: 'CI_leap15_NOBUILD', + // defaultValue: false, + // description: 'Do not build sources and RPMs on Leap 15') booleanParam(name: 'CI_ALLOW_UNSTABLE_TEST', defaultValue: false, description: 'Continue testing if a previous stage is Unstable') - booleanParam(name: 'CI_UNIT_TEST', - defaultValue: true, - description: 'Run the Unit Test test stage') - booleanParam(name: 'CI_NLT_TEST', - defaultValue: true, - description: 'Run the NLT test stage') - booleanParam(name: 'CI_UNIT_TEST_MEMCHECK', - defaultValue: true, - description: 'Run the Unit Test with memcheck test stage') - booleanParam(name: 'CI_FI_TEST', - defaultValue: true, - description: 'Run the Fault injection testing test stage') - booleanParam(name: 'CI_TEST_EL_RPMs', - defaultValue: true, - description: 'Run the Test RPMs on EL stage') - booleanParam(name: 'CI_TEST_LEAP_RPMs', - defaultValue: true, - description: 'Run the Test RPMs on Leap test stage') - booleanParam(name: 'CI_FUNCTIONAL_TEST_SKIP', - defaultValue: false, - description: 'Skip all functional test stages (Test)') - booleanParam(name: 'CI_MORE_FUNCTIONAL_PR_TESTS', - defaultValue: false, - description: 'Enable more distros for functional CI tests') - booleanParam(name: 'CI_FUNCTIONAL_el8_VALGRIND_TEST', - defaultValue: false, - description: 'Run the Functional on EL 8 with Valgrind test stage') - booleanParam(name: 'CI_FUNCTIONAL_el8_TEST', - defaultValue: false, - description: 'Run the Functional on EL 8 test stage') - booleanParam(name: 'CI_FUNCTIONAL_el9_TEST', - defaultValue: true, - description: 'Run the Functional on EL 9 test stage') - booleanParam(name: 'CI_FUNCTIONAL_leap15_TEST', - defaultValue: false, - description: 'Run the Functional on Leap 15 test stage') - booleanParam(name: 'CI_FUNCTIONAL_ubuntu20_TEST', - defaultValue: false, - description: 'Run the Functional on Ubuntu 20.04 test stage') - booleanParam(name: 'CI_FUNCTIONAL_HARDWARE_TEST_SKIP', - defaultValue: false, - description: 'Skip Functional Hardware (Test Hardware) stage') - booleanParam(name: 'CI_medium_TEST', - defaultValue: false, - description: 'Run the Functional Hardware Medium test stage') - booleanParam(name: 'CI_medium_md_on_ssd_TEST', - defaultValue: true, - description: 'Run the Functional Hardware Medium MD on SSD test stage') - booleanParam(name: 'CI_medium_vmd_TEST', - defaultValue: false, - description: 'Run the Functional Hardware Medium VMD test stage') - booleanParam(name: 'CI_medium_verbs_provider_TEST', - defaultValue: false, - description: 'Run the Functional Hardware Medium Verbs Provider test stage') - booleanParam(name: 'CI_medium_verbs_provider_md_on_ssd_TEST', - defaultValue: true, - description: 'Run the Functional Hardware Medium Verbs Provider MD on SSD test stage') - booleanParam(name: 'CI_medium_ucx_provider_TEST', - defaultValue: false, - description: 'Run the Functional Hardware Medium UCX Provider test stage') - booleanParam(name: 'CI_large_TEST', - defaultValue: false, - description: 'Run the Functional Hardware Large test stage') - booleanParam(name: 'CI_large_md_on_ssd_TEST', - defaultValue: true, - description: 'Run the Functional Hardware Large MD on SSD test stage') + // booleanParam(name: 'CI_UNIT_TEST', + // defaultValue: true, + // description: 'Run the Unit Test test stage') + // booleanParam(name: 'CI_NLT_TEST', + // defaultValue: true, + // description: 'Run the NLT test stage') + // booleanParam(name: 'CI_UNIT_TEST_MEMCHECK', + // defaultValue: true, + // description: 'Run the Unit Test with memcheck test stage') + // booleanParam(name: 'CI_FI_TEST', + // defaultValue: true, + // description: 'Run the Fault injection testing test stage') + // booleanParam(name: 'CI_TEST_EL_RPMs', + // defaultValue: true, + // description: 'Run the Test RPMs on EL stage') + // booleanParam(name: 'CI_TEST_LEAP_RPMs', + // defaultValue: true, + // description: 'Run the Test RPMs on Leap test stage') + // booleanParam(name: 'CI_FUNCTIONAL_TEST_SKIP', + // defaultValue: false, + // description: 'Skip all functional test stages (Test)') + // booleanParam(name: 'CI_MORE_FUNCTIONAL_PR_TESTS', + // defaultValue: false, + // description: 'Enable more distros for functional CI tests') + // booleanParam(name: 'CI_FUNCTIONAL_el8_VALGRIND_TEST', + // defaultValue: false, + // description: 'Run the Functional on EL 8 with Valgrind test stage') + // booleanParam(name: 'CI_FUNCTIONAL_el8_TEST', + // defaultValue: false, + // description: 'Run the Functional on EL 8 test stage') + // booleanParam(name: 'CI_FUNCTIONAL_el9_TEST', + // defaultValue: true, + // description: 'Run the Functional on EL 9 test stage') + // booleanParam(name: 'CI_FUNCTIONAL_leap15_TEST', + // defaultValue: false, + // description: 'Run the Functional on Leap 15 test stage') + // booleanParam(name: 'CI_FUNCTIONAL_ubuntu20_TEST', + // defaultValue: false, + // description: 'Run the Functional on Ubuntu 20.04 test stage') + // booleanParam(name: 'CI_FUNCTIONAL_HARDWARE_TEST_SKIP', + // defaultValue: false, + // description: 'Skip Functional Hardware (Test Hardware) stage') + // booleanParam(name: 'CI_medium_TEST', + // defaultValue: false, + // description: 'Run the Functional Hardware Medium test stage') + // booleanParam(name: 'CI_medium_md_on_ssd_TEST', + // defaultValue: true, + // description: 'Run the Functional Hardware Medium MD on SSD test stage') + // booleanParam(name: 'CI_medium_vmd_TEST', + // defaultValue: false, + // description: 'Run the Functional Hardware Medium VMD test stage') + // booleanParam(name: 'CI_medium_verbs_provider_TEST', + // defaultValue: false, + // description: 'Run the Functional Hardware Medium Verbs Provider test stage') + // booleanParam(name: 'CI_medium_verbs_provider_md_on_ssd_TEST', + // defaultValue: true, + // description: 'Run the Functional Hardware Medium Verbs Provider MD on SSD test stage') + // booleanParam(name: 'CI_medium_ucx_provider_TEST', + // defaultValue: false, + // description: 'Run the Functional Hardware Medium UCX Provider test stage') + // booleanParam(name: 'CI_large_TEST', + // defaultValue: false, + // description: 'Run the Functional Hardware Large test stage') + // booleanParam(name: 'CI_large_md_on_ssd_TEST', + // defaultValue: true, + // description: 'Run the Functional Hardware Large MD on SSD test stage') string(name: 'CI_UNIT_VM1_LABEL', defaultValue: 'ci_vm1', description: 'Label to use for 1 VM node unit and RPM tests') @@ -418,9 +682,6 @@ pipeline { string(name: 'CI_BUILD_DESCRIPTION', defaultValue: '', description: 'A description of the build') - booleanParam(name: 'CI_BUILD_EL8', defaultValue: true, description: 'Whether or not to build and test on EL 8') - booleanParam(name: 'CI_BUILD_EL9', defaultValue: true, description: 'Whether or not to build and test on EL 9') - booleanParam(name: 'CI_BUILD_LEAP15', defaultValue: true, description: 'Whether or not to build and test on Leap 15') } stages { @@ -435,27 +696,9 @@ pipeline { } } } - stage('Update Parameters with Commit Pragmas') { + stage('Update Run Stage') { steps { - script { - println('Original parameters:') - println("CI_BUILD_EL8: ${params.CI_BUILD_EL8}") - println("CI_BUILD_EL9: ${params.CI_BUILD_EL9}") - println("CI_BUILD_LEAP15: ${params.CI_BUILD_LEAP15}") - if (cachedCommitPragma("Skip-build-el8", 'false').toLowerCase() == 'true') { - params.CI_BUILD_EL8 = false - } - if (cachedCommitPragma("Skip-build-el9", 'false').toLowerCase() == 'true') { - params.CI_BUILD_EL9 = false - } - if (cachedCommitPragma("Skip-build-leap15", 'false').toLowerCase() == 'true') { - params.CI_BUILD_LEAP15 = false - } - println('Updated parameters based on commit pragmas:') - println("CI_BUILD_EL8: ${params.CI_BUILD_EL8}") - println("CI_BUILD_EL9: ${params.CI_BUILD_EL9}") - println("CI_BUILD_LEAP15: ${params.CI_BUILD_LEAP15}") - } + updateRunStage() } } } @@ -501,7 +744,7 @@ pipeline { stage('Cancel Previous Builds') { when { beforeAgent true - expression { !paramsValue('CI_CANCEL_PREV_BUILD_SKIP', false) && !skipStage() } + expression { runStage['Cancel Previous Builds'] } } steps { cancelPreviousBuilds() @@ -510,13 +753,13 @@ pipeline { stage('Pre-build') { when { beforeAgent true - expression { !skipStage() } + expression { runStage['Pre-build'] } } parallel { stage('Python Bandit check') { when { beforeAgent true - expression { !skipStage() } + expression { runStage['Python Bandit check'] } } agent { dockerfile { @@ -549,13 +792,13 @@ pipeline { //failFast true when { beforeAgent true - expression { !skip_build_stage() } + expression { runStage['Build'] } } parallel { stage('Build on EL 8') { when { beforeAgent true - expression { !skip_build_stage('el8') } + expression { runStage['Build on EL 8'] } } agent { dockerfile { @@ -609,7 +852,7 @@ pipeline { stage('Build on EL 9') { when { beforeAgent true - expression { !skip_build_stage('el9') } + expression { runStage['Build on EL 9'] } } agent { dockerfile { @@ -663,7 +906,7 @@ pipeline { stage('Build on Leap 15') { when { beforeAgent true - expression { !skip_build_stage('leap15') } + expression { runStage['Build on Leap 15'] } } agent { dockerfile { @@ -717,13 +960,13 @@ pipeline { stage('Unit Tests') { when { beforeAgent true - expression { !skipStage() } + expression { runStage['Unit Tests'] } } parallel { stage('Unit Test') { when { beforeAgent true - expression { !skipStage() } + expression { runStage['Unit Test'] } } agent { label cachedCommitPragma(pragma: 'VM1-label', def_val: params.CI_UNIT_VM1_LABEL) @@ -748,7 +991,7 @@ pipeline { stage('Unit Test bdev') { when { beforeAgent true - expression { !skipStage() } + expression { runStage['Unit Test bdev'] } } agent { label params.CI_UNIT_VM1_NVME_LABEL @@ -771,7 +1014,7 @@ pipeline { stage('NLT') { when { beforeAgent true - expression { params.CI_NLT_TEST && !skipStage() } + expression { runStage['NLT'] } } agent { label params.CI_NLT_1_LABEL @@ -812,7 +1055,7 @@ pipeline { stage('Unit Test with memcheck') { when { beforeAgent true - expression { !skipStage() } + expression { runStage['Unit Test with memcheck'] } } agent { label cachedCommitPragma(pragma: 'VM1-label', def_val: params.CI_UNIT_VM1_LABEL) @@ -838,7 +1081,7 @@ pipeline { stage('Unit Test bdev with memcheck') { when { beforeAgent true - expression { !skipStage() } + expression { runStage['Unit Test bdev with memcheck'] } } agent { label params.CI_UNIT_VM1_NVME_LABEL @@ -866,15 +1109,13 @@ pipeline { stage('Test') { when { beforeAgent true - //expression { !paramsValue('CI_FUNCTIONAL_TEST_SKIP', false) && !skipStage() } - // Above not working, always skipping functional VM tests. - expression { !paramsValue('CI_FUNCTIONAL_TEST_SKIP', false) } + expression { runStage['Test'] } } parallel { stage('Functional on EL 8.8 with Valgrind') { when { beforeAgent true - expression { !skipStage() } + expression { runStage['Functional on EL 8.8 with Valgrind'] } } agent { label vm9_label('EL8') @@ -897,7 +1138,7 @@ pipeline { stage('Functional on EL 8') { when { beforeAgent true - expression { !skipStage() } + expression { runStage['Functional on EL 8'] } } agent { label vm9_label('EL8') @@ -921,7 +1162,7 @@ pipeline { stage('Functional on EL 9') { when { beforeAgent true - expression { !skipStage() } + expression { runStage['Functional on EL 9'] } } agent { label vm9_label('EL9') @@ -945,7 +1186,7 @@ pipeline { stage('Functional on Leap 15') { when { beforeAgent true - expression { !skipStage() } + expression { runStage['Functional on Leap 15'] } } agent { label vm9_label('Leap15') @@ -969,7 +1210,7 @@ pipeline { stage('Functional on SLES 15') { when { beforeAgent true - expression { !skipStage() } + expression { runStage['Functional on SLES 15'] } } agent { label vm9_label('Leap15') @@ -993,7 +1234,7 @@ pipeline { stage('Functional on Ubuntu 20.04') { when { beforeAgent true - expression { !skipStage() } + expression { runStage['Functional on Ubuntu 20.04'] } } agent { label vm9_label('Ubuntu') @@ -1016,7 +1257,7 @@ pipeline { stage('Fault injection testing') { when { beforeAgent true - expression { !skipStage() } + expression { runStage['Fault injection testing'] } } agent { dockerfile { @@ -1074,7 +1315,7 @@ pipeline { stage('Test RPMs on EL 9.6') { when { beforeAgent true - expression { params.CI_TEST_EL_RPMs && !skipStage() } + expression { runStage['Test RPMs on EL 9.6'] } } agent { label params.CI_UNIT_VM1_LABEL @@ -1095,7 +1336,7 @@ pipeline { stage('Test RPMs on Leap 15.5') { when { beforeAgent true - expression { params.CI_TEST_LEAP_RPMs && !skipStage() } + expression { runStage['Test RPMs on Leap 15.5'] } } agent { label params.CI_UNIT_VM1_LABEL @@ -1150,7 +1391,7 @@ pipeline { stage('Test Storage Prep on EL 8.8') { when { beforeAgent true - expression { params.CI_STORAGE_PREP_LABEL != '' } + expression { runStage['Test Storage Prep on EL 8.8'] && params.CI_STORAGE_PREP_LABEL != '' } } agent { label params.CI_STORAGE_PREP_LABEL @@ -1170,7 +1411,7 @@ pipeline { stage('Test Hardware') { when { beforeAgent true - expression { !paramsValue('CI_FUNCTIONAL_HARDWARE_TEST_SKIP', false) && !skipStage() } + expression { runStage['Test Hardware'] } } steps { script { From 7580a7cf549e08c0c103911fe409b9e2a1518b28 Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Thu, 21 May 2026 20:08:29 -0400 Subject: [PATCH 04/38] Updates Skip-build-el8: true Signed-off-by: Phil Henderson --- Jenkinsfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 354709ac25c..d637e64c657 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -171,7 +171,8 @@ List getStageNameSkipPragmas(String stageName) { if (stageName.contains('Functional Hardware')) { pragmas.add('Skip-func-hw-test') } - for distro in ['el', 'leap', 'sles', 'ubuntu'] { + List distros = ['el', 'leap', 'sles', 'ubuntu'] + for (distro in distros) { if (pragmas[0].contains("${distro}-")) { // Compatibility for commit pragmas that don't match stage names exactly pragmas[0] = pragmas[0].replace("${distro}-", "${distro}") From 936e30c35af5bddd2d4691c34fc0a67e36dbc36a Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Thu, 21 May 2026 22:11:24 -0400 Subject: [PATCH 05/38] Updates. Skip-build-el8: true Signed-off-by: Phil Henderson --- Jenkinsfile | 79 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 68 insertions(+), 11 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index d637e64c657..37aef37b5bc 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -115,15 +115,21 @@ void updateRunStage() { } // Update stage running based on commit pragmas + Map commitPragmas = getCommitMessageKeyValues() + println("updateRunStage: commit pragmas from commit message:") + commitPragmas.each { key, value -> + println(" ${key}: ${value}") + } + for (stage in runStage.keySet()) { List skipPragmas = getStageNameSkipPragmas(stage) for (pragma in skipPragmas) { - if (cachedCommitPragma(pragma, '').toLowerCase() == 'true') { + if (commitPragmas.get(pragma, '').toLowerCase() == 'true') { runStage[stage] = false reasons[stage] = "commit pragma ${pragma}: true" continue } - if (cachedCommitPragma(pragma, '').toLowerCase() == 'false') { + if (commitPragmas.get(pragma, '').toLowerCase() == 'false') { runStage[stage] = true reasons[stage] = "commit pragma ${pragma}: false" continue @@ -145,43 +151,94 @@ void displayRunStage(Map reasons = [:]) { } } +// Returns only lines like: Key-Name: some value +Map getCommitMessageKeyValues() { + String commitMessage = sh( + script: 'git log -1 --pretty=%B', + returnStdout: true + ).trim() + + Map pragmas = [:] + + commitMessage.readLines().each { String line -> + // ^([A-Za-z0-9-]+):\s+(.+)$ + // 1) key: letters/numbers/dashes + // 2) colon + at least one space + // 3) value: rest of line + def m = (line =~ /^([A-Za-z0-9-]+):\s+(.+)$/) + if (m.matches()) { + pragmas[m[0][1]] = m[0][2].trim() + } + } + + return pragmas +} + // Get a list of skip commit pragmas to check for a given stage name List getStageNameSkipPragmas(String stageName) { List pragmas = [] pragmas.add("Skip-${stageName.replaceAll(' ', '-').toLowerCase()}") if (stageName.contains('Build')) { + // Add skip pragma for parent stage pragmas.add('Skip-build') + + // Compatibility with commit pragmas that don't match stage names exactly + if (pragmas[0].contains('build-on-')) { + pragmas.add(pragmas[0].replace('build-on-', 'build-')) + } } if (stageName.contains('Unit Test') || stageName.contains('NLT')) { + // Add skip pragma for parent stage pragmas.add('Skip-unit-tests') } if (stageName.contains('Test')) { + // Add skip pragma for parent stage pragmas.add('Skip-test') } if (stageName.contains('Functional')) { - // Compatibility for commit pragmas that don't match stage names exactly - pragmas[0] = pragmas[0].replace('functional-', 'func-') - pragmas[0] = pragmas[0].replace('func-on-', 'func-test-') - pragmas[0] = pragmas[0].replace('hardware-', 'hw-') + // Add skip pragma for parent stage pragmas.add('Skip-func-test') + + // Compatibility for commit pragmas that don't match stage names exactly + if (pragmas[0].contains('functional-on-')) { + pragmas.add(pragmas[0].replace('functional-on-', 'func-test-')) + } else if (pragmas[0].contains('functional-hardware-')) { + pragmas.add(pragmas[0].replace('functional-hardware-', 'func-hw-')) + } } if (stageName.contains('Functional on')) { + // Add skip pragma for parent stage + pragmas.add('Skip-test') + + // Add skip pragma alias for all functional VM tests pragmas.add('Skip-func-test-vm') } if (stageName.contains('Functional Hardware')) { + // Add skip pragma for parent stage + pragmas.add('Skip-test-hardware') + pragmas.add('Skip-test-hw') + + // Add skip pragma alias for all functional HW tests pragmas.add('Skip-func-hw-test') } + + // Compatibility for commit pragmas with distro versions that don't match stage names exactly List distros = ['el', 'leap', 'sles', 'ubuntu'] + List copyPragmas = pragmas.clone() for (distro in distros) { - if (pragmas[0].contains("${distro}-")) { - // Compatibility for commit pragmas that don't match stage names exactly - pragmas[0] = pragmas[0].replace("${distro}-", "${distro}") + for (_pragma in copyPragmas) { + if (_pragma.contains("-${distro}-")) { + pragmas.add(_pragma.replace("-${distro}-", "-${distro}")) + } } } // Compatibility for commit pragmas that don't match stage names exactly - pragmas[0] = pragmas[0].replace('-testing', '-test') - pragmas[0] = pragmas[0].replace('-check', '') + if (pragmas[0].contains('-testing')) { + pragmas.add(pragmas[0].replace('-testing', '-test')) + } else if (pragmas[0].contains('-check')) { + pragmas.add(pragmas[0].replace('-check', '')) + } return pragmas } From 607748a6a67103dd3c686898086149391ecb3497 Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Thu, 21 May 2026 22:26:47 -0400 Subject: [PATCH 06/38] Updates. Skip-build-on-el8: true Skip-test: true Skip-test-hw: true Skip-unit-tests: false Signed-off-by: Phil Henderson --- Jenkinsfile | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 37aef37b5bc..b8c647c3743 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -144,14 +144,14 @@ void displayRunStage(Map reasons = [:]) { for (stage in runStage.keySet()) { String reason = reasons.get(stage, 'default') if (runStage[stage]) { - echo(" ${stage}: Running (reason: ${reason})") + echo("Running: ${stage} (reason: ${reason})") } else { - echo(" ${stage}: Skipping (reason: ${reason})") + echo("Skipping: ${stage} (reason: ${reason})") } } } -// Returns only lines like: Key-Name: some value +// Extract the commit pragmas from the commit message and return them as a map Map getCommitMessageKeyValues() { String commitMessage = sh( script: 'git log -1 --pretty=%B', @@ -171,6 +171,9 @@ Map getCommitMessageKeyValues() { } } + // Ignore non-pragma lines that match the pragma pattern (i.e. Signed-off-by) + pragmas.remove('Signed-off-by') + return pragmas } From 3f19d518fa0fc735ed10144093b8e2df5087d456 Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Thu, 21 May 2026 23:40:36 -0400 Subject: [PATCH 07/38] Updates Skip-build-on-el8: true Skip-test-hw: true Signed-off-by: Phil Henderson --- Jenkinsfile | 123 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 76 insertions(+), 47 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index b8c647c3743..22efcfc008e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -63,6 +63,7 @@ runStage = [ 'Functional Hardware Large MD on SSD': true, ] +// Update the runStage map void updateRunStage() { Map reasons = [:] @@ -114,31 +115,38 @@ void updateRunStage() { } } + // Handle builds started by the user + if (startedByUser()) { + println("updateRunStage: Build started by the user, skipping commit pragma checks") + displayRunStage(reasons) + return + } + // Update stage running based on commit pragmas Map commitPragmas = getCommitMessageKeyValues() println("updateRunStage: commit pragmas from commit message:") commitPragmas.each { key, value -> println(" ${key}: ${value}") } - for (stage in runStage.keySet()) { List skipPragmas = getStageNameSkipPragmas(stage) for (pragma in skipPragmas) { + println("updateRunStage: checking for a ${pragma} commit pragma for stage ${stage}") if (commitPragmas.get(pragma, '').toLowerCase() == 'true') { runStage[stage] = false reasons[stage] = "commit pragma ${pragma}: true" - continue - } - if (commitPragmas.get(pragma, '').toLowerCase() == 'false') { + break + } else if (commitPragmas.get(pragma, '').toLowerCase() == 'false') { runStage[stage] = true reasons[stage] = "commit pragma ${pragma}: false" - continue + break } } } displayRunStage(reasons) } +// Log which stages will be run and why based on the current state of the runStage map void displayRunStage(Map reasons = [:]) { println("Stage run conditions:") for (stage in runStage.keySet()) { @@ -179,53 +187,81 @@ Map getCommitMessageKeyValues() { // Get a list of skip commit pragmas to check for a given stage name List getStageNameSkipPragmas(String stageName) { + String stagePragma = "Skip-${stageName.replaceAll(' ', '-').toLowerCase()}" List pragmas = [] - pragmas.add("Skip-${stageName.replaceAll(' ', '-').toLowerCase()}") - if (stageName.contains('Build')) { - // Add skip pragma for parent stage - pragmas.add('Skip-build') - // Compatibility with commit pragmas that don't match stage names exactly - if (pragmas[0].contains('build-on-')) { - pragmas.add(pragmas[0].replace('build-on-', 'build-')) - } - } - if (stageName.contains('Unit Test') || stageName.contains('NLT')) { - // Add skip pragma for parent stage - pragmas.add('Skip-unit-tests') - } - if (stageName.contains('Test')) { - // Add skip pragma for parent stage - pragmas.add('Skip-test') - } - if (stageName.contains('Functional')) { - // Add skip pragma for parent stage - pragmas.add('Skip-func-test') + // Build up a priority list of pragmas to check based on the stage name. + if (stageName == 'Python Bandit check') { + // Add skip pragma for this stage + pragmas.add(stagePragma) + // Compatibility with existing commit pragmas + pragmas.add(stagePragma.replace('-bandit-check', '-bandit')) - // Compatibility for commit pragmas that don't match stage names exactly - if (pragmas[0].contains('functional-on-')) { - pragmas.add(pragmas[0].replace('functional-on-', 'func-test-')) - } else if (pragmas[0].contains('functional-hardware-')) { - pragmas.add(pragmas[0].replace('functional-hardware-', 'func-hw-')) + } else if (stageName.contains('Build')) { + // Add skip pragma for parent stage + if (stageName != 'Build') { + pragmas.add('Skip-build') } - } - if (stageName.contains('Functional on')) { + // Add skip pragma for this stage + pragmas.add(stagePragma) + // Compatibility with existing commit pragmas + if (stagePragma.contains('build-on-')) { + pragmas.add(stagePragma.replace('build-on-', 'build-')) + } + + } else if (stageName.contains('Unit Test') || stageName.contains('NLT')) { // Add skip pragma for parent stage - pragmas.add('Skip-test') + if (stageName != 'Unit Tests') { + pragmas.add('Skip-unit-tests') + } + // Add skip pragma for this stage + pragmas.add(stagePragma) + // Compatibility with existing commit pragmas + if (stagePragma.contains('-with-')) { + pragmas.add(stagePragma.replace('-with-', '-')) + } - // Add skip pragma alias for all functional VM tests - pragmas.add('Skip-func-test-vm') - } - if (stageName.contains('Functional Hardware')) { + } else if (stageName == 'Test' || stageName.contains('Functional on') + || stageName.contains('Fault injection') || stageName.contains('Test RPMs')) { // Add skip pragma for parent stage - pragmas.add('Skip-test-hardware') - pragmas.add('Skip-test-hw') + if (stageName != 'Test') { + pragmas.add('Skip-test') + } + if (stageName.contains('Functional on')) { + // Add skip pragma alias for all functional tests + pragmas.add('Skip-func-test') + // Add skip pragma alias for all functional VM tests + pragmas.add('Skip-func-test-vm') + // Compatibility with existing commit pragmas + pragmas.add(stagePragma.replace('functional-on-', 'func-test-')) + } else if (stageName.contains('Test RPMs on')) { + // Add skip pragma alias for all RPM tests + pragmas.add('Skip-test-rpms') + } else if (stageName.contains('Fault injection')) { + // Compatibility with existing commit pragmas + pragmas.add('Skip-fault-injection-test') + } + // Add skip pragma for this stage + pragmas.add(stagePragma) + } else if (stageName.contains('Test Storage Prep')) { + // Add skip pragma for this stage + pragmas.add(stagePragma) + + } else if (stageName.contains('Hardware')) { + // Add skip pragma alias for all functional tests + pragmas.add('Skip-func-test') // Add skip pragma alias for all functional HW tests pragmas.add('Skip-func-hw-test') + // Add skip pragma for this stage + pragmas.add(stagePragma) + // Compatibility with existing commit pragmas + if (stagePragma.contains('functional-hardware-')) { + pragmas.add(stagePragma.replace('functional-hardware-', 'func-hw-test-')) + } } - // Compatibility for commit pragmas with distro versions that don't match stage names exactly + // Compatibility with existing commit pragmas using distro versions List distros = ['el', 'leap', 'sles', 'ubuntu'] List copyPragmas = pragmas.clone() for (distro in distros) { @@ -236,13 +272,6 @@ List getStageNameSkipPragmas(String stageName) { } } - // Compatibility for commit pragmas that don't match stage names exactly - if (pragmas[0].contains('-testing')) { - pragmas.add(pragmas[0].replace('-testing', '-test')) - } else if (pragmas[0].contains('-check')) { - pragmas.add(pragmas[0].replace('-check', '')) - } - return pragmas } From 37685e0553da3edf748fab8724d49cfcfd1a9975 Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Thu, 21 May 2026 23:57:35 -0400 Subject: [PATCH 08/38] Add 'Skip-all-tests'. Skip-build-on-el8: true Skip-test: true Skip-test-hw: true Signed-off-by: Phil Henderson --- Jenkinsfile | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 22efcfc008e..98423434946 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -124,7 +124,7 @@ void updateRunStage() { // Update stage running based on commit pragmas Map commitPragmas = getCommitMessageKeyValues() - println("updateRunStage: commit pragmas from commit message:") + println("updateRunStage: Checking commit pragmas from commit message:") commitPragmas.each { key, value -> println(" ${key}: ${value}") } @@ -210,6 +210,8 @@ List getStageNameSkipPragmas(String stageName) { } } else if (stageName.contains('Unit Test') || stageName.contains('NLT')) { + // Add skip pragma alias for all tests + pragmas.add('Skip-all-tests') // Add skip pragma for parent stage if (stageName != 'Unit Tests') { pragmas.add('Skip-unit-tests') @@ -223,6 +225,8 @@ List getStageNameSkipPragmas(String stageName) { } else if (stageName == 'Test' || stageName.contains('Functional on') || stageName.contains('Fault injection') || stageName.contains('Test RPMs')) { + // Add skip pragma alias for all tests + pragmas.add('Skip-all-tests') // Add skip pragma for parent stage if (stageName != 'Test') { pragmas.add('Skip-test') @@ -245,10 +249,14 @@ List getStageNameSkipPragmas(String stageName) { pragmas.add(stagePragma) } else if (stageName.contains('Test Storage Prep')) { + // Add skip pragma alias for all tests + pragmas.add('Skip-all-tests') // Add skip pragma for this stage pragmas.add(stagePragma) } else if (stageName.contains('Hardware')) { + // Add skip pragma alias for all tests + pragmas.add('Skip-all-tests') // Add skip pragma alias for all functional tests pragmas.add('Skip-func-test') // Add skip pragma alias for all functional HW tests From 903d99f9df532ce2e62ea4756ba5448138013fac Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Fri, 22 May 2026 00:15:43 -0400 Subject: [PATCH 09/38] Updates. Skip-build-on-el8: true Skip-unit-tests: true Skip-func-hw-test: true Skip-fault-injection-testing: false Skip-fault-injection-testing: true Signed-off-by: Phil Henderson --- Jenkinsfile | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 98423434946..7d26a106b94 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -51,7 +51,6 @@ runStage = [ 'Fault injection testing': true, 'Test RPMs on EL 9.6': true, 'Test RPMs on Leap 15.5': true, - 'Test Storage Prep on EL 8.8': true, 'Test Hardware': true, 'Functional Hardware Medium': false, 'Functional Hardware Medium MD on SSD': true, @@ -131,7 +130,7 @@ void updateRunStage() { for (stage in runStage.keySet()) { List skipPragmas = getStageNameSkipPragmas(stage) for (pragma in skipPragmas) { - println("updateRunStage: checking for a ${pragma} commit pragma for stage ${stage}") + println("updateRunStage: ${stage} checking for a ${pragma} commit pragma") if (commitPragmas.get(pragma, '').toLowerCase() == 'true') { runStage[stage] = false reasons[stage] = "commit pragma ${pragma}: true" @@ -191,7 +190,11 @@ List getStageNameSkipPragmas(String stageName) { List pragmas = [] // Build up a priority list of pragmas to check based on the stage name. - if (stageName == 'Python Bandit check') { + if (stageName in ['Cancel Previous Builds', 'Pre-build']) { + // Add skip pragma for this stage + pragmas.add(stagePragma) + + } else if (stageName == 'Python Bandit check') { // Add skip pragma for this stage pragmas.add(stagePragma) // Compatibility with existing commit pragmas @@ -248,12 +251,6 @@ List getStageNameSkipPragmas(String stageName) { // Add skip pragma for this stage pragmas.add(stagePragma) - } else if (stageName.contains('Test Storage Prep')) { - // Add skip pragma alias for all tests - pragmas.add('Skip-all-tests') - // Add skip pragma for this stage - pragmas.add(stagePragma) - } else if (stageName.contains('Hardware')) { // Add skip pragma alias for all tests pragmas.add('Skip-all-tests') @@ -636,9 +633,6 @@ pipeline { booleanParam(name: 'Test RPMs on Leap 15.5', defaultValue: runStage['Test RPMs on Leap 15.5'], description: 'Run the Test RPMs on Leap 15.5 stage.') - booleanParam(name: 'Test Storage Prep on EL 8.8', - defaultValue: runStage['Test Storage Prep on EL 8.8'], - description: 'Run the Test Storage Prep on EL 8.8 stage.') booleanParam(name: 'Test Hardware', defaultValue: runStage['Test Hardware'], description: 'Run the Test Hardware stage.') @@ -1489,7 +1483,7 @@ pipeline { stage('Test Storage Prep on EL 8.8') { when { beforeAgent true - expression { runStage['Test Storage Prep on EL 8.8'] && params.CI_STORAGE_PREP_LABEL != '' } + expression { params.CI_STORAGE_PREP_LABEL != '' } } agent { label params.CI_STORAGE_PREP_LABEL From db340307eb492450278582d4979a143f020b53aa Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Fri, 22 May 2026 00:56:04 -0400 Subject: [PATCH 10/38] Updates. Skip-build-on-el8: true Skip-unit-tests: true Skip-func-hw-test: true Skip-fault-injection-testing: false Skip-fault-injection-testing: true Signed-off-by: Phil Henderson --- Jenkinsfile | 49 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 7d26a106b94..bb1e6aa70c1 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -66,15 +66,17 @@ runStage = [ void updateRunStage() { Map reasons = [:] + // Default to the parameter selection/default for all stages + for (stage in runStage.keySet()) { + runStage[stage] = params.get(stage, true) + reasons[stage] = "parameter selection/default" + } + // Handle doc-only changes: Only run default or selected build stages if (docOnlyChange(target_branch)) { - println("updateRunStage: Detected doc-only change, overwriting defaults") + println("updateRunStage: Detected doc-only change, skipping testing") for (stage in runStage.keySet()) { - if (stage in ['Cancel Previous Builds', 'Pre-build', 'Build'] - || stage.contains('Build')) { - runStage[stage] = params.get(stage, true) - reasons[stage] = "parameter selection/default" - } else { + if (stage in ['Unit Tests', 'Test', 'Test Hardware']) { runStage[stage] = false reasons[stage] = "doc-only change" } @@ -87,10 +89,11 @@ void updateRunStage() { if (startedByLanding()) { println("updateRunStage: Detected landing build, overwriting defaults") for (stage in runStage.keySet()) { - if (stage in ['Pre-build', 'Build', 'Unit Tests', 'Test'] + if (stage in ['Pre-build', 'Python Bandit check', 'Build', 'Unit Tests', 'Test'] || stage.contains('Build on') || stage.contains('Unit Test') || stage.contains('NLT') + || stage.contains('Fault injection') || stage.contains('Test RPMs') || (stage.contains('Functional on') && !stage.contains('Ubuntu'))) { runStage[stage] = true @@ -103,15 +106,35 @@ void updateRunStage() { return } - // Handle specific RPM Version + // Handle user setting CI_RPM_TEST_VERSION if (params.CI_RPM_TEST_VERSION) { - println("updateRunStage: Detected specific RPM version, overwriting build/RPM test stages") + println("updateRunStage: Detected specific RPM version, skipping build/RPM test stages") for (stage in runStage.keySet()) { - if (stage.contains('Build') || stage.contains('Test RPMs')) { + if (stage.contains('Build') + || stage.contains('Unit Tests') + || stage.contains('Test RPMs')) { runStage[stage] = false reasons[stage] = "specific RPM version" } } + displayRunStage(reasons) + return + } + + // Handle user setting CI_BUILD_PACKAGES_ONLY + if (params.CI_BUILD_PACKAGES_ONLY) { + println("updateRunStage: Detected CI_BUILD_PACKAGES_ONLY, skipping unit test stages") + for (stage in runStage.keySet()) { + if (stage.contains('Unit Tests')) { + runStage[stage] = false + reasons[stage] = "CI_BUILD_PACKAGES_ONLY" + } else if (stage.contains('Build')) { + runStage[stage] = true + reasons[stage] = "CI_BUILD_PACKAGES_ONLY" + } + } + displayRunStage(reasons) + return } // Handle builds started by the user @@ -529,9 +552,9 @@ pipeline { 'stages. Specifies the default provider to use the daos_server ' + 'config file when running functional tests (the launch.py ' + '--provider argument; i.e. "ucx+dc_x", "ofi+verbs", "ofi+tcp")') - booleanParam(name: 'CI_CANCEL_PREV_BUILD_SKIP', - defaultValue: false, - description: 'Do not cancel previous build.') + // booleanParam(name: 'CI_CANCEL_PREV_BUILD_SKIP', + // defaultValue: false, + // description: 'Do not cancel previous build.') booleanParam(name: 'CI_BUILD_PACKAGES_ONLY', defaultValue: false, description: 'Build RPM and DEB packages, Skip unit tests.') From 9e352f694ab5fe7e18145e6ba6d0c98dc8b7647b Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Fri, 22 May 2026 01:30:09 -0400 Subject: [PATCH 11/38] Attempt to fix UnmodifiableMap Skip-build-on-el8: true Skip-unit-tests: true Skip-func-hw-test: true Skip-fault-injection-testing: false Skip-fault-injection-testing: true Signed-off-by: Phil Henderson --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index bb1e6aa70c1..a1818a1b72f 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -25,7 +25,7 @@ job_status_internal = [:] // Update the defaults for running stages in a PR here /* groovylint-disable-next-line CompileStatic */ -runStage = [ +Map runStage = [ 'Cancel Previous Builds': true, 'Pre-build': true, 'Python Bandit check': true, From 8736a4e3545d71799de6c925147d89fbdad5de4d Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Fri, 22 May 2026 01:40:51 -0400 Subject: [PATCH 12/38] Make runStage globally visable and mutable. Skip-build-on-el8: true Skip-unit-tests: true Skip-func-hw-test: true Skip-fault-injection-testing: false Skip-fault-injection-testing: true Signed-off-by: Phil Henderson --- Jenkinsfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index a1818a1b72f..7fe9a172188 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -16,6 +16,8 @@ * LICENSE file. */ +import groovy.transform.Field + // To use a test branch (i.e. PR) until it lands to master // I.e. for testing library changes //@Library(value='pipeline-lib@your_branch') _ @@ -24,7 +26,7 @@ job_status_internal = [:] // Update the defaults for running stages in a PR here -/* groovylint-disable-next-line CompileStatic */ +@Field Map runStage = [ 'Cancel Previous Builds': true, 'Pre-build': true, From def8ff26a4d7aca4e74f593e53e50779248bbdea Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Fri, 22 May 2026 01:55:24 -0400 Subject: [PATCH 13/38] Test. Skip-build-on-el8: true Skip-unit-tests: true Skip-func-hw-test: true Skip-fault-injection-testing: false Skip-fault-injection-testing: true Signed-off-by: Phil Henderson --- Jenkinsfile | 75 +++++++++++++++++++++++++++-------------------------- 1 file changed, 38 insertions(+), 37 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 7fe9a172188..5f7fe0c7318 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -16,8 +16,6 @@ * LICENSE file. */ -import groovy.transform.Field - // To use a test branch (i.e. PR) until it lands to master // I.e. for testing library changes //@Library(value='pipeline-lib@your_branch') _ @@ -25,8 +23,8 @@ import groovy.transform.Field /* groovylint-disable-next-line CompileStatic */ job_status_internal = [:] -// Update the defaults for running stages in a PR here -@Field +// Values here don't matter, the true defaults are set in pipeline.parameters +/* groovylint-disable-next-line CompileStatic */ Map runStage = [ 'Cancel Previous Builds': true, 'Pre-build': true, @@ -587,103 +585,106 @@ pipeline { defaultValue: '', description: 'Image to used for Ubuntu 20 CI tests. I.e. ubuntu20.04, etc.') booleanParam(name: 'Cancel Previous Builds', - defaultValue: runStage['Cancel Previous Builds'], + defaultValue: true, description: 'Cancel previous build before running this one.') booleanParam(name: 'Pre-build', - defaultValue: runStage['Pre-build'], + defaultValue: true, description: 'Run the pre-build stage.') booleanParam(name: 'Python Bandit check', - defaultValue: runStage['Python Bandit check'], + defaultValue: true, description: 'Run the Python Bandit check stage.') booleanParam(name: 'Build', - defaultValue: runStage['Build'], + defaultValue: true, description: 'Run the build stage.') booleanParam(name: 'Build on EL 8', - defaultValue: runStage['Build on EL 8'], + defaultValue: true, description: 'Run the build on EL 8 stage.') booleanParam(name: 'Build on EL 9', - defaultValue: runStage['Build on EL 9'], + defaultValue: true, description: 'Run the build on EL 9 stage.') booleanParam(name: 'Build on Leap 15', - defaultValue: runStage['Build on Leap 15'], + defaultValue: true, description: 'Run the build on Leap 15 stage.') booleanParam(name: 'Build on EL 9 with Bullseye', - defaultValue: runStage['Build on EL 9 with Bullseye'], + defaultValue: true, description: 'Run the build on EL 9 with Bullseye stage.') booleanParam(name: 'Unit Tests', - defaultValue: runStage['Unit Tests'], + defaultValue: true, description: 'Run the Unit Tests stage.') booleanParam(name: 'Unit Test', - defaultValue: runStage['Unit Test'], + defaultValue: true, description: 'Run the Unit Test stage.') booleanParam(name: 'Unit Test bdev', - defaultValue: runStage['Unit Test bdev'], + defaultValue: true, description: 'Run the Unit Test bdev stage.') booleanParam(name: 'NLT', - defaultValue: runStage['NLT'], + defaultValue: true, description: 'Run the NLT stage.') booleanParam(name: 'NLT with Bullseye', - defaultValue: runStage['NLT with Bullseye'], + defaultValue: true, description: 'Run the NLT with Bullseye stage.') booleanParam(name: 'Unit Test with memcheck', - defaultValue: runStage['Unit Test with memcheck'], + defaultValue: true, description: 'Run the Unit Test with memcheck stage.') booleanParam(name: 'Unit Test bdev with memcheck', - defaultValue: runStage['Unit Test bdev with memcheck'], + defaultValue: true, description: 'Run the Unit Test bdev with memcheck stage.') booleanParam(name: 'Test', - defaultValue: runStage['Test'], + defaultValue: true, description: 'Run the Test stage.') booleanParam(name: 'Functional on EL 8.8 with Valgrind', - defaultValue: runStage['Functional on EL 8.8 with Valgrind'], + defaultValue: false, description: 'Run the Functional on EL 8.8 with Valgrind stage.') booleanParam(name: 'Functional on EL 8', - defaultValue: runStage['Functional on EL 8'], + defaultValue: false, description: 'Run the Functional on EL 8 stage.') booleanParam(name: 'Functional on EL 9', - defaultValue: runStage['Functional on EL 9'], + defaultValue: true, description: 'Run the Functional on EL 9 stage.') booleanParam(name: 'Functional on Leap 15', - defaultValue: runStage['Functional on Leap 15'], + defaultValue: false, description: 'Run the Functional on Leap 15 stage.') + booleanParam(name: 'Functional on SLES 15', + defaultValue: false, + description: 'Run the Functional on SLES 15 stage.') booleanParam(name: 'Functional on Ubuntu 20.04', - defaultValue: runStage['Functional on Ubuntu 20.04'], + defaultValue: false, description: 'Run the Functional on Ubuntu 20.04 stage.') booleanParam(name: 'Fault injection testing', - defaultValue: runStage['Fault injection testing'], + defaultValue: true, description: 'Run the Fault injection testing stage.') booleanParam(name: 'Test RPMs on EL 9.6', - defaultValue: runStage['Test RPMs on EL 9.6'], + defaultValue: true, description: 'Run the Test RPMs on EL 9.6 stage.') booleanParam(name: 'Test RPMs on Leap 15.5', - defaultValue: runStage['Test RPMs on Leap 15.5'], + defaultValue: true, description: 'Run the Test RPMs on Leap 15.5 stage.') booleanParam(name: 'Test Hardware', - defaultValue: runStage['Test Hardware'], + defaultValue: true, description: 'Run the Test Hardware stage.') booleanParam(name: 'Functional Hardware Medium', - defaultValue: runStage['Functional Hardware Medium'], + defaultValue: false, description: 'Run the Functional Hardware Medium stage.') booleanParam(name: 'Functional Hardware Medium MD on SSD', - defaultValue: runStage['Functional Hardware Medium MD on SSD'], + defaultValue: true, description: 'Run the Functional Hardware Medium MD on SSD stage.') booleanParam(name: 'Functional Hardware Medium VMD', - defaultValue: runStage['Functional Hardware Medium VMD'], + defaultValue: false, description: 'Run the Functional Hardware Medium VMD stage.') booleanParam(name: 'Functional Hardware Medium Verbs Provider', - defaultValue: runStage['Functional Hardware Medium Verbs Provider'], + defaultValue: false, description: 'Run the Functional Hardware Medium Verbs Provider stage.') booleanParam(name: 'Functional Hardware Medium Verbs Provider MD on SSD', - defaultValue: runStage['Functional Hardware Medium Verbs Provider MD on SSD'], + defaultValue: true, description: 'Run the Functional Hardware Medium Verbs Provider MD on SSD stage.') booleanParam(name: 'Functional Hardware Medium UCX Provider', - defaultValue: runStage['Functional Hardware Medium UCX Provider'], + defaultValue: false, description: 'Run the Functional Hardware Medium UCX Provider stage.') booleanParam(name: 'Functional Hardware Large', - defaultValue: runStage['Functional Hardware Large'], + defaultValue: false, description: 'Run the Functional Hardware Large stage.') booleanParam(name: 'Functional Hardware Large MD on SSD', - defaultValue: runStage['Functional Hardware Large MD on SSD'], + defaultValue: true, description: 'Run the Functional Hardware Large MD on SSD stage.') // booleanParam(name: 'CI_el8_NOBUILD', // defaultValue: false, From 71bb0969be10265a25cf52a8ca375f8b173a911f Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Fri, 22 May 2026 02:02:54 -0400 Subject: [PATCH 14/38] Another test Skip-build-on-el8: true Skip-unit-tests: true Skip-func-hw-test: true Skip-fault-injection-testing: false Skip-fault-injection-testing: true Signed-off-by: Phil Henderson --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 5f7fe0c7318..d4675fe308b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -25,7 +25,7 @@ job_status_internal = [:] // Values here don't matter, the true defaults are set in pipeline.parameters /* groovylint-disable-next-line CompileStatic */ -Map runStage = [ +runStage = [ 'Cancel Previous Builds': true, 'Pre-build': true, 'Python Bandit check': true, From 702ddaa32e21e75736dd00429d1e56c8638f235f Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Fri, 22 May 2026 02:13:48 -0400 Subject: [PATCH 15/38] Experiment Skip-build-on-el8: true Skip-unit-tests: true Skip-func-hw-test: true Skip-fault-injection-testing: false Skip-fault-injection-testing: true Signed-off-by: Phil Henderson --- Jenkinsfile | 56 +++++++++++++++++++++++++++-------------------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index d4675fe308b..63886ddd8c3 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -16,6 +16,8 @@ * LICENSE file. */ +import groovy.transform.Field + // To use a test branch (i.e. PR) until it lands to master // I.e. for testing library changes //@Library(value='pipeline-lib@your_branch') _ @@ -23,43 +25,43 @@ /* groovylint-disable-next-line CompileStatic */ job_status_internal = [:] -// Values here don't matter, the true defaults are set in pipeline.parameters -/* groovylint-disable-next-line CompileStatic */ -runStage = [ - 'Cancel Previous Builds': true, - 'Pre-build': true, - 'Python Bandit check': true, - 'Build': true, - 'Build on EL 8': true, - 'Build on EL 9': true, - 'Build on Leap 15': true, - 'Build on EL 9 with Bullseye': true, - 'Unit Tests': true, - 'Unit Test': true, - 'Unit Test bdev': true, - 'NLT': true, - 'NLT with Bullseye': true, - 'Unit Test with memcheck': true, - 'Unit Test bdev with memcheck': true, - 'Test': true, +// Initial values here don't matter, updateRunStage() will set the defaults using the parameters +@Field +Map runStage = [ + 'Cancel Previous Builds': false, + 'Pre-build': false, + 'Python Bandit check': false, + 'Build': false, + 'Build on EL 8': false, + 'Build on EL 9': false, + 'Build on Leap 15': false, + 'Build on EL 9 with Bullseye': false, + 'Unit Tests': false, + 'Unit Test': false, + 'Unit Test bdev': false, + 'NLT': false, + 'NLT with Bullseye': false, + 'Unit Test with memcheck': false, + 'Unit Test bdev with memcheck': false, + 'Test': false, 'Functional on EL 8.8 with Valgrind': false, 'Functional on EL 8': false, - 'Functional on EL 9': true, + 'Functional on EL 9': false, 'Functional on Leap 15': false, 'Functional on SLES 15': false, 'Functional on Ubuntu 20.04': false, - 'Fault injection testing': true, - 'Test RPMs on EL 9.6': true, - 'Test RPMs on Leap 15.5': true, - 'Test Hardware': true, + 'Fault injection testing': false, + 'Test RPMs on EL 9.6': false, + 'Test RPMs on Leap 15.5': false, + 'Test Hardware': false, 'Functional Hardware Medium': false, - 'Functional Hardware Medium MD on SSD': true, + 'Functional Hardware Medium MD on SSD': false, 'Functional Hardware Medium VMD': false, 'Functional Hardware Medium Verbs Provider': false, - 'Functional Hardware Medium Verbs Provider MD on SSD': true, + 'Functional Hardware Medium Verbs Provider MD on SSD': false, 'Functional Hardware Medium UCX Provider': false, 'Functional Hardware Large': false, - 'Functional Hardware Large MD on SSD': true, + 'Functional Hardware Large MD on SSD': false, ] // Update the runStage map From c1a8f46ad8f38ed006e0c1dd05d2b3aa8507185d Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Fri, 22 May 2026 02:28:55 -0400 Subject: [PATCH 16/38] Cleanup Skip-build-on-el8: true Skip-unit-tests: true Skip-func-hw-test: true Skip-fault-injection-testing: false Skip-fault-injection-testing: true Signed-off-by: Phil Henderson --- Jenkinsfile | 135 +++++----------------------------------------------- 1 file changed, 12 insertions(+), 123 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 63886ddd8c3..26c51054436 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -25,53 +25,20 @@ import groovy.transform.Field /* groovylint-disable-next-line CompileStatic */ job_status_internal = [:] -// Initial values here don't matter, updateRunStage() will set the defaults using the parameters @Field -Map runStage = [ - 'Cancel Previous Builds': false, - 'Pre-build': false, - 'Python Bandit check': false, - 'Build': false, - 'Build on EL 8': false, - 'Build on EL 9': false, - 'Build on Leap 15': false, - 'Build on EL 9 with Bullseye': false, - 'Unit Tests': false, - 'Unit Test': false, - 'Unit Test bdev': false, - 'NLT': false, - 'NLT with Bullseye': false, - 'Unit Test with memcheck': false, - 'Unit Test bdev with memcheck': false, - 'Test': false, - 'Functional on EL 8.8 with Valgrind': false, - 'Functional on EL 8': false, - 'Functional on EL 9': false, - 'Functional on Leap 15': false, - 'Functional on SLES 15': false, - 'Functional on Ubuntu 20.04': false, - 'Fault injection testing': false, - 'Test RPMs on EL 9.6': false, - 'Test RPMs on Leap 15.5': false, - 'Test Hardware': false, - 'Functional Hardware Medium': false, - 'Functional Hardware Medium MD on SSD': false, - 'Functional Hardware Medium VMD': false, - 'Functional Hardware Medium Verbs Provider': false, - 'Functional Hardware Medium Verbs Provider MD on SSD': false, - 'Functional Hardware Medium UCX Provider': false, - 'Functional Hardware Large': false, - 'Functional Hardware Large MD on SSD': false, -] +Map runStage = [:] // Update the runStage map void updateRunStage() { Map reasons = [:] - // Default to the parameter selection/default for all stages - for (stage in runStage.keySet()) { - runStage[stage] = params.get(stage, true) - reasons[stage] = "parameter selection/default" + // Initialize the run state of each stage using the parameter stage keys + for (name in params.keySet()) { + value = params.get(name, null) + if (value instanceof Boolean && !name.startsWith('CI_')) { + runStage[name] = value + reasons[name] = "parameter selection/default" + } } // Handle doc-only changes: Only run default or selected build stages @@ -554,12 +521,12 @@ pipeline { 'stages. Specifies the default provider to use the daos_server ' + 'config file when running functional tests (the launch.py ' + '--provider argument; i.e. "ucx+dc_x", "ofi+verbs", "ofi+tcp")') - // booleanParam(name: 'CI_CANCEL_PREV_BUILD_SKIP', - // defaultValue: false, - // description: 'Do not cancel previous build.') booleanParam(name: 'CI_BUILD_PACKAGES_ONLY', defaultValue: false, description: 'Build RPM and DEB packages, Skip unit tests.') + booleanParam(name: 'CI_ALLOW_UNSTABLE_TEST', + defaultValue: false, + description: 'Continue testing if a previous stage is Unstable') string(name: 'CI_SCONS_ARGS', defaultValue: '', description: 'Arguments for scons when building DAOS') @@ -588,7 +555,7 @@ pipeline { description: 'Image to used for Ubuntu 20 CI tests. I.e. ubuntu20.04, etc.') booleanParam(name: 'Cancel Previous Builds', defaultValue: true, - description: 'Cancel previous build before running this one.') + description: 'Run the Cancel Previous Builds stage.') booleanParam(name: 'Pre-build', defaultValue: true, description: 'Run the pre-build stage.') @@ -688,84 +655,6 @@ pipeline { booleanParam(name: 'Functional Hardware Large MD on SSD', defaultValue: true, description: 'Run the Functional Hardware Large MD on SSD stage.') - // booleanParam(name: 'CI_el8_NOBUILD', - // defaultValue: false, - // description: 'Do not build sources and RPMs on EL 8') - // booleanParam(name: 'CI_el9_NOBUILD', - // defaultValue: false, - // description: 'Do not build sources and RPMs on EL 9') - // booleanParam(name: 'CI_leap15_NOBUILD', - // defaultValue: false, - // description: 'Do not build sources and RPMs on Leap 15') - booleanParam(name: 'CI_ALLOW_UNSTABLE_TEST', - defaultValue: false, - description: 'Continue testing if a previous stage is Unstable') - // booleanParam(name: 'CI_UNIT_TEST', - // defaultValue: true, - // description: 'Run the Unit Test test stage') - // booleanParam(name: 'CI_NLT_TEST', - // defaultValue: true, - // description: 'Run the NLT test stage') - // booleanParam(name: 'CI_UNIT_TEST_MEMCHECK', - // defaultValue: true, - // description: 'Run the Unit Test with memcheck test stage') - // booleanParam(name: 'CI_FI_TEST', - // defaultValue: true, - // description: 'Run the Fault injection testing test stage') - // booleanParam(name: 'CI_TEST_EL_RPMs', - // defaultValue: true, - // description: 'Run the Test RPMs on EL stage') - // booleanParam(name: 'CI_TEST_LEAP_RPMs', - // defaultValue: true, - // description: 'Run the Test RPMs on Leap test stage') - // booleanParam(name: 'CI_FUNCTIONAL_TEST_SKIP', - // defaultValue: false, - // description: 'Skip all functional test stages (Test)') - // booleanParam(name: 'CI_MORE_FUNCTIONAL_PR_TESTS', - // defaultValue: false, - // description: 'Enable more distros for functional CI tests') - // booleanParam(name: 'CI_FUNCTIONAL_el8_VALGRIND_TEST', - // defaultValue: false, - // description: 'Run the Functional on EL 8 with Valgrind test stage') - // booleanParam(name: 'CI_FUNCTIONAL_el8_TEST', - // defaultValue: false, - // description: 'Run the Functional on EL 8 test stage') - // booleanParam(name: 'CI_FUNCTIONAL_el9_TEST', - // defaultValue: true, - // description: 'Run the Functional on EL 9 test stage') - // booleanParam(name: 'CI_FUNCTIONAL_leap15_TEST', - // defaultValue: false, - // description: 'Run the Functional on Leap 15 test stage') - // booleanParam(name: 'CI_FUNCTIONAL_ubuntu20_TEST', - // defaultValue: false, - // description: 'Run the Functional on Ubuntu 20.04 test stage') - // booleanParam(name: 'CI_FUNCTIONAL_HARDWARE_TEST_SKIP', - // defaultValue: false, - // description: 'Skip Functional Hardware (Test Hardware) stage') - // booleanParam(name: 'CI_medium_TEST', - // defaultValue: false, - // description: 'Run the Functional Hardware Medium test stage') - // booleanParam(name: 'CI_medium_md_on_ssd_TEST', - // defaultValue: true, - // description: 'Run the Functional Hardware Medium MD on SSD test stage') - // booleanParam(name: 'CI_medium_vmd_TEST', - // defaultValue: false, - // description: 'Run the Functional Hardware Medium VMD test stage') - // booleanParam(name: 'CI_medium_verbs_provider_TEST', - // defaultValue: false, - // description: 'Run the Functional Hardware Medium Verbs Provider test stage') - // booleanParam(name: 'CI_medium_verbs_provider_md_on_ssd_TEST', - // defaultValue: true, - // description: 'Run the Functional Hardware Medium Verbs Provider MD on SSD test stage') - // booleanParam(name: 'CI_medium_ucx_provider_TEST', - // defaultValue: false, - // description: 'Run the Functional Hardware Medium UCX Provider test stage') - // booleanParam(name: 'CI_large_TEST', - // defaultValue: false, - // description: 'Run the Functional Hardware Large test stage') - // booleanParam(name: 'CI_large_md_on_ssd_TEST', - // defaultValue: true, - // description: 'Run the Functional Hardware Large MD on SSD test stage') string(name: 'CI_UNIT_VM1_LABEL', defaultValue: 'ci_vm1', description: 'Label to use for 1 VM node unit and RPM tests') From 517ea2dca6641d0566dc07b6600de34dbfab1b9b Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Fri, 22 May 2026 02:39:26 -0400 Subject: [PATCH 17/38] Ordered parameter names Skip-build-on-el8: true Skip-unit-tests: true Skip-func-hw-test: true Skip-fault-injection-testing: false Skip-fault-injection-testing: true Signed-off-by: Phil Henderson --- Jenkinsfile | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 26c51054436..eaaa3a62bc5 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -32,9 +32,13 @@ Map runStage = [:] void updateRunStage() { Map reasons = [:] + def orderedParams = currentBuild.rawBuild.parent.getProperty( + hudson.model.ParametersDefinitionProperty) ?.parameterDefinitions ?: [] + // Initialize the run state of each stage using the parameter stage keys - for (name in params.keySet()) { - value = params.get(name, null) + for (def paramDef in orderedParams) { + String name = paramDef.name + def value = params.get(name, null) if (value instanceof Boolean && !name.startsWith('CI_')) { runStage[name] = value reasons[name] = "parameter selection/default" From 64ce4a13dc2568eda87b9cce33ad9e4222ba9154 Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Fri, 22 May 2026 03:12:06 -0400 Subject: [PATCH 18/38] Manually handle stage order Skip-build-on-el8: true Skip-unit-tests: true Skip-func-hw-test: true Skip-fault-injection-testing: false Skip-fault-injection-testing: true Signed-off-by: Phil Henderson --- Jenkinsfile | 45 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index eaaa3a62bc5..0fc53b37e90 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -25,6 +25,7 @@ import groovy.transform.Field /* groovylint-disable-next-line CompileStatic */ job_status_internal = [:] +// Keys and values updated by the updateRunStage() function using the parameters. @Field Map runStage = [:] @@ -32,13 +33,47 @@ Map runStage = [:] void updateRunStage() { Map reasons = [:] - def orderedParams = currentBuild.rawBuild.parent.getProperty( - hudson.model.ParametersDefinitionProperty) ?.parameterDefinitions ?: [] + // Ordered list of stage names as params.keySet() does not guarantee order + List stageOrder = [ + 'Cancel Previous Builds', + 'Pre-build', + 'Python Bandit check', + 'Build', + 'Build on EL 8', + 'Build on EL 9', + 'Build on Leap 15', + 'Build on EL 9 with Bullseye', + 'Unit Tests', + 'Unit Test', + 'Unit Test bdev', + 'NLT', + 'NLT with Bullseye', + 'Unit Test with memcheck', + 'Unit Test bdev with memcheck', + 'Test', + 'Functional on EL 8.8 with Valgrind', + 'Functional on EL 8', + 'Functional on EL 9', + 'Functional on Leap 15', + 'Functional on SLES 15', + 'Functional on Ubuntu 20.04', + 'Fault injection testing', + 'Test RPMs on EL 9.6', + 'Test RPMs on Leap 15.5', + 'Test Hardware', + 'Functional Hardware Medium', + 'Functional Hardware Medium MD on SSD', + 'Functional Hardware Medium VMD', + 'Functional Hardware Medium Verbs Provider', + 'Functional Hardware Medium Verbs Provider MD on SSD', + 'Functional Hardware Medium UCX Provider', + 'Functional Hardware Large', + 'Functional Hardware Large MD on SSD' + ] // Initialize the run state of each stage using the parameter stage keys - for (def paramDef in orderedParams) { - String name = paramDef.name - def value = params.get(name, null) + for (name in stageOrder) { + value = params.get(name, null) if (value instanceof Boolean && !name.startsWith('CI_')) { runStage[name] = value reasons[name] = "parameter selection/default" From 59271f7dc079c21ef2fb19ef62f3f886a2f5779c Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Wed, 3 Jun 2026 16:58:05 -0400 Subject: [PATCH 19/38] Move stage. Test-tag: always_passes Skip-func-hw-test-medium: false Signed-off-by: Phil Henderson --- Jenkinsfile | 47 ++++++----------------------------------------- 1 file changed, 6 insertions(+), 41 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 1e1c5524ca8..f091d503978 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -153,20 +153,19 @@ void updateRunStage() { } // Update stage running based on commit pragmas - Map commitPragmas = getCommitMessageKeyValues() println("updateRunStage: Checking commit pragmas from commit message:") - commitPragmas.each { key, value -> + env.pragmas.each { key, value -> println(" ${key}: ${value}") } for (stage in runStage.keySet()) { List skipPragmas = getStageNameSkipPragmas(stage) for (pragma in skipPragmas) { println("updateRunStage: ${stage} checking for a ${pragma} commit pragma") - if (commitPragmas.get(pragma, '').toLowerCase() == 'true') { + if (env.pragmas.get(pragma, '').toLowerCase() == 'true') { runStage[stage] = false reasons[stage] = "commit pragma ${pragma}: true" break - } else if (commitPragmas.get(pragma, '').toLowerCase() == 'false') { + } else if (env.pragmas.get(pragma, '').toLowerCase() == 'false') { runStage[stage] = true reasons[stage] = "commit pragma ${pragma}: false" break @@ -189,32 +188,6 @@ void displayRunStage(Map reasons = [:]) { } } -// Extract the commit pragmas from the commit message and return them as a map -Map getCommitMessageKeyValues() { - String commitMessage = sh( - script: 'git log -1 --pretty=%B', - returnStdout: true - ).trim() - - Map pragmas = [:] - - commitMessage.readLines().each { String line -> - // ^([A-Za-z0-9-]+):\s+(.+)$ - // 1) key: letters/numbers/dashes - // 2) colon + at least one space - // 3) value: rest of line - def m = (line =~ /^([A-Za-z0-9-]+):\s+(.+)$/) - if (m.matches()) { - pragmas[m[0][1]] = m[0][2].trim() - } - } - - // Ignore non-pragma lines that match the pragma pattern (i.e. Signed-off-by) - pragmas.remove('Signed-off-by') - - return pragmas -} - // Get a list of skip commit pragmas to check for a given stage name List getStageNameSkipPragmas(String stageName) { String stagePragma = "Skip-${stageName.replaceAll(' ', '-').toLowerCase()}" @@ -700,7 +673,7 @@ pipeline { } stages { - stage('Setup') { + stage('Prepare') { parallel { stage('Set Description') { steps { @@ -711,19 +684,11 @@ pipeline { } } } - stage('Update Run Stage') { - steps { - updateRunStage() - } - } - } - } - stage('Prepare') { - parallel { - stage('Get Commit Message') { + stage('Configure Stage Actions') { steps { pragmasToEnv() update_default_commit_pragmas() + updateRunStage() } } stage('Get RPM relval') { From 8d011d98a4e0a6621320fb1a23e6972c5c08787e Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Wed, 3 Jun 2026 17:15:52 -0400 Subject: [PATCH 20/38] Convert env.pragmas back into a Map Test-tag: always_passes Skip-func-hw-test-medium: false Signed-off-by: Phil Henderson --- Jenkinsfile | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index f091d503978..09c783cbd25 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -153,19 +153,30 @@ void updateRunStage() { } // Update stage running based on commit pragmas + Map commitPragmas = [:] + if (env.pragmas && env.pragmas != '{}') { + // Convert the env.pragmas string back into a Map + commitPragmas = env.pragmas + .replaceAll(/^\{|\}$/, '') + .split(',\s*') + .collectEntries { entry -> + def (key, value) = entry.split('=', 2)*.trim() + [(key): value] + } as Map + } println("updateRunStage: Checking commit pragmas from commit message:") - env.pragmas.each { key, value -> + commitPragmas.each { key, value -> println(" ${key}: ${value}") } for (stage in runStage.keySet()) { List skipPragmas = getStageNameSkipPragmas(stage) for (pragma in skipPragmas) { println("updateRunStage: ${stage} checking for a ${pragma} commit pragma") - if (env.pragmas.get(pragma, '').toLowerCase() == 'true') { + if (commitPragmas.get(pragma, '').toLowerCase() == 'true') { runStage[stage] = false reasons[stage] = "commit pragma ${pragma}: true" break - } else if (env.pragmas.get(pragma, '').toLowerCase() == 'false') { + } else if (commitPragmas.get(pragma, '').toLowerCase() == 'false') { runStage[stage] = true reasons[stage] = "commit pragma ${pragma}: false" break From 18c1aed721762a8f6f37f61476e838fb49fc1e18 Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Wed, 3 Jun 2026 17:20:45 -0400 Subject: [PATCH 21/38] Fix syntax Test-tag: always_passes Skip-func-hw-test-medium: false Signed-off-by: Phil Henderson --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 09c783cbd25..751d8d93441 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -158,7 +158,7 @@ void updateRunStage() { // Convert the env.pragmas string back into a Map commitPragmas = env.pragmas .replaceAll(/^\{|\}$/, '') - .split(',\s*') + .split(/,\s*/) .collectEntries { entry -> def (key, value) = entry.split('=', 2)*.trim() [(key): value] From aa881a702d0e737bd1514702d597ba3745078ca6 Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Wed, 3 Jun 2026 17:27:51 -0400 Subject: [PATCH 22/38] Trying different groovy syntax Test-tag: always_passes Skip-func-hw-test-medium: false Signed-off-by: Phil Henderson --- Jenkinsfile | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 751d8d93441..91dd4b0c636 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -156,13 +156,20 @@ void updateRunStage() { Map commitPragmas = [:] if (env.pragmas && env.pragmas != '{}') { // Convert the env.pragmas string back into a Map - commitPragmas = env.pragmas - .replaceAll(/^\{|\}$/, '') - .split(/,\s*/) - .collectEntries { entry -> - def (key, value) = entry.split('=', 2)*.trim() - [(key): value] - } as Map + env.pragmas.replaceAll(/^\{|\}$/, '').split(/,\s*/).each { line -> + String key, value + try { + (key, value) = line.split(':', 2) + if (key.contains(' ')) { + // this returns from the .each closure, not the method + return + } + commitPragmas[key.toLowerCase()] = value.trim() + /* groovylint-disable-next-line CatchArrayIndexOutOfBoundsException */ + } catch (ArrayIndexOutOfBoundsException ignored) { + // ignore and move on to the next line + } + } } println("updateRunStage: Checking commit pragmas from commit message:") commitPragmas.each { key, value -> From 16d39c301d3ce640174967fd7e4b0fc849f6fb75 Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Wed, 3 Jun 2026 17:35:58 -0400 Subject: [PATCH 23/38] Debug Test-tag: always_passes Skip-func-hw-test-medium: false Signed-off-by: Phil Henderson --- Jenkinsfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Jenkinsfile b/Jenkinsfile index 91dd4b0c636..7f036a87951 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -156,6 +156,7 @@ void updateRunStage() { Map commitPragmas = [:] if (env.pragmas && env.pragmas != '{}') { // Convert the env.pragmas string back into a Map + println("updateRunStage: Converting env.pragmas string back into a Map: ${env.pragmas}") env.pragmas.replaceAll(/^\{|\}$/, '').split(/,\s*/).each { line -> String key, value try { From ea5b5087d803b300ccc69bf669050bef3d058443 Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Wed, 3 Jun 2026 17:41:01 -0400 Subject: [PATCH 24/38] Use envToPragmas(). Test-tag: always_passes Skip-func-hw-test-medium: false Signed-off-by: Phil Henderson --- Jenkinsfile | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 7f036a87951..3216279f32e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -153,25 +153,8 @@ void updateRunStage() { } // Update stage running based on commit pragmas - Map commitPragmas = [:] - if (env.pragmas && env.pragmas != '{}') { - // Convert the env.pragmas string back into a Map - println("updateRunStage: Converting env.pragmas string back into a Map: ${env.pragmas}") - env.pragmas.replaceAll(/^\{|\}$/, '').split(/,\s*/).each { line -> - String key, value - try { - (key, value) = line.split(':', 2) - if (key.contains(' ')) { - // this returns from the .each closure, not the method - return - } - commitPragmas[key.toLowerCase()] = value.trim() - /* groovylint-disable-next-line CatchArrayIndexOutOfBoundsException */ - } catch (ArrayIndexOutOfBoundsException ignored) { - // ignore and move on to the next line - } - } - } + println("updateRunStage: Converting env.pragmas string back into a Map: ${env.pragmas}") + Map commitPragmas = envToPragmas() println("updateRunStage: Checking commit pragmas from commit message:") commitPragmas.each { key, value -> println(" ${key}: ${value}") From 3bfeb370767a54530bb679da60c9d4c16246e28d Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Wed, 3 Jun 2026 17:52:21 -0400 Subject: [PATCH 25/38] Cleanup Test-tag: always_passes Skip-func-hw-test-medium: false Signed-off-by: Phil Henderson --- Jenkinsfile | 66 ++++++++++++----------------------------------------- 1 file changed, 14 insertions(+), 52 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 3216279f32e..1c5a3c6cfde 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -162,6 +162,7 @@ void updateRunStage() { for (stage in runStage.keySet()) { List skipPragmas = getStageNameSkipPragmas(stage) for (pragma in skipPragmas) { + // commitPragmas will already contain lower case keys from pragmasToMap() println("updateRunStage: ${stage} checking for a ${pragma} commit pragma") if (commitPragmas.get(pragma, '').toLowerCase() == 'true') { runStage[stage] = false @@ -192,7 +193,7 @@ void displayRunStage(Map reasons = [:]) { // Get a list of skip commit pragmas to check for a given stage name List getStageNameSkipPragmas(String stageName) { - String stagePragma = "Skip-${stageName.replaceAll(' ', '-').toLowerCase()}" + String stagePragma = "skip-${stageName.replaceAll(' ', '-').toLowerCase()}" List pragmas = [] // Build up a priority list of pragmas to check based on the stage name. @@ -209,7 +210,7 @@ List getStageNameSkipPragmas(String stageName) { } else if (stageName.contains('Build')) { // Add skip pragma for parent stage if (stageName != 'Build') { - pragmas.add('Skip-build') + pragmas.add('skip-build') } // Add skip pragma for this stage pragmas.add(stagePragma) @@ -220,10 +221,10 @@ List getStageNameSkipPragmas(String stageName) { } else if (stageName.contains('Unit Test') || stageName.contains('NLT')) { // Add skip pragma alias for all tests - pragmas.add('Skip-all-tests') + pragmas.add('skip-all-tests') // Add skip pragma for parent stage if (stageName != 'Unit Tests') { - pragmas.add('Skip-unit-tests') + pragmas.add('skip-unit-tests') } // Add skip pragma for this stage pragmas.add(stagePragma) @@ -235,35 +236,35 @@ List getStageNameSkipPragmas(String stageName) { } else if (stageName == 'Test' || stageName.contains('Functional on') || stageName.contains('Fault injection') || stageName.contains('Test RPMs')) { // Add skip pragma alias for all tests - pragmas.add('Skip-all-tests') + pragmas.add('skip-all-tests') // Add skip pragma for parent stage if (stageName != 'Test') { - pragmas.add('Skip-test') + pragmas.add('skip-test') } if (stageName.contains('Functional on')) { // Add skip pragma alias for all functional tests - pragmas.add('Skip-func-test') + pragmas.add('skip-func-test') // Add skip pragma alias for all functional VM tests - pragmas.add('Skip-func-test-vm') + pragmas.add('skip-func-test-vm') // Compatibility with existing commit pragmas pragmas.add(stagePragma.replace('functional-on-', 'func-test-')) } else if (stageName.contains('Test RPMs on')) { // Add skip pragma alias for all RPM tests - pragmas.add('Skip-test-rpms') + pragmas.add('skip-test-rpms') } else if (stageName.contains('Fault injection')) { // Compatibility with existing commit pragmas - pragmas.add('Skip-fault-injection-test') + pragmas.add('skip-fault-injection-test') } // Add skip pragma for this stage pragmas.add(stagePragma) } else if (stageName.contains('Hardware')) { // Add skip pragma alias for all tests - pragmas.add('Skip-all-tests') + pragmas.add('skip-all-tests') // Add skip pragma alias for all functional tests - pragmas.add('Skip-func-test') + pragmas.add('skip-func-test') // Add skip pragma alias for all functional HW tests - pragmas.add('Skip-func-hw-test') + pragmas.add('skip-func-hw-test') // Add skip pragma for this stage pragmas.add(stagePragma) // Compatibility with existing commit pragmas @@ -413,45 +414,6 @@ Map update_default_commit_pragmas() { } } -Boolean skip_pragma_set(String name, String def_val='false') { - // Return whether or not the skip pragma is set - return cachedCommitPragma("Skip-${name}", def_val).toLowerCase() == 'true' -} - -Boolean skip_build_stage(String distro='', String compiler='gcc') { - // Skip the stage if the CI__NOBUILD parameter is set - if (distro) { - if (startedByUser() && paramsValue("CI_${distro}_NOBUILD", false)) { - println("[${env.STAGE_NAME}] Skipping build stage due to CI_${distro}_NOBUILD") - return true - } - } - - // Skip the stage if any Skip-build[--] pragmas are true - List pragma_names = ['build'] - if (distro && compiler) { - pragma_names << "build-${distro}-${compiler}" - } - Boolean any_pragma_skip = pragma_names.any { name -> - if (skip_pragma_set(name)) { - println("[${env.STAGE_NAME}] Skipping build stage due to \"Skip-${name}: true\" pragma") - return true - } - } - if (any_pragma_skip) { - return true - } - - // Skip the stage if a specific DAOS RPM version is specified - if (rpmTestVersion() != '') { - println("[${env.STAGE_NAME}] Skipping build stage for due to specific DAOS RPM version") - return true - } - - // Otherwise run the build stage - return false -} - pipeline { agent { label 'lightweight' } From 1a1f0cd1fcab02b3fdb2bab514f56929e18f9778 Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Wed, 3 Jun 2026 18:36:28 -0400 Subject: [PATCH 26/38] Simplified stage name. skip-unit-tests: true SKIP-TEST-HW: true skip-test-vm: true skip-fault-injection-testing: true skip-cancel-previous-builds: true Signed-off-by: Phil Henderson --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 1c5a3c6cfde..f395639e1ed 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -155,7 +155,7 @@ void updateRunStage() { // Update stage running based on commit pragmas println("updateRunStage: Converting env.pragmas string back into a Map: ${env.pragmas}") Map commitPragmas = envToPragmas() - println("updateRunStage: Checking commit pragmas from commit message:") + println("updateRunStage: Checking skip commit pragmas from commit message:") commitPragmas.each { key, value -> println(" ${key}: ${value}") } @@ -648,7 +648,7 @@ pipeline { } } } - stage('Configure Stage Actions') { + stage('Setup Stages') { steps { pragmasToEnv() update_default_commit_pragmas() From 355b764faeeb3fb7147928d62568279b09f49349 Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Thu, 4 Jun 2026 10:11:33 -0400 Subject: [PATCH 27/38] Add support for HW stages Doc-only: true Signed-off-by: Phil Henderson --- Jenkinsfile | 60 +++++++++++++++++++++++++++-------------------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index cd4259e28c1..256b35b69d5 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -21,6 +21,7 @@ import groovy.transform.Field // To use a test branch (i.e. PR) until it lands to master // I.e. for testing library changes //@Library(value='pipeline-lib@your_branch') _ +@Library(value='pipeline-lib@hendersp/test_param_update') _ /* groovylint-disable-next-line CompileStatic */ job_status_internal = [:] @@ -220,8 +221,6 @@ List getStageNameSkipPragmas(String stageName) { } } else if (stageName.contains('Unit Test') || stageName.contains('NLT')) { - // Add skip pragma alias for all tests - pragmas.add('skip-all-tests') // Add skip pragma for parent stage if (stageName != 'Unit Tests') { pragmas.add('skip-unit-tests') @@ -235,8 +234,6 @@ List getStageNameSkipPragmas(String stageName) { } else if (stageName == 'Test' || stageName.contains('Functional on') || stageName.contains('Fault injection') || stageName.contains('Test RPMs')) { - // Add skip pragma alias for all tests - pragmas.add('skip-all-tests') // Add skip pragma for parent stage if (stageName != 'Test') { pragmas.add('skip-test') @@ -246,6 +243,7 @@ List getStageNameSkipPragmas(String stageName) { pragmas.add('skip-func-test') // Add skip pragma alias for all functional VM tests pragmas.add('skip-func-test-vm') + pragmas.add('skip-func-vm-test') // Compatibility with existing commit pragmas pragmas.add(stagePragma.replace('functional-on-', 'func-test-')) } else if (stageName.contains('Test RPMs on')) { @@ -259,17 +257,29 @@ List getStageNameSkipPragmas(String stageName) { pragmas.add(stagePragma) } else if (stageName.contains('Hardware')) { - // Add skip pragma alias for all tests - pragmas.add('skip-all-tests') - // Add skip pragma alias for all functional tests - pragmas.add('skip-func-test') - // Add skip pragma alias for all functional HW tests - pragmas.add('skip-func-hw-test') + if (stageName != 'Test Hardware') { + pragmas.add('skip-test-hardware') + pragmas.add('skip-test-hw') + } + if (stageName.contains('Functional')) { + // Add skip pragma alias for all functional tests + pragmas.add('skip-func-test') + // Add skip pragma alias for all functional HW tests + pragmas.add('skip-func-test-hw') + pragmas.add('skip-func-hw-test') + + // Compatibility with existing commit pragmas + if (stagePragma.contains('functional-hardware-')) { + pragmas.add(stagePragma.replace('functional-hardware-', 'func-hw-test-')) + pragmas.add(stagePragma.replace('functional-hardware-', 'func-hw-')) + } + } // Add skip pragma for this stage pragmas.add(stagePragma) - // Compatibility with existing commit pragmas - if (stagePragma.contains('functional-hardware-')) { - pragmas.add(stagePragma.replace('functional-hardware-', 'func-hw-test-')) + + // Support shortening hardware to hw + if (stagePragma.contains('hardware-')) { + pragmas.add(stagePragma.replace('hardware-', 'hw-')) } } @@ -1358,32 +1368,31 @@ pipeline { parallel( 'Functional Hardware Medium': getFunctionalTestStage( name: 'Functional Hardware Medium', + runStage: runStage['Functional Hardware Medium'], pragma_suffix: '-hw-medium', label: params.FUNCTIONAL_HARDWARE_MEDIUM_LABEL, next_version: next_version(), stage_tags: 'hw,medium,-provider', default_tags: startedByTimer() ? 'pr daily_regression' : 'pr', nvme: 'auto', - run_if_pr: false, - run_if_landing: false, job_status: job_status_internal, image_version: 'el9.7' ), 'Functional Hardware Medium MD on SSD': getFunctionalTestStage( name: 'Functional Hardware Medium MD on SSD', + runStage: runStage['Functional Hardware Medium MD on SSD'], pragma_suffix: '-hw-medium-md-on-ssd', label: params.FUNCTIONAL_HARDWARE_MEDIUM_LABEL, next_version: next_version(), stage_tags: 'hw,medium,-provider', default_tags: startedByTimer() ? 'pr daily_regression' : 'pr', nvme: 'auto_md_on_ssd', - run_if_pr: true, - run_if_landing: false, job_status: job_status_internal, image_version: 'el9.7' ), 'Functional Hardware Medium VMD': getFunctionalTestStage( name: 'Functional Hardware Medium VMD', + runStage: runStage['Functional Hardware Medium VMD'], pragma_suffix: '-hw-medium-vmd', label: params.FUNCTIONAL_HARDWARE_MEDIUM_VMD_LABEL, next_version: next_version(), @@ -1391,13 +1400,12 @@ pipeline { /* groovylint-disable-next-line UnnecessaryGetter */ default_tags: startedByTimer() ? 'pr daily_regression' : 'pr', nvme: 'auto', - run_if_pr: false, - run_if_landing: false, job_status: job_status_internal, image_version: 'el9.7' ), 'Functional Hardware Medium Verbs Provider': getFunctionalTestStage( name: 'Functional Hardware Medium Verbs Provider', + runStage: runStage['Functional Hardware Medium Verbs Provider'], pragma_suffix: '-hw-medium-verbs-provider', label: params.FUNCTIONAL_HARDWARE_MEDIUM_VERBS_PROVIDER_LABEL, next_version: next_version(), @@ -1405,13 +1413,12 @@ pipeline { default_tags: startedByTimer() ? 'pr daily_regression' : 'pr', default_nvme: 'auto', provider: 'ofi+verbs;ofi_rxm', - run_if_pr: false, - run_if_landing: false, job_status: job_status_internal, image_version: 'el9.7' ), 'Functional Hardware Medium Verbs Provider MD on SSD': getFunctionalTestStage( name: 'Functional Hardware Medium Verbs Provider MD on SSD', + runStage: runStage['Functional Hardware Medium Verbs Provider MD on SSD'], pragma_suffix: '-hw-medium-verbs-provider-md-on-ssd', label: params.FUNCTIONAL_HARDWARE_MEDIUM_VERBS_PROVIDER_LABEL, next_version: next_version(), @@ -1419,13 +1426,12 @@ pipeline { default_tags: startedByTimer() ? 'pr daily_regression' : 'pr', default_nvme: 'auto_md_on_ssd', provider: 'ofi+verbs;ofi_rxm', - run_if_pr: true, - run_if_landing: false, job_status: job_status_internal, image_version: 'el9.7' ), 'Functional Hardware Medium UCX Provider': getFunctionalTestStage( name: 'Functional Hardware Medium UCX Provider', + runStage: runStage['Functional Hardware Medium UCX Provider'], pragma_suffix: '-hw-medium-ucx-provider', label: params.FUNCTIONAL_HARDWARE_MEDIUM_UCX_PROVIDER_LABEL, next_version: next_version(), @@ -1433,34 +1439,30 @@ pipeline { default_tags: startedByTimer() ? 'pr daily_regression' : 'pr', default_nvme: 'auto', provider: cachedCommitPragma('Test-provider-ucx', 'ucx+ud_x'), - run_if_pr: false, - run_if_landing: false, job_status: job_status_internal, image_version: 'el9.7' ), 'Functional Hardware Large': getFunctionalTestStage( name: 'Functional Hardware Large', + runStage: runStage['Functional Hardware Large'], pragma_suffix: '-hw-large', label: params.FUNCTIONAL_HARDWARE_LARGE_LABEL, next_version: next_version(), stage_tags: 'hw,large', default_tags: startedByTimer() ? 'pr daily_regression' : 'pr', default_nvme: 'auto', - run_if_pr: false, - run_if_landing: false, job_status: job_status_internal, image_version: 'el9.7' ), 'Functional Hardware Large MD on SSD': getFunctionalTestStage( name: 'Functional Hardware Large MD on SSD', + runStage: runStage['Functional Hardware Large MD on SSD'], pragma_suffix: '-hw-large-md-on-ssd', label: params.FUNCTIONAL_HARDWARE_LARGE_LABEL, next_version: next_version(), stage_tags: 'hw,large', default_tags: startedByTimer() ? 'pr daily_regression' : 'pr', default_nvme: 'auto_md_on_ssd', - run_if_pr: true, - run_if_landing: false, job_status: job_status_internal, image_version: 'el9.7' ), From aceeeac8cdd7ac71c8d32481137ca9beae8c5225 Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Thu, 4 Jun 2026 17:38:25 -0400 Subject: [PATCH 28/38] Cleanup Test-tag: always_passes skip-functional-on-el-8: false SKIP-FUNC-hw-MEdiUm-verbs-provider-md-on-ssd: true skip-functional-hw-large: TRUE Signed-off-by: Phil Henderson --- Jenkinsfile | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 256b35b69d5..64ee089ad59 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -43,7 +43,6 @@ void updateRunStage() { 'Build on EL 8', 'Build on EL 9', 'Build on Leap 15', - 'Build on EL 9 with Bullseye', 'Unit Tests', 'Unit Test', 'Unit Test bdev', @@ -524,9 +523,6 @@ pipeline { booleanParam(name: 'Build on Leap 15', defaultValue: true, description: 'Run the build on Leap 15 stage.') - booleanParam(name: 'Build on EL 9 with Bullseye', - defaultValue: true, - description: 'Run the build on EL 9 with Bullseye stage.') booleanParam(name: 'Unit Tests', defaultValue: true, description: 'Run the Unit Tests stage.') From 71bdacfb4fa859b878ddff89ccd835a37ae73d46 Mon Sep 17 00:00:00 2001 From: Ryon Jensen Date: Tue, 9 Jun 2026 18:36:23 -0600 Subject: [PATCH 29/38] SRE-481 build: Testing if this has been fixed Test-tag: test_daos_checksum Test-repeat: 10 Quick-Functional: true From fac18d75519ae76e148befbd88080bb7c5453896 Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Tue, 9 Jun 2026 23:25:00 -0400 Subject: [PATCH 30/38] Minor updates. Signed-off-by: Phil Henderson --- Jenkinsfile | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 64ee089ad59..12af3b17441 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -47,7 +47,6 @@ void updateRunStage() { 'Unit Test', 'Unit Test bdev', 'NLT', - 'NLT with Bullseye', 'Unit Test with memcheck', 'Unit Test bdev with memcheck', 'Test', @@ -76,7 +75,7 @@ void updateRunStage() { value = params.get(name, null) if (value instanceof Boolean && !name.startsWith('CI_')) { runStage[name] = value - reasons[name] = "parameter selection/default" + reasons[name] = "parameter selection or default" } } @@ -114,15 +113,15 @@ void updateRunStage() { return } - // Handle user setting CI_RPM_TEST_VERSION - if (params.CI_RPM_TEST_VERSION) { - println("updateRunStage: Detected specific RPM version, skipping build/RPM test stages") + // Handle user setting CI_RPM_TEST_VERSION or specifying RPM-test-version + if (rpmTestVersion()) { + println("updateRunStage: Detected RPM test version, skipping build/RPM test stages") for (stage in runStage.keySet()) { if (stage.contains('Build') || stage.contains('Unit Tests') || stage.contains('Test RPMs')) { runStage[stage] = false - reasons[stage] = "specific RPM version" + reasons[stage] = "RPM test version" } } displayRunStage(reasons) @@ -535,9 +534,6 @@ pipeline { booleanParam(name: 'NLT', defaultValue: true, description: 'Run the NLT stage.') - booleanParam(name: 'NLT with Bullseye', - defaultValue: true, - description: 'Run the NLT with Bullseye stage.') booleanParam(name: 'Unit Test with memcheck', defaultValue: true, description: 'Run the Unit Test with memcheck stage.') From e73acd89c8b167c186a43a022679d0fa64416a4d Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Tue, 16 Jun 2026 23:40:56 -0400 Subject: [PATCH 31/38] Add quick functional support. Quick-Functional: true Test-tag: test_setup_vm Signed-off-by: Phil Henderson --- Jenkinsfile | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index 5602854e889..c4c0f8f218a 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -151,6 +151,44 @@ void updateRunStage() { return } + // Handle quick functional + if (quickFunctional()) { + println("updateRunStage: Detected quick functional testing") + Map testBuildStage = [ + 'Functional on EL8': 'Build on EL8', + 'Functional on EL9': 'Build on EL9', + 'Functional on Leap 15': 'Build on Leap 15', + 'Functional on SLES 15': 'Build on Leap 15', + 'Functional Hardware Medium': 'Build on EL9', + 'Functional Hardware Medium MD on SSD': 'Build on EL9', + 'Functional Hardware Medium VMD': 'Build on EL9', + 'Functional Hardware Medium Verbs Provider': 'Build on EL9', + 'Functional Hardware Medium Verbs Provider MD on SSD': 'Build on EL9', + 'Functional Hardware Medium UCX Provider': 'Build on EL9', + 'Functional Hardware Large': 'Build on EL9', + 'Functional Hardware Large MD on SSD': 'Build on EL9'] + for (stage in runStage.keySet()) { + if (stage in ['Pre-build', 'Python Bandit check', 'Build']) { + // These stages must be run for functional testing + runStage[stage] = true + reasons[stage] = "Quick functional testing" + } else if (stage in ['Unit Tests', + 'Fault injection testing', + 'Test RPMs on EL 9.6', + 'Test RPMs on Leap 15.5']) { + // These stages are unrelated to functional testing and should be skipped + runStage[stage] = false + reasons[stage] = "Quick functional testing" + } else if (stage in testBuildStage && runStage[stage]) { + // The mapped build stage must be run to generate RPMs for the functional test stage + runStage[testBuildStage[stage]] = true + reasons[testBuildStage[stage]] = "Quick functional testing" + } + } + displayRunStage(reasons) + return + } + // Update stage running based on commit pragmas println("updateRunStage: Converting env.pragmas string back into a Map: ${env.pragmas}") Map commitPragmas = envToPragmas() From 9e0ce1f100fd80618c15bbf5b781b42a6af3a21d Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Wed, 17 Jun 2026 00:05:21 -0400 Subject: [PATCH 32/38] Update quickFunctional handling. Quick-Functional: true Test-tag: test_setup_vm Signed-off-by: Phil Henderson --- Jenkinsfile | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index c4c0f8f218a..e9c649ff610 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -154,9 +154,21 @@ void updateRunStage() { // Handle quick functional if (quickFunctional()) { println("updateRunStage: Detected quick functional testing") + // These stages must be run for functional testing + for (stage in ['Pre-build', 'Python Bandit check', 'Build']) { + runStage[stage] = true + reasons[stage] = "Quick functional testing" + } + // These stages are unrelated to functional testing and should be skipped + for (stage in ['Unit Tests', 'Fault injection testing', + 'Test RPMs on EL 9.6', 'Test RPMs on Leap 15.5']) { + runStage[stage] = false + reasons[stage] = "Quick functional testing" + } + // Build stages should only be run if their RPMs are needed Map testBuildStage = [ - 'Functional on EL8': 'Build on EL8', - 'Functional on EL9': 'Build on EL9', + 'Functional on EL8': 'Build on EL 8', + 'Functional on EL9': 'Build on EL 9', 'Functional on Leap 15': 'Build on Leap 15', 'Functional on SLES 15': 'Build on Leap 15', 'Functional Hardware Medium': 'Build on EL9', @@ -167,20 +179,14 @@ void updateRunStage() { 'Functional Hardware Medium UCX Provider': 'Build on EL9', 'Functional Hardware Large': 'Build on EL9', 'Functional Hardware Large MD on SSD': 'Build on EL9'] - for (stage in runStage.keySet()) { - if (stage in ['Pre-build', 'Python Bandit check', 'Build']) { - // These stages must be run for functional testing - runStage[stage] = true - reasons[stage] = "Quick functional testing" - } else if (stage in ['Unit Tests', - 'Fault injection testing', - 'Test RPMs on EL 9.6', - 'Test RPMs on Leap 15.5']) { - // These stages are unrelated to functional testing and should be skipped - runStage[stage] = false - reasons[stage] = "Quick functional testing" - } else if (stage in testBuildStage && runStage[stage]) { - // The mapped build stage must be run to generate RPMs for the functional test stage + // Initially skip all the build stages + for (stage in testBuildStage.values().toSet()) { + runStage[stage] = false + reasons[stage] = "Quick functional testing" + } + // The mapped build stage must be run to generate RPMs for the functional test stage + for (stage in testBuildStage.keySet()) { + if (runStage[stage]) { runStage[testBuildStage[stage]] = true reasons[testBuildStage[stage]] = "Quick functional testing" } From 01e216f7adb5630b171042120782d587e01d8217 Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Wed, 17 Jun 2026 00:34:17 -0400 Subject: [PATCH 33/38] Updates for quick functional Quick-Functional: true Test-tag: test_setup_vm Signed-off-by: Phil Henderson --- Jenkinsfile | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index e9c649ff610..faf1e30ec33 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -151,7 +151,7 @@ void updateRunStage() { return } - // Handle quick functional + // Handle quick functional commit pragma if (quickFunctional()) { println("updateRunStage: Detected quick functional testing") // These stages must be run for functional testing @@ -166,19 +166,26 @@ void updateRunStage() { reasons[stage] = "Quick functional testing" } // Build stages should only be run if their RPMs are needed + String hwBuildStage = 'Build on ' + List distroTarget = hwDistroTarget2() + if (distroTarget[0].toUpperCase() == 'LEAP' || distroTarget[0].toUpperCase() == 'SLES') { + hwBuildStage += "Leap ${distroTarget[1]}" + } else { + hwBuildStage += "${distroTarget[0].toUpperCase()} ${distroTarget[1]}" + } Map testBuildStage = [ - 'Functional on EL8': 'Build on EL 8', - 'Functional on EL9': 'Build on EL 9', + 'Functional on EL 8': 'Build on EL 8', + 'Functional on EL 9': 'Build on EL 9', 'Functional on Leap 15': 'Build on Leap 15', 'Functional on SLES 15': 'Build on Leap 15', - 'Functional Hardware Medium': 'Build on EL9', - 'Functional Hardware Medium MD on SSD': 'Build on EL9', - 'Functional Hardware Medium VMD': 'Build on EL9', - 'Functional Hardware Medium Verbs Provider': 'Build on EL9', - 'Functional Hardware Medium Verbs Provider MD on SSD': 'Build on EL9', - 'Functional Hardware Medium UCX Provider': 'Build on EL9', - 'Functional Hardware Large': 'Build on EL9', - 'Functional Hardware Large MD on SSD': 'Build on EL9'] + 'Functional Hardware Medium': hwBuildStage, + 'Functional Hardware Medium MD on SSD': hwBuildStage, + 'Functional Hardware Medium VMD': hwBuildStage, + 'Functional Hardware Medium Verbs Provider': hwBuildStage, + 'Functional Hardware Medium Verbs Provider MD on SSD': hwBuildStage, + 'Functional Hardware Medium UCX Provider': hwBuildStage, + 'Functional Hardware Large': hwBuildStage, + 'Functional Hardware Large MD on SSD': hwBuildStage] // Initially skip all the build stages for (stage in testBuildStage.values().toSet()) { runStage[stage] = false From 472a3633e4cb87e70fa80962c1de6fa4c7f40c88 Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Wed, 17 Jun 2026 10:29:35 -0400 Subject: [PATCH 34/38] Handle any skip pragmas before quick functional. Quick-Functional: true Test-tag: test_setup_vm Skip-test-hardware: true Signed-off-by: Phil Henderson --- Jenkinsfile | 49 ++++++++++++++++++++++++------------------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index faf1e30ec33..81b43bbd72d 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -151,6 +151,30 @@ void updateRunStage() { return } + // Update stage running based on commit pragmas + println("updateRunStage: Converting env.pragmas string back into a Map: ${env.pragmas}") + Map commitPragmas = envToPragmas() + println("updateRunStage: Checking skip commit pragmas from commit message:") + commitPragmas.each { key, value -> + println(" ${key}: ${value}") + } + for (stage in runStage.keySet()) { + List skipPragmas = getStageNameSkipPragmas(stage) + for (pragma in skipPragmas) { + // commitPragmas will already contain lower case keys from pragmasToMap() + println("updateRunStage: ${stage} checking for a ${pragma} commit pragma") + if (commitPragmas.get(pragma, '').toLowerCase() == 'true') { + runStage[stage] = false + reasons[stage] = "commit pragma ${pragma}: true" + break + } else if (commitPragmas.get(pragma, '').toLowerCase() == 'false') { + runStage[stage] = true + reasons[stage] = "commit pragma ${pragma}: false" + break + } + } + } + // Handle quick functional commit pragma if (quickFunctional()) { println("updateRunStage: Detected quick functional testing") @@ -198,33 +222,8 @@ void updateRunStage() { reasons[testBuildStage[stage]] = "Quick functional testing" } } - displayRunStage(reasons) - return } - // Update stage running based on commit pragmas - println("updateRunStage: Converting env.pragmas string back into a Map: ${env.pragmas}") - Map commitPragmas = envToPragmas() - println("updateRunStage: Checking skip commit pragmas from commit message:") - commitPragmas.each { key, value -> - println(" ${key}: ${value}") - } - for (stage in runStage.keySet()) { - List skipPragmas = getStageNameSkipPragmas(stage) - for (pragma in skipPragmas) { - // commitPragmas will already contain lower case keys from pragmasToMap() - println("updateRunStage: ${stage} checking for a ${pragma} commit pragma") - if (commitPragmas.get(pragma, '').toLowerCase() == 'true') { - runStage[stage] = false - reasons[stage] = "commit pragma ${pragma}: true" - break - } else if (commitPragmas.get(pragma, '').toLowerCase() == 'false') { - runStage[stage] = true - reasons[stage] = "commit pragma ${pragma}: false" - break - } - } - } displayRunStage(reasons) } From ae4dc1d766b5c4f32e5cb957be90f5ccf304bbb7 Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Wed, 17 Jun 2026 10:43:55 -0400 Subject: [PATCH 35/38] Minor update. Quick-Functional: true Test-tag: test_setup_vm Skip-Functional-on-EL-8: false Signed-off-by: Phil Henderson --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 81b43bbd72d..e470c809cb4 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -191,7 +191,7 @@ void updateRunStage() { } // Build stages should only be run if their RPMs are needed String hwBuildStage = 'Build on ' - List distroTarget = hwDistroTarget2() + List distroTarget = hwDistroTarget() if (distroTarget[0].toUpperCase() == 'LEAP' || distroTarget[0].toUpperCase() == 'SLES') { hwBuildStage += "Leap ${distroTarget[1]}" } else { From fb128accda39bd59a251efdaedba0f3f036b6463 Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Wed, 17 Jun 2026 10:49:56 -0400 Subject: [PATCH 36/38] Fix. Quick-Functional: true Test-tag: test_setup_vm Skip-Functional-on-EL-8: false Signed-off-by: Phil Henderson --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index e470c809cb4..81b43bbd72d 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -191,7 +191,7 @@ void updateRunStage() { } // Build stages should only be run if their RPMs are needed String hwBuildStage = 'Build on ' - List distroTarget = hwDistroTarget() + List distroTarget = hwDistroTarget2() if (distroTarget[0].toUpperCase() == 'LEAP' || distroTarget[0].toUpperCase() == 'SLES') { hwBuildStage += "Leap ${distroTarget[1]}" } else { From 91dd143cff718a3d7103c6043effe938bea8856d Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Wed, 17 Jun 2026 18:16:49 -0400 Subject: [PATCH 37/38] Added build cause debug Quick-Functional: true Test-tag: test_setup_vm Skip-Functional-on-EL-8: false Signed-off-by: Phil Henderson --- Jenkinsfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index 81b43bbd72d..a0644a883bc 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -79,6 +79,10 @@ void updateRunStage() { } } + // Debug + String buildCause = currentBuild.getBuildCauses().toString() + println("updateRunStage: Build cause: ${buildCause}") + // Handle doc-only changes: Only run default or selected build stages if (docOnlyChange(target_branch)) { println("updateRunStage: Detected doc-only change, skipping testing") From a381a31230cd3aaa3ebcade03d8004c6a7afb7b4 Mon Sep 17 00:00:00 2001 From: Phil Henderson Date: Thu, 18 Jun 2026 15:09:17 -0400 Subject: [PATCH 38/38] Add option to ignore skip pragmas when setting params Quick-Functional: true Test-tag: test_setup_vm Skip-Functional-on-EL-8: false Signed-off-by: Phil Henderson --- Jenkinsfile | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index e1fb6af8ac7..e5a9f1d1fcd 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -82,6 +82,7 @@ void updateRunStage() { // Debug String buildCause = currentBuild.getBuildCauses().toString() println("updateRunStage: Build cause: ${buildCause}") + println("updateRunStage: Started by user: ${startedByUser()}") // Handle doc-only changes: Only run default or selected build stages if (docOnlyChange(target_branch)) { @@ -148,9 +149,10 @@ void updateRunStage() { return } - // Handle builds started by the user - if (startedByUser()) { - println("updateRunStage: Build started by the user, skipping commit pragma checks") + // Handle user setting CI_IGNORE_SKIP_COMMIT_PRAGMAS + if (params.CI_IGNORE_SKIP_COMMIT_PRAGMAS) { + println( + "updateRunStage: Detected CI_IGNORE_SKIP_COMMIT_PRAGMAS, ignoring skip commit pragmas") displayRunStage(reasons) return } @@ -528,6 +530,10 @@ pipeline { booleanParam(name: 'CI_ALLOW_UNSTABLE_TEST', defaultValue: false, description: 'Continue testing if a previous stage is Unstable') + booleanParam(name: 'CI_IGNORE_SKIP_COMMIT_PRAGMAS', + defaultValue: false, + description: 'Ignore any commit pragmas used to skip/run stages and rely ' + + 'solely on the build parameter settings') string(name: 'CI_SCONS_ARGS', defaultValue: '', description: 'Arguments for scons when building DAOS')