From f402f23238e6576acb732e2d290f148c5ad14454 Mon Sep 17 00:00:00 2001 From: Dmitry Baryshkov Date: Tue, 17 Feb 2026 09:25:02 +0200 Subject: [PATCH 01/10] packagegroups-qcom-utilities: check for DISTRO_FEATURES for systemd-analyze Parsing of meta-qcom-distro recipes fails if systemd is not enabled in DISTRO_FEATURES. Hide systemd-analyze dependency behind the DISTRO_FEATURES check. BitBake error: Missing or unbuildable dependency chain was: ['meta-world-pkgdata', 'packagegroup-qcom-utilities', 'systemd-analyze'] Signed-off-by: Dmitry Baryshkov --- recipes-products/packagegroups/packagegroup-qcom-utilities.bb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes-products/packagegroups/packagegroup-qcom-utilities.bb b/recipes-products/packagegroups/packagegroup-qcom-utilities.bb index 5698dd4a..bc12cc55 100644 --- a/recipes-products/packagegroups/packagegroup-qcom-utilities.bb +++ b/recipes-products/packagegroups/packagegroup-qcom-utilities.bb @@ -69,7 +69,7 @@ RDEPENDS:${PN}-profile-utils = " \ perf \ powertop \ sysbench \ - systemd-analyze \ + ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'systemd-analyze', '', d)} \ tiobench \ " From 8390a6c28fc2faba6c24d7e50055feb8e3c35d55 Mon Sep 17 00:00:00 2001 From: Jose Quaresma Date: Thu, 29 Jan 2026 10:30:06 +0000 Subject: [PATCH 02/10] workflows: import from meta-qcom c5ef0066e To get CI going on meta-qcom-distro, copy over the meta-qcom .github/workflows folder revision c5ef0066e [1]. [1] c5ef0066e Enable TPM Stack (#1504) Signed-off-by: Jose Quaresma --- .github/workflows/build-yocto.yml | 297 ++++++++++++++++++++++++++ .github/workflows/monthly.yml | 15 ++ .github/workflows/nightly-build.yml | 34 +++ .github/workflows/pr.yml | 28 +++ .github/workflows/publish-results.yml | 73 +++++++ .github/workflows/push.yml | 31 +++ .github/workflows/repolinter.yml | 31 +++ .github/workflows/stales.yml | 25 +++ .github/workflows/test-pr.yml | 74 +++++++ .github/workflows/test.yml | 270 +++++++++++++++++++++++ 10 files changed, 878 insertions(+) create mode 100644 .github/workflows/build-yocto.yml create mode 100644 .github/workflows/monthly.yml create mode 100644 .github/workflows/nightly-build.yml create mode 100644 .github/workflows/pr.yml create mode 100644 .github/workflows/publish-results.yml create mode 100644 .github/workflows/push.yml create mode 100644 .github/workflows/repolinter.yml create mode 100644 .github/workflows/stales.yml create mode 100644 .github/workflows/test-pr.yml create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/build-yocto.yml b/.github/workflows/build-yocto.yml new file mode 100644 index 00000000..b377a4f9 --- /dev/null +++ b/.github/workflows/build-yocto.yml @@ -0,0 +1,297 @@ +name: Build Yocto + +on: + workflow_call: + inputs: + sdk: + required: false + type: string + default: "0" + outputs: + artifacts_url: + description: "URL to retrieve build artifacts" + value: ${{ jobs.create-output.outputs.url }} + +# Concurrency is used to prevent multiple workflows from running for the same PR +concurrency: + group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && format('pr-{0}', github.event.pull_request.number) || format('push-{0}', github.sha) }} + cancel-in-progress: true + +env: + CACHE_DIR: /efs/qli/meta-qcom + KAS_CLONE_DEPTH: 1 + +jobs: + kas-setup: + if: github.repository_owner == 'qualcomm-linux' + runs-on: [self-hosted, qcom-u2404, amd64] + steps: + - name: Setting up kas-container + run: | + KAS_CONTAINER=$RUNNER_TEMP/kas-container + echo "KAS_CONTAINER=$KAS_CONTAINER" >> $GITHUB_ENV + LATEST=$(git ls-remote --tags --refs --sort="v:refname" https://github.com/siemens/kas | tail -n1 | sed 's/.*\///') + wget -qO ${KAS_CONTAINER} https://raw.githubusercontent.com/siemens/kas/refs/tags/$LATEST/kas-container + chmod +x ${KAS_CONTAINER} + + - uses: actions/checkout@v4 + + - name: Run kas lock + run: | + ${KAS_CONTAINER} lock --update ci/base.yml:ci/qcom-distro.yml + + - name: Upload kas lockfile + uses: actions/upload-artifact@v6 + with: + name: kas-lockfile + path: ci/*.lock.yml + + - name: Upload kas-container + uses: actions/upload-artifact@v4 + with: + name: kas-container + path: ${{ env.KAS_CONTAINER }} + + yocto-run-checks: + needs: kas-setup + if: github.repository_owner == 'qualcomm-linux' + runs-on: [self-hosted, qcom-u2404, amd64] + steps: + - uses: actions/checkout@v4 + + - name: Download kas lockfile + uses: actions/download-artifact@v6 + with: + name: kas-lockfile + path: ci + + - name: Download kas-container + uses: actions/download-artifact@v6 + with: + name: kas-container + path: ${{ runner.temp }} + + - name: Setting up kas-container + run: | + KAS_CONTAINER=$RUNNER_TEMP/kas-container + echo "KAS_CONTAINER=$KAS_CONTAINER" >> $GITHUB_ENV + chmod +x $KAS_CONTAINER + + - name: Run yocto-check-layer + run: | + ci/kas-container-shell-helper.sh ci/yocto-check-layer.sh + + - name: Run Yocto patchreview + run: | + ci/kas-container-shell-helper.sh ci/yocto-patchreview.sh + + compile_warm_up: + needs: [kas-setup, yocto-run-checks] + if: github.repository_owner == 'qualcomm-linux' + runs-on: [self-hosted, qcom-u2404, amd64] + strategy: + fail-fast: true + matrix: + machine: + - rb3gen2-core-kit + - qcom-armv8a + distro: + - name: poky-altcfg + yamlfile: "" + - name: qcom-distro + yamlfile: ':ci/qcom-distro-prop-image.yml' + - name: qcom-distro-catchall + yamlfile: ':ci/qcom-distro-catchall.yml' + - name: performance + yamlfile: ':ci/qcom-distro-prop-image.yml:ci/performance.yml' + kernel: + - type: default + dirname: "" + yamlfile: "" + - type: 6.18 + dirname: "+linux-qcom-6.18" + yamlfile: ":ci/linux-qcom-6.18.yml" + - type: rt-6.18 + dirname: "+linux-qcom-rt-6.18" + yamlfile: ":ci/linux-qcom-rt-6.18.yml" + name: ${{ matrix.machine }}/${{ matrix.distro.name }}${{ matrix.kernel.dirname }} + steps: + - uses: actions/checkout@v4 + + - name: Run kas build + uses: ./.github/actions/compile + with: + machine: ${{matrix.machine}} + distro_yaml: ${{matrix.distro.yamlfile}} + distro_name: ${{matrix.distro.name}} + kernel_yaml: ${{matrix.kernel.yamlfile}} + kernel_dirname: ${{matrix.kernel.dirname}} + cache_dir: ${CACHE_DIR} + sdk: ${{inputs.sdk}} + + compile: + needs: compile_warm_up + if: github.repository_owner == 'qualcomm-linux' + runs-on: [self-hosted, qcom-u2404, amd64] + outputs: + url: ${{ steps.compile_kas.outputs.url }} + strategy: + fail-fast: true + matrix: + machine: + - iq-615-evk + - iq-8275-evk + - iq-9075-evk + - iq-x7181-evk + - kaanapali-mtp + - qcm6490-idp + - qcs615-ride + - qcs8300-ride-sx + - qcs9100-ride-sx + - rb1-core-kit + - sm8750-mtp + distro: + - name: poky-altcfg + yamlfile: "" + - name: qcom-distro + yamlfile: ':ci/qcom-distro-prop-image.yml' + - name: qcom-distro-catchall + yamlfile: ':ci/qcom-distro-catchall.yml' + - name: performance + yamlfile: ':ci/qcom-distro-prop-image.yml:ci/performance.yml' + kernel: + - type: default + dirname: "" + yamlfile: "" + - type: 6.18 + dirname: "+linux-qcom-6.18" + yamlfile: ":ci/linux-qcom-6.18.yml" + - type: rt-6.18 + dirname: "+linux-qcom-rt-6.18" + yamlfile: ":ci/linux-qcom-rt-6.18.yml" + include: + # Additional builds for specific machines + - machine: qcom-armv8a + distro: + name: qcom-distro + yamlfile: ':ci/qcom-distro-prop-image.yml' + kernel: + type: additional + dirname: "+linux-yocto-dev" + yamlfile: ":ci/linux-yocto-dev.yml" + - machine: iq-9075-evk + distro: + name: qcom-distro + yamlfile: ':ci/qcom-distro-prop-image.yml' + kernel: + type: qcom-next-rt + dirname: "+linux-qcom-next-rt" + yamlfile: ":ci/linux-qcom-next-rt.yml" + - machine: iq-9075-evk + distro: + name: qcom-distro-kvm + yamlfile: ':ci/qcom-distro-kvm.yml' + kernel: + type: default + dirname: "" + yamlfile: "" + - machine: iq-8275-evk + distro: + name: qcom-distro-kvm + yamlfile: ':ci/qcom-distro-kvm.yml' + kernel: + type: default + dirname: "" + yamlfile: "" + - machine: qcom-armv7a + distro: + name: poky-altcfg + yamlfile: '' + kernel: + type: default + dirname: "" + yamlfile: "" + - machine: qcom-armv7a + distro: + name: qcom-distro + yamlfile: ':ci/qcom-distro.yml' + kernel: + type: default + dirname: "" + yamlfile: "" + name: ${{ matrix.machine }}/${{ matrix.distro.name }}${{ matrix.kernel.dirname }} + steps: + - uses: actions/checkout@v4 + + - name: Run kas build + uses: ./.github/actions/compile + id: compile_kas + with: + machine: ${{matrix.machine}} + distro_yaml: ${{matrix.distro.yamlfile}} + distro_name: ${{matrix.distro.name}} + kernel_yaml: ${{matrix.kernel.yamlfile}} + kernel_dirname: ${{matrix.kernel.dirname}} + cache_dir: ${CACHE_DIR} + sdk: ${{inputs.sdk}} + + publish_summary: + needs: compile + runs-on: [self-hosted, qcom-u2404, amd64] + steps: + - name: 'Download build URLs' + uses: actions/download-artifact@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + pattern: build-url* + path: urlfiles + merge-multiple: true + + - name: "Print output" + shell: python + id: print-output + run: | + import os + ftable = {} + oslist = set() + machinelist = set() + for fname in os.listdir("./urlfiles"): + if fname.startswith("build-url"): + b, m, o = fname.split("_", 2) + oslist.add(o) + machinelist.add(m) + url = "" + with open(f"./urlfiles/{fname}", "r") as urlfile: + url = urlfile.read() + if not o in ftable: + ftable.update({o:{m: url}}) + else: + ftable[o].update({m: url}) + + table_str = "| |" + + for m in sorted(machinelist): + table_str += f" {m} |" + + table_str += "\n|" + for i in range(len(machinelist) + 1): + table_str += " ---- |" + + table_str += "\n" + + for o in sorted(ftable.keys()): + table_str += f"| {o} |" + for m in sorted(machinelist): + url = ftable[o].get(m) + if url: + url = url.strip() + table_str += f" [Files]({url}/{o}/{m}/) |" + else: + table_str += " |" + table_str += "\n" + summary_file_name = os.environ.get("GITHUB_STEP_SUMMARY") + if summary_file_name: + with open(summary_file_name, "a") as summaryfile: + summaryfile.write("## Download URLs\n") + summaryfile.write(table_str) + print(table_str) diff --git a/.github/workflows/monthly.yml b/.github/workflows/monthly.yml new file mode 100644 index 00000000..3738f6f8 --- /dev/null +++ b/.github/workflows/monthly.yml @@ -0,0 +1,15 @@ +name: Monthly job + +on: + schedule: + - cron: "22 10 2 * *" # montly job - at "random" time - top of hour can be busy in github + +jobs: + sstate-cache-cleanup: + if: github.repository_owner == 'qualcomm-linux' + runs-on: [self-hosted, qcom-u2404, amd64-ssd] + steps: + - name: Clean up the persistant sstate-cache dir + run: | + # keep current and last month to allow smooth end of month transition + rm -rf /efs/qli/meta-qcom/sstate-cache-$(date -d '2 months ago' '+%Y-%m') diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml new file mode 100644 index 00000000..be189f2e --- /dev/null +++ b/.github/workflows/nightly-build.yml @@ -0,0 +1,34 @@ +name: Nightly Build + +on: + schedule: + # NOTE - changes to the cron spec should be pushed by https://github.com/quic-yocto-ci + # so that build notification emails will be sent out properly. + - cron: "23 23 * * *" # daily job - pick a random "minute" - top of hour can be busy in github + +permissions: + checks: write + pull-requests: write + contents: read + packages: read + +jobs: + build-nightly: + uses: ./.github/workflows/build-yocto.yml + with: + sdk: "1" + test-nightly: + uses: ./.github/workflows/test.yml + needs: build-nightly + secrets: inherit + with: + build_id: ${{ github.run_id }} + publish-test-results: + uses: ./.github/workflows/publish-results.yml + needs: test-nightly + secrets: inherit + with: + workflow_id: ${{ github.run_id }} + event_name: ${{ github.event_name }} + event_file: ${{ github.event_path }} + commit: ${{ github.sha }} diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml new file mode 100644 index 00000000..fe893ef1 --- /dev/null +++ b/.github/workflows/pr.yml @@ -0,0 +1,28 @@ +name: Build on PR + +on: + pull_request: + paths-ignore: + - 'README.md' + - 'README' + - 'SECURITY.md' + +permissions: + checks: write + pull-requests: write + contents: read + packages: read + +jobs: + event-file: + name: "Upload event file" + runs-on: ubuntu-latest + steps: + - name: Upload + uses: actions/upload-artifact@v6 + with: + name: Event File + path: ${{ github.event_path }} + build-pr: + uses: ./.github/workflows/build-yocto.yml + diff --git a/.github/workflows/publish-results.yml b/.github/workflows/publish-results.yml new file mode 100644 index 00000000..1567eb85 --- /dev/null +++ b/.github/workflows/publish-results.yml @@ -0,0 +1,73 @@ +name: Publish test results + +on: + workflow_call: + inputs: + workflow_id: + required: true + type: string + event_name: + required: true + type: string + event_file: + required: true + type: string + commit: + required: true + type: string + +permissions: + checks: write + pull-requests: write + contents: read + packages: read + +jobs: + publish-test-results: + name: "Publish Tests Results" + runs-on: ubuntu-latest + steps: + - name: Download result files + uses: actions/download-artifact@v6 + with: + run-id: ${{ inputs.workflow_id }} + path: artifacts + github-token: ${{ github.token }} + + - name: Download result files PR + if: ${{ github.run_id != inputs.workflow_id }} + uses: actions/download-artifact@v6 + with: + path: artifacts + github-token: ${{ github.token }} + + - name: "List files" + id: listfiles + run: | + echo $GITHUB_WORKSPACE + ls -R $GITHUB_WORKSPACE + if ! find "${{ github.workspace }}/artifacts/" -name '*.xml' -print -quit | grep -q .; then + echo "Error: no .xml files found" + exit 1 + fi + + - id: app_token + uses: actions/create-github-app-token@v2 + if: always() + with: + app-id: 2291458 + private-key: ${{ secrets.TEST_REPORTING_APP_TOKEN }} + + - name: Publish Test Results + uses: EnricoMi/publish-unit-test-result-action@v2 + if: | + always() + && contains(steps.listfiles.outcome, 'success') + with: + commit: ${{ inputs.commit }} + event_file: ${{ inputs.event_file}} + event_name: ${{ inputs.event_name }} + files: "${{ github.workspace }}/artifacts/**/*.xml" + action_fail: true + action_fail_on_inconclusive: true + github_token: ${{ steps.app_token.outputs.token }} diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml new file mode 100644 index 00000000..f06432de --- /dev/null +++ b/.github/workflows/push.yml @@ -0,0 +1,31 @@ +name: Build on push + +on: + push: + branches: + - master + +permissions: + checks: write + pull-requests: write + contents: read + packages: read + +jobs: + build: + uses: ./.github/workflows/build-yocto.yml + test: + uses: ./.github/workflows/test.yml + needs: [build] + secrets: inherit + with: + build_id: ${{ github.run_id }} + publish-test-results: + uses: ./.github/workflows/publish-results.yml + needs: test + secrets: inherit + with: + workflow_id: ${{ github.run_id }} + event_name: ${{ github.event_name }} + event_file: ${{ github.event_path }} + commit: ${{ github.sha }} diff --git a/.github/workflows/repolinter.yml b/.github/workflows/repolinter.yml new file mode 100644 index 00000000..7102d757 --- /dev/null +++ b/.github/workflows/repolinter.yml @@ -0,0 +1,31 @@ +name: QuIC Organization Repolinter + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + workflow_dispatch: + +jobs: + repolinter: + if: github.repository_owner == 'qualcomm-linux' + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + - name: Verify repolinter config file is present + id: check_files + uses: andstor/file-existence-action@v3 + with: + files: "repolint.json" + - name: Run Repolinter with local repolint.json + if: steps.check_files.outputs.files_exists == 'true' + uses: todogroup/repolinter-action@v1 + with: + config_file: "repolint.json" + - name: Run Repolinter with default ruleset + if: steps.check_files.outputs.files_exists == 'false' + uses: todogroup/repolinter-action@v1 + with: + config_url: "https://raw.githubusercontent.com/quic/.github/main/repolint.json" diff --git a/.github/workflows/stales.yml b/.github/workflows/stales.yml new file mode 100644 index 00000000..0a8685c0 --- /dev/null +++ b/.github/workflows/stales.yml @@ -0,0 +1,25 @@ +name: 'Close stale issues and pull requests with no recent activity' +on: + schedule: + - cron: "30 1 * * *" + +permissions: + issues: write + pull-requests: write + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v9 + with: + stale-issue-message: 'This issue has been marked as stale due to 30 days of inactivity. Please add a comment and close if it is resolved or if it is no longer relevant.' + stale-pr-message: 'This pull request has been marked as stale due to 30 days of inactivity. To prevent automatic closure in 5 days, remove the stale label or add a comment. You can reopen a closed pull request at any time.' + exempt-issue-labels: bug,enhancement + exempt-pr-labels: bug,enhancement + days-before-stale: 30 + days-before-close: 5 + days-before-issue-close: -1 + remove-stale-when-updated: true + remove-issue-stale-when-updated: true + remove-pr-stale-when-updated: true diff --git a/.github/workflows/test-pr.yml b/.github/workflows/test-pr.yml new file mode 100644 index 00000000..b860895f --- /dev/null +++ b/.github/workflows/test-pr.yml @@ -0,0 +1,74 @@ +name: Test PR build + +run-name: "Tests triggered by PR: ${{ github.event.workflow_run.display_title }}" + +on: + workflow_run: + workflows: ["Build on PR"] + types: + - completed + +permissions: + checks: write + pull-requests: write + contents: read + packages: read + +jobs: + test: + if: ${{ github.event.workflow_run.conclusion == 'success' }} + uses: ./.github/workflows/test.yml + secrets: inherit + with: + build_id: ${{ github.event.workflow_run.id }} + + comment-on-pr: + name: "Comment on PR" + needs: test + runs-on: ubuntu-latest + steps: + + - name: Download Result Summary + id: download-result-summary + uses: actions/download-artifact@v6 + with: + artifact-ids: ${{ needs.test.outputs.summary_id }} + path: results_summary + + - name: Download event file + uses: actions/download-artifact@v6 + with: + run-id: ${{ github.event.workflow_run.id }} + path: artifacts + github-token: ${{ github.token }} + + - name: "List files" + run: | + echo $GITHUB_WORKSPACE + ls -R $GITHUB_WORKSPACE + + - name: Prepare PR comment + id: pr_comment_prep + run: | + echo "## Test run [workflow](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})" > pr-comment.txt + echo "## Test jobs for commit ${{ github.event.workflow_run.head_sha }}" >> pr-comment.txt + PR_NUMBER=$(cat "artifacts/Event File/event.json" | jq -r ".number") + RESULT_FILE_NAME=$(find ./results_summary/ -type f) + cat "${RESULT_FILE_NAME}" >> pr-comment.txt + echo "pr_number=$PR_NUMBER" >> $GITHUB_OUTPUT + + - name: Comment on PR + uses: thollander/actions-comment-pull-request@v3 + with: + file-path: pr-comment.txt + pr-number: ${{ steps.pr_comment_prep.outputs.pr_number }} + + publish-test-results: + uses: ./.github/workflows/publish-results.yml + secrets: inherit + needs: [test] + with: + commit: ${{ github.event.workflow_run.sha }} + event_file: artifacts/Event File/event.json + event_name: ${{ github.event.workflow_run.event }} + workflow_id: ${{ github.event.workflow_run.id }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..43cac990 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,270 @@ +name: Tests + +on: + workflow_call: + inputs: + build_id: + required: true + type: string + outputs: + summary_id: + description: "ID of the test summary artifact" + value: ${{ jobs.publish-test-summary.outputs.summary_id }} + +jobs: + prepare-boot-jobs: + runs-on: ubuntu-latest + strategy: + matrix: + machine: + - iq-8275-evk + - iq-9075-evk + - qcm6490-idp + - qcs615-ride + - rb3gen2-core-kit + - qcs8300-ride-sx + - qcs9100-ride-sx + - qcom-armv8a + - qcom-armv7a + - rb1-core-kit + distro: + - name: poky-altcfg + - name: qcom-distro + kernel: + - "" + - +linux-qcom-6.18 + exclude: + - distro: poky-altcfg + kernel: +linux-qcom-6.18 + - machine: qcom-armv7a + kernel: +linux-qcom-6.18 + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Run lava-test-plans + uses: ./.github/actions/lava-test-plans + with: + machine: ${{ matrix.machine }} + distro_name: ${{ matrix.distro.name }} + kernel: ${{ matrix.kernel }} + build_id: ${{ inputs.build_id }} + gh_token: ${{ secrets.GITHUB_TOKEN }} + prefix: boottest + + prepare-boot-job-list: + needs: prepare-boot-jobs + runs-on: ubuntu-latest + outputs: + jobmatrix: ${{ steps.listjobs.outputs.jobmatrix }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: 'Download job templates' + uses: actions/download-artifact@v6 + with: + pattern: boottest-* + + - name: "List jobs" + id: listjobs + uses: ./.github/actions/list-jobs + with: + prefix: "boottest" + build_id: ${{ inputs.build_id }} + gh_token: ${{ secrets.GITHUB_TOKEN }} + + submit-boot-job: + needs: prepare-boot-job-list + runs-on: ubuntu-latest + continue-on-error: true + name: Boot ${{ matrix.target.name }} + strategy: + matrix: ${{ fromJson(needs.prepare-boot-job-list.outputs.jobmatrix) }} + steps: + - name: 'Download job templates' + uses: actions/download-artifact@v6 + with: + pattern: boottest-* + + - name: Submit ${{ matrix.target.name }} + timeout-minutes: 20 + id: submit + uses: foundriesio/lava-action@v9 + with: + lava_token: ${{ secrets.LAVATOKEN }} + lava_url: 'lava.infra.foundries.io' + job_definition: ${{ matrix.target.path }} + wait_for_job: true + fail_action_on_failure: true + fail_action_on_incomplete: true + save_result_as_artifact: true + save_job_details: true + result_file_name: "${{ matrix.target.result_file }}" + - uses: mwasilew/github-action-matrix-outputs-write@v2 + if: always() + id: out + with: + matrix-step-name: ${{ github.job }} + matrix-key: ${{ matrix.target.name }} + artifact-name: ${{ matrix.target.name }} + outputs: |- + result: ${{ steps.submit.outcome }} + + + boot-job-result: + runs-on: ubuntu-latest + needs: [submit-boot-job] + outputs: + boot_result: "${{ steps.print-boot-result.outputs.boot_result }}" + steps: + - uses: cloudposse/github-action-matrix-outputs-read@v1 + id: read + with: + matrix-step-name: "submit-boot-job" + - id: print-boot-result + name: "Print boot result" + run: | + # collapse results of matrix of boot test jobs to a single result + echo '${{ steps.read.outputs.result }}' | yq + BOOT_RESULT=$(echo '${{ steps.read.outputs.result }}' | yq '.[] | first (. != "success")') + if [ -z "$BOOT_RESULT" ]; then + BOOT_RESULT="success" + fi + echo "boot_result=$BOOT_RESULT" + echo "boot_result=$BOOT_RESULT" >> "$GITHUB_OUTPUT" + + prepare-premerge-jobs: + needs: boot-job-result + # run only if boot jobs are successful + if: ${{ needs.boot-job-result.outputs.boot_result == 'success' }} + runs-on: ubuntu-latest + strategy: + matrix: + # only run pre-merge tests on devices available in the LAB + # and "contemporary" - exclude dragonboards + machine: + - iq-9075-evk + - qcs615-ride + - rb3gen2-core-kit + - qcs8300-ride-sx + - qcs9100-ride-sx + - rb1-core-kit + distro: + - name: poky-altcfg + - name: qcom-distro + kernel: + - "" + - +linux-qcom-6.18 + exclude: + - distro: poky-altcfg + kernel: +linux-qcom-6.18 + steps: + - id: print-condition + name: "Print condition" + env: + RESULT: ${{ needs.boot-job-result.outputs.boot_result }} + run: | + echo "${RESULT}" + + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Run lava-test-plans + uses: ./.github/actions/lava-test-plans + with: + machine: ${{ matrix.machine }} + distro_name: ${{ matrix.distro.name }} + kernel: ${{ matrix.kernel }} + build_id: ${{ inputs.build_id }} + gh_token: ${{ secrets.GITHUB_TOKEN }} + prefix: premerge + testplan: pre-merge + + prepare-premerge-job-list: + needs: prepare-premerge-jobs + runs-on: ubuntu-latest + outputs: + jobmatrix: ${{ steps.listjobs.outputs.jobmatrix }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: 'Download job templates' + uses: actions/download-artifact@v6 + with: + pattern: premerge-* + + - name: "List jobs" + id: listjobs + uses: ./.github/actions/list-jobs + with: + prefix: "premerge" + build_id: ${{ inputs.build_id }} + gh_token: ${{ secrets.GITHUB_TOKEN }} + + submit-premerge-job: + needs: prepare-premerge-job-list + runs-on: ubuntu-latest + continue-on-error: true + name: Pre-merge ${{ matrix.target.name }} + strategy: + matrix: ${{ fromJson(needs.prepare-premerge-job-list.outputs.jobmatrix) }} + steps: + - name: 'Download job templates' + uses: actions/download-artifact@v6 + with: + pattern: premerge-* + + - name: Submit ${{ matrix.target.name }} + timeout-minutes: 20 + uses: foundriesio/lava-action@v9 + with: + lava_token: ${{ secrets.LAVATOKEN }} + lava_url: 'lava.infra.foundries.io' + job_definition: ${{ matrix.target.path }} + wait_for_job: true + fail_action_on_failure: true + fail_action_on_incomplete: true + save_result_as_artifact: true + save_job_details: true + result_file_name: "${{ matrix.target.result_file }}" + + publish-test-summary: + name: "Publish Tests Summary" + needs: [submit-premerge-job, submit-boot-job] + if: | + always() + && contains(needs.*.result, 'success') + && !contains(needs.*.result, 'failure') + runs-on: ubuntu-latest + permissions: + checks: write + pull-requests: write + outputs: + summary_id: ${{ steps.generate-summary.outputs.artifact_id }} + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Generate Summary + id: generate-summary + uses: ./.github/actions/test-job-summary + with: + build_id: ${{ github.run_id }} + gh_token: ${{ secrets.GITHUB_TOKEN }} + summary_file_name: test_job_summary + + - name: Download Summary + uses: actions/download-artifact@v6 + with: + artifact-ids: ${{ steps.generate-summary.outputs.artifact_id }} + + - name: Publish Test Job Details + run: | + cat test_job_summary >> $GITHUB_STEP_SUMMARY From 5a2aff88c793126a5cd3d3fc6920933a3550d8c8 Mon Sep 17 00:00:00 2001 From: Jose Quaresma Date: Thu, 29 Jan 2026 10:30:06 +0000 Subject: [PATCH 03/10] workflows: drop unnecessary workflows We can discard the scheduled jobs, nightly-build and monthly, that are already being carried out at meta-qcom ci. Signed-off-by: Jose Quaresma --- .github/workflows/monthly.yml | 15 ------------- .github/workflows/nightly-build.yml | 34 ----------------------------- 2 files changed, 49 deletions(-) delete mode 100644 .github/workflows/monthly.yml delete mode 100644 .github/workflows/nightly-build.yml diff --git a/.github/workflows/monthly.yml b/.github/workflows/monthly.yml deleted file mode 100644 index 3738f6f8..00000000 --- a/.github/workflows/monthly.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: Monthly job - -on: - schedule: - - cron: "22 10 2 * *" # montly job - at "random" time - top of hour can be busy in github - -jobs: - sstate-cache-cleanup: - if: github.repository_owner == 'qualcomm-linux' - runs-on: [self-hosted, qcom-u2404, amd64-ssd] - steps: - - name: Clean up the persistant sstate-cache dir - run: | - # keep current and last month to allow smooth end of month transition - rm -rf /efs/qli/meta-qcom/sstate-cache-$(date -d '2 months ago' '+%Y-%m') diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml deleted file mode 100644 index be189f2e..00000000 --- a/.github/workflows/nightly-build.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: Nightly Build - -on: - schedule: - # NOTE - changes to the cron spec should be pushed by https://github.com/quic-yocto-ci - # so that build notification emails will be sent out properly. - - cron: "23 23 * * *" # daily job - pick a random "minute" - top of hour can be busy in github - -permissions: - checks: write - pull-requests: write - contents: read - packages: read - -jobs: - build-nightly: - uses: ./.github/workflows/build-yocto.yml - with: - sdk: "1" - test-nightly: - uses: ./.github/workflows/test.yml - needs: build-nightly - secrets: inherit - with: - build_id: ${{ github.run_id }} - publish-test-results: - uses: ./.github/workflows/publish-results.yml - needs: test-nightly - secrets: inherit - with: - workflow_id: ${{ github.run_id }} - event_name: ${{ github.event_name }} - event_file: ${{ github.event_path }} - commit: ${{ github.sha }} From b9665610dce056ff03610fb05605eb19a4cc57cc Mon Sep 17 00:00:00 2001 From: Jose Quaresma Date: Thu, 29 Jan 2026 10:30:06 +0000 Subject: [PATCH 04/10] workflows: disable tests The tests workflows are not ready and will be proposed later after the first phase. Signed-off-by: Jose Quaresma --- .github/workflows/push.yml | 15 -- .github/workflows/test-pr.yml | 74 ---------- .github/workflows/test.yml | 270 ---------------------------------- 3 files changed, 359 deletions(-) delete mode 100644 .github/workflows/test-pr.yml delete mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index f06432de..2e8cbec8 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -14,18 +14,3 @@ permissions: jobs: build: uses: ./.github/workflows/build-yocto.yml - test: - uses: ./.github/workflows/test.yml - needs: [build] - secrets: inherit - with: - build_id: ${{ github.run_id }} - publish-test-results: - uses: ./.github/workflows/publish-results.yml - needs: test - secrets: inherit - with: - workflow_id: ${{ github.run_id }} - event_name: ${{ github.event_name }} - event_file: ${{ github.event_path }} - commit: ${{ github.sha }} diff --git a/.github/workflows/test-pr.yml b/.github/workflows/test-pr.yml deleted file mode 100644 index b860895f..00000000 --- a/.github/workflows/test-pr.yml +++ /dev/null @@ -1,74 +0,0 @@ -name: Test PR build - -run-name: "Tests triggered by PR: ${{ github.event.workflow_run.display_title }}" - -on: - workflow_run: - workflows: ["Build on PR"] - types: - - completed - -permissions: - checks: write - pull-requests: write - contents: read - packages: read - -jobs: - test: - if: ${{ github.event.workflow_run.conclusion == 'success' }} - uses: ./.github/workflows/test.yml - secrets: inherit - with: - build_id: ${{ github.event.workflow_run.id }} - - comment-on-pr: - name: "Comment on PR" - needs: test - runs-on: ubuntu-latest - steps: - - - name: Download Result Summary - id: download-result-summary - uses: actions/download-artifact@v6 - with: - artifact-ids: ${{ needs.test.outputs.summary_id }} - path: results_summary - - - name: Download event file - uses: actions/download-artifact@v6 - with: - run-id: ${{ github.event.workflow_run.id }} - path: artifacts - github-token: ${{ github.token }} - - - name: "List files" - run: | - echo $GITHUB_WORKSPACE - ls -R $GITHUB_WORKSPACE - - - name: Prepare PR comment - id: pr_comment_prep - run: | - echo "## Test run [workflow](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})" > pr-comment.txt - echo "## Test jobs for commit ${{ github.event.workflow_run.head_sha }}" >> pr-comment.txt - PR_NUMBER=$(cat "artifacts/Event File/event.json" | jq -r ".number") - RESULT_FILE_NAME=$(find ./results_summary/ -type f) - cat "${RESULT_FILE_NAME}" >> pr-comment.txt - echo "pr_number=$PR_NUMBER" >> $GITHUB_OUTPUT - - - name: Comment on PR - uses: thollander/actions-comment-pull-request@v3 - with: - file-path: pr-comment.txt - pr-number: ${{ steps.pr_comment_prep.outputs.pr_number }} - - publish-test-results: - uses: ./.github/workflows/publish-results.yml - secrets: inherit - needs: [test] - with: - commit: ${{ github.event.workflow_run.sha }} - event_file: artifacts/Event File/event.json - event_name: ${{ github.event.workflow_run.event }} - workflow_id: ${{ github.event.workflow_run.id }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 43cac990..00000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,270 +0,0 @@ -name: Tests - -on: - workflow_call: - inputs: - build_id: - required: true - type: string - outputs: - summary_id: - description: "ID of the test summary artifact" - value: ${{ jobs.publish-test-summary.outputs.summary_id }} - -jobs: - prepare-boot-jobs: - runs-on: ubuntu-latest - strategy: - matrix: - machine: - - iq-8275-evk - - iq-9075-evk - - qcm6490-idp - - qcs615-ride - - rb3gen2-core-kit - - qcs8300-ride-sx - - qcs9100-ride-sx - - qcom-armv8a - - qcom-armv7a - - rb1-core-kit - distro: - - name: poky-altcfg - - name: qcom-distro - kernel: - - "" - - +linux-qcom-6.18 - exclude: - - distro: poky-altcfg - kernel: +linux-qcom-6.18 - - machine: qcom-armv7a - kernel: +linux-qcom-6.18 - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Run lava-test-plans - uses: ./.github/actions/lava-test-plans - with: - machine: ${{ matrix.machine }} - distro_name: ${{ matrix.distro.name }} - kernel: ${{ matrix.kernel }} - build_id: ${{ inputs.build_id }} - gh_token: ${{ secrets.GITHUB_TOKEN }} - prefix: boottest - - prepare-boot-job-list: - needs: prepare-boot-jobs - runs-on: ubuntu-latest - outputs: - jobmatrix: ${{ steps.listjobs.outputs.jobmatrix }} - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: 'Download job templates' - uses: actions/download-artifact@v6 - with: - pattern: boottest-* - - - name: "List jobs" - id: listjobs - uses: ./.github/actions/list-jobs - with: - prefix: "boottest" - build_id: ${{ inputs.build_id }} - gh_token: ${{ secrets.GITHUB_TOKEN }} - - submit-boot-job: - needs: prepare-boot-job-list - runs-on: ubuntu-latest - continue-on-error: true - name: Boot ${{ matrix.target.name }} - strategy: - matrix: ${{ fromJson(needs.prepare-boot-job-list.outputs.jobmatrix) }} - steps: - - name: 'Download job templates' - uses: actions/download-artifact@v6 - with: - pattern: boottest-* - - - name: Submit ${{ matrix.target.name }} - timeout-minutes: 20 - id: submit - uses: foundriesio/lava-action@v9 - with: - lava_token: ${{ secrets.LAVATOKEN }} - lava_url: 'lava.infra.foundries.io' - job_definition: ${{ matrix.target.path }} - wait_for_job: true - fail_action_on_failure: true - fail_action_on_incomplete: true - save_result_as_artifact: true - save_job_details: true - result_file_name: "${{ matrix.target.result_file }}" - - uses: mwasilew/github-action-matrix-outputs-write@v2 - if: always() - id: out - with: - matrix-step-name: ${{ github.job }} - matrix-key: ${{ matrix.target.name }} - artifact-name: ${{ matrix.target.name }} - outputs: |- - result: ${{ steps.submit.outcome }} - - - boot-job-result: - runs-on: ubuntu-latest - needs: [submit-boot-job] - outputs: - boot_result: "${{ steps.print-boot-result.outputs.boot_result }}" - steps: - - uses: cloudposse/github-action-matrix-outputs-read@v1 - id: read - with: - matrix-step-name: "submit-boot-job" - - id: print-boot-result - name: "Print boot result" - run: | - # collapse results of matrix of boot test jobs to a single result - echo '${{ steps.read.outputs.result }}' | yq - BOOT_RESULT=$(echo '${{ steps.read.outputs.result }}' | yq '.[] | first (. != "success")') - if [ -z "$BOOT_RESULT" ]; then - BOOT_RESULT="success" - fi - echo "boot_result=$BOOT_RESULT" - echo "boot_result=$BOOT_RESULT" >> "$GITHUB_OUTPUT" - - prepare-premerge-jobs: - needs: boot-job-result - # run only if boot jobs are successful - if: ${{ needs.boot-job-result.outputs.boot_result == 'success' }} - runs-on: ubuntu-latest - strategy: - matrix: - # only run pre-merge tests on devices available in the LAB - # and "contemporary" - exclude dragonboards - machine: - - iq-9075-evk - - qcs615-ride - - rb3gen2-core-kit - - qcs8300-ride-sx - - qcs9100-ride-sx - - rb1-core-kit - distro: - - name: poky-altcfg - - name: qcom-distro - kernel: - - "" - - +linux-qcom-6.18 - exclude: - - distro: poky-altcfg - kernel: +linux-qcom-6.18 - steps: - - id: print-condition - name: "Print condition" - env: - RESULT: ${{ needs.boot-job-result.outputs.boot_result }} - run: | - echo "${RESULT}" - - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Run lava-test-plans - uses: ./.github/actions/lava-test-plans - with: - machine: ${{ matrix.machine }} - distro_name: ${{ matrix.distro.name }} - kernel: ${{ matrix.kernel }} - build_id: ${{ inputs.build_id }} - gh_token: ${{ secrets.GITHUB_TOKEN }} - prefix: premerge - testplan: pre-merge - - prepare-premerge-job-list: - needs: prepare-premerge-jobs - runs-on: ubuntu-latest - outputs: - jobmatrix: ${{ steps.listjobs.outputs.jobmatrix }} - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: 'Download job templates' - uses: actions/download-artifact@v6 - with: - pattern: premerge-* - - - name: "List jobs" - id: listjobs - uses: ./.github/actions/list-jobs - with: - prefix: "premerge" - build_id: ${{ inputs.build_id }} - gh_token: ${{ secrets.GITHUB_TOKEN }} - - submit-premerge-job: - needs: prepare-premerge-job-list - runs-on: ubuntu-latest - continue-on-error: true - name: Pre-merge ${{ matrix.target.name }} - strategy: - matrix: ${{ fromJson(needs.prepare-premerge-job-list.outputs.jobmatrix) }} - steps: - - name: 'Download job templates' - uses: actions/download-artifact@v6 - with: - pattern: premerge-* - - - name: Submit ${{ matrix.target.name }} - timeout-minutes: 20 - uses: foundriesio/lava-action@v9 - with: - lava_token: ${{ secrets.LAVATOKEN }} - lava_url: 'lava.infra.foundries.io' - job_definition: ${{ matrix.target.path }} - wait_for_job: true - fail_action_on_failure: true - fail_action_on_incomplete: true - save_result_as_artifact: true - save_job_details: true - result_file_name: "${{ matrix.target.result_file }}" - - publish-test-summary: - name: "Publish Tests Summary" - needs: [submit-premerge-job, submit-boot-job] - if: | - always() - && contains(needs.*.result, 'success') - && !contains(needs.*.result, 'failure') - runs-on: ubuntu-latest - permissions: - checks: write - pull-requests: write - outputs: - summary_id: ${{ steps.generate-summary.outputs.artifact_id }} - - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Generate Summary - id: generate-summary - uses: ./.github/actions/test-job-summary - with: - build_id: ${{ github.run_id }} - gh_token: ${{ secrets.GITHUB_TOKEN }} - summary_file_name: test_job_summary - - - name: Download Summary - uses: actions/download-artifact@v6 - with: - artifact-ids: ${{ steps.generate-summary.outputs.artifact_id }} - - - name: Publish Test Job Details - run: | - cat test_job_summary >> $GITHUB_STEP_SUMMARY From 29248ade0ea1f3661fb7a18f90d16a419e935f23 Mon Sep 17 00:00:00 2001 From: Jose Quaresma Date: Thu, 29 Jan 2026 10:30:06 +0000 Subject: [PATCH 05/10] workflows: reuse actions We will reuse the actions from the meta-com repository to avoid code duplication. Signed-off-by: Jose Quaresma --- .github/workflows/build-yocto.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-yocto.yml b/.github/workflows/build-yocto.yml index b377a4f9..2d32ba0e 100644 --- a/.github/workflows/build-yocto.yml +++ b/.github/workflows/build-yocto.yml @@ -119,7 +119,7 @@ jobs: - uses: actions/checkout@v4 - name: Run kas build - uses: ./.github/actions/compile + uses: qualcomm-linux/meta-qcom/.github/actions/compile@master with: machine: ${{matrix.machine}} distro_yaml: ${{matrix.distro.yamlfile}} @@ -224,7 +224,7 @@ jobs: - uses: actions/checkout@v4 - name: Run kas build - uses: ./.github/actions/compile + uses: qualcomm-linux/meta-qcom/.github/actions/compile@master id: compile_kas with: machine: ${{matrix.machine}} From 8870630f1930014ab192067adf586ced4e307f29 Mon Sep 17 00:00:00 2001 From: Jose Quaresma Date: Thu, 29 Jan 2026 10:30:06 +0000 Subject: [PATCH 06/10] workflows: change branch names The branch name here is main and not master like in meta-qcom. Signed-off-by: Jose Quaresma --- .github/workflows/push.yml | 2 +- .github/workflows/repolinter.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 2e8cbec8..a3f2d605 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -3,7 +3,7 @@ name: Build on push on: push: branches: - - master + - main permissions: checks: write diff --git a/.github/workflows/repolinter.yml b/.github/workflows/repolinter.yml index 7102d757..aff3ca2e 100644 --- a/.github/workflows/repolinter.yml +++ b/.github/workflows/repolinter.yml @@ -2,9 +2,9 @@ name: QuIC Organization Repolinter on: push: - branches: [ master ] + branches: [ main ] pull_request: - branches: [ master ] + branches: [ main ] workflow_dispatch: jobs: From 9ec850716cc5f76526b523cb3a910436789b6bce Mon Sep 17 00:00:00 2001 From: Jose Quaresma Date: Thu, 29 Jan 2026 10:30:06 +0000 Subject: [PATCH 07/10] workflows/build-yocto: drop poky-altcfg distro We will exercise all qcom-distro distributions variants here. The poky-altcfg is more appropriate for testing the Yocto distributions, and are already tested in the meta-qcom layer. Signed-off-by: Jose Quaresma --- .github/workflows/build-yocto.yml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/.github/workflows/build-yocto.yml b/.github/workflows/build-yocto.yml index 2d32ba0e..77cde694 100644 --- a/.github/workflows/build-yocto.yml +++ b/.github/workflows/build-yocto.yml @@ -96,8 +96,6 @@ jobs: - rb3gen2-core-kit - qcom-armv8a distro: - - name: poky-altcfg - yamlfile: "" - name: qcom-distro yamlfile: ':ci/qcom-distro-prop-image.yml' - name: qcom-distro-catchall @@ -151,8 +149,6 @@ jobs: - rb1-core-kit - sm8750-mtp distro: - - name: poky-altcfg - yamlfile: "" - name: qcom-distro yamlfile: ':ci/qcom-distro-prop-image.yml' - name: qcom-distro-catchall @@ -203,14 +199,6 @@ jobs: type: default dirname: "" yamlfile: "" - - machine: qcom-armv7a - distro: - name: poky-altcfg - yamlfile: '' - kernel: - type: default - dirname: "" - yamlfile: "" - machine: qcom-armv7a distro: name: qcom-distro From fd143372ffd8178e85c9f5e0231172475d4e5093 Mon Sep 17 00:00:00 2001 From: Dmitry Baryshkov Date: Tue, 17 Feb 2026 13:03:43 +0200 Subject: [PATCH 08/10] ci: import configs from meta-qcom, commit 05fed45a3063 Import CI configuration matching metea-qcom commit 05fed45a3063 ("ci: remove qcm6490 qmc2290 soc yaml file (#1578)"). Signed-off-by: Dmitry Baryshkov --- ci/base.yml | 70 ++++++++++++++++++++++++++++++++ ci/debug.yml | 6 +++ ci/initramfs-test.yml | 32 +++++++++++++++ ci/iq-615-evk.yml | 8 ++++ ci/iq-8275-evk.yml | 8 ++++ ci/iq-9075-evk.yml | 8 ++++ ci/iq-x7181-evk.yml | 8 ++++ ci/kaanapali-mtp.yml | 8 ++++ ci/kas-container-shell-helper.sh | 20 +++++++++ ci/kas-shell-helper.sh | 19 +++++++++ ci/linux-qcom-6.18.yml | 7 ++++ ci/linux-qcom-next-rt.yml | 6 +++ ci/linux-qcom-next.yml | 6 +++ ci/linux-qcom-rt-6.18.yml | 7 ++++ ci/linux-yocto-dev.yml | 6 +++ ci/mirror.yml | 8 ++++ ci/performance.yml | 6 +++ ci/qcm6490-idp.yml | 8 ++++ ci/qcom-armv7a.yml | 11 +++++ ci/qcom-armv8a.yml | 11 +++++ ci/qcom-distro-catchall.yml | 13 ++++++ ci/qcom-distro-kvm.yml | 8 ++++ ci/qcom-distro-prop-image.yml | 11 +++++ ci/qcom-distro-selinux.yml | 12 ++++++ ci/qcom-distro-sota.yml | 8 ++++ ci/qcom-distro.yml | 52 ++++++++++++++++++++++++ ci/qcs615-ride.yml | 8 ++++ ci/qcs8300-ride-sx.yml | 8 ++++ ci/qcs9100-ride-sx.yml | 8 ++++ ci/rb1-core-kit.yml | 8 ++++ ci/rb3gen2-core-kit.yml | 8 ++++ ci/schemacheck.py | 33 +++++++++++++++ ci/sm8750-mtp.yml | 8 ++++ ci/world.yml | 13 ++++++ ci/yocto-check-layer.sh | 43 ++++++++++++++++++++ ci/yocto-patchreview.sh | 29 +++++++++++++ ci/yocto-pybootchartgui.sh | 35 ++++++++++++++++ 37 files changed, 568 insertions(+) create mode 100644 ci/base.yml create mode 100644 ci/debug.yml create mode 100644 ci/initramfs-test.yml create mode 100644 ci/iq-615-evk.yml create mode 100644 ci/iq-8275-evk.yml create mode 100644 ci/iq-9075-evk.yml create mode 100644 ci/iq-x7181-evk.yml create mode 100644 ci/kaanapali-mtp.yml create mode 100755 ci/kas-container-shell-helper.sh create mode 100755 ci/kas-shell-helper.sh create mode 100644 ci/linux-qcom-6.18.yml create mode 100644 ci/linux-qcom-next-rt.yml create mode 100644 ci/linux-qcom-next.yml create mode 100644 ci/linux-qcom-rt-6.18.yml create mode 100644 ci/linux-yocto-dev.yml create mode 100644 ci/mirror.yml create mode 100644 ci/performance.yml create mode 100644 ci/qcm6490-idp.yml create mode 100644 ci/qcom-armv7a.yml create mode 100644 ci/qcom-armv8a.yml create mode 100644 ci/qcom-distro-catchall.yml create mode 100644 ci/qcom-distro-kvm.yml create mode 100644 ci/qcom-distro-prop-image.yml create mode 100644 ci/qcom-distro-selinux.yml create mode 100644 ci/qcom-distro-sota.yml create mode 100644 ci/qcom-distro.yml create mode 100644 ci/qcs615-ride.yml create mode 100644 ci/qcs8300-ride-sx.yml create mode 100644 ci/qcs9100-ride-sx.yml create mode 100644 ci/rb1-core-kit.yml create mode 100644 ci/rb3gen2-core-kit.yml create mode 100644 ci/schemacheck.py create mode 100644 ci/sm8750-mtp.yml create mode 100644 ci/world.yml create mode 100755 ci/yocto-check-layer.sh create mode 100755 ci/yocto-patchreview.sh create mode 100755 ci/yocto-pybootchartgui.sh diff --git a/ci/base.yml b/ci/base.yml new file mode 100644 index 00000000..b23eff15 --- /dev/null +++ b/ci/base.yml @@ -0,0 +1,70 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + +distro: poky-altcfg + +defaults: + repos: + branch: master + +repos: + meta-qcom: + + oe-core: + url: https://github.com/openembedded/openembedded-core + layers: + meta: + + bitbake: + url: https://github.com/openembedded/bitbake + layers: + .: disabled + + meta-yocto: + url: https://git.yoctoproject.org/meta-yocto + layers: + meta-poky: + +local_conf_header: + base: | + CONF_VERSION = "2" + INHERIT += "buildstats-summary" + INHERIT += "buildhistory" + INHERIT += "rm_work" + diskmon: | + BB_DISKMON_DIRS ??= "\ + STOPTASKS,${TMPDIR},1G,100K \ + STOPTASKS,${DL_DIR},1G,100K \ + STOPTASKS,${SSTATE_DIR},1G,100K \ + STOPTASKS,/tmp,100M,100K \ + HALT,${TMPDIR},100M,1K \ + HALT,${DL_DIR},100M,1K \ + HALT,${SSTATE_DIR},100M,1K \ + HALT,/tmp,10M,1K" + clo-mirrors: | + MIRRORS:append = " \ + git://github.com git://git.codelinaro.org/clo/yocto-mirrors/github/ \ + git://.*/ git://git.codelinaro.org/clo/yocto-mirrors/ \ + https://.*/.*/ https://artifacts.codelinaro.org/codelinaro-le/ \ + " + cmdline: | + KERNEL_CMDLINE_EXTRA:append = " qcom_scm.download_mode=1" + qcomflash: | + IMAGE_CLASSES += "image_types_qcom" + IMAGE_FSTYPES += "qcomflash" + extra: | + DISTRO_FEATURES:append = " efi pni-names" + EXTRA_IMAGE_FEATURES = "allow-empty-password empty-root-password allow-root-login" + IMAGE_ROOTFS_EXTRA_SPACE = "307200" + WATCHDOG_RUNTIME_SEC:pn-systemd = "30" + uninative: | + INHERIT:remove = "uninative" + sstate: | + BB_SIGNATURE_HANDLER = "OEBasicHash" + +machine: unset + +target: + - core-image-base diff --git a/ci/debug.yml b/ci/debug.yml new file mode 100644 index 00000000..8458b756 --- /dev/null +++ b/ci/debug.yml @@ -0,0 +1,6 @@ +header: + version: 14 + +local_conf_header: + debug-build: | + DEBUG_BUILD = "1" diff --git a/ci/initramfs-test.yml b/ci/initramfs-test.yml new file mode 100644 index 00000000..eb2c4a35 --- /dev/null +++ b/ci/initramfs-test.yml @@ -0,0 +1,32 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + +local_conf_header: + fwcompress: | + FIRMWARE_COMPRESSION = "zst" + +target: + - initramfs-firmware-db8074-image + - initramfs-firmware-dragonboard410c-image + - initramfs-firmware-dragonboard820c-image + - initramfs-firmware-dragonboard845c-image + - initramfs-firmware-qar2130p-image + - initramfs-firmware-qcs615-ride-image + - initramfs-firmware-qcs8300-ride-image + - initramfs-firmware-rb1-image + - initramfs-firmware-rb2-image + - initramfs-firmware-rb3gen2-image + - initramfs-firmware-rb5-image + - initramfs-firmware-sa8775p-ride-image + - initramfs-firmware-sm8150-hdk-image + - initramfs-firmware-sm8350-hdk-image + - initramfs-firmware-sm8450-hdk-image + - initramfs-firmware-sm8550-hdk-image + - initramfs-firmware-sm8650-hdk-image + - initramfs-kerneltest-full-image + - initramfs-kerneltest-image + - initramfs-test-full-image + - initramfs-test-image + - initramfs-tiny-image diff --git a/ci/iq-615-evk.yml b/ci/iq-615-evk.yml new file mode 100644 index 00000000..f214942d --- /dev/null +++ b/ci/iq-615-evk.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +machine: iq-615-evk diff --git a/ci/iq-8275-evk.yml b/ci/iq-8275-evk.yml new file mode 100644 index 00000000..b16dc6a5 --- /dev/null +++ b/ci/iq-8275-evk.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +machine: iq-8275-evk diff --git a/ci/iq-9075-evk.yml b/ci/iq-9075-evk.yml new file mode 100644 index 00000000..75a09668 --- /dev/null +++ b/ci/iq-9075-evk.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +machine: iq-9075-evk diff --git a/ci/iq-x7181-evk.yml b/ci/iq-x7181-evk.yml new file mode 100644 index 00000000..00ae0a43 --- /dev/null +++ b/ci/iq-x7181-evk.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +machine: iq-x7181-evk diff --git a/ci/kaanapali-mtp.yml b/ci/kaanapali-mtp.yml new file mode 100644 index 00000000..b0c8fb5d --- /dev/null +++ b/ci/kaanapali-mtp.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +machine: kaanapali-mtp diff --git a/ci/kas-container-shell-helper.sh b/ci/kas-container-shell-helper.sh new file mode 100755 index 00000000..39e4be63 --- /dev/null +++ b/ci/kas-container-shell-helper.sh @@ -0,0 +1,20 @@ +#!/bin/sh -e +# Copyright (c) 2025 Qualcomm Innovation Center, Inc. All rights reserved. +# SPDX-License-Identifier: MIT + +TOPDIR=$(realpath $(dirname $(readlink -f $0))/..) +SCRIPT=$(realpath $1) + +if ! [ -f $SCRIPT ]; then + echo "The script path argument is missing, please run it with:" + echo " $0 /path/to/script" + exit 1 +fi + +# make it relative to the TOPDIR +SCRIPT=${SCRIPT#$TOPDIR/} + +# on ci the kas-container is not on the default path +KAS_CONTAINER=${KAS_CONTAINER:-$(which kas-container)} + +exec $KAS_CONTAINER shell $TOPDIR/ci/base.yml --command "/repo/$SCRIPT /repo /work" diff --git a/ci/kas-shell-helper.sh b/ci/kas-shell-helper.sh new file mode 100755 index 00000000..2479d033 --- /dev/null +++ b/ci/kas-shell-helper.sh @@ -0,0 +1,19 @@ +#!/bin/sh -e +# Copyright (c) 2025 Qualcomm Innovation Center, Inc. All rights reserved. +# SPDX-License-Identifier: MIT + +TOPDIR=$(realpath $(dirname $(readlink -f $0))/..) +SCRIPT=$(realpath $1) + +if ! [ -f $SCRIPT ]; then + echo "The script path argument is missing, please run it with:" + echo " $0 /path/to/script" + exit 1 +fi + +# Ensure KAS workspace is outside of the checked out repo +# Allows the caller to specify KAS_WORK_DIR, otherwise make temp one +export KAS_WORK_DIR=$(realpath ${KAS_WORK_DIR:-$(mktemp -d)}) + +echo "Running kas in $KAS_WORK_DIR" +exec kas shell $TOPDIR/ci/base.yml --command "$SCRIPT $TOPDIR $KAS_WORK_DIR" diff --git a/ci/linux-qcom-6.18.yml b/ci/linux-qcom-6.18.yml new file mode 100644 index 00000000..075d9369 --- /dev/null +++ b/ci/linux-qcom-6.18.yml @@ -0,0 +1,7 @@ +header: + version: 14 + +local_conf_header: + kernelprovider: | + PREFERRED_PROVIDER_virtual/kernel = "linux-qcom" + PREFERRED_VERSION_virtual/kernel = "6.18%" diff --git a/ci/linux-qcom-next-rt.yml b/ci/linux-qcom-next-rt.yml new file mode 100644 index 00000000..eccae1ad --- /dev/null +++ b/ci/linux-qcom-next-rt.yml @@ -0,0 +1,6 @@ +header: + version: 14 + +local_conf_header: + kernelprovider: | + PREFERRED_PROVIDER_virtual/kernel = "linux-qcom-next-rt" diff --git a/ci/linux-qcom-next.yml b/ci/linux-qcom-next.yml new file mode 100644 index 00000000..dc4daf7f --- /dev/null +++ b/ci/linux-qcom-next.yml @@ -0,0 +1,6 @@ +header: + version: 14 + +local_conf_header: + kernelprovider: | + PREFERRED_PROVIDER_virtual/kernel = "linux-qcom-next" diff --git a/ci/linux-qcom-rt-6.18.yml b/ci/linux-qcom-rt-6.18.yml new file mode 100644 index 00000000..b10c55bb --- /dev/null +++ b/ci/linux-qcom-rt-6.18.yml @@ -0,0 +1,7 @@ +header: + version: 14 + +local_conf_header: + kernelprovider: | + PREFERRED_PROVIDER_virtual/kernel = "linux-qcom-rt" + PREFERRED_VERSION_virtual/kernel = "6.18%" diff --git a/ci/linux-yocto-dev.yml b/ci/linux-yocto-dev.yml new file mode 100644 index 00000000..2bf720f3 --- /dev/null +++ b/ci/linux-yocto-dev.yml @@ -0,0 +1,6 @@ +header: + version: 14 + +local_conf_header: + kernelprovider: | + PREFERRED_PROVIDER_virtual/kernel = "linux-yocto-dev" diff --git a/ci/mirror.yml b/ci/mirror.yml new file mode 100644 index 00000000..f2fdd3ba --- /dev/null +++ b/ci/mirror.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + +local_conf_header: + mirror: | + SSTATE_MIRRORS = "file://.* http://sstate.yoctoproject.org/all/PATH;downloadfilename=PATH" diff --git a/ci/performance.yml b/ci/performance.yml new file mode 100644 index 00000000..524f40a2 --- /dev/null +++ b/ci/performance.yml @@ -0,0 +1,6 @@ +header: + version: 14 + +local_conf_header: + cmdline: | + KERNEL_CMDLINE_EXTRA:append = " quiet" diff --git a/ci/qcm6490-idp.yml b/ci/qcm6490-idp.yml new file mode 100644 index 00000000..0331392b --- /dev/null +++ b/ci/qcm6490-idp.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +machine: qcm6490-idp diff --git a/ci/qcom-armv7a.yml b/ci/qcom-armv7a.yml new file mode 100644 index 00000000..6cc84084 --- /dev/null +++ b/ci/qcom-armv7a.yml @@ -0,0 +1,11 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +local_conf_header: + qcomflash: | + +machine: qcom-armv7a diff --git a/ci/qcom-armv8a.yml b/ci/qcom-armv8a.yml new file mode 100644 index 00000000..6798ba13 --- /dev/null +++ b/ci/qcom-armv8a.yml @@ -0,0 +1,11 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +local_conf_header: + qcomflash: | + +machine: qcom-armv8a diff --git a/ci/qcom-distro-catchall.yml b/ci/qcom-distro-catchall.yml new file mode 100644 index 00000000..c63a2303 --- /dev/null +++ b/ci/qcom-distro-catchall.yml @@ -0,0 +1,13 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/qcom-distro.yml + +distro: qcom-distro-catchall + +target: + - qcom-multimedia-image + - qcom-multimedia-proprietary-image + - qcom-container-orchestration-image diff --git a/ci/qcom-distro-kvm.yml b/ci/qcom-distro-kvm.yml new file mode 100644 index 00000000..1a3ace09 --- /dev/null +++ b/ci/qcom-distro-kvm.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/qcom-distro.yml + +distro: qcom-distro-kvm diff --git a/ci/qcom-distro-prop-image.yml b/ci/qcom-distro-prop-image.yml new file mode 100644 index 00000000..cec2a629 --- /dev/null +++ b/ci/qcom-distro-prop-image.yml @@ -0,0 +1,11 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/qcom-distro.yml + +target: + - qcom-multimedia-image + - qcom-multimedia-proprietary-image + - qcom-container-orchestration-image diff --git a/ci/qcom-distro-selinux.yml b/ci/qcom-distro-selinux.yml new file mode 100644 index 00000000..bc9dd512 --- /dev/null +++ b/ci/qcom-distro-selinux.yml @@ -0,0 +1,12 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/qcom-distro.yml + +distro: qcom-distro-selinux + +target: + - qcom-multimedia-image + - qcom-multimedia-proprietary-image diff --git a/ci/qcom-distro-sota.yml b/ci/qcom-distro-sota.yml new file mode 100644 index 00000000..84d6ea4e --- /dev/null +++ b/ci/qcom-distro-sota.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/qcom-distro.yml + +distro: qcom-distro-sota diff --git a/ci/qcom-distro.yml b/ci/qcom-distro.yml new file mode 100644 index 00000000..fd3c8cd1 --- /dev/null +++ b/ci/qcom-distro.yml @@ -0,0 +1,52 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + +distro: qcom-distro + +repos: + meta-qcom-distro: + url: https://github.com/qualcomm-linux/meta-qcom-distro + branch: main + + meta-openembedded: + url: https://github.com/openembedded/meta-openembedded + layers: + meta-filesystems: + meta-gnome: + meta-multimedia: + meta-networking: + meta-oe: + meta-python: + meta-xfce: + + meta-virtualization: + url: https://git.yoctoproject.org/git/meta-virtualization + branch: master + + meta-audioreach: + url: https://github.com/AudioReach/meta-audioreach + branch: master + + meta-selinux: + branch: master + url: https://git.yoctoproject.org/meta-selinux + + meta-updater: + branch: master + url: https://github.com/uptane/meta-updater + + meta-security: + url: https://git.yoctoproject.org/meta-security + branch: master + layers: + .: + meta-tpm: + +local_conf_header: + virtualization: + SKIP_META_VIRT_SANITY_CHECK = "1" + +target: + - qcom-multimedia-image diff --git a/ci/qcs615-ride.yml b/ci/qcs615-ride.yml new file mode 100644 index 00000000..d09d46d3 --- /dev/null +++ b/ci/qcs615-ride.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +machine: qcs615-ride diff --git a/ci/qcs8300-ride-sx.yml b/ci/qcs8300-ride-sx.yml new file mode 100644 index 00000000..213a2457 --- /dev/null +++ b/ci/qcs8300-ride-sx.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +machine: qcs8300-ride-sx diff --git a/ci/qcs9100-ride-sx.yml b/ci/qcs9100-ride-sx.yml new file mode 100644 index 00000000..baa01b7b --- /dev/null +++ b/ci/qcs9100-ride-sx.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +machine: qcs9100-ride-sx diff --git a/ci/rb1-core-kit.yml b/ci/rb1-core-kit.yml new file mode 100644 index 00000000..ac0bd029 --- /dev/null +++ b/ci/rb1-core-kit.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +machine: rb1-core-kit diff --git a/ci/rb3gen2-core-kit.yml b/ci/rb3gen2-core-kit.yml new file mode 100644 index 00000000..0cab499d --- /dev/null +++ b/ci/rb3gen2-core-kit.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +machine: rb3gen2-core-kit diff --git a/ci/schemacheck.py b/ci/schemacheck.py new file mode 100644 index 00000000..e8107802 --- /dev/null +++ b/ci/schemacheck.py @@ -0,0 +1,33 @@ +# Copyright (c) 2025 Qualcomm Innovation Center, Inc. All rights reserved. +# SPDX-License-Identifier: MIT + +import os +import sys +import yaml +import voluptuous +from lava_common.schemas import validate + +exitcode = 0 + +for root, dirs, files in os.walk(sys.argv[1]): + for fname in files: + if fname.endswith(".yaml"): + filename = os.path.join(root, fname) + + try: + f = open(filename, "rb") + y = yaml.safe_load(f) + f.close() + validate(y) + print(f"{filename} is valid") + except voluptuous.Invalid as e1: + print(f"{filename} is invalid") + print(e1.msg) + print(e1.path) + exitcode += 1 + except yaml.error.MarkedYAMLError as e2: + print(f"{filename} is invalid") + print(e2.problem) + print(e2.problem_mark) + exitcode += 1 +sys.exit(exitcode) diff --git a/ci/sm8750-mtp.yml b/ci/sm8750-mtp.yml new file mode 100644 index 00000000..fe0c25d1 --- /dev/null +++ b/ci/sm8750-mtp.yml @@ -0,0 +1,8 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - ci/base.yml + +machine: sm8750-mtp diff --git a/ci/world.yml b/ci/world.yml new file mode 100644 index 00000000..590fc47b --- /dev/null +++ b/ci/world.yml @@ -0,0 +1,13 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + +local_conf_header: + world_build: | + EXCLUDE_FROM_WORLD = "1" + EXCLUDE_FROM_WORLD:layer-qcom = "0" + #EXCLUDE_FROM_WORLD:layer-qcom-distro = "0" + +target: + - world diff --git a/ci/yocto-check-layer.sh b/ci/yocto-check-layer.sh new file mode 100755 index 00000000..61777299 --- /dev/null +++ b/ci/yocto-check-layer.sh @@ -0,0 +1,43 @@ +#!/bin/bash -e +# Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved. +# SPDX-License-Identifier: MIT + +if [ -z $1 ] || [ -z $2 ] ; then + echo "The REPO_DIR or WORK_DIR is empty and it needs to point to the corresponding directories." + echo "Please run it with:" + echo " $0 REPO_DIR WORK_DIR" + exit 1 +fi + +REPO_DIR="$1" +WORK_DIR="$2" + +_is_dir(){ + test -d "$1" && return + echo "The '$1' is not a directory." + exit 1 +} + +_is_dir "$REPO_DIR" +_is_dir "$WORK_DIR" + +# Creates a temporary build directory to run the yocto-check-layer +# script to avoid a contaminated environment. +BUILDDIR="$(mktemp -p $WORK_DIR -d -t build-yocto-check-layer-XXXX)" +source $WORK_DIR/oe-core/oe-init-build-env $BUILDDIR +git -c advice.detachedHead=false -c init.defaultBranch=master clone --quiet --shared $REPO_DIR meta-qcom + +# Yocto Project layer checking tool +CMD="yocto-check-layer" +# Layer to check +CMD="$CMD meta-qcom" +# Disable auto layer discovery +CMD="$CMD --no-auto" +# Layers to process for dependencies +CMD="$CMD --dependency $WORK_DIR/oe-core/meta" +# Disable automatic testing of dependencies +CMD="$CMD --no-auto-dependency" +# Set machines to all machines defined in this BSP layer +CMD="$CMD --machines $(echo $(find meta-qcom/conf/machine/ -maxdepth 1 -name *.conf -exec basename {} .conf \; ))" + +exec $CMD diff --git a/ci/yocto-patchreview.sh b/ci/yocto-patchreview.sh new file mode 100755 index 00000000..033c87e4 --- /dev/null +++ b/ci/yocto-patchreview.sh @@ -0,0 +1,29 @@ +#!/bin/sh -e +# Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved. +# SPDX-License-Identifier: MIT + +if [ -z $1 ] || [ -z $2 ] ; then + echo "The REPO_DIR or WORK_DIR is empty and it needs to point to the corresponding directories." + echo "Please run it with:" + echo " $0 REPO_DIR WORK_DIR" + exit 1 +fi + +REPO_DIR="$1" +WORK_DIR="$2" + +_is_dir(){ + test -d "$1" && return + echo "The '$1' is not a directory." + exit 1 +} + +_is_dir "$REPO_DIR" +_is_dir "$WORK_DIR" + + +$WORK_DIR/oe-core/scripts/contrib/patchreview.py -v -b -j status.json $REPO_DIR + +# return an error if any malformed patch is found +cat $WORK_DIR/build/status.json | + python3 -c "import json,sys;obj=json.load(sys.stdin); sys.exit(1) if 'malformed-sob' in obj[0] or 'malformed-upstream-status' in obj[0] else sys.exit(0)" diff --git a/ci/yocto-pybootchartgui.sh b/ci/yocto-pybootchartgui.sh new file mode 100755 index 00000000..80bf24d7 --- /dev/null +++ b/ci/yocto-pybootchartgui.sh @@ -0,0 +1,35 @@ +#!/bin/sh -e +# Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved. +# SPDX-License-Identifier: MIT + +if [ -z $1 ] || [ -z $2 ] ; then + echo "The REPO_DIR or WORK_DIR is empty and it needs to point to the corresponding directories." + echo "Please run it with:" + echo " $0 REPO_DIR WORK_DIR" + exit 1 +fi + +REPO_DIR="$1" +WORK_DIR="$2" + +_is_dir(){ + test -d "$1" && return + echo "The '$1' is not a directory." + exit 1 +} + +_is_dir "$REPO_DIR" +_is_dir "$WORK_DIR" + +# pybootchartgui tool +CMD="$CMD $WORK_DIR/oe-core/scripts/pybootchartgui/pybootchartgui.py" +# display time in minutes instead of seconds +CMD="$CMD --minutes" +# image format (png, svg, pdf); default format png +CMD="$CMD --format=svg" +# output path (file or directory) where charts are stored +CMD="$CMD --output=buildchart" +# /path/to/tmp/buildstats/// +CMD="$CMD $WORK_DIR/build/tmp/buildstats" + +exec $CMD From 0bfb9038517da83158b25897176040534d9286bd Mon Sep 17 00:00:00 2001 From: Dmitry Baryshkov Date: Tue, 17 Feb 2026 13:07:27 +0200 Subject: [PATCH 09/10] ci: adapt to the meta-qcom -> meta-qcom-distro Adapt CI configuration to be executed from the meta-qcom-distro layer rather than bare meta-qcom. Signed-off-by: Dmitry Baryshkov --- ci/base.yml | 1 + ci/kas-container-shell-helper.sh | 2 +- ci/qcom-distro.yml | 2 -- ci/yocto-check-layer.sh | 22 ++++++++++++++++++---- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/ci/base.yml b/ci/base.yml index b23eff15..3fd82396 100644 --- a/ci/base.yml +++ b/ci/base.yml @@ -11,6 +11,7 @@ defaults: repos: meta-qcom: + url: https://github.com/qualcomm-linux/meta-qcom oe-core: url: https://github.com/openembedded/openembedded-core diff --git a/ci/kas-container-shell-helper.sh b/ci/kas-container-shell-helper.sh index 39e4be63..f715f985 100755 --- a/ci/kas-container-shell-helper.sh +++ b/ci/kas-container-shell-helper.sh @@ -17,4 +17,4 @@ SCRIPT=${SCRIPT#$TOPDIR/} # on ci the kas-container is not on the default path KAS_CONTAINER=${KAS_CONTAINER:-$(which kas-container)} -exec $KAS_CONTAINER shell $TOPDIR/ci/base.yml --command "/repo/$SCRIPT /repo /work" +exec $KAS_CONTAINER shell $TOPDIR/ci/base.yml:$TOPDIR/ci/qcom-distro.yml --command "/repo/$SCRIPT /repo /work" diff --git a/ci/qcom-distro.yml b/ci/qcom-distro.yml index fd3c8cd1..29b76ab9 100644 --- a/ci/qcom-distro.yml +++ b/ci/qcom-distro.yml @@ -7,8 +7,6 @@ distro: qcom-distro repos: meta-qcom-distro: - url: https://github.com/qualcomm-linux/meta-qcom-distro - branch: main meta-openembedded: url: https://github.com/openembedded/meta-openembedded diff --git a/ci/yocto-check-layer.sh b/ci/yocto-check-layer.sh index 61777299..06a5dafa 100755 --- a/ci/yocto-check-layer.sh +++ b/ci/yocto-check-layer.sh @@ -25,19 +25,33 @@ _is_dir "$WORK_DIR" # script to avoid a contaminated environment. BUILDDIR="$(mktemp -p $WORK_DIR -d -t build-yocto-check-layer-XXXX)" source $WORK_DIR/oe-core/oe-init-build-env $BUILDDIR -git -c advice.detachedHead=false -c init.defaultBranch=master clone --quiet --shared $REPO_DIR meta-qcom +git -c advice.detachedHead=false -c init.defaultBranch=master clone --quiet --shared $REPO_DIR meta-qcom-distro # Yocto Project layer checking tool CMD="yocto-check-layer" # Layer to check -CMD="$CMD meta-qcom" +CMD="$CMD meta-qcom-distro" # Disable auto layer discovery CMD="$CMD --no-auto" # Layers to process for dependencies -CMD="$CMD --dependency $WORK_DIR/oe-core/meta" +CMD="$CMD --dependency" +CMD="$CMD $WORK_DIR/oe-core/meta" +CMD="$CMD $WORK_DIR/meta-qcom" +CMD="$CMD $WORK_DIR/meta-openembedded/meta-oe" +CMD="$CMD $WORK_DIR/meta-openembedded/meta-networking" +CMD="$CMD $WORK_DIR/meta-openembedded/meta-multimedia" +CMD="$CMD $WORK_DIR/meta-openembedded/meta-python" +CMD="$CMD $WORK_DIR/meta-openembedded/meta-filesystems" +CMD="$CMD $WORK_DIR/meta-openembedded/meta-gnome" +CMD="$CMD $WORK_DIR/meta-openembedded/meta-xfce" +CMD="$CMD $WORK_DIR/meta-security" +CMD="$CMD $WORK_DIR/meta-security/meta-tpm" +CMD="$CMD $WORK_DIR/meta-selinux" +CMD="$CMD $WORK_DIR/meta-updater" +CMD="$CMD $WORK_DIR/meta-virtualization" # Disable automatic testing of dependencies CMD="$CMD --no-auto-dependency" # Set machines to all machines defined in this BSP layer -CMD="$CMD --machines $(echo $(find meta-qcom/conf/machine/ -maxdepth 1 -name *.conf -exec basename {} .conf \; ))" +CMD="$CMD --machines $(echo $(find ${WORK_DIR}/meta-qcom/conf/machine/ -maxdepth 1 -name *.conf -exec basename {} .conf \; ))" exec $CMD From 6e25777adea95f918750fb13bc51bfe24af321e9 Mon Sep 17 00:00:00 2001 From: Dmitry Baryshkov Date: Tue, 17 Feb 2026 13:07:47 +0200 Subject: [PATCH 10/10] ci/yocto-check-layer: apply workarounds In order to test the meta-qcom-distro we need to perform several changes. First of all, specify DISTRO_FEATURES matching qcom-distro, otherwise qcom-distro packages can't pull in dependencies like vulkan-tool. Second, provide workarounds for recipes outside of qcom-distro, which otherwise break yocto-check-layers. Signed-off-by: Dmitry Baryshkov --- ci/yocto-check-layer.sh | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/ci/yocto-check-layer.sh b/ci/yocto-check-layer.sh index 06a5dafa..add39021 100755 --- a/ci/yocto-check-layer.sh +++ b/ci/yocto-check-layer.sh @@ -27,6 +27,41 @@ BUILDDIR="$(mktemp -p $WORK_DIR -d -t build-yocto-check-layer-XXXX)" source $WORK_DIR/oe-core/oe-init-build-env $BUILDDIR git -c advice.detachedHead=false -c init.defaultBranch=master clone --quiet --shared $REPO_DIR meta-qcom-distro +# Patch dependent layers otherwise breaking yocto-check-layer +bitbake-layers create-layer -a meta-patch +mkdir -p meta-patch/recipes-patch/patch +# Taint (by forced/invalidated task) changed from nostamp(uuid4):foo to nostamp(uuid4):foo +echo 'unset do_install[nostamp]' >> meta-patch/recipes-patch/patch/aide_%.bbappend +# Taint (by forced/invalidated task) changed from nostamp(uuid4):foo to nostamp(uuid4):foo +echo 'unset do_populate_registry[nostamp]' >> meta-patch/recipes-patch/patch/container-registry-populate.bbappend +# QA error because of network access +echo 'unset do_populate_registry[network]' >> meta-patch/recipes-patch/patch/container-registry-populate.bbappend +# Depends on the package outside of the layer set +echo 'EXCLUDE_FROM_WORLD = "1"' >> meta-patch/recipes-patch/patch/cockpit-machines_%.bbappend +# Missing or unbuildable dependency chain was: ['meta-world-pkgdata', 'packagegroup-yocto-builder', 'systemd'] +echo 'inherit features_check' >> meta-patch/recipes-patch/patch/packagegroup-yocto-builder.bbappend +echo 'REQUIRED_DISTRO_FEATURES = "systemd"' >> meta-patch/recipes-patch/patch/packagegroup-yocto-builder.bbappend + +# DISTRO features of qcom-distro +echo 'DISTRO_FEATURES:append:nodistro = " \ + bluetooth \ + efi \ + glvnd \ + opencl \ + opengl \ + overlayfs \ + pam \ + pni-names \ + ptest \ + security \ + tpm2 \ + virtualization \ + vulkan \ + wayland \ + wifi \ + x11 \ +"' >> conf/local.conf + # Yocto Project layer checking tool CMD="yocto-check-layer" # Layer to check