[OE-core] [PATCH v2] bitbake-buildall: automate build testing for qemu MACHINEs

Khem Raj raj.khem at gmail.com
Tue Feb 11 00:28:20 UTC 2020


On Mon, Feb 10, 2020 at 3:47 PM Trevor Gamblin
<trevor.gamblin at windriver.com> wrote:
>
> bitbake-buildall simplifies the process of build testing an upgraded or
> patched recipe by cycling through the build steps for each available qemu
> target, with desired LIBC specified by the user as an option (defaulting
> to both glibc and musl if no option is provided). While building, a log
> file with the name "<recipe>-buildall.log" is written, containing a PASS
> or FAIL line upon completion of the build for each architecture. For now,
> qemu targets are not selectable (i.e. the recipe is built for all qemu
> targets found in meta/conf/machine), but this functionality can be added
> in the future along with other useful options.
>
> The log file created by bitbake-buildall also includes some basic system
> info (e.g. build start time, hostname, host OS, host kernel). Since it is
> not guaranteed that tools such as lsb_release will be available on the
> host (it isn't by default on my Fedora machine), this information is
> collected manually. Additionally, the previous run's log is retained for
> comparison by renaming it in the format <recipe>-buildall.log.old once a
> new set of builds is triggered for the same recipe.
>
> Finally, in v2, the line "set -o pipefail" has been removed to be fully
> POSIX-compatible.
>
> Sample log output:
>
> BITBAKE-BUILDALL LOG FOR aspell
> START TIME: 2020-02-05_15:57:41
> HOSTNAME: yow-tgamblin-fedora2
> HOST OS: Fedora 31 (Server Edition)
> HOST KERNEL: 5.4.10-200.fc31.x86_64
> ===============
> BUILD RESULTS:
> [glibc]
> PASS: qemuarmv5
> PASS: qemux86
> PASS: qemuppc
> PASS: qemumips64
> FAIL: qemux86-64
> FAIL: qemumips
> FAIL: qemuarm
> FAIL: qemuarm64
> FAIL: qemuriscv64
> [musl]
> PASS: qemuarmv5
> PASS: qemux86
> PASS: qemuppc
> PASS: qemumips64
> PASS: qemux86-64
> PASS: qemumips
> PASS: qemuarm
> PASS: qemuarm64
> PASS: qemuriscv64
> ===============
> PASSED: 13
> FAILED: 5
>
> Signed-off-by: Trevor Gamblin <trevor.gamblin at windriver.com>
> ---
>  scripts/bitbake-buildall | 120 +++++++++++++++++++++++++++++++++++++++
>  1 file changed, 120 insertions(+)
>  create mode 100755 scripts/bitbake-buildall

if its building qemu machines only, then naming it build-qemuall.sh or
some such would be
better, I would avoid usine bitbake- prefix. That can confuse with bitbake tools

>
> diff --git a/scripts/bitbake-buildall b/scripts/bitbake-buildall
> new file mode 100755
> index 0000000000..74a5994f2f
> --- /dev/null
> +++ b/scripts/bitbake-buildall
> @@ -0,0 +1,120 @@
> +#!/bin/sh
> +#  Copyright (c) 2020 Wind River Systems, Inc.
> +#
> +# SPDX-License-Identifier: GPL-2.0-only
> +#
> +# bitbake-buildall: a tool for automating build testing of recipes
> +# TODO: Add support for selecting which qemu architectures to build
> +# TODO: Add support for queueing up multiple recipe builds
> +# TODO: Add more logging options (e.g. local.conf info, bitbake env info)
> +
> +usage ()
> +{
> +    base=$(basename "$0")
> +    echo "Usage: $base [options] [recipename/target]"
> +    echo "Executes a build of a given target for selected LIBCs. With no options, default to both libc and musl."
> +    echo "Options:"
> +    echo "-l, --libc            Specify one of \"libc\" or \"musl\""
> +}
> +
> +
> +buildall ()
> +{
> +    # Get path to oe-core directory. Since oe-init-build-env prepends $PATH with
> +    # the path to the scripts directory, get it from there
> +    SCRIPTS_PATH="$(echo "$PATH" | cut -d ":" -f 1)"
> +    OE_CORE_PATH=$(echo "$SCRIPTS_PATH" | sed 's|\(.*\)/.*|\1|')
> +
> +    # Get target list and host machine information
> +    TARGET_LIST=$(find "$OE_CORE_PATH"/meta/conf/machine -maxdepth 1 -type f | grep qemu | sed 's|.*/||' | sed -e 's/\.conf//')
> +
> +    # Set LIBC value to use for the builds based on options provided by the user
> +    if [ -n "$2" ]
> +    then
> +       LIBC_LIST="$2"
> +       echo "$LIBC_LIST"
> +    else
> +       LIBC_LIST="glibc musl"
> +       echo "$LIBC_LIST"
> +    fi
> +
> +    START_TIME=$(date "+%Y-%m-%d_%H:%M:%S")
> +    LOG_FILE="$1-buildall.log"
> +    OS_INFO=$(grep "PRETTY_NAME=" /etc/os-release | awk -F "=" '{print $2}' | sed -e 's/^"//' -e 's/"$//')
> +
> +    # Append an existing log file for this build with .old if one exists
> +    if [ -f "${LOG_FILE}" ]
> +    then
> +       mv "${LOG_FILE}" "${LOG_FILE}.old"
> +    else
> +          touch "${LOG_FILE}"
> +    fi
> +
> +    # Fill the log file with build and host info
> +    echo "BITBAKE-BUILDALL LOG FOR $1" >> "${LOG_FILE}"
> +    echo "START TIME: ${START_TIME}" >> "${LOG_FILE}"
> +    echo "HOSTNAME: $(uname -n)" >> "${LOG_FILE}"
> +    echo "HOST OS: ${OS_INFO}" >> "${LOG_FILE}"
> +    echo "HOST KERNEL: $(uname -r)" >> "${LOG_FILE}"
> +    echo "===============" >> "${LOG_FILE}"
> +    echo "BUILD RESULTS:" >> "${LOG_FILE}"
> +
> +    # start the builds for each MACHINE and TCLIBC
> +    for j in ${LIBC_LIST}
> +    do
> +       echo "[$j]" >> "${LOG_FILE}"
> +       for i in ${TARGET_LIST}
> +       do
> +           echo "$i" "$j"; \
> +           TCLIBC=$j MACHINE=$i bitbake "$1" && echo "PASS: $i" >> "${LOG_FILE}" || echo "FAIL: $i" >> "${LOG_FILE}"
> +       done
> +    done
> +
> +    # Get pass/fail totals and add them to the end of the log
> +    PASSED=$(grep "PASS:" "${LOG_FILE}" | wc -l)
> +    FAILED=$(grep "FAIL:" "${LOG_FILE}" | wc -l)
> +
> +    echo "===============" >> "${LOG_FILE}"
> +    echo "PASSED: ${PASSED}" >> "${LOG_FILE}"
> +    echo "FAILED: ${FAILED}" >> "${LOG_FILE}"
> +}
> +
> +
> +# fail entire script if any command fails
> +set -e
> +
> +# print usage and exit if not enough args given
> +[ $# -eq 0 ] && usage && exit 1
> +
> +# handle arguments
> +RECIPE=
> +while [ $# -gt 0 ]
> +do
> +    arg=$1
> +    case $arg in
> +       -l|--libc)
> +       if [ "$2" = "glibc" ] || [ "$2" = "musl" ]
> +       then
> +           LIBC_LIST="$2"
> +       else
> +           echo "Unrecognized libc option."
> +           usage && exit 1
> +       fi
> +       shift
> +       shift
> +       ;;
> +       *)
> +        RECIPE="$1"
> +       shift
> +       ;;
> +    esac
> +done
> +
> +set -- "$RECIPE"
> +
> +# run buildall for the given recipe and LIBC
> +if [ -n "$1" ]
> +then
> +       buildall "$1" "$LIBC_LIST"
> +fi
> +
> --
> 2.24.1
>
> --
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core at lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core


More information about the Openembedded-core mailing list