From 26895230f7a1401b5470cac50d00c4ae3fc10f14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20=C5=A0tetiar?= Date: Tue, 21 Jul 2026 07:00:44 +0200 Subject: [PATCH] ci: cram: add component split jobs behind CRAM_COMPONENTS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The hardware cram jobs currently run each board's complete suite. Every automatic pipeline therefore consumes coverage that can be selected more cheaply by component. Add a runtime component template so test collection happens in cram's checkout and environment. Replace each legacy board job with four static full, prplmesh, lcm, and prplos jobs selected through the comma-separated CRAM_COMPONENTS variable. Name each job `cram []` and include the selected component in the expandable test-execution section title. Move the MXL-specific cram skip from the legacy job-name token. Use the stable DUT board identifier instead. Preserve skip behavior under the compact OSPv2 name. Default automatic pipelines to prplos. Start the full jobs automatically in prplware release tag pipelines, whose build jobs also run automatically. Keep cram jobs out of scheduled pipelines entirely, as with the legacy suite: schedules never create the build jobs these jobs need, so any selected cram job would fail scheduled pipeline creation with an unsatisfiable needs reference. Keep the test command, post suite, timeout, run_check, and JUnit filenames unchanged. Assisted-by: codex:gpt-5 Assisted-by: claude:fable-5 References: CI-7 Signed-off-by: Petr Štetiar --- .gitlab-ci.yml | 151 +++++++++++++++++- .gitlab/testbed.yml | 32 +++- .gitlab/tests/cram/README.md | 21 +++ .../105-temperature.t | 4 +- 4 files changed, 194 insertions(+), 14 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5e808a4d93..db80e4fd91 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,7 @@ variables: CI_DESIGNATED_BRANCH: prpl/nightly CI_DESIGNATED_BRANCH_SLUG: prpl-nightly + CRAM_COMPONENTS: prplos include: - local: .gitlab/build.yml @@ -85,32 +86,170 @@ blackduck scan mxl_x86_osp_tb341_v2 mxl_wlan_hostap_ng_wav700 prpl extender_full blackduck scan qca_ipq95xx prpl extender_full cellular security thread: extends: .blackduck scan config -run test Turris Omnia initramfs: +cram Omnia [full]: allow_failure: true needs: ["build test mvebu prpl security"] extends: .turris-omnia testbed + variables: + COMPONENT: full -run test Haze initramfs: +cram Omnia [prplmesh]: + allow_failure: true + needs: ["build test mvebu prpl security"] + extends: .turris-omnia testbed + variables: + COMPONENT: prplmesh + +cram Omnia [lcm]: + allow_failure: true + needs: ["build test mvebu prpl security"] + extends: .turris-omnia testbed + variables: + COMPONENT: lcm + +cram Omnia [prplos]: + allow_failure: true + needs: ["build test mvebu prpl security"] + extends: .turris-omnia testbed + variables: + COMPONENT: prplos + +cram Haze [full]: allow_failure: true needs: ["build test ipq807x prpl security"] extends: .prpl-haze testbed + variables: + COMPONENT: full -run test MXL25641-HDK-6 with system on eMMC: +cram Haze [prplmesh]: + allow_failure: true + needs: ["build test ipq807x prpl security"] + extends: .prpl-haze testbed + variables: + COMPONENT: prplmesh + +cram Haze [lcm]: + allow_failure: true + needs: ["build test ipq807x prpl security"] + extends: .prpl-haze testbed + variables: + COMPONENT: lcm + +cram Haze [prplos]: + allow_failure: true + needs: ["build test ipq807x prpl security"] + extends: .prpl-haze testbed + variables: + COMPONENT: prplos + +cram OSPv2 [full]: needs: ["build test mxl_x86_osp_tb341_v2 mxl_wlan_hostap_ng_wav700 prpl cellular security thread"] extends: .mxl25641-hdk-6 testbed + variables: + COMPONENT: full -run test Freedom with system on eMMC: +cram OSPv2 [prplmesh]: + needs: ["build test mxl_x86_osp_tb341_v2 mxl_wlan_hostap_ng_wav700 prpl cellular security thread"] + extends: .mxl25641-hdk-6 testbed + variables: + COMPONENT: prplmesh + +cram OSPv2 [lcm]: + needs: ["build test mxl_x86_osp_tb341_v2 mxl_wlan_hostap_ng_wav700 prpl cellular security thread"] + extends: .mxl25641-hdk-6 testbed + variables: + COMPONENT: lcm + +cram OSPv2 [prplos]: + needs: ["build test mxl_x86_osp_tb341_v2 mxl_wlan_hostap_ng_wav700 prpl cellular security thread"] + extends: .mxl25641-hdk-6 testbed + variables: + COMPONENT: prplos + +cram Freedom [full]: needs: ["build test qca_ipq95xx prpl cellular security thread"] extends: .wnc-freedom testbed + variables: + COMPONENT: full -run test Mozart initramfs: +cram Freedom [prplmesh]: + needs: ["build test qca_ipq95xx prpl cellular security thread"] + extends: .wnc-freedom testbed + variables: + COMPONENT: prplmesh + +cram Freedom [lcm]: + needs: ["build test qca_ipq95xx prpl cellular security thread"] + extends: .wnc-freedom testbed + variables: + COMPONENT: lcm + +cram Freedom [prplos]: + needs: ["build test qca_ipq95xx prpl cellular security thread"] + extends: .wnc-freedom testbed + variables: + COMPONENT: prplos + +cram Mozart [full]: needs: - job: build test mtk_filogic prpl security optional: true extends: .arcadyan-mozart testbed + variables: + COMPONENT: full -run test Valyrian initramfs: +cram Mozart [prplmesh]: + needs: + - job: build test mtk_filogic prpl security + optional: true + extends: .arcadyan-mozart testbed + variables: + COMPONENT: prplmesh + +cram Mozart [lcm]: + needs: + - job: build test mtk_filogic prpl security + optional: true + extends: .arcadyan-mozart testbed + variables: + COMPONENT: lcm + +cram Mozart [prplos]: + needs: + - job: build test mtk_filogic prpl security + optional: true + extends: .arcadyan-mozart testbed + variables: + COMPONENT: prplos + +cram Valyrian [full]: needs: - job: build test airoha_an7581 prpl security optional: true extends: .nokia-valyrian testbed + variables: + COMPONENT: full + +cram Valyrian [prplmesh]: + needs: + - job: build test airoha_an7581 prpl security + optional: true + extends: .nokia-valyrian testbed + variables: + COMPONENT: prplmesh + +cram Valyrian [lcm]: + needs: + - job: build test airoha_an7581 prpl security + optional: true + extends: .nokia-valyrian testbed + variables: + COMPONENT: lcm + +cram Valyrian [prplos]: + needs: + - job: build test airoha_an7581 prpl security + optional: true + extends: .nokia-valyrian testbed + variables: + COMPONENT: prplos diff --git a/.gitlab/testbed.yml b/.gitlab/testbed.yml index 6ba0584c16..149b2658bb 100644 --- a/.gitlab/testbed.yml +++ b/.gitlab/testbed.yml @@ -2,10 +2,6 @@ stage: run image: "registry.gitlab.com/prpl-foundation/prplos/ci/containers/testbed/testbed:v1.3.0@sha256:7f50dde2279c201542569b7f31e965d43a308e245a4ec973df52d581560b0c28" timeout: 87 minutes - rules: - - if: '$CI_PIPELINE_SOURCE == "schedule"' - when: never - - when: on_success variables: DUT_WAN_INTERFACE: eth1 TESTBED_MNG_INTERFACE: enp1s0 @@ -115,7 +111,7 @@ script: - source .gitlab/scripts/helpers.sh - - section_start "test-execution" "Test Execution" "expanded" + - section_start "test-execution" "Test Execution${COMPONENT:+ [$COMPONENT]}" "expanded" - | TEST_CUTOFF_TIMEOUT=$((CI_JOB_TIMEOUT - DUT_SLEEP_AFTER_BOOT - TEST_SETUP_TEARDOWN_DURATION)) @@ -222,5 +218,29 @@ reports: junit: cram-result-$LABGRID_TARGET.junit.xml -.testbed true.cz: +.cram_component: extends: .testbed + rules: + - if: '$CI_PIPELINE_SOURCE == "schedule"' + when: never + - if: '$CI_COMMIT_TAG =~ /^prplware-v[0-9]+\.[0-9]+\.[0-9]+.*$/ && $COMPONENT == "full"' + - if: '$COMPONENT == "full" && $CRAM_COMPONENTS =~ /(^|,)full($|,)/' + - if: '$COMPONENT == "prplmesh" && $CRAM_COMPONENTS =~ /(^|,)prplmesh($|,)/' + - if: '$COMPONENT == "lcm" && $CRAM_COMPONENTS =~ /(^|,)lcm($|,)/' + - if: '$COMPONENT == "prplos" && $CRAM_COMPONENTS =~ /(^|,)prplos($|,)/' + variables: + COMPONENT: prplos + script: + - | + CRAM_TEST_SUITE="$( + .gitlab/tests/cram/scripts/resolve-component-tests.py \ + --test-root .gitlab/tests/cram \ + --manifest components.yml \ + --board "$DUT_BOARD" \ + --component "$COMPONENT" + )" + export CRAM_TEST_SUITE + - !reference [.testbed, script] + +.testbed true.cz: + extends: .cram_component diff --git a/.gitlab/tests/cram/README.md b/.gitlab/tests/cram/README.md index d84d8f3dac..707ab93a94 100644 --- a/.gitlab/tests/cram/README.md +++ b/.gitlab/tests/cram/README.md @@ -67,6 +67,27 @@ jobs do not use them. `cram_component_bucketing.py` uses underscores because it is an importable module. Executable scripts follow the repository's hyphenated CLI convention. +## Selecting pipeline jobs + +Set the pipeline-level `CRAM_COMPONENTS` variable to a comma-separated list +containing one or more of `full`, `prplmesh`, `lcm`, and `prplos`. Do not add +spaces around the commas. The default is `prplos`. + +For example: + +```text +CRAM_COMPONENTS=prplmesh +CRAM_COMPONENTS=lcm,prplos +CRAM_COMPONENTS=full +``` + +Release tag pipelines (`prplware-v*`) start the `full` jobs automatically. +Scheduled pipelines never create cram jobs, because they also never create +the build jobs these jobs need. Other pipeline sources run the jobs named by +the list. The job names have the form +`cram []`, such as `cram OSPv2 [lcm]`. The trailing +component name lets GitLab group the four jobs for a board in the pipeline UI. + ## Resolving tests locally The CI jobs call the resolver at runtime. Run it from the same checkout and diff --git a/.gitlab/tests/cram/generic/acceleration-plan-components/105-temperature.t b/.gitlab/tests/cram/generic/acceleration-plan-components/105-temperature.t index 120ba5f68c..ed28a45ff9 100644 --- a/.gitlab/tests/cram/generic/acceleration-plan-components/105-temperature.t +++ b/.gitlab/tests/cram/generic/acceleration-plan-components/105-temperature.t @@ -31,8 +31,8 @@ Check if directories or symbolic links exist for each TemperatureSensor object: > fi All zones exists -If test is running on a mxl, skip the next part because of PPW-423 - $ if echo "$CI_JOB_NAME" | grep -q -E "MXL|URX"; then exit 80; fi +If test is running on an MXL board, skip the next part because of PPW-423 + $ if echo "$DUT_BOARD" | grep -q -E "^(mxl25641-hdk-6|urx851-)"; then exit 80; fi Check that the value is actually synchronized with the system value: