try to run arm-iar with circleci with new token (#2890)

* try to run arm-iar with circleci with new token
* limit iar ci parallel build to 4 for medium+ and 6 for large
* add hil-hfp to compile and test with IAR
This commit is contained in:
Ha Thach 2024-12-05 18:01:16 +07:00 committed by GitHub
parent eabf68bd91
commit 310b8657f0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 93 additions and 41 deletions

View File

@ -20,6 +20,7 @@ jobs:
BUILDSYSTEM_TOOLCHAIN=( BUILDSYSTEM_TOOLCHAIN=(
"cmake arm-clang" "cmake arm-clang"
"cmake arm-iar"
"make aarch64-gcc" "make aarch64-gcc"
"make arm-gcc" "make arm-gcc"
"make msp430-gcc" "make msp430-gcc"
@ -28,7 +29,27 @@ jobs:
"cmake esp-idf" "cmake esp-idf"
) )
RESOURCE_LARGE='["nrf", "imxrt"]' RESOURCE_LARGE='["nrf", "imxrt", "stm32f4", "stm32h7"]'
gen_build_entry() {
local build_system="$1"
local toolchain="$2"
local family="$3"
local resource_class="$4"
if [[ "$toolchain" == "esp-idf" ]]; then
echo " - build-vm:" >> .circleci/config2.yml
else
echo " - build:" >> .circleci/config2.yml
fi
echo " matrix:" >> .circleci/config2.yml
echo " parameters:" >> .circleci/config2.yml
echo " build-system: ['$build_system']" >> .circleci/config2.yml
echo " toolchain: ['$toolchain']" >> .circleci/config2.yml
echo " family: $family" >> .circleci/config2.yml
echo " resource_class: ['$resource_class']" >> .circleci/config2.yml
}
for e in "${BUILDSYSTEM_TOOLCHAIN[@]}"; do for e in "${BUILDSYSTEM_TOOLCHAIN[@]}"; do
e_arr=($e) e_arr=($e)
@ -43,26 +64,14 @@ jobs:
FAMILY=$(jq -n --argjson family "$FAMILY" --argjson resource "$RESOURCE_LARGE" '$family | map(select(IN($resource[]) | not))') FAMILY=$(jq -n --argjson family "$FAMILY" --argjson resource "$RESOURCE_LARGE" '$family | map(select(IN($resource[]) | not))')
if [[ $toolchain == esp-idf ]]; then if [[ $toolchain == esp-idf ]]; then
echo " - build-vm:" >> .circleci/config2.yml gen_build_entry "$build_system" "$toolchain" "$FAMILY" "large"
else else
echo " - build:" >> .circleci/config2.yml gen_build_entry "$build_system" "$toolchain" "$FAMILY" "medium+"
fi
echo " matrix:" >> .circleci/config2.yml
echo " parameters:" >> .circleci/config2.yml
echo " build-system: ['$build_system']" >> .circleci/config2.yml
echo " toolchain: ['$toolchain']" >> .circleci/config2.yml
echo " family: $FAMILY" >> .circleci/config2.yml
#echo " resource_class: ['medium+']" >> .circleci/config2.yml
# add large resources # add large resources if available
if [ "$(echo $FAMILY_LARGE | jq 'length')" -gt 0 ]; then if [ "$(echo $FAMILY_LARGE | jq 'length')" -gt 0 ]; then
echo " - build:" >> .circleci/config2.yml gen_build_entry "$build_system" "$toolchain" "$FAMILY_LARGE" "large"
echo " matrix:" >> .circleci/config2.yml fi
echo " parameters:" >> .circleci/config2.yml
echo " build-system: ['$build_system']" >> .circleci/config2.yml
echo " toolchain: ['$toolchain']" >> .circleci/config2.yml
echo " family: $FAMILY_LARGE" >> .circleci/config2.yml
echo " resource_class: ['large']" >> .circleci/config2.yml
fi fi
done done

View File

@ -16,7 +16,8 @@ commands:
"arm-gcc": "https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases/download/v13.2.1-1.1/xpack-arm-none-eabi-gcc-13.2.1-1.1-linux-x64.tar.gz", "arm-gcc": "https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases/download/v13.2.1-1.1/xpack-arm-none-eabi-gcc-13.2.1-1.1-linux-x64.tar.gz",
"msp430-gcc": "http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSPGCC/9_2_0_0/export/msp430-gcc-9.2.0.50_linux64.tar.bz2", "msp430-gcc": "http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSPGCC/9_2_0_0/export/msp430-gcc-9.2.0.50_linux64.tar.bz2",
"riscv-gcc": "https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v13.2.0-2/xpack-riscv-none-elf-gcc-13.2.0-2-linux-x64.tar.gz", "riscv-gcc": "https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v13.2.0-2/xpack-riscv-none-elf-gcc-13.2.0-2-linux-x64.tar.gz",
"rx-gcc": "https://llvm-gcc-renesas.com/downloads/get.php?f=rx/8.3.0.202004-gnurx/gcc-8.3.0.202004-GNURX-ELF.run" "rx-gcc": "https://llvm-gcc-renesas.com/downloads/get.php?f=rx/8.3.0.202004-gnurx/gcc-8.3.0.202004-GNURX-ELF.run",
"arm-iar": "https://updates.iar.com/FileStore/STANDARD/001/003/322/cxarm-9.60.3.deb"
}' }'
toolchain_url=$(echo $TOOLCHAIN_JSON | jq -r '.["<< parameters.toolchain >>"]') toolchain_url=$(echo $TOOLCHAIN_JSON | jq -r '.["<< parameters.toolchain >>"]')
@ -38,18 +39,26 @@ commands:
# download if folder does not exist (not cached) # download if folder does not exist (not cached)
if [ ! -d ~/cache/<< parameters.toolchain >> ]; then if [ ! -d ~/cache/<< parameters.toolchain >> ]; then
mkdir -p ~/cache/<< parameters.toolchain >> mkdir -p ~/cache/<< parameters.toolchain >>
wget --progress=dot:giga $toolchain_url -O toolchain.tar.gz
if [[ << parameters.toolchain >> == rx-gcc ]]; then if [[ << parameters.toolchain >> == rx-gcc ]]; then
mv toolchain.tar.gz toolchain.run wget --progress=dot:giga $toolchain_url -O toolchain.run
chmod +x toolchain.run chmod +x toolchain.run
./toolchain.run -p ~/cache/<< parameters.toolchain >>/gnurx -y ./toolchain.run -p ~/cache/<< parameters.toolchain >>/gnurx -y
elif [[ << parameters.toolchain >> == arm-iar ]]; then
wget --progress=dot:giga $toolchain_url -O ~/cache/<< parameters.toolchain >>/toolchain.deb
else else
wget --progress=dot:giga $toolchain_url -O toolchain.tar.gz
tar -C ~/cache/<< parameters.toolchain >> -xaf toolchain.tar.gz tar -C ~/cache/<< parameters.toolchain >> -xaf toolchain.tar.gz
fi fi
fi fi
# Add toolchain to PATH # Add toolchain to PATH
echo "export PATH=$PATH:`echo ~/cache/<< parameters.toolchain >>/*/bin`" >> $BASH_ENV if [[ << parameters.toolchain >> == arm-iar ]]; then
# Install IAR since we only cache deb file
sudo dpkg --ignore-depends=libusb-1.0-0 -i ~/cache/<< parameters.toolchain >>/toolchain.deb
echo "export PATH=$PATH:/opt/iar/cxarm/arm/bin" >> $BASH_ENV
else
echo "export PATH=$PATH:`echo ~/cache/<< parameters.toolchain >>/*/bin`" >> $BASH_ENV
fi
- save_cache: - save_cache:
name: Save Toolchain Cache name: Save Toolchain Cache
@ -110,6 +119,9 @@ commands:
# Toolchain option default is gcc # Toolchain option default is gcc
if [ << parameters.toolchain >> == arm-clang ]; then if [ << parameters.toolchain >> == arm-clang ]; then
TOOLCHAIN_OPTION="--toolchain clang" TOOLCHAIN_OPTION="--toolchain clang"
elif [ << parameters.toolchain >> == arm-iar ]; then
TOOLCHAIN_OPTION="--toolchain iar"
iccarm --version
elif [ << parameters.toolchain >> == arm-gcc ]; then elif [ << parameters.toolchain >> == arm-gcc ]; then
TOOLCHAIN_OPTION="--toolchain gcc" TOOLCHAIN_OPTION="--toolchain gcc"
fi fi

View File

@ -113,13 +113,12 @@ jobs:
# Build IAR on HFP self-hosted # Build IAR on HFP self-hosted
# --------------------------------------- # ---------------------------------------
arm-iar: arm-iar:
if: github.repository_owner == 'hathach' if: github.repository_owner == 'hathach' && github.event_name == 'push'
needs: set-matrix needs: set-matrix
runs-on: [self-hosted, Linux, X64, hifiphile] runs-on: [self-hosted, Linux, X64, hifiphile]
env: env:
BUILD_ARGS: ${{ join(fromJSON(needs.set-matrix.outputs.json)['arm-iar'], ' ') }} BUILD_ARGS: ${{ join(fromJSON(needs.set-matrix.outputs.json)['arm-iar'], ' ') }}
IAR_LMS_CLOUD_URL: https://license.cloud.iar.com # IAR_LMS_BEARER_TOKEN: ${{ secrets.IAR_LMS_BEARER_TOKEN }}
IAR_LMS_BEARER_TOKEN: ${{ secrets.IAR_LMS_BEARER_TOKEN }}
steps: steps:
- name: Clean workspace - name: Clean workspace
run: | run: |
@ -138,8 +137,3 @@ jobs:
- name: Build - name: Build
run: python3 tools/build.py --one-per-family --toolchain iar $BUILD_ARGS run: python3 tools/build.py --one-per-family --toolchain iar $BUILD_ARGS
- name: Test on actual hardware (hardware in the loop)
if: github.event_name == 'pull_request'
run: |
python3 test/hil/hil_test.py hfp.json

View File

@ -55,14 +55,6 @@ def set_matrix_json():
for toolchain in toolchain_list: for toolchain in toolchain_list:
filtered_families = [family for family, supported_toolchain in family_list.items() if filtered_families = [family for family, supported_toolchain in family_list.items() if
toolchain in supported_toolchain] toolchain in supported_toolchain]
# always add board in hfp.json for arm-iar
if toolchain == 'arm-iar':
with open('test/hil/hfp.json') as f:
hfp_data = json.load(f)
hfp_boards = [f"-b{board['name']}" for board in hfp_data['boards']]
filtered_families = filtered_families + hfp_boards
matrix[toolchain] = filtered_families matrix[toolchain] = filtered_families
print(json.dumps(matrix)) print(json.dumps(matrix))

View File

@ -58,7 +58,7 @@ jobs:
# --------------------------------------- # ---------------------------------------
# Hardware in the loop (HIL) # Hardware in the loop (HIL)
# self-hosted running on an VM. For attached hardware checkout HIL_JSON # self-hosted on local VM, for attached hardware checkout HIL_JSON
# --------------------------------------- # ---------------------------------------
hil-tinyusb: hil-tinyusb:
if: github.repository_owner == 'hathach' if: github.repository_owner == 'hathach'
@ -86,3 +86,41 @@ jobs:
run: | run: |
ls cmake-build/ ls cmake-build/
python3 test/hil/hil_test.py ${{ env.HIL_JSON }} python3 test/hil/hil_test.py ${{ env.HIL_JSON }}
# ---------------------------------------
# Hardware in the loop (HIL)
# self-hosted by HFP, build with IAR toolchain, for attached hardware checkout test/hil/hfp.json
# ---------------------------------------
hil-hfp:
if: github.repository_owner == 'hathach'
runs-on: [self-hosted, Linux, X64, hifiphile]
#env:
# IAR_LMS_BEARER_TOKEN: ${{ secrets.IAR_LMS_BEARER_TOKEN }}
steps:
- name: Clean workspace
run: |
echo "Cleaning up previous run"
rm -rf "${{ github.workspace }}"
mkdir -p "${{ github.workspace }}"
- name: Toolchain version
run: iccarm --version
- name: Checkout TinyUSB
uses: actions/checkout@v4
- name: Get build boards
run: |
MATRIX_JSON=$(python test/hil/hil_ci_set_matrix.py test/hil/hfp.json)
BUILD_ARGS=$(echo $MATRIX_JSON | jq -r '.["arm-gcc"] | join(" ")')
echo "BUILD_ARGS=$BUILD_ARGS"
echo "BUILD_ARGS=$BUILD_ARGS" >> $GITHUB_ENV
- name: Get Dependencies
run: python3 tools/get_deps.py $BUILD_ARGS
- name: Build
run: python3 tools/build.py --toolchain iar $BUILD_ARGS
- name: Test on actual hardware (hardware in the loop)
run: python3 test/hil/hil_test.py hfp.json

View File

@ -109,7 +109,14 @@ def cmake_board(board, toolchain, build_flags_on):
rcmd = run_cmd(f'cmake examples -B {build_dir} -G "Ninja" -DBOARD={board} -DCMAKE_BUILD_TYPE=MinSizeRel ' rcmd = run_cmd(f'cmake examples -B {build_dir} -G "Ninja" -DBOARD={board} -DCMAKE_BUILD_TYPE=MinSizeRel '
f'-DTOOLCHAIN={toolchain} {build_flags}') f'-DTOOLCHAIN={toolchain} {build_flags}')
if rcmd.returncode == 0: if rcmd.returncode == 0:
rcmd = run_cmd(f"cmake --build {build_dir}") cmd = f"cmake --build {build_dir}"
# Due to IAR capability, limit parallel build to 4 (medium+) or 6 (large) docker
if toolchain == 'iar' and os.getenv('CIRCLECI'):
if 'large' in os.getenv('CIRCLE_JOB'):
cmd += ' --parallel 6'
else:
cmd += ' --parallel 4'
rcmd = run_cmd(cmd)
ret[0 if rcmd.returncode == 0 else 1] += 1 ret[0 if rcmd.returncode == 0 else 1] += 1
example = 'all' example = 'all'