From 9add906e8e0c56833bae4cd6e5c2cd20df3c8dab Mon Sep 17 00:00:00 2001 From: tro Date: Thu, 17 Oct 2024 17:15:20 +0200 Subject: [PATCH] build-test-recipe.yml: add This GH workflow will build and test recipes. --- .github/workflows/build-test-recipe.yml | 139 ++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 .github/workflows/build-test-recipe.yml diff --git a/.github/workflows/build-test-recipe.yml b/.github/workflows/build-test-recipe.yml new file mode 100644 index 000000000..e753f855a --- /dev/null +++ b/.github/workflows/build-test-recipe.yml @@ -0,0 +1,139 @@ +name: build-test-recipe +on: + workflow_dispatch: + pull_request: + paths: + - '**.bb' + - '**.inc' +jobs: + changed-recipes: + name: Get changed recipes + runs-on: ubuntu-latest + outputs: + recipes: ${{ steps.diff.outputs.recipes }} + release: ${{ steps.get-yocto-release-name.outputs.release }} + steps: + - uses: actions/checkout@v4 + - name: Diff files and set variables + id: diff + run: | + # See https://github.community/t/check-pushed-file-changes-with-git-diff-tree-in-github-actions/17220/10 + if [ $GITHUB_BASE_REF ]; then + # Pull Request + git fetch origin $GITHUB_BASE_REF --depth=1 + export DIFF=$( git diff --name-only origin/$GITHUB_BASE_REF $GITHUB_SHA ) + echo "Diff between origin/$GITHUB_BASE_REF and $GITHUB_SHA" + else + # Push + git fetch origin ${{ github.event.before }} --depth=1 + export DIFF=$( git diff --name-only ${{ github.event.before }} $GITHUB_SHA ) + echo "Diff between ${{ github.event.before }} and $GITHUB_SHA" + fi + echo "$DIFF" + echo "diff=$( echo "$DIFF" | tr -d '\n' )" >> $GITHUB_OUTPUT + # Get recipe names + export RECIPES=$( echo "$DIFF" | sed 's!.*/!!' | sed 's!.bb!!' | sed 's!_.*!!' | sort | uniq | sed -z $'s/\\\n/ /g') + if [ -z "$DIFF" ]; then + echo "No changed recipes, adding everything with a ptest to test, build" + THINGS_TO_EXCLUDE="! -name aws-lc* ! -name neo-ai-tv* ! -name corretto-17-bin* ! -name corretto-21-bin* ! -name corretto-8-bin* ! -name firecracker-bin* ! -name jailer-bin* ! -name amazon-kvs-producer-sdk-c* ! -name aws-cli-v2*" + RECIPES=$(find . -name *.bb -type f \( ${THINGS_TO_EXCLUDE} \) -print | xargs grep -l 'inherit.*ptest.*'| sed 's!.*/!!' | sed 's!.bb!!' | sed 's!_.*!!' | sort | uniq | sed -z $'s/\\\n/ /g') + else + echo "Changed recipes" + fi + echo "$RECIPES" + echo "recipes=$( echo "$RECIPES" | tr -d '\n' )" >> $GITHUB_OUTPUT + - name: get yocto release name + id: get-yocto-release-name + run: | + RELEASE=$(echo ${{github.event.pull_request.base.ref}} | cut -d- -f1) + # this is deprecated, but replacement does not seem to work now? + echo "$RELEASE" + echo "release=${RELEASE:-master}" >> $GITHUB_OUTPUT + build-test: + name: Build, Test ${{ matrix.machine }} ${{ needs.changed-recipes.outputs.release }} + needs: changed-recipes + strategy: + fail-fast: false + matrix: + machine: + - qemuarm + - qemuarm64 + - qemux86-64 + runs-on: codebuild-${{ vars.CODEBUILD_RUNNER_NAME }}-${{ github.run_id }}-${{ github.run_attempt }} + steps: + - name: Checkout meta-aws + uses: actions/checkout@v4 + with: + path: ${{ github.workspace }}/meta-aws + - name: Checkout meta-oe + uses: actions/checkout@v4 + with: + repository: openembedded/meta-openembedded + path: ${{ github.workspace }}/meta-openembedded + ref: ${{ needs.changed-recipes.outputs.release }} + - name: Checkout poky + run: | + git clone git://git.yoctoproject.org/poky --single-branch ${{ github.workspace }}/poky -b ${{ needs.changed-recipes.outputs.release }} + - name: Run build + run: | + chown yoctouser /sstate-cache + chown yoctouser /downloads + chown -R yoctouser . + sysctl vm.mmap_min_addr=65536 + sudo -u yoctouser bash -c ' + cd ${{ github.workspace }} + source poky/oe-init-build-env build + echo QEMU_USE_KVM = \"\" >> conf/local.conf + # set to the same as core-image-ptest + echo QB_MEM = \"-m 1024\" >> conf/local.conf + # use slirp networking instead of TAP interface (require root rights) + echo QEMU_USE_SLIRP = \"1\" >> conf/local.conf + echo TEST_RUNQEMUPARAMS += \"slirp\" >> conf/local.conf + echo TEST_SERVER_IP = \"127.0.0.1\" >> conf/local.conf + echo DISTRO_FEATURES += \"ptest\" >> conf/local.conf + # this will specify what test should run when running testimage cmd - oeqa layer tests + ptests: + # Ping and SSH are not required, but do help in debugging. ptest will discover all ptest packages. + echo TEST_SUITES = \" ping ssh ptest\" >> conf/local.conf + # this will allow - running testimage cmd: bitbake core-image-minimal -c testimage + echo IMAGE_CLASSES += \"testimage\" >> conf/local.conf + bitbake-layers add-layer ../meta-openembedded/meta-oe + bitbake-layers add-layer ../meta-openembedded/meta-python + bitbake-layers add-layer ../meta-openembedded/meta-networking + bitbake-layers add-layer ../meta-openembedded/meta-multimedia + bitbake-layers add-layer ../meta-aws + export SSTATE_DIR=/sstate-cache + export DL_DIR=/downloads + export MACHINE=${{ matrix.machine }} + export BB_ENV_PASSTHROUGH_ADDITIONS="$BB_ENV_PASSTHROUGH_ADDITIONS SSTATE_DIR DL_DIR" + bitbake ${{ needs.changed-recipes.outputs.recipes }} -k | tee -a $MACHINE-build.log + test -e $MACHINE-build.log && ! grep -A3 " failed" $MACHINE-build.log + test -e $MACHINE-build.log && ! grep -A3 " ERROR:" $MACHINE-build.log' + - name: Save ${{ matrix.machine }}-build.log + if: '!cancelled()' + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.machine }}-build.log + path: build/${{ matrix.machine }}-build.log + - name: Run test + run: | + sudo -u yoctouser bash -c ' + cd ${{ github.workspace }} + source poky/oe-init-build-env build + # PUT = package under test + for recipe in ${{ needs.changed-recipes.outputs.recipes }}; do PUT+="${recipe}-ptest "; done + echo IMAGE_INSTALL:append = \" ptest-runner ssh ${PUT}\" >> conf/local.conf + export SSTATE_DIR=/sstate-cache + export DL_DIR=/downloads + export MACHINE=${{ matrix.machine }} + export BB_ENV_PASSTHROUGH_ADDITIONS="$BB_ENV_PASSTHROUGH_ADDITIONS SSTATE_DIR DL_DIR" + bitbake core-image-minimal + bitbake core-image-minimal -c testimage + resulttool log tmp/log/oeqa/testresults.json --raw-ptest + resulttool report tmp/log/oeqa/testresults.json | tee -a ${{ matrix.machine }}-resulttool_report.txt + test -e tmp/log/oeqa/testresults.json && ! grep -B3 "\"FAILED\"" tmp/log/oeqa/testresults.json' + - name: Save resulttool_report.txt + if: '!cancelled()' + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.machine }}-resulttool_report.txt + path: build/${{ matrix.machine }}-resulttool_report.txt