From 7ea741e8ed0840eb8cb0131b41eb7b976aadde94 Mon Sep 17 00:00:00 2001 From: Jose Quaresma Date: Thu, 29 Jan 2026 10:30:06 +0000 Subject: [PATCH 01/15] workflows: import from meta-qcom 67fd9f0c1 To get CI going on meta-qcom-distro, copy over the meta-qcom .github/workflows folder revision 67fd9f0c1 [1]. [1] 67fd9f0c1 firmware-qcom-boot-iq-x7181: upgrade to 00006.0 (#1480) Signed-off-by: Jose Quaresma --- .github/workflows/build-yocto.yml | 321 ++++++++++++++++++++++++++ .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 | 254 ++++++++++++++++++++ 10 files changed, 886 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..a1c1f0e9 --- /dev/null +++ b/.github/workflows/build-yocto.yml @@ -0,0 +1,321 @@ +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.ref }} + cancel-in-progress: true + +env: + CACHE_DIR: /efs/qli/meta-qcom + KAS_REPO_REF_DIR: /efs/qli/meta-qcom/kas-mirrors + +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} + + - name: Update kas mirrors + run: | + for r in $(find ${KAS_REPO_REF_DIR}/* -maxdepth 0 -type d); do + echo "pre-fetch: $r" + git -C $r fetch --prune origin '+refs/*:refs/*' + done + + - 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-selinux + yamlfile: ':ci/qcom-distro-selinux.yml' + - name: qcom-distro-sota + yamlfile: ':ci/qcom-distro-sota.yml' + kernel: + - type: default + dirname: "" + yamlfile: "" + - type: 6.18 + dirname: "+linux-qcom-6.18" + yamlfile: ":ci/linux-qcom-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-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-selinux + yamlfile: ':ci/qcom-distro-selinux.yml' + - name: qcom-distro-sota + yamlfile: ':ci/qcom-distro-sota.yml' + kernel: + - type: default + dirname: "" + yamlfile: "" + - type: 6.18 + dirname: "+linux-qcom-6.18" + yamlfile: ":ci/linux-qcom-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: rt-6.18 + dirname: "+linux-qcom-rt-6.18" + yamlfile: ":ci/linux-qcom-rt-6.18.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: performance + yamlfile: ':ci/qcom-distro-prop-image.yml:ci/performance.yml' + kernel: + type: 6.18 + dirname: "+linux-qcom-6.18" + yamlfile: ":ci/linux-qcom-6.18.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: performance + yamlfile: ':ci/qcom-distro-prop-image.yml:ci/performance.yml' + kernel: + type: 6.18 + dirname: "+linux-qcom-6.18" + yamlfile: ":ci/linux-qcom-6.18.yml" + - 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..11d581cf --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,254 @@ +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 + 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 }} + 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 + 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 }} + 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 f2a8c0a0a330c83beeb93f9d954f347d77a0d253 Mon Sep 17 00:00:00 2001 From: Jose Quaresma Date: Thu, 29 Jan 2026 10:30:06 +0000 Subject: [PATCH 02/15] 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 5ca9801f0f00251f348e19f0b8e84c5cbf547bfd Mon Sep 17 00:00:00 2001 From: Jose Quaresma Date: Thu, 29 Jan 2026 10:30:06 +0000 Subject: [PATCH 03/15] 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 | 254 ---------------------------------- 3 files changed, 343 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 11d581cf..00000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,254 +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 - 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 }} - 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 - 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 }} - 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 d3c12ee19904096a456a5ddc045a7c79a451aa95 Mon Sep 17 00:00:00 2001 From: Jose Quaresma Date: Thu, 29 Jan 2026 10:30:06 +0000 Subject: [PATCH 04/15] workflows/build-yocto: disable yocto-run-checks The yocto-run-checks step needs adaptations that are not yet complete. We will turn it off since this does not prevent the existing features from working. It will be proposed in the next step. Signed-off-by: Jose Quaresma --- .github/workflows/build-yocto.yml | 35 +------------------------------ 1 file changed, 1 insertion(+), 34 deletions(-) diff --git a/.github/workflows/build-yocto.yml b/.github/workflows/build-yocto.yml index a1c1f0e9..a1470e10 100644 --- a/.github/workflows/build-yocto.yml +++ b/.github/workflows/build-yocto.yml @@ -59,41 +59,8 @@ jobs: 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] + needs: kas-setup if: github.repository_owner == 'qualcomm-linux' runs-on: [self-hosted, qcom-u2404, amd64] strategy: From 7159b7982938247eacc73ad31e0d0fff763c61c7 Mon Sep 17 00:00:00 2001 From: Jose Quaresma Date: Thu, 29 Jan 2026 10:30:06 +0000 Subject: [PATCH 05/15] 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 a1470e10..aac98953 100644 --- a/.github/workflows/build-yocto.yml +++ b/.github/workflows/build-yocto.yml @@ -90,7 +90,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}} @@ -215,7 +215,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 c55aa34f01c1dd403f3768fc0506aa6ff8b3f1b8 Mon Sep 17 00:00:00 2001 From: Jose Quaresma Date: Thu, 29 Jan 2026 10:30:06 +0000 Subject: [PATCH 06/15] 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 6e2110bf22ca1e09b103d3126293b77dee296175 Mon Sep 17 00:00:00 2001 From: Jose Quaresma Date: Thu, 29 Jan 2026 10:30:06 +0000 Subject: [PATCH 07/15] 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 aac98953..49e8e940 100644 --- a/.github/workflows/build-yocto.yml +++ b/.github/workflows/build-yocto.yml @@ -70,8 +70,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-selinux @@ -121,8 +119,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-selinux @@ -194,14 +190,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 3096312686ae9e84fa31e00b0c4802d8de6d187b Mon Sep 17 00:00:00 2001 From: Jose Quaresma Date: Thu, 29 Jan 2026 10:30:06 +0000 Subject: [PATCH 08/15] workflows/build-yocto: add qcom-distro yml local override This change is intended only to have a functional build with minimal modifications and is temporary; it will be reverted in subsequent iterations of the distro ci integration. We need the primary repository to be meta-qcom so we can keep using its github/actions with minimal changes. To do this, we'll first checkout meta-qcom as the primary repository and then meta-qcom-distro inside it. The last part we need for this is the new kas config which will allow us to change the layer structure used by kas here. This configuration has the necessary changes for move the meta-qcom-distro layer as well as the differences of meta-qcom layer. Instead of meta-qcom-distro being an external layer like in meta-qcom ci, it becomes a internal layer of meta-qcom here. Signed-off-by: Jose Quaresma --- .github/workflows/build-yocto.yml | 39 +++++++++++++++++++++++++++++++ ci/qcom-distro.yml | 16 +++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 ci/qcom-distro.yml diff --git a/.github/workflows/build-yocto.yml b/.github/workflows/build-yocto.yml index 49e8e940..74041a7f 100644 --- a/.github/workflows/build-yocto.yml +++ b/.github/workflows/build-yocto.yml @@ -42,6 +42,19 @@ jobs: done - uses: actions/checkout@v4 + with: + repository: qualcomm-linux/meta-qcom + ref: master + + - uses: actions/checkout@v4 + with: + path: meta-qcom-distro + + - name: Prepare kas qcom-distro yml + run: | + # move meta-qcom-distro layer: from external repo to meta-qcom internal layer + cp ci/qcom-distro.yml ci/qcom-distro-full.yml + cp meta-qcom-distro/ci/qcom-distro.yml ci/ - name: Run kas lock run: | @@ -86,6 +99,19 @@ jobs: name: ${{ matrix.machine }}/${{ matrix.distro.name }}${{ matrix.kernel.dirname }} steps: - uses: actions/checkout@v4 + with: + repository: qualcomm-linux/meta-qcom + ref: master + + - uses: actions/checkout@v4 + with: + path: meta-qcom-distro + + - name: Prepare kas qcom-distro yml + run: | + # move meta-qcom-distro layer: from external repo to meta-qcom internal layer + cp ci/qcom-distro.yml ci/qcom-distro-full.yml + cp meta-qcom-distro/ci/qcom-distro.yml ci/ - name: Run kas build uses: qualcomm-linux/meta-qcom/.github/actions/compile@master @@ -201,6 +227,19 @@ jobs: name: ${{ matrix.machine }}/${{ matrix.distro.name }}${{ matrix.kernel.dirname }} steps: - uses: actions/checkout@v4 + with: + repository: qualcomm-linux/meta-qcom + ref: master + + - uses: actions/checkout@v4 + with: + path: meta-qcom-distro + + - name: Prepare kas qcom-distro yml + run: | + # move meta-qcom-distro layer: from external repo to meta-qcom internal layer + cp ci/qcom-distro.yml ci/qcom-distro-full.yml + cp meta-qcom-distro/ci/qcom-distro.yml ci/ - name: Run kas build uses: qualcomm-linux/meta-qcom/.github/actions/compile@master diff --git a/ci/qcom-distro.yml b/ci/qcom-distro.yml new file mode 100644 index 00000000..04b7ac23 --- /dev/null +++ b/ci/qcom-distro.yml @@ -0,0 +1,16 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - qcom-distro-full.yml + +repos: + meta-qcom-distro: + layers: + .: disabled + + meta-qcom: + layers: + .: + meta-qcom-distro: From 708ebd3728fbf5cdf1d6c6895c1aec242f12af2f Mon Sep 17 00:00:00 2001 From: Jose Quaresma Date: Wed, 4 Feb 2026 16:53:32 +0000 Subject: [PATCH 09/15] [FIXME] Revert "workflows/build-yocto: add qcom-distro yml local override" This reverts commit 9dc37bfa8ab1a97079d5d1514d961d6b47ab4c5e. The above commit is wrong Signed-off-by: Jose Quaresma --- .github/workflows/build-yocto.yml | 39 ------------------------------- ci/qcom-distro.yml | 16 ------------- 2 files changed, 55 deletions(-) delete mode 100644 ci/qcom-distro.yml diff --git a/.github/workflows/build-yocto.yml b/.github/workflows/build-yocto.yml index 74041a7f..49e8e940 100644 --- a/.github/workflows/build-yocto.yml +++ b/.github/workflows/build-yocto.yml @@ -42,19 +42,6 @@ jobs: done - uses: actions/checkout@v4 - with: - repository: qualcomm-linux/meta-qcom - ref: master - - - uses: actions/checkout@v4 - with: - path: meta-qcom-distro - - - name: Prepare kas qcom-distro yml - run: | - # move meta-qcom-distro layer: from external repo to meta-qcom internal layer - cp ci/qcom-distro.yml ci/qcom-distro-full.yml - cp meta-qcom-distro/ci/qcom-distro.yml ci/ - name: Run kas lock run: | @@ -99,19 +86,6 @@ jobs: name: ${{ matrix.machine }}/${{ matrix.distro.name }}${{ matrix.kernel.dirname }} steps: - uses: actions/checkout@v4 - with: - repository: qualcomm-linux/meta-qcom - ref: master - - - uses: actions/checkout@v4 - with: - path: meta-qcom-distro - - - name: Prepare kas qcom-distro yml - run: | - # move meta-qcom-distro layer: from external repo to meta-qcom internal layer - cp ci/qcom-distro.yml ci/qcom-distro-full.yml - cp meta-qcom-distro/ci/qcom-distro.yml ci/ - name: Run kas build uses: qualcomm-linux/meta-qcom/.github/actions/compile@master @@ -227,19 +201,6 @@ jobs: name: ${{ matrix.machine }}/${{ matrix.distro.name }}${{ matrix.kernel.dirname }} steps: - uses: actions/checkout@v4 - with: - repository: qualcomm-linux/meta-qcom - ref: master - - - uses: actions/checkout@v4 - with: - path: meta-qcom-distro - - - name: Prepare kas qcom-distro yml - run: | - # move meta-qcom-distro layer: from external repo to meta-qcom internal layer - cp ci/qcom-distro.yml ci/qcom-distro-full.yml - cp meta-qcom-distro/ci/qcom-distro.yml ci/ - name: Run kas build uses: qualcomm-linux/meta-qcom/.github/actions/compile@master diff --git a/ci/qcom-distro.yml b/ci/qcom-distro.yml deleted file mode 100644 index 04b7ac23..00000000 --- a/ci/qcom-distro.yml +++ /dev/null @@ -1,16 +0,0 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json - -header: - version: 14 - includes: - - qcom-distro-full.yml - -repos: - meta-qcom-distro: - layers: - .: disabled - - meta-qcom: - layers: - .: - meta-qcom-distro: From c7efcfe2d21b27eb833aa4767660f018615e5ded Mon Sep 17 00:00:00 2001 From: Jose Quaresma Date: Wed, 4 Feb 2026 16:56:33 +0000 Subject: [PATCH 10/15] ci: add qcom-distro kas config Signed-off-by: Jose Quaresma --- .github/workflows/build-yocto.yml | 2 +- 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 | 50 +++++++++++++++++++++++++++++++ 6 files changed, 90 insertions(+), 1 deletion(-) 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 diff --git a/.github/workflows/build-yocto.yml b/.github/workflows/build-yocto.yml index 49e8e940..a9232945 100644 --- a/.github/workflows/build-yocto.yml +++ b/.github/workflows/build-yocto.yml @@ -45,7 +45,7 @@ jobs: - name: Run kas lock run: | - ${KAS_CONTAINER} lock --update ci/base.yml:ci/qcom-distro.yml + ${KAS_CONTAINER} lock --update ci/qcom-distro.yml - name: Upload kas lockfile uses: actions/upload-artifact@v6 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..6bb11bea --- /dev/null +++ b/ci/qcom-distro.yml @@ -0,0 +1,50 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/siemens/kas/master/kas/schema-kas.json + +header: + version: 14 + includes: + - repo: meta-qcom + file: ci/base.yml + +distro: qcom-distro + +repos: + meta-qcom-distro: + + meta-qcom: + branch: master + url: https://github.com/qualcomm-linux/meta-qcom + + 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 + +local_conf_header: + virtualization: + SKIP_META_VIRT_SANITY_CHECK = "1" + +target: + - qcom-multimedia-image From 9bf09c1839f5b2f70a3908b015af72d7f397a162 Mon Sep 17 00:00:00 2001 From: Jose Quaresma Date: Fri, 6 Feb 2026 14:58:26 +0000 Subject: [PATCH 11/15] [WIP] actions/compile: add copy Signed-off-by: Jose Quaresma --- .github/actions/compile/action.yml | 141 +++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 .github/actions/compile/action.yml diff --git a/.github/actions/compile/action.yml b/.github/actions/compile/action.yml new file mode 100644 index 00000000..eed0074c --- /dev/null +++ b/.github/actions/compile/action.yml @@ -0,0 +1,141 @@ +name: Run kas for a specific build configuration +inputs: + machine: + required: true + distro_yaml: + required: true + distro_name: + required: true + kernel_yaml: + required: true + kernel_dirname: + required: true + cache_dir: + required: true + sdk: + required: false + default: "0" +outputs: + url: + description: Location of the published binaries + value: ${{ steps.upload_artifacts.outputs.url }} +runs: + using: "composite" + steps: + - 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 + shell: bash + run: | + KAS_CONTAINER=$RUNNER_TEMP/kas-container + echo "KAS_CONTAINER=$KAS_CONTAINER" >> $GITHUB_ENV + chmod +x $KAS_CONTAINER + + - name: Setup build variables and sstate-cache + shell: bash + run: | + # use a monthly sstate cache folder + echo "DL_DIR=${{inputs.cache_dir}}/downloads" >> $GITHUB_ENV + echo "SSTATE_DIR=${{inputs.cache_dir}}/sstate-cache-$(date '+%Y-%m')" >> $GITHUB_ENV + echo "KAS_WORK_DIR=$PWD/../kas" >> $GITHUB_ENV + + - name: Dump kas-build yaml + shell: bash + run: | + mkdir $KAS_WORK_DIR + $KAS_CONTAINER dump --resolve-env --resolve-local --resolve-refs \ + ci/mirror.yml:ci/${{ inputs.machine }}.yml${{ inputs.distro_yaml }}${{ inputs.kernel_yaml }} > kas-build.yml + + - name: Kas qcom world build + shell: bash + run: | + $KAS_CONTAINER build ci/mirror.yml:ci/${{ inputs.machine }}.yml${{ inputs.distro_yaml }}${{ inputs.kernel_yaml }}:ci/world.yml + ci/kas-container-shell-helper.sh ci/yocto-pybootchartgui.sh + mv $KAS_WORK_DIR/build/buildchart.svg buildchart-world.svg + + - name: Kas build images + shell: bash + run: | + $KAS_CONTAINER build ci/mirror.yml:ci/${{ inputs.machine }}.yml${{ inputs.distro_yaml }}${{ inputs.kernel_yaml }} + ci/kas-container-shell-helper.sh ci/yocto-pybootchartgui.sh + mv $KAS_WORK_DIR/build/buildchart.svg . + + if [ "${{ inputs.machine }}" = "qcom-armv8a" ]; then + $KAS_CONTAINER build ci/mirror.yml:ci/${{ inputs.machine }}.yml${{ inputs.distro_yaml }}${{ inputs.kernel_yaml }}:ci/initramfs-test.yml + + # SDK only with the default kernel + if [ "${{ inputs.sdk }}" = "1" ] && [ "${{ inputs.kernel_yaml }}" = "" ] ; then + $KAS_CONTAINER build ci/mirror.yml:ci/${{ inputs.machine }}.yml${{ inputs.distro_yaml }}${{ inputs.kernel_yaml }} --task populate_sdk + fi + fi + + - uses: actions/upload-artifact@v6 + with: + name: buildchart-${{ inputs.distro_name }}${{ inputs.kernel_dirname }}-${{ inputs.machine }} + path: | + buildchart.svg + buildchart-world.svg + + - uses: actions/upload-artifact@v6 + with: + name: kas-build-${{ inputs.distro_name }}${{ inputs.kernel_dirname }}-${{ inputs.machine }} + path: kas-build.yml + + - name: Stage build artifacts for publishing + shell: bash + run: | + # The upload-private-artifact-action runs from a container that + # expects file to be relative to our PWD. deploy_dir is outside + # that, so we move things around: + deploy_dir=../kas/build/tmp/deploy/images/${{inputs.machine}} + uploads_dir=./uploads/${{ inputs.distro_name }}${{ inputs.kernel_dirname }}/${{ inputs.machine }} + mkdir -p $uploads_dir + # Publish everything that is linked by bitbake at the end of the build (avoid timestamp and duplication) + find $deploy_dir/ -maxdepth 1 -type l -exec cp --dereference {} $uploads_dir/ \; + # Files without links: *.vfat, *.elf, *.efi, efi.stub, fit *.its, qcom-metadata.dtb and qclinuxfitImage + # Copy *.efi, *.efi and *.vfat as they are useful for debugging + find $deploy_dir/ -maxdepth 1 -type f \( -name \*.efi -o -name \*.elf -o -name dtb-\*.vfat \) -exec cp {} $uploads_dir/ \; + cp buildchart.svg kas-build.yml $uploads_dir/ + if [ -d $deploy_dir/../../sdk ]; then + cp $deploy_dir/../../sdk/* $uploads_dir/ + fi + + - name: Upload private artifacts + uses: qualcomm-linux/upload-private-artifact-action@v1 + id: upload_artifacts + with: + path: ./uploads + + - name: Upload artifacts to S3 bucket + uses: qualcomm-linux/upload-private-artifact-action@aws-v1 + with: + path: ./uploads + destination: ${{ github.repository_owner }}/${{ github.event.repository.name }}/${{ github.run_id }}-${{ github.run_attempt }}/ + s3_bucket: qcom-prd-gh-artifacts + + - name: "Print output" + shell: bash + id: print-output + run: | + KERNEL_DIRNAME="${{ inputs.kernel_dirname }}" + BUILDNAME="${{ inputs.machine }}_${{ inputs.distro_name }}${KERNEL_DIRNAME}" + FILENAME="build-url_${BUILDNAME}" + echo "${{ steps.upload_artifacts.outputs.url }}" > "${FILENAME}" + echo "filename=${FILENAME}" >> $GITHUB_OUTPUT + - name: Upload build URL + uses: actions/upload-artifact@v6 + with: + overwrite: true + name: ${{ steps.print-output.outputs.filename }} + path: ${{ steps.print-output.outputs.filename }} + From 01cdf591b6c7f4d57b46743c56f7322ea25d9ef7 Mon Sep 17 00:00:00 2001 From: Jose Quaresma Date: Fri, 6 Feb 2026 15:45:26 +0000 Subject: [PATCH 12/15] Revert "workflows: reuse actions" This reverts commit 7159b7982938247eacc73ad31e0d0fff763c61c7. 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 a9232945..e2f622b2 100644 --- a/.github/workflows/build-yocto.yml +++ b/.github/workflows/build-yocto.yml @@ -88,7 +88,7 @@ jobs: - uses: actions/checkout@v4 - name: Run kas build - uses: qualcomm-linux/meta-qcom/.github/actions/compile@master + uses: ./.github/actions/compile with: machine: ${{matrix.machine}} distro_yaml: ${{matrix.distro.yamlfile}} @@ -203,7 +203,7 @@ jobs: - uses: actions/checkout@v4 - name: Run kas build - uses: qualcomm-linux/meta-qcom/.github/actions/compile@master + uses: ./.github/actions/compile id: compile_kas with: machine: ${{matrix.machine}} From a531b97399b33dca93d90cce68373b757f8afdfb Mon Sep 17 00:00:00 2001 From: Jose Quaresma Date: Fri, 6 Feb 2026 16:10:01 +0000 Subject: [PATCH 13/15] wip Signed-off-by: Jose Quaresma --- .github/workflows/build-yocto.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-yocto.yml b/.github/workflows/build-yocto.yml index e2f622b2..a42dbbad 100644 --- a/.github/workflows/build-yocto.yml +++ b/.github/workflows/build-yocto.yml @@ -41,11 +41,20 @@ jobs: git -C $r fetch --prune origin '+refs/*:refs/*' done - - uses: actions/checkout@v4 + - name: Checkout meta-qcom + uses: actions/checkout@v4 + with: + repository: qualcomm-linux/meta-qcom + ref: master + + - name: Checkout meta-qcom-dsitro + uses: actions/checkout@v4 - name: Run kas lock run: | - ${KAS_CONTAINER} lock --update ci/qcom-distro.yml + KAS_CI_BASE=${GITHUB_WORKSPACE}/meta-qcom/ci/base.yml + KAS_CI_DISTRO=${GITHUB_WORKSPACE}/meta-qcom-distro/ci/qcom-distro.yml + ${KAS_CONTAINER} lock --update ${KAS_CI_BASE}:${KAS_CI_DISTRO} - name: Upload kas lockfile uses: actions/upload-artifact@v6 From 7ec7580c8a611b2411a33bee1451093c16210940 Mon Sep 17 00:00:00 2001 From: Jose Quaresma Date: Fri, 6 Feb 2026 16:20:17 +0000 Subject: [PATCH 14/15] fixup! wip Signed-off-by: Jose Quaresma --- .github/workflows/build-yocto.yml | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build-yocto.yml b/.github/workflows/build-yocto.yml index a42dbbad..9fa5e4cd 100644 --- a/.github/workflows/build-yocto.yml +++ b/.github/workflows/build-yocto.yml @@ -34,26 +34,19 @@ jobs: wget -qO ${KAS_CONTAINER} https://raw.githubusercontent.com/siemens/kas/refs/tags/$LATEST/kas-container chmod +x ${KAS_CONTAINER} - - name: Update kas mirrors - run: | - for r in $(find ${KAS_REPO_REF_DIR}/* -maxdepth 0 -type d); do - echo "pre-fetch: $r" - git -C $r fetch --prune origin '+refs/*:refs/*' - done - - name: Checkout meta-qcom uses: actions/checkout@v4 with: repository: qualcomm-linux/meta-qcom - ref: master + path: ${{ github.workspace }}/../meta-qcom - name: Checkout meta-qcom-dsitro uses: actions/checkout@v4 - name: Run kas lock run: | - KAS_CI_BASE=${GITHUB_WORKSPACE}/meta-qcom/ci/base.yml - KAS_CI_DISTRO=${GITHUB_WORKSPACE}/meta-qcom-distro/ci/qcom-distro.yml + KAS_CI_BASE=${GITHUB_WORKSPACE}/../meta-qcom/ci/base.yml + KAS_CI_DISTRO=${GITHUB_WORKSPACE}/../meta-qcom-distro/ci/qcom-distro.yml ${KAS_CONTAINER} lock --update ${KAS_CI_BASE}:${KAS_CI_DISTRO} - name: Upload kas lockfile From 354f878bca39072ee2a552b2a3f8c64294ea1599 Mon Sep 17 00:00:00 2001 From: Jose Quaresma Date: Fri, 6 Feb 2026 16:44:29 +0000 Subject: [PATCH 15/15] fixup! fixup! wip Signed-off-by: Jose Quaresma --- .github/workflows/build-yocto.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-yocto.yml b/.github/workflows/build-yocto.yml index 9fa5e4cd..336e0c7b 100644 --- a/.github/workflows/build-yocto.yml +++ b/.github/workflows/build-yocto.yml @@ -38,15 +38,17 @@ jobs: uses: actions/checkout@v4 with: repository: qualcomm-linux/meta-qcom - path: ${{ github.workspace }}/../meta-qcom + path: ${{ github.workspace }}/meta-qcom - - name: Checkout meta-qcom-dsitro + - name: Checkout meta-qcom-distro uses: actions/checkout@v4 + with: + path: ${{ github.workspace }}/meta-qcom-distro - name: Run kas lock run: | - KAS_CI_BASE=${GITHUB_WORKSPACE}/../meta-qcom/ci/base.yml - KAS_CI_DISTRO=${GITHUB_WORKSPACE}/../meta-qcom-distro/ci/qcom-distro.yml + KAS_CI_BASE=${GITHUB_WORKSPACE}/meta-qcom/ci/base.yml + KAS_CI_DISTRO=${GITHUB_WORKSPACE}/meta-qcom-distro/ci/qcom-distro.yml ${KAS_CONTAINER} lock --update ${KAS_CI_BASE}:${KAS_CI_DISTRO} - name: Upload kas lockfile