sdk-ng/.github/workflows/ci.yml

1563 lines
54 KiB
YAML

# Zephyr SDK Continuous Integration Workflow
name: CI
on:
push:
branches:
- main
- topic-*
pull_request_target:
branches:
- main
- topic-*
workflow_call:
secrets:
AWS_CACHE_SDK_ACCESS_KEY_ID:
required: true
AWS_CACHE_SDK_SECRET_ACCESS_KEY:
required: true
workflow_dispatch:
inputs:
zephyr-ref:
description: 'Zephyr Ref (branch, tag, SHA, ...)'
required: true
default: main
host:
description: 'Host'
type: choice
required: true
options:
- all
- linux-x86_64
- linux-aarch64
- macos-x86_64
- macos-aarch64
- windows-x86_64
target:
description: 'Target'
type: choice
required: true
options:
- all
- aarch64-zephyr-elf
- arc64-zephyr-elf
- arc-zephyr-elf
- arm-zephyr-eabi
- mips-zephyr-elf
- nios2-zephyr-elf
- riscv64-zephyr-elf
- sparc-zephyr-elf
- x86_64-zephyr-elf
- xtensa-espressif_esp32_zephyr-elf
- xtensa-espressif_esp32s2_zephyr-elf
- xtensa-intel_apl_adsp_zephyr-elf
- xtensa-intel_bdw_adsp_zephyr-elf
- xtensa-intel_byt_adsp_zephyr-elf
- xtensa-intel_s1000_zephyr-elf
- xtensa-nxp_imx_adsp_zephyr-elf
- xtensa-nxp_imx8m_adsp_zephyr-elf
- xtensa-sample_controller_zephyr-elf
debug:
description: 'Debug'
type: choice
required: true
options:
- none
- toolchain-pre
- toolchain-post
- hosttools
concurrency:
group: ${{ github.event_name == 'workflow_dispatch' && github.run_id || github.head_ref || github.ref }}
cancel-in-progress: ${{ github.event_name != 'workflow_dispatch' }}
env:
BUG_URL: 'https://github.com/zephyrproject-rtos/sdk-ng/issues'
BUNDLE_NAME: Zephyr SDK
BUNDLE_PREFIX: zephyr-sdk
ZEPHYR_REF: main
jobs:
# Setup
setup:
name: Setup
runs-on: ubuntu-20.04
outputs:
hosts: ${{ steps.generate-matrix.outputs.hosts }}
targets: ${{ steps.generate-matrix.outputs.targets }}
testenvs: ${{ steps.generate-matrix.outputs.testenvs }}
debug: ${{ steps.generate-matrix.outputs.debug }}
steps:
- name: Check out source code
if: ${{ github.event_name != 'pull_request_target' }}
uses: actions/checkout@v3
with:
fetch-depth: 0
persist-credentials: false
- name: Check out source code (pull request)
if: ${{ github.event_name == 'pull_request_target' }}
uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0
persist-credentials: false
- name: Generate version file
run: |
VERSION=$(git describe --tags --match 'v*')
echo "${VERSION:1}" > version
- name: Upload version file
uses: actions/upload-artifact@v3
with:
name: version
path: version
- name: Generate matrix
id: generate-matrix
run: |
# Set build configurations
if [ "${{ github.event_name }}" == "pull_request_target" ]; then
# Set configurations based on the pull request labels
${{ contains(github.event.pull_request.labels.*.name, 'ci-linux-x86_64') }} && build_host_linux_x86_64="y"
${{ contains(github.event.pull_request.labels.*.name, 'ci-linux-aarch64') }} && build_host_linux_aarch64="y"
${{ contains(github.event.pull_request.labels.*.name, 'ci-macos-x86_64') }} && build_host_macos_x86_64="y"
${{ contains(github.event.pull_request.labels.*.name, 'ci-macos-aarch64') }} && build_host_macos_aarch64="y"
${{ contains(github.event.pull_request.labels.*.name, 'ci-windows-x86_64') }} && build_host_windows_x86_64="y"
# Build all targets for pull requests
build_target_all="y"
# Set debug mode based on the pull request labels
${{ contains(github.event.pull_request.labels.*.name, 'debug-toolchain-pre') }} && MATRIX_DEBUG="toolchain-pre"
${{ contains(github.event.pull_request.labels.*.name, 'debug-toolchain-post') }} && MATRIX_DEBUG="toolchain-post"
${{ contains(github.event.pull_request.labels.*.name, 'debug-hosttools') }} && MATRIX_DEBUG="hosttools"
elif [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
# Set configurations based on the user selection
case '${{ github.event.inputs.host }}' in
all) build_host_all="y";;
linux-x86_64) build_host_linux_x86_64="y";;
linux-aarch64) build_host_linux_aarch64="y";;
macos-x86_64) build_host_macos_x86_64="y";;
macos-aarch64) build_host_macos_aarch64="y";;
windows-x86_64) build_host_windows_x86_64="y";;
esac
case '${{ github.event.inputs.target }}' in
all) build_target_all="y";;
aarch64-zephyr-elf) build_target_aarch64_zephyr_elf="y";;
arc64-zephyr-elf) build_target_arc64_zephyr_elf="y";;
arc-zephyr-elf) build_target_arc_zephyr_elf="y";;
arm-zephyr-eabi) build_target_arm_zephyr_eabi="y";;
mips-zephyr-elf) build_target_mips_zephyr_elf="y";;
nios2-zephyr-elf) build_target_nios2_zephyr_elf="y";;
riscv64-zephyr-elf) build_target_riscv64_zephyr_elf="y";;
sparc-zephyr-elf) build_target_sparc_zephyr_elf="y";;
x86_64-zephyr-elf) build_target_x86_64_zephyr_elf="y";;
xtensa-espressif_esp32_zephyr-elf) build_target_xtensa_espressif_esp32_zephyr_elf="y";;
xtensa-espressif_esp32s2_zephyr-elf) build_target_xtensa_espressif_esp32s2_zephyr_elf="y";;
xtensa-intel_apl_adsp_zephyr-elf) build_target_xtensa_intel_apl_adsp_zephyr_elf="y";;
xtensa-intel_bdw_adsp_zephyr-elf) build_target_xtensa_intel_bdw_adsp_zephyr_elf="y";;
xtensa-intel_byt_adsp_zephyr-elf) build_target_xtensa_intel_byt_adsp_zephyr_elf="y";;
xtensa-intel_s1000_zephyr-elf) build_target_xtensa_intel_s1000_zephyr_elf="y";;
xtensa-nxp_imx_adsp_zephyr-elf) build_target_xtensa_nxp_imx_adsp_zephyr_elf="y";;
xtensa-nxp_imx8m_adsp_zephyr-elf) build_target_xtensa_nxp_imx8m_adsp_zephyr_elf="y";;
xtensa-sample_controller_zephyr-elf) build_target_xtensa_sample_controller_zephyr_elf="y";;
esac
MATRIX_DEBUG="${{ github.event.inputs.debug }}"
else
# Build all for pushes and releases
build_host_all="y"
build_target_all="y"
fi
if [ "${build_host_all}" == "y" ]; then
build_host_linux_x86_64="y"
build_host_linux_aarch64="y"
build_host_macos_x86_64="y"
build_host_macos_aarch64="y"
build_host_windows_x86_64="y"
fi
if [ "${build_target_all}" == "y" ]; then
build_target_aarch64_zephyr_elf="y"
build_target_arc64_zephyr_elf="y"
build_target_arc_zephyr_elf="y"
build_target_arm_zephyr_eabi="y"
build_target_mips_zephyr_elf="y"
build_target_nios2_zephyr_elf="y"
build_target_riscv64_zephyr_elf="y"
build_target_sparc_zephyr_elf="y"
build_target_x86_64_zephyr_elf="y"
build_target_xtensa_espressif_esp32_zephyr_elf="y"
build_target_xtensa_espressif_esp32s2_zephyr_elf="y"
build_target_xtensa_intel_apl_adsp_zephyr_elf="y"
build_target_xtensa_intel_bdw_adsp_zephyr_elf="y"
build_target_xtensa_intel_byt_adsp_zephyr_elf="y"
build_target_xtensa_intel_s1000_zephyr_elf="y"
build_target_xtensa_nxp_imx_adsp_zephyr_elf="y"
build_target_xtensa_nxp_imx8m_adsp_zephyr_elf="y"
build_target_xtensa_sample_controller_zephyr_elf="y"
fi
# Build 'linux_x86_64' by default if no host is selected
list_build_host=(${!build_host_@})
[ "${#list_build_host[@]}" == "0" ] && build_host_linux_x86_64="y"
# Generate host list
MATRIX_HOSTS='['
if [ "${build_host_linux_x86_64}" == "y" ]; then
MATRIX_HOSTS+='{
"name": "linux-x86_64",
"runner": "zephyr-runner-linux-x64-4xlarge",
"container": "ghcr.io/zephyrproject-rtos/sdk-build:v1.2.3",
"archive": "tar.xz"
},'
fi
if [ "${build_host_linux_aarch64}" == "y" ]; then
MATRIX_HOSTS+='{
"name": "linux-aarch64",
"runner": "zephyr-runner-linux-x64-4xlarge",
"container": "ghcr.io/zephyrproject-rtos/sdk-build:v1.2.3",
"archive": "tar.xz"
},'
fi
if [ "${build_host_macos_x86_64}" == "y" ]; then
MATRIX_HOSTS+='{
"name": "macos-x86_64",
"runner": "zephyr_runner-macos-x86_64",
"container": "",
"archive": "tar.xz"
},'
fi
if [ "${build_host_macos_aarch64}" == "y" ]; then
MATRIX_HOSTS+='{
"name": "macos-aarch64",
"runner": "zephyr_runner-macos-x86_64",
"container": "",
"archive": "tar.xz"
},'
fi
if [ "${build_host_windows_x86_64}" == "y" ]; then
MATRIX_HOSTS+='{
"name": "windows-x86_64",
"runner": "zephyr-runner-linux-x64-4xlarge",
"container": "ghcr.io/zephyrproject-rtos/sdk-build:v1.2.3",
"archive": "7z"
},'
fi
MATRIX_HOSTS+=']'
# Generate target list
MATRIX_TARGETS='['
[ "${build_target_aarch64_zephyr_elf}" == "y" ] && MATRIX_TARGETS+='"aarch64-zephyr-elf",'
[ "${build_target_arc64_zephyr_elf}" == "y" ] && MATRIX_TARGETS+='"arc64-zephyr-elf",'
[ "${build_target_arc_zephyr_elf}" == "y" ] && MATRIX_TARGETS+='"arc-zephyr-elf",'
[ "${build_target_arm_zephyr_eabi}" == "y" ] && MATRIX_TARGETS+='"arm-zephyr-eabi",'
[ "${build_target_mips_zephyr_elf}" == "y" ] && MATRIX_TARGETS+='"mips-zephyr-elf",'
[ "${build_target_nios2_zephyr_elf}" == "y" ] && MATRIX_TARGETS+='"nios2-zephyr-elf",'
[ "${build_target_riscv64_zephyr_elf}" == "y" ] && MATRIX_TARGETS+='"riscv64-zephyr-elf",'
[ "${build_target_sparc_zephyr_elf}" == "y" ] && MATRIX_TARGETS+='"sparc-zephyr-elf",'
[ "${build_target_x86_64_zephyr_elf}" == "y" ] && MATRIX_TARGETS+='"x86_64-zephyr-elf",'
[ "${build_target_xtensa_espressif_esp32_zephyr_elf}" == "y" ] && MATRIX_TARGETS+='"xtensa-espressif_esp32_zephyr-elf",'
[ "${build_target_xtensa_espressif_esp32s2_zephyr_elf}" == "y" ] && MATRIX_TARGETS+='"xtensa-espressif_esp32s2_zephyr-elf",'
[ "${build_target_xtensa_intel_apl_adsp_zephyr_elf}" == "y" ] && MATRIX_TARGETS+='"xtensa-intel_apl_adsp_zephyr-elf",'
[ "${build_target_xtensa_intel_bdw_adsp_zephyr_elf}" == "y" ] && MATRIX_TARGETS+='"xtensa-intel_bdw_adsp_zephyr-elf",'
[ "${build_target_xtensa_intel_byt_adsp_zephyr_elf}" == "y" ] && MATRIX_TARGETS+='"xtensa-intel_byt_adsp_zephyr-elf",'
[ "${build_target_xtensa_intel_s1000_zephyr_elf}" == "y" ] && MATRIX_TARGETS+='"xtensa-intel_s1000_zephyr-elf",'
[ "${build_target_xtensa_nxp_imx_adsp_zephyr_elf}" == "y" ] && MATRIX_TARGETS+='"xtensa-nxp_imx_adsp_zephyr-elf",'
[ "${build_target_xtensa_nxp_imx8m_adsp_zephyr_elf}" == "y" ] && MATRIX_TARGETS+='"xtensa-nxp_imx8m_adsp_zephyr-elf",'
[ "${build_target_xtensa_sample_controller_zephyr_elf}" == "y" ] && MATRIX_TARGETS+='"xtensa-sample_controller_zephyr-elf",'
MATRIX_TARGETS+=']'
# Generate test environment list
MATRIX_TESTENVS='['
if [ "${build_host_linux_x86_64}" == "y" ]; then
MATRIX_TESTENVS+='{
"name": "ubuntu-20.04-x86_64",
"runner": "ubuntu-20.04",
"container": "",
"bundle-host": "linux-x86_64",
"bundle-archive": "tar.xz"
},'
fi
if [ "${build_host_macos_x86_64}" == "y" ]; then
MATRIX_TESTENVS+='{
"name": "macos-11-x86_64",
"runner": "macos-11",
"container": "",
"bundle-host": "macos-x86_64",
"bundle-archive": "tar.xz"
},'
fi
if [ "${build_host_windows_x86_64}" == "y" ]; then
MATRIX_TESTENVS+='{
"name": "windows-2019-x86_64",
"runner": "windows-2019-8c",
"container": "",
"bundle-host": "windows-x86_64",
"bundle-archive": "7z"
},'
fi
MATRIX_TESTENVS+=']'
# Escape control characters because GitHub Actions
MATRIX_HOSTS="${MATRIX_HOSTS//'%'/''}"
MATRIX_HOSTS="${MATRIX_HOSTS//$'\n'/''}"
MATRIX_HOSTS="${MATRIX_HOSTS//$'\r'/''}"
MATRIX_TARGETS="${MATRIX_TARGETS//'%'/''}"
MATRIX_TARGETS="${MATRIX_TARGETS//$'\n'/''}"
MATRIX_TARGETS="${MATRIX_TARGETS//$'\r'/''}"
MATRIX_TESTENVS="${MATRIX_TESTENVS//'%'/''}"
MATRIX_TESTENVS="${MATRIX_TESTENVS//$'\n'/''}"
MATRIX_TESTENVS="${MATRIX_TESTENVS//$'\r'/''}"
# Remove trailing comma
MATRIX_HOSTS=$(echo "${MATRIX_HOSTS}" | sed -zr 's/,([^,]*$)/\1/')
MATRIX_TARGETS=$(echo "${MATRIX_TARGETS}" | sed -zr 's/,([^,]*$)/\1/')
MATRIX_TESTENVS=$(echo "${MATRIX_TESTENVS}" | sed -zr 's/,([^,]*$)/\1/')
# Output matrix variables
echo "hosts=${MATRIX_HOSTS}" >> $GITHUB_OUTPUT
echo "targets=${MATRIX_TARGETS}" >> $GITHUB_OUTPUT
echo "testenvs=${MATRIX_TESTENVS}" >> $GITHUB_OUTPUT
echo "debug=${MATRIX_DEBUG}" >> $GITHUB_OUTPUT
# Prepare configuration report
CONFIG_REPORT=${RUNNER_TEMP}/config-report.txt
echo "Hosts:" > ${CONFIG_REPORT}
echo "$(echo "${MATRIX_HOSTS}" | jq)" >> ${CONFIG_REPORT}
echo "" >> ${CONFIG_REPORT}
echo "Targets:" >> ${CONFIG_REPORT}
echo "$(echo "${MATRIX_TARGETS}" | jq)" >> ${CONFIG_REPORT}
echo "" >> ${CONFIG_REPORT}
echo "Test Environments:" >> ${CONFIG_REPORT}
echo "$(echo "${MATRIX_TESTENVS}" | jq)" >> ${CONFIG_REPORT}
CONFIG_REPORT_CONTENT=$(cat ${CONFIG_REPORT})
CONFIG_REPORT_CONTENT="${CONFIG_REPORT_CONTENT//'%'/'%25'}"
CONFIG_REPORT_CONTENT="${CONFIG_REPORT_CONTENT//$'\n'/'%0A'}"
CONFIG_REPORT_CONTENT="${CONFIG_REPORT_CONTENT//$'\r'/'%0D'}"
echo "::notice:: ${CONFIG_REPORT_CONTENT}"
# Build toolchain
build-toolchain:
name: Toolchain ${{ matrix.target }} (${{ matrix.host.name }})
needs: setup
runs-on: ${{ matrix.host.runner }}
container: ${{ matrix.host.container }}
defaults:
run:
shell: bash
strategy:
fail-fast: false
matrix:
host: ${{ fromJSON(needs.setup.outputs.hosts) }}
target: ${{ fromJSON(needs.setup.outputs.targets) }}
steps:
# - name: echo-default-env-variables
# run: |
# whoami
# echo "Shell: ${SHELL}"
# echo "Home: ${HOME}"
# echo "RUNNER_NAME: ${RUNNER_NAME}"
# echo "RUNNER_TEMP: ${RUNNER_TEMP}"
# echo "GITHUB_WORKFLOW: ${GITHUB_WORKFLOW}"
# echo "GITHUB_ACTIONS: ${GITHUB_ACTIONS}"
# echo "GITHUB_ACTOR: ${GITHUB_ACTOR}"
# echo "GITHUB_REPOSITORY: ${GITHUB_REPOSITORY}"
# echo "GITHUB_EVENT_NAME: ${GITHUB_EVENT_NAME}"
# echo "GITHUB_WORKSPACE: ${GITHUB_WORKSPACE}"
# echo "GITHUB_SHA: ${GITHUB_SHA}"
# echo "GITHUB_REF: ${GITHUB_REF}"
- name: Set up build environment (Linux)
if: ${{ runner.os == 'Linux' }}
run: |
# Create workspace directory
WORKSPACE="${RUNNER_TEMP}/workspace"
sudo mkdir -p ${WORKSPACE}
# Clean up working directories
shopt -s dotglob
sudo rm -rf ${GITHUB_WORKSPACE}/*
sudo rm -rf ${WORKSPACE}/*
shopt -u dotglob
# Allow non-root access to the working directories
sudo chmod -R 777 ${GITHUB_WORKSPACE}
sudo chmod -R 777 ${RUNNER_TEMP}
# Install common dependencies
sudo apt-get update
sudo apt-get install -y autoconf automake bison flex gettext \
help2man libboost-dev libboost-regex-dev \
libncurses5-dev libtool-bin libtool-doc \
pkg-config texinfo p7zip
# Install dependencies for cross compilation
if [ "${{ matrix.host.name }}" == "linux-aarch64" ]; then
# Install aarch64-linux-gnu cross toolchain
sudo apt-get install -y binutils-aarch64-linux-gnu \
gcc-aarch64-linux-gnu \
g++-aarch64-linux-gnu
elif [ "${{ matrix.host.name }}" == "windows-x86_64" ]; then
# Install MinGW-w64 cross toolchain
sudo apt-get install -y binutils-mingw-w64 gcc-mingw-w64 \
g++-mingw-w64
# Build and install libboost-regex for MinGW-w64 host
## Check out Boost library source code
mkdir -p ${WORKSPACE}/boost
pushd ${WORKSPACE}/boost
git clone \
--branch boost-1.73.0 --depth 1 \
https://github.com/boostorg/boost.git \
src
cd src
git submodule update --init --depth 1
## Bootstrap boost library build system with MinGW-w64 compiler
./bootstrap.sh --with-toolset=gcc --with-libraries=regex --without-icu
sed -i \
's/using gcc ;/using gcc : mingw : x86_64-w64-mingw32-g++ ;/g' \
project-config.jam
## Build and install boost-regex library
sudo ./b2 install \
toolset=gcc-mingw link=static threading=multi variant=release \
--prefix=/usr/x86_64-w64-mingw32
## Clean up to reduce disk usage
popd
sudo rm -rf ${WORKSPACE}/boost
fi
# Set environment variables
echo "TAR=tar" >> $GITHUB_ENV
echo "WORKSPACE=${WORKSPACE}" >> $GITHUB_ENV
- name: Set up build environment (macOS)
if: ${{ runner.os == 'macOS' }}
run: |
# Delete workspace from the previous run
WORKSPACE="/Volumes/Workspace"
if [ -d ${WORKSPACE} ]; then
# Get disk device name
OLDDISK=$(diskutil info -plist "${WORKSPACE}" |
plutil -extract ParentWholeDisk xml1 - -o - |
sed -n "s/.*<string>\(.*\)<\/string>.*/\1/p")
# Force unmount and eject to deallocate disk blocks
if [ ! -z "${OLDDISK}" ]; then
diskutil unmountDisk force ${OLDDISK}
diskutil eject ${OLDDISK}
fi
fi
# Clean up working directories
shopt -s dotglob
rm -rf ${GITHUB_WORKSPACE}/*
rm -f ${RUNNER_TEMP}/Workspace.sparseimage
shopt -u dotglob
# Create case-sensitive workspace volume for macOS
hdiutil create ${RUNNER_TEMP}/Workspace.sparseimage \
-volname Workspace -type SPARSE -size 70g -fs HFSX
hdiutil mount ${RUNNER_TEMP}/Workspace.sparseimage -mountpoint ${WORKSPACE}
# Install required dependencies if running inside a GitHub-hosted runner
# (self-hosted runners are expected to provide all required dependencies)
if [[ "${{ matrix.host.runner }}" =~ ^macos.* ]]; then
brew install autoconf automake bash binutils boost coreutils gawk \
gnu-sed gnu-tar help2man meson ncurses ninja pkg-config
fi
# Install dependencies for cross compilation
if [ "${{ matrix.host.name }}" == "macos-aarch64" ]; then
# Clone x86-AArch64 crosskit
git clone \
https://github.com/stephanosio/crosskit-aarch64-apple-darwin.git \
${WORKSPACE}/crosskit
# Make crosskit available in PATH
echo "${WORKSPACE}/crosskit/scripts" >> $GITHUB_PATH
fi
# Make Python 3.8 available in PATH
echo "/usr/local/opt/python@3.8/bin" >> $GITHUB_PATH
# Set environment variables
echo "TAR=gtar" >> $GITHUB_ENV
echo "WORKSPACE=${WORKSPACE}" >> $GITHUB_ENV
- name: Check out source code
if: ${{ github.event_name != 'pull_request_target' }}
uses: actions/checkout@v3
with:
submodules: recursive
persist-credentials: false
- name: Check out source code (pull request)
if: ${{ github.event_name == 'pull_request_target' }}
uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.head.sha }}
submodules: recursive
persist-credentials: false
- name: Build crosstool-ng
run: |
# Configure macOS build environment
if [ "$RUNNER_OS" == "macOS" ]; then
export PATH="$PATH:/usr/local/opt/binutils/bin"
export CPPFLAGS="-I/usr/local/opt/ncurses/include -I/usr/local/opt/gettext/include"
export LDFLAGS="-L/usr/local/opt/ncurses/lib -L/usr/local/opt/gettext/lib"
fi
# Create build directory
pushd ${WORKSPACE}
mkdir -p crosstool-ng-build
cd crosstool-ng-build
# Bootstrap crosstool-ng
pushd ${GITHUB_WORKSPACE}/crosstool-ng
./bootstrap
popd
# Build and install crosstool-ng
${GITHUB_WORKSPACE}/crosstool-ng/configure --prefix=${WORKSPACE}/crosstool-ng
make
make install
# Clean up build directory to reduce disk usage
popd
rm -rf ${WORKSPACE}/crosstool-ng-build
# Export crosstool-ng executable path
echo "CT_NG=${WORKSPACE}/crosstool-ng/bin/ct-ng" >> $GITHUB_ENV
- name: Test crosstool-ng
run: |
${CT_NG} version
- name: Download version information
uses: actions/download-artifact@v3
with:
name: version
path: ${{ runner.temp }}
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1-node16
with:
aws-access-key-id: ${{ secrets.AWS_CACHE_SDK_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_CACHE_SDK_SECRET_ACCESS_KEY }}
aws-region: us-east-1
- name: Download cached source files
continue-on-error: true
run: |
SRC_CACHE_BASE="s3://cache-sdk/crosstool-ng-sources"
SRC_CACHE_DIR="${{ matrix.host.name }}/${{ matrix.target }}"
SRC_CACHE_URI="${SRC_CACHE_BASE}/${SRC_CACHE_DIR}"
# Download cached source files
mkdir -p ${WORKSPACE}/sources
pushd ${WORKSPACE}/sources
aws s3 sync ${SRC_CACHE_URI} .
popd
# Export environment variables
echo "SRC_CACHE_URI=${SRC_CACHE_URI}" >> $GITHUB_ENV
- name: Setup debug session (pre)
if: always() && needs.setup.outputs.debug == 'toolchain-pre'
uses: mxschmitt/action-tmate@v3
with:
limit-access-to-actor: true
- name: Build toolchain
run: |
# Set output path
export CT_PREFIX="${WORKSPACE}/output"
# Create build directory
mkdir -p ${WORKSPACE}/build
pushd ${WORKSPACE}/build
# Load default target configurations
cp ${GITHUB_WORKSPACE}/configs/${{ matrix.target }}.config \
.config
# Set version information
cat <<EOF >> .config
CT_SHOW_CT_VERSION=n
CT_TOOLCHAIN_PKGVERSION="${{ env.BUNDLE_NAME }} $(<${RUNNER_TEMP}/version)"
CT_TOOLCHAIN_BUGURL="${{ env.BUG_URL }}"
EOF
# Set environment configuration
cat <<EOF >> .config
CT_LOCAL_TARBALLS_DIR="${WORKSPACE}/sources"
CT_LOCAL_PATCH_DIR="${GITHUB_WORKSPACE}/patches-arc64"
CT_OVERLAY_LOCATION="${GITHUB_WORKSPACE}/overlays"
EOF
# Set logging configurations
cat <<EOF >> .config
CT_LOG_PROGRESS_BAR=n
CT_LOG_EXTRA=y
CT_LOG_LEVEL_MAX="EXTRA"
EOF
# Set Canadian cross compilation configurations
if [ "${{ matrix.host.name }}" == "linux-aarch64" ]; then
# Building for linux-aarch64 on linux-x86_64
cat <<EOF >> .config
CT_CANADIAN=y
CT_HOST="aarch64-linux-gnu"
EOF
elif [ "${{ matrix.host.name }}" == "macos-aarch64" ]; then
# Building for macos-aarch64 on macos-x86_64
cat <<EOF >> .config
CT_CANADIAN=y
CT_HOST="aarch64-apple-darwin"
EOF
elif [ "${{ matrix.host.name }}" == "windows-x86_64" ]; then
# Building for windows-x86_64 on linux-x86_64
cat <<EOF >> .config
CT_CANADIAN=y
CT_HOST="x86_64-w64-mingw32"
EOF
fi
# Configure GDB Python scripting support
cat <<EOF >> .config
CT_GDB_CROSS_PYTHON=y
CT_GDB_CROSS_PYTHON_VARIANT=y
EOF
if [ "${{ matrix.host.name }}" == "linux-aarch64" ]; then
# Clone crosskit-aarch64-linux-libpython cross compilation kit
git clone \
https://github.com/stephanosio/crosskit-aarch64-linux-libpython.git \
${WORKSPACE}/crosskit-aarch64-linux-libpython
# Use Python 3.8.0
export LIBPYTHON_KIT_ROOT=${WORKSPACE}/crosskit-aarch64-linux-libpython/python-3.8.0
# Set Python configuration resolver for GDB
cat <<EOF >> .config
CT_GDB_CROSS_PYTHON_BINARY="${LIBPYTHON_KIT_ROOT}/bin/python"
EOF
elif [ "${{ matrix.host.name }}" == "macos-aarch64" ]; then
# Clone crosskit-aarch64-darwin-libpython cross compilation kit
git clone \
https://github.com/stephanosio/crosskit-aarch64-darwin-libpython.git \
${WORKSPACE}/crosskit-aarch64-darwin-libpython
# Use Python 3.8.12
export LIBPYTHON_KIT_ROOT=${WORKSPACE}/crosskit-aarch64-darwin-libpython/python-3.8.12
# Set Python configuration resolver for GDB
cat <<EOF >> .config
CT_GDB_CROSS_PYTHON_BINARY="${LIBPYTHON_KIT_ROOT}/bin/python"
EOF
elif [ "${{ matrix.host.name }}" == "windows-x86_64" ]; then
# Clone crosskit-mingw-w64-libpython cross compilation kit
git clone \
https://github.com/stephanosio/crosskit-mingw-w64-libpython.git \
${WORKSPACE}/crosskit-mingw-w64-libpython
# Use Python 3.8.3
export LIBPYTHON_KIT_ROOT=${WORKSPACE}/crosskit-mingw-w64-libpython/python-3.8.3
# Set Python configuration resolver for GDB
cat <<EOF >> .config
CT_GDB_CROSS_PYTHON_BINARY="${LIBPYTHON_KIT_ROOT}/bin/python"
EOF
else
# Use Python 3.8 for non-Canadian Linux and macOS builds
cat <<EOF >> .config
CT_GDB_CROSS_PYTHON_BINARY="python3.8"
EOF
fi
# Allow building as root on Linux to avoid all sorts of container
# permission issues with the GitHub Actions.
if [ "$RUNNER_OS" == "Linux" ]; then
cat <<EOF >> .config
CT_EXPERIMENTAL=y
CT_ALLOW_BUILD_AS_ROOT=y
CT_ALLOW_BUILD_AS_ROOT_SURE=y
EOF
fi
# Merge configurations
${CT_NG} savedefconfig DEFCONFIG=build.config
${CT_NG} distclean
${CT_NG} defconfig DEFCONFIG=build.config
# Build toolchain
${CT_NG} build
popd
# Resolve output directory path
if [ "${{ matrix.host.name }}" == "linux-aarch64" ]; then
OUTPUT_BASE="${WORKSPACE}/output"
OUTPUT_DIR="HOST-aarch64-linux-gnu"
elif [ "${{ matrix.host.name }}" == "macos-aarch64" ]; then
OUTPUT_BASE="${WORKSPACE}/output"
OUTPUT_DIR="HOST-aarch64-apple-darwin"
elif [ "${{ matrix.host.name }}" == "windows-x86_64" ]; then
OUTPUT_BASE="${WORKSPACE}/output"
OUTPUT_DIR="HOST-x86_64-w64-mingw32"
else
OUTPUT_BASE="${WORKSPACE}"
OUTPUT_DIR="output"
fi
# Remove unneeded files from output directory
pushd ${OUTPUT_BASE}/${OUTPUT_DIR}/${{ matrix.target }}
rm -rf newlib-nano
rm -f build.log.bz2
popd
# Grant write permission for owner
chmod -R u+w ${OUTPUT_BASE}/${OUTPUT_DIR}
# Rename Canadian cross-compiled toolchain output directory to
# "output" for consistency
if [ "${OUTPUT_DIR}" != "output" ]; then
mv ${OUTPUT_BASE}/${OUTPUT_DIR} ${OUTPUT_BASE}/output
OUTPUT_DIR="output"
fi
# Create archive
ARCHIVE_NAME=toolchain_${{ matrix.host.name }}_${{ matrix.target }}
ARCHIVE_FILE=${ARCHIVE_NAME}.${{ matrix.host.archive }}
if [ "${{ matrix.host.archive }}" == "tar.xz" ]; then
XZ_OPT="-T0" \
${TAR} -Jcvf ${ARCHIVE_FILE} \
--owner=0 --group=0 -C ${OUTPUT_BASE}/${OUTPUT_DIR} ${{ matrix.target }}
elif [ "${{ matrix.host.archive }}" == "7z" ]; then
pushd ${OUTPUT_BASE}/${OUTPUT_DIR}
7z a -t7z -l ${GITHUB_WORKSPACE}/${ARCHIVE_FILE} ${{ matrix.target }}
popd
fi
# Compute checksum
md5sum ${ARCHIVE_FILE} > md5.sum
sha256sum ${ARCHIVE_FILE} > sha256.sum
- name: Setup debug session (post)
if: always() && needs.setup.outputs.debug == 'toolchain-post'
uses: mxschmitt/action-tmate@v3
with:
limit-access-to-actor: true
- name: Sync downloaded source files to cache
continue-on-error: true
run: |
pushd ${WORKSPACE}/sources
aws s3 sync . ${SRC_CACHE_URI}
popd
- name: Prepare toolchain build log
if: always()
run: |
# Move build log file out of workspace
mv ${WORKSPACE}/build/build.log ${{ matrix.target }}.log
- name: Upload toolchain build log
if: always()
uses: actions/upload-artifact@v3
with:
name: log_${{ matrix.host.name }}_${{ matrix.target }}
path: ${{ matrix.target }}.log
- name: Upload toolchain build artifact
uses: actions/upload-artifact@v3
with:
name: toolchain_${{ matrix.host.name }}_${{ matrix.target }}
path: |
toolchain_${{ matrix.host.name }}_${{ matrix.target }}.${{ matrix.host.archive }}
md5.sum
sha256.sum
# Build host tools
build-hosttools:
name: Host Tools (${{ matrix.host.name }})
needs: setup
runs-on: ${{ matrix.host.runner }}
container: ${{ matrix.host.container }}
defaults:
run:
shell: bash
strategy:
fail-fast: false
matrix:
host: ${{ fromJSON(needs.setup.outputs.hosts) }}
steps:
- name: Apply container owner mismatch workaround
run: |
# FIXME: The owner UID of the GITHUB_WORKSPACE directory may not
# match the container user UID because of the way GitHub
# Actions runner is implemented. Remove this workaround when
# GitHub comes up with a fundamental fix for this problem.
git config --global --add safe.directory '*'
- name: Set up build environment (Linux)
if: ${{ runner.os == 'Linux' }}
run: |
# Clean up working directories
shopt -s dotglob
sudo rm -rf ${GITHUB_WORKSPACE}/*
shopt -u dotglob
# Set environment variables
echo "TAR=tar" >> $GITHUB_ENV
- name: Set up build environment (macOS)
if: ${{ runner.os == 'macOS' }}
run: |
# Clean up working directories
shopt -s dotglob
rm -rf ${GITHUB_WORKSPACE}/*
shopt -u dotglob
# Set environment variables
echo "TAR=gtar" >> $GITHUB_ENV
- name: Check out source code
if: ${{ github.event_name != 'pull_request_target' }}
uses: actions/checkout@v3
with:
submodules: recursive
persist-credentials: false
- name: Check out source code (pull request)
if: ${{ github.event_name == 'pull_request_target' }}
uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.head.sha }}
submodules: recursive
persist-credentials: false
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1-node16
with:
aws-access-key-id: ${{ secrets.AWS_CACHE_SDK_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_CACHE_SDK_SECRET_ACCESS_KEY }}
aws-region: us-east-1
- name: Download cached source files (Linux)
if: startsWith(matrix.host.name, 'linux-')
continue-on-error: true
run: |
SRC_CACHE_BASE="s3://cache-sdk/poky-sources"
SRC_CACHE_DIR="${{ matrix.host.name }}"
SRC_CACHE_URI="${SRC_CACHE_BASE}/${SRC_CACHE_DIR}"
POKY_DOWNLOADS="${RUNNER_TEMP}/poky-downloads"
# Download cached source files
mkdir -p ${POKY_DOWNLOADS}
pushd ${POKY_DOWNLOADS}
aws s3 sync ${SRC_CACHE_URI} .
popd
# Export environment variables
echo "SRC_CACHE_URI=${SRC_CACHE_URI}" >> $GITHUB_ENV
echo "POKY_DOWNLOADS=${POKY_DOWNLOADS}" >> $GITHUB_ENV
- name: Build Linux host tools
if: startsWith(matrix.host.name, 'linux-')
run: |
POKY_BASE=${GITHUB_WORKSPACE}/meta-zephyr-sdk
export META_DOWNLOADS="${POKY_DOWNLOADS}"
# Check out Poky
${POKY_BASE}/scripts/meta-zephyr-sdk-clone.sh
# Patch Poky sanity configuration to allow building as root
sed -i '/^INHERIT/ s/./#&/' poky/meta/conf/sanity.conf
# Resolve host machine type
if [ "${{ matrix.host.name }}" == "linux-aarch64" ]; then
# Cross compiling for AArch64 host on x86-64
export MACHINE="aarch64"
fi
# Build meta-zephyr-sdk
${POKY_BASE}/scripts/meta-zephyr-sdk-build.sh tools
# Prepare artifact for upload
ARTIFACT_ROOT="${POKY_BASE}/scripts/toolchains"
ARTIFACT=(${ARTIFACT_ROOT}/*hosttools*.sh)
ARTIFACT=${ARTIFACT[0]}
ARTIFACT=$(basename ${ARTIFACT})
ARCHIVE_NAME=hosttools_${{ matrix.host.name }}
ARCHIVE_FILE=hosttools_${{ matrix.host.name }}.tar.xz
XZ_OPT="-T0" \
${TAR} -Jcvf ${ARCHIVE_FILE} --owner=0 --group=0 \
-C ${ARTIFACT_ROOT} ${ARTIFACT}
# Compute checksum
md5sum ${ARCHIVE_FILE} > md5.sum
sha256sum ${ARCHIVE_FILE} > sha256.sum
- name: Setup debug session
if: always() && needs.setup.outputs.debug == 'hosttools'
uses: mxschmitt/action-tmate@v3
with:
limit-access-to-actor: true
- name: Sync downloaded source files to cache (Linux)
if: startsWith(matrix.host.name, 'linux-')
continue-on-error: true
run: |
pushd ${POKY_DOWNLOADS}
rm -rf git2
rm -rf svn
aws s3 sync . ${SRC_CACHE_URI}
popd
- name: Upload toolchain build artifact
if: startsWith(matrix.host.name, 'linux-') # FIXME: Do for all
uses: actions/upload-artifact@v3
with:
name: hosttools_${{ matrix.host.name }}
path: |
hosttools_${{ matrix.host.name }}.${{ matrix.host.archive }}
md5.sum
sha256.sum
# TODO: Add host tool build process for macOS hosts.
# TODO: Add host tool build process for Windows hosts.
# Build CMake package
build-cmake-pkg:
name: CMake Package (${{ matrix.host.name }})
needs: setup
runs-on: ${{ matrix.host.runner }}
container: ${{ matrix.host.container }}
defaults:
run:
shell: bash
strategy:
fail-fast: false
matrix:
host: ${{ fromJSON(needs.setup.outputs.hosts) }}
steps:
- name: Set up build environment (Linux)
if: ${{ runner.os == 'Linux' }}
run: |
# Clean up working directories
shopt -s dotglob
sudo rm -rf ${GITHUB_WORKSPACE}/*
shopt -u dotglob
# Install common dependencies
sudo apt-get update
sudo apt-get install -y p7zip
# Set environment variables
echo "TAR=tar" >> $GITHUB_ENV
- name: Set up build environment (macOS)
if: ${{ runner.os == 'macOS' }}
run: |
# Clean up working directories
shopt -s dotglob
rm -rf ${GITHUB_WORKSPACE}/*
shopt -u dotglob
# Install required dependencies if running inside a GitHub-hosted runner
# (self-hosted runners are expected to provide all required dependencies)
if [[ "${{ matrix.host.runner }}" =~ ^macos.* ]]; then
brew install gnu-tar
fi
# Set environment variables
echo "TAR=gtar" >> $GITHUB_ENV
- name: Check out source code
if: ${{ github.event_name != 'pull_request_target' }}
uses: actions/checkout@v3
with:
persist-credentials: false
- name: Check out source code (pull request)
if: ${{ github.event_name == 'pull_request_target' }}
uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.head.sha }}
persist-credentials: false
- name: Build CMake package
run: |
# Create CMake package archive
ARCHIVE_NAME=cmake_${{ matrix.host.name }}
ARCHIVE_FILE=${ARCHIVE_NAME}.${{ matrix.host.archive }}
if [ "${{ matrix.host.archive }}" == "tar.xz" ]; then
XZ_OPT="-T0" \
${TAR} -Jcvf ${ARCHIVE_FILE} --owner=0 --group=0 \
-C . cmake
elif [ "${{ matrix.host.archive }}" == "7z" ]; then
7z a -t7z -l ${ARCHIVE_FILE} cmake
fi
# Compute checksum
md5sum ${ARCHIVE_FILE} > md5.sum
sha256sum ${ARCHIVE_FILE} > sha256.sum
- name: Upload CMake package build artifact
uses: actions/upload-artifact@v3
with:
name: cmake_${{ matrix.host.name }}
path: |
cmake_${{ matrix.host.name }}.${{ matrix.host.archive }}
md5.sum
sha256.sum
# Build distribution bundle
build-dist-bundle:
name: Distribution Bundle (${{ matrix.host.name }})
needs: [ setup, build-toolchain, build-hosttools, build-cmake-pkg ]
runs-on: ${{ matrix.host.runner }}
container: ${{ matrix.host.container }}
defaults:
run:
shell: bash
strategy:
fail-fast: false
matrix:
host: ${{ fromJSON(needs.setup.outputs.hosts) }}
steps:
- name: Set up build environment (Linux)
if: ${{ runner.os == 'Linux' }}
run: |
# Clean up working directories
shopt -s dotglob
sudo rm -rf ${GITHUB_WORKSPACE}/*
shopt -u dotglob
# Install common dependencies
sudo apt-get update
sudo apt-get install -y jq p7zip
# Set environment variables
echo "TAR=tar" >> $GITHUB_ENV
- name: Set up build environment (macOS)
if: ${{ runner.os == 'macOS' }}
run: |
# Clean up working directories
shopt -s dotglob
rm -rf ${GITHUB_WORKSPACE}/*
shopt -u dotglob
# Install required dependencies if running inside a GitHub-hosted runner
# (self-hosted runners are expected to provide all required dependencies)
if [[ "${{ matrix.host.runner }}" =~ ^macos.* ]]; then
brew install coreutils gnu-tar jq
fi
# Set environment variables
echo "TAR=gtar" >> $GITHUB_ENV
- name: Check out source code
if: ${{ github.event_name != 'pull_request_target' }}
uses: actions/checkout@v3
with:
path: repository
persist-credentials: false
- name: Check out source code (pull request)
if: ${{ github.event_name == 'pull_request_target' }}
uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.head.sha }}
path: repository
persist-credentials: false
- name: Download artifacts
uses: actions/download-artifact@v3
with:
# NOTE: This downloads all build artifacts, including the toolchains and host tools for
# the irrelevant hosts, because the download-artifact action does not support
# specifying wildcards in the artifact name.
path: artifacts
- name: Create distribution bundle
run: |
# Set environment variables
HOST=${{ matrix.host.name }}
EXT=${{ matrix.host.archive }}
REPO_ROOT=${GITHUB_WORKSPACE}/repository
ARTIFACT_ROOT=${GITHUB_WORKSPACE}/artifacts
VERSION=$(<${ARTIFACT_ROOT}/version/version)
ARCHIVE_DIR=${{ env.BUNDLE_PREFIX }}-${VERSION}
ARCHIVE_NAME=${{ env.BUNDLE_PREFIX }}-${VERSION}_${HOST}
echo "BUNDLE_ARCHIVE_NAME=${ARCHIVE_NAME}" >> $GITHUB_ENV
if [ "${{ matrix.host.archive }}" == "tar.xz" ]; then
EXTRACT="${TAR} -Jxvf"
elif [ "${{ matrix.host.archive }}" == "7z" ]; then
EXTRACT="7z x -o."
fi
# Create bundle directory
mkdir ${ARCHIVE_DIR}
pushd ${ARCHIVE_DIR}
# Stage version file
echo "${VERSION}" > sdk_version
# Stage toolchain list file
echo '${{ needs.setup.outputs.targets }}' | jq -cr '.[]' > sdk_toolchains
# Stage CMake package
## Verify CMake package archive checksum
pushd ${ARTIFACT_ROOT}/cmake_${HOST}
md5sum --check md5.sum
sha256sum --check sha256.sum
popd
## Extract CMake package archive
${EXTRACT} ${ARTIFACT_ROOT}/cmake_${HOST}/cmake_${HOST}.${EXT}
# Stage host tools
HOSTTOOLS_ARTIFACT=hosttools_${HOST}
if [ -d ${ARTIFACT_ROOT}/${HOSTTOOLS_ARTIFACT} ]; then
# Verify host tools archive checksum
pushd ${ARTIFACT_ROOT}/${HOSTTOOLS_ARTIFACT}
md5sum --check md5.sum
sha256sum --check sha256.sum
popd
# Extract host tools archive
${EXTRACT} ${ARTIFACT_ROOT}/${HOSTTOOLS_ARTIFACT}/${HOSTTOOLS_ARTIFACT}.${EXT}
fi
# Stage setup script
case ${{ matrix.host.name }} in
linux-* | macos-*)
cp ${REPO_ROOT}/scripts/template_setup_posix setup.sh
chmod +x setup.sh
;;
windows-*)
cp ${REPO_ROOT}/scripts/template_setup_win setup.cmd
;;
esac
popd
# Create minimal (without toolchains) distribution bundle archive
if [ "${{ matrix.host.archive }}" == "tar.xz" ]; then
XZ_OPT="-T0" \
${TAR} -Jcvf ${ARCHIVE_NAME}_minimal.${EXT} --owner=0 --group=0 \
-C . ${ARCHIVE_DIR}
elif [ "${{ matrix.host.archive }}" == "7z" ]; then
7z a -t7z -l ${ARCHIVE_NAME}_minimal.${EXT} ${ARCHIVE_DIR}
fi
# Stage toolchains
pushd ${ARCHIVE_DIR}
## Generate target list from the workflow matrix
TARGETS=$(echo '${{ needs.setup.outputs.targets }}' | jq -cr '.[]')
## Extract all toolchains
for TARGET in ${TARGETS}; do
TOOLCHAIN_ARTIFACT=toolchain_${HOST}_${TARGET}
# Verify toolchain archive checksum
pushd ${ARTIFACT_ROOT}/${TOOLCHAIN_ARTIFACT}
md5sum --check md5.sum
sha256sum --check sha256.sum
popd
# Extract toolchain archive
${EXTRACT} ${ARTIFACT_ROOT}/${TOOLCHAIN_ARTIFACT}/${TOOLCHAIN_ARTIFACT}.${EXT}
done
popd
# Create full distribution bundle archive
if [ "${{ matrix.host.archive }}" == "tar.xz" ]; then
XZ_OPT="-T0" \
${TAR} -Jcvf ${ARCHIVE_NAME}.${EXT} --owner=0 --group=0 \
-C . ${ARCHIVE_DIR}
elif [ "${{ matrix.host.archive }}" == "7z" ]; then
7z a -t7z -l ${ARCHIVE_NAME}.${EXT} ${ARCHIVE_DIR}
fi
# Compute checksum
md5sum ${ARCHIVE_NAME}.${EXT} ${ARCHIVE_NAME}_minimal.${EXT} > md5.sum
sha256sum ${ARCHIVE_NAME}.${EXT} ${ARCHIVE_NAME}_minimal.${EXT} > sha256.sum
- name: Upload distribution bundle
uses: actions/upload-artifact@v3
with:
name: ${{ env.BUNDLE_ARCHIVE_NAME }}
path: |
${{ env.BUNDLE_ARCHIVE_NAME }}.${{ matrix.host.archive }}
${{ env.BUNDLE_ARCHIVE_NAME }}_minimal.${{ matrix.host.archive }}
md5.sum
sha256.sum
# Test distribution bundle
test-dist-bundle:
name: Test (${{ matrix.testenv.name }}) Subset ${{ matrix.subset }}
needs: [ setup, build-dist-bundle ]
runs-on: ${{ matrix.testenv.runner }}
container: ${{ matrix.testenv.container }}
defaults:
run:
shell: bash
strategy:
fail-fast: false
matrix:
testenv: ${{ fromJSON(needs.setup.outputs.testenvs) }}
subset: [ 1, 2 ]
env:
SUBSET_COUNT: 2
PYTHON_DEPS: https://raw.githubusercontent.com/zephyrproject-rtos/zephyr/main/scripts/requirements.txt
ZEPHYR_TOOLCHAIN_VARIANT: zephyr
steps:
- name: Set up Python
uses: actions/setup-python@v4
with:
# Force Python 3.10 because the twister is not compatible with a Python
# version lower than 3.8 on Windows.
python-version: '3.10'
- name: Set up test environment (Linux)
if: ${{ runner.os == 'Linux' }}
run: |
# Clean up working directories
shopt -s dotglob
sudo rm -rf ${GITHUB_WORKSPACE}/*
shopt -u dotglob
# Install required system packages
sudo apt-get update
sudo apt-get install -y ccache device-tree-compiler dos2unix gperf \
jq ninja-build wget
# Upgrade pip
python3 -m pip install --upgrade pip
# Install west
pip3 install --user --upgrade west
echo 'export PATH=~/.local/bin:"$PATH"' >> ~/.bashrc
# Install required Python packages
pip3 install --user --upgrade -r "${{ env.PYTHON_DEPS }}"
# Set environment variables
echo "TAR=tar" >> $GITHUB_ENV
echo "ARTIFACT_ROOT=${GITHUB_WORKSPACE}/artifacts" >> $GITHUB_ENV
- name: Set up test environment (macOS)
if: ${{ runner.os == 'macOS' }}
run: |
# Clean up working directories
shopt -s dotglob
rm -rf ${GITHUB_WORKSPACE}/*
shopt -u dotglob
# Install required system packages
brew install ccache coreutils dos2unix dtc gperf jq ninja wget
# Upgrade pip
sudo python3 -m pip install --upgrade pip
# Install west
sudo pip3 install --upgrade west
# Install required Python packages
sudo pip3 install --upgrade -r "${{ env.PYTHON_DEPS }}"
# Set environment variables
echo "TAR=gtar" >> $GITHUB_ENV
echo "ARTIFACT_ROOT=${GITHUB_WORKSPACE}/artifacts" >> $GITHUB_ENV
- name: Set up test environment (Windows)
if: ${{ runner.os == 'Windows' }}
run: |
# Clean up working directories
shopt -s dotglob
rm -rf ${GITHUB_WORKSPACE}/*
shopt -u dotglob
# Install required system packages
choco install ccache dtc-msys2 gperf jq ninja wget 7zip
# Upgrade pip
python3 -m pip install --upgrade pip
# Install west
pip3 install --upgrade west
# Install required Python packages
pip3 install --upgrade -r "${{ env.PYTHON_DEPS }}"
# Enable long paths support for Git
git config --system core.longpaths true
# Set environment variables
echo "ARTIFACT_ROOT=${GITHUB_WORKSPACE}/artifacts" >> $GITHUB_ENV
- name: Download version information
uses: actions/download-artifact@v3
with:
name: version
path: artifacts
- name: Resolve distribution bundle name
run: |
# Set base environment variables
HOST=${{ matrix.testenv.bundle-host }}
EXT=${{ matrix.testenv.bundle-archive }}
VERSION=$(<${ARTIFACT_ROOT}/version)
# Resolve distribution bundle name
BUNDLE_NAME=${{ env.BUNDLE_PREFIX }}-${VERSION}_${HOST}
BUNDLE_DIR=${{ env.BUNDLE_PREFIX }}-${VERSION}
echo "BUNDLE_NAME=${BUNDLE_NAME}" >> $GITHUB_ENV
echo "BUNDLE_DIR=${BUNDLE_DIR}" >> $GITHUB_ENV
- name: Download distribution bundle
uses: actions/download-artifact@v3
with:
name: ${{ env.BUNDLE_NAME }}
path: artifacts
- name: Install distribution bundle
run: |
# Create tools directory
mkdir -p tools
# Verify distribution bundle archive checksum
pushd ${ARTIFACT_ROOT}
md5sum --check md5.sum
sha256sum --check sha256.sum
popd
# Extract distribution bundle archive
BUNDLE_FILE=${BUNDLE_NAME}.${{ matrix.testenv.bundle-archive }}
if [ "${{ matrix.testenv.bundle-archive }}" == "tar.xz" ]; then
${TAR} -Jxvf ${ARTIFACT_ROOT}/${BUNDLE_FILE} -C tools
elif [ "${{ matrix.testenv.bundle-archive }}" == "7z" ]; then
7z x -otools ${ARTIFACT_ROOT}/${BUNDLE_FILE}
fi
# Run setup script
pushd ${GITHUB_WORKSPACE}/tools/${BUNDLE_DIR}
if [ "${{ runner.os }}" == "Windows" ]; then
# Shorten distribution bundle path on Windows
subst s: ${PWD}
pushd /s
# NOTE: Escape forward slashes because MinGW (bash)
# NOTE: A full path (using PWD) must be specified to ensure that the
# setup script is launched from the shortened path.
${PWD}/setup.cmd //t all //h //c
popd
else
./setup.sh -t all -h -c
fi
# Clean up bundle archive to reduce disk usage
rm -f ${ARTIFACT_ROOT}/${BUNDLE_FILE}
popd
- name: Set up Zephyr repository
run: |
# Create Zephyr workspace
ZEPHYR_WORKSPACE=${GITHUB_WORKSPACE}/zephyrproject
west init ${ZEPHYR_WORKSPACE}
cd ${ZEPHYR_WORKSPACE}
# Check out specified Zephyr ref
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
REF="${{ github.event.inputs.zephyr-ref }}"
else
REF="${{ env.ZEPHYR_REF }}"
fi
pushd zephyr
git fetch origin ${REF}
git checkout FETCH_HEAD
popd
# Clone Zephyr repositories
west update
west zephyr-export
# Export variables
echo "ZEPHYR_WORKSPACE=${ZEPHYR_WORKSPACE}" >> $GITHUB_ENV
echo "ZEPHYR_ROOT=${ZEPHYR_WORKSPACE}/zephyr" >> $GITHUB_ENV
- name: Run test suites
run: |
# Create working directory
mkdir -p test
cd test
# Set host-specific twister parameters
if [ "${{ runner.os }}" != "Linux" ]; then
# TODO: Remove `--build-only` when QEMU is available on non-Linux hosts
HOST_ARGS+="--build-only "
fi
if [ "${{ runner.os }}" == "Windows" ]; then
# Shorten twister output paths on Windows in order to work around the
# long path issues
HOST_ARGS+="--short-build-path "
fi
# Generate platform list from the target list
TARGETS=$(echo '${{ needs.setup.outputs.targets }}' | jq -cr '.[]' | dos2unix)
for TARGET in ${TARGETS}; do
case ${TARGET} in
aarch64-zephyr-elf)
PLATFORM_ARGS+="-p qemu_cortex_a53 "
;;
arc64-zephyr-elf)
PLATFORM_ARGS+="-p qemu_arc_hs6x "
;;
arc-zephyr-elf)
PLATFORM_ARGS+="-p qemu_arc_em "
PLATFORM_ARGS+="-p qemu_arc_hs "
;;
arm-zephyr-eabi)
PLATFORM_ARGS+="-p qemu_cortex_m0 "
PLATFORM_ARGS+="-p mps2_an385 "
PLATFORM_ARGS+="-p mps2_an521 "
PLATFORM_ARGS+="-p mps3_an547 "
;;
mips-zephyr-elf)
PLATFORM_ARGS+="-p qemu_malta "
;;
nios2-zephyr-elf)
PLATFORM_ARGS+="-p qemu_nios2 "
;;
riscv64-zephyr-elf)
PLATFORM_ARGS+="-p qemu_riscv32 "
PLATFORM_ARGS+="-p qemu_riscv32e "
PLATFORM_ARGS+="-p qemu_riscv64 "
;;
sparc-zephyr-elf)
PLATFORM_ARGS+="-p qemu_leon3 "
;;
x86_64-zephyr-elf)
PLATFORM_ARGS+="-p qemu_x86 "
PLATFORM_ARGS+="-p qemu_x86_64 "
;;
xtensa-espressif_esp32_zephyr-elf)
PLATFORM_ARGS+="-p esp32 "
;;
xtensa-espressif_esp32s2_zephyr-elf)
PLATFORM_ARGS+="-p esp32s2_saola "
;;
xtensa-intel_apl_adsp_zephyr-elf)
PLATFORM_ARGS+="-p intel_adsp_cavs15 "
;;
xtensa-intel_bdw_adsp_zephyr-elf)
# NOTE: no default user for this target is available
;;
xtensa-intel_byt_adsp_zephyr-elf)
# NOTE: no default user for this target is available
;;
xtensa-intel_s1000_zephyr-elf)
PLATFORM_ARGS+="-p intel_adsp_cavs18 "
;;
xtensa-nxp_imx_adsp_zephyr-elf)
PLATFORM_ARGS+="-p nxp_adsp_imx8 "
;;
xtensa-nxp_imx8m_adsp_zephyr-elf)
PLATFORM_ARGS+="-p nxp_adsp_imx8m "
;;
xtensa-sample_controller_zephyr-elf)
PLATFORM_ARGS+="-p qemu_xtensa "
;;
esac
done
# Generate test list
TEST_ARGS="
-T ${ZEPHYR_ROOT}/samples/hello_world
-T ${ZEPHYR_ROOT}/tests/lib/newlib
"
# Run tests with twister
TWISTER="${ZEPHYR_ROOT}/scripts/twister"
${TWISTER} -v -N -M --force-color --inline-logs --retry-failed 3 \
--subset ${{ matrix.subset }}/${{ env.SUBSET_COUNT }} \
${HOST_ARGS} \
${TEST_ARGS} \
${PLATFORM_ARGS}
- name: Publish test results
if: always()
uses: actions/upload-artifact@v3
with:
name: test_${{ matrix.testenv.name }}_${{ matrix.subset }}
if-no-files-found: ignore
path: test/twister-out/twister.xml
# Post test result check
test-result:
name: Test Result
needs: [ test-dist-bundle ]
runs-on: ubuntu-20.04
# NOTE: The 'test-result' job depends on the 'test-dist-bundle' job and
# therefore only runs when all distribution bundle tests pass.
#
# The purpose of this job is to provide a checkpoint which the GitHub
# branch protection rule can use to enforce the required checks for
# merging pull requests, because GitHub does not support specifying a
# job that is part of a matrix for this purpose.
steps:
- name: Summary
run: |
echo "All passed"