Skip to content

Test Licensed Docker Image (amd64) #42

Test Licensed Docker Image (amd64)

Test Licensed Docker Image (amd64) #42

# This workflow tests the licensed Docker image (amd64) generated by the licensed_image_build.yml workflow.
# It pulls the image from GitHub Container Registry, clones the cmsis-mlek application repository,
# builds multiple variants of the keyword spotting (kws) application, executes them on FVP models,
# and verifies the output.
name: Test Licensed Docker Image (amd64)
on:
workflow_run:
workflows: ["Licensed Docker Image - Build and Push"]
types:
- completed
workflow_dispatch:
pull_request:
paths:
- .github/workflows/test_licensed_docker_image_amd64.yml
- docker_licensed/**
push:
branches: [main]
#schedule:
# - cron: '00 20 * * 6'
permissions:
contents: read
packages: read
jobs:
CI:
strategy:
matrix:
context: [
# {proj: kws, build_type: Release-Live_Stream, target_type: SSE-300, model: FVP_Corstone_SSE-300_Ethos-U55, fvp_dir: Corstone-300, mps: mps3},
# {proj: kws, build_type: Debug-Live_Stream, target_type: SSE-300, model: FVP_Corstone_SSE-300_Ethos-U55, fvp_dir: Corstone-300, mps: mps3},
{proj: kws, build_type: Release-Data_Array, target_type: SSE-300, model: FVP_Corstone_SSE-300_Ethos-U55, fvp_dir: Corstone-300, mps: mps3},
{proj: kws, build_type: Debug-Data_Array, target_type: SSE-300, model: FVP_Corstone_SSE-300_Ethos-U55, fvp_dir: Corstone-300, mps: mps3},
# {proj: kws, build_type: Release-Live_Stream, target_type: SSE-300-U55, model: FVP_Corstone_SSE-300_Ethos-U55, fvp_dir: Corstone-300, mps: mps3},
# {proj: kws, build_type: Debug-Live_Stream, target_type: SSE-300-U55, model: FVP_Corstone_SSE-300_Ethos-U55, fvp_dir: Corstone-300, mps: mps3},
{proj: kws, build_type: Release-Data_Array, target_type: SSE-300-U55, model: FVP_Corstone_SSE-300_Ethos-U55, fvp_dir: Corstone-300, mps: mps3},
{proj: kws, build_type: Debug-Data_Array, target_type: SSE-300-U55, model: FVP_Corstone_SSE-300_Ethos-U55, fvp_dir: Corstone-300, mps: mps3},
# {proj: kws, build_type: Release-Live_Stream, target_type: SSE-300-U65, model: FVP_Corstone_SSE-300_Ethos-U65, fvp_dir: Corstone-300, mps: mps3},
# {proj: kws, build_type: Debug-Live_Stream, target_type: SSE-300-U65, model: FVP_Corstone_SSE-300_Ethos-U65, fvp_dir: Corstone-300, mps: mps3},
{proj: kws, build_type: Release-Data_Array, target_type: SSE-300-U65, model: FVP_Corstone_SSE-300_Ethos-U65, fvp_dir: Corstone-300, mps: mps3},
{proj: kws, build_type: Debug-Data_Array, target_type: SSE-300-U65, model: FVP_Corstone_SSE-300_Ethos-U65, fvp_dir: Corstone-300, mps: mps3},
# {proj: kws, build_type: Release-Live_Stream, target_type: SSE-310, model: FVP_Corstone_SSE-310, fvp_dir: Corstone-310, mps: mps3},
# {proj: kws, build_type: Debug-Live_Stream, target_type: SSE-310, model: FVP_Corstone_SSE-310, fvp_dir: Corstone-310, mps: mps3},
{proj: kws, build_type: Release-Data_Array, target_type: SSE-310, model: FVP_Corstone_SSE-310, fvp_dir: Corstone-310, mps: mps3},
{proj: kws, build_type: Debug-Data_Array, target_type: SSE-310, model: FVP_Corstone_SSE-310, fvp_dir: Corstone-310, mps: mps3},
# {proj: kws, build_type: Release-Live_Stream, target_type: SSE-310-U55, model: FVP_Corstone_SSE-310, fvp_dir: Corstone-310, mps: mps3},
# {proj: kws, build_type: Debug-Live_Stream, target_type: SSE-310-U55, model: FVP_Corstone_SSE-310, fvp_dir: Corstone-310, mps: mps3},
{proj: kws, build_type: Release-Data_Array, target_type: SSE-310-U55, model: FVP_Corstone_SSE-310, fvp_dir: Corstone-310, mps: mps3},
{proj: kws, build_type: Debug-Data_Array, target_type: SSE-310-U55, model: FVP_Corstone_SSE-310, fvp_dir: Corstone-310, mps: mps3},
# {proj: kws, build_type: Release-Live_Stream, target_type: SSE-310-U65, model: FVP_Corstone_SSE-310_Ethos-U65, fvp_dir: Corstone-310, mps: mps3},
# {proj: kws, build_type: Debug-Live_Stream, target_type: SSE-310-U65, model: FVP_Corstone_SSE-310_Ethos-U65, fvp_dir: Corstone-310, mps: mps3},
{proj: kws, build_type: Release-Data_Array, target_type: SSE-310-U65, model: FVP_Corstone_SSE-310_Ethos-U65, fvp_dir: Corstone-310, mps: mps3},
{proj: kws, build_type: Debug-Data_Array, target_type: SSE-310-U65, model: FVP_Corstone_SSE-310_Ethos-U65, fvp_dir: Corstone-310, mps: mps3},
# {proj: kws, build_type: Release-Live_Stream, target_type: SSE-315, model: FVP_Corstone_SSE-315, fvp_dir: Corstone-315, mps: mps4},
# {proj: kws, build_type: Debug-Live_Stream, target_type: SSE-315, model: FVP_Corstone_SSE-315, fvp_dir: Corstone-315, mps: mps4},
{proj: kws, build_type: Release-Data_Array, target_type: SSE-315, model: FVP_Corstone_SSE-315, fvp_dir: Corstone-315, mps: mps4},
{proj: kws, build_type: Debug-Data_Array, target_type: SSE-315, model: FVP_Corstone_SSE-315, fvp_dir: Corstone-315, mps: mps4},
# {proj: kws, build_type: Release-Live_Stream, target_type: SSE-315-U65, model: FVP_Corstone_SSE-315, fvp_dir: Corstone-315, mps: mps4},
# {proj: kws, build_type: Debug-Live_Stream, target_type: SSE-315-U65, model: FVP_Corstone_SSE-315, fvp_dir: Corstone-315, mps: mps4},
{proj: kws, build_type: Release-Data_Array, target_type: SSE-315-U65, model: FVP_Corstone_SSE-315, fvp_dir: Corstone-315, mps: mps4},
{proj: kws, build_type: Debug-Data_Array, target_type: SSE-315-U65, model: FVP_Corstone_SSE-315, fvp_dir: Corstone-315, mps: mps4},
# {proj: kws, build_type: Release-Live_Stream, target_type: SSE-320, model: FVP_Corstone_SSE-320, fvp_dir: Corstone-320, mps: mps4},
# {proj: kws, build_type: Debug-Live_Stream, target_type: SSE-320, model: FVP_Corstone_SSE-320, fvp_dir: Corstone-320, mps: mps4},
{proj: kws, build_type: Release-Data_Array, target_type: SSE-320, model: FVP_Corstone_SSE-320, fvp_dir: Corstone-320, mps: mps4},
{proj: kws, build_type: Debug-Data_Array, target_type: SSE-320, model: FVP_Corstone_SSE-320, fvp_dir: Corstone-320, mps: mps4},
# {proj: kws, build_type: Release-Live_Stream, target_type: SSE-320-U85, model: FVP_Corstone_SSE-320, fvp_dir: Corstone-320, mps: mps4},
# {proj: kws, build_type: Debug-Live_Stream, target_type: SSE-320-U85, model: FVP_Corstone_SSE-320, fvp_dir: Corstone-320, mps: mps4},
{proj: kws, build_type: Release-Data_Array, target_type: SSE-320-U85, model: FVP_Corstone_SSE-320, fvp_dir: Corstone-320, mps: mps4},
{proj: kws, build_type: Debug-Data_Array, target_type: SSE-320-U85, model: FVP_Corstone_SSE-320, fvp_dir: Corstone-320, mps: mps4}
]
fail-fast: false
if: ${{ github.event_name != 'workflow_run' || github.event.workflow_run.conclusion == 'success' }}
runs-on: ubuntu-latest
env:
DOCKER_IMAGE: ghcr.io/arm-software/avh-mlops/arm-mlops-docker-licensed:latest-amd64
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Log in to GitHub Container Registry
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Pull Licensed Docker image (amd64)
run: docker pull ${{ env.DOCKER_IMAGE }}
- name: Start Docker container
run: |
docker run -d --name test_container \
${{ env.DOCKER_IMAGE }} \
sleep infinity
- name: Clone application repository
run: |
docker exec test_container runops \
git clone https://github.com/Arm-Examples/cmsis-mlek.git /home/arm_mlops_docker/cmsis-mlek
- name: Initialize CMSIS pack root folder
run: |
docker exec test_container runops bash -c "\
cpackget init https://www.keil.com/pack/index.pidx && \
cpackget update-index"
- name: Add local CMSIS packs
run: |
docker exec -w /home/arm_mlops_docker/cmsis-mlek test_container runops \
cpackget add ./ARM.CMSIS-MLEK.pdsc
- name: Build Test
run: |
docker exec -w /home/arm_mlops_docker/cmsis-mlek/template/audio test_container runops \
cbuild mlek_audio.csolution.yml --update-rte --packs --no-schema-check \
--context ${{matrix.context.proj}}.${{matrix.context.build_type}}+${{matrix.context.target_type}} \
--toolchain AC6 --rebuild
- name: Execution Test
run: |
docker exec -w /home/arm_mlops_docker/cmsis-mlek/template/audio test_container runops \
${{ matrix.context.model }} \
-a ./out/${{matrix.context.proj}}/${{matrix.context.target_type}}/${{matrix.context.build_type}}/${{matrix.context.proj}}.axf \
-f ./board/${{matrix.context.fvp_dir}}/fvp_config.txt \
-C ${{matrix.context.mps}}_board.telnetterminal0.start_telnet=0 \
-C ${{matrix.context.mps}}_board.uart0.out_file=stdout_${{matrix.context.build_type}}_${{matrix.context.target_type}}.log \
--simlimit 30
- name: Show and check FVP UART output
run: |
docker exec -w /home/arm_mlops_docker/cmsis-mlek/template/audio test_container runops bash -c '
echo "Show FVP UART output..."
cat stdout_${{matrix.context.build_type}}_${{matrix.context.target_type}}.log
echo "Checking FVP UART output..."
test "$(grep "FAIL: " stdout_${{matrix.context.build_type}}_${{matrix.context.target_type}}.log | wc -l)" -eq 0
'
- name: Copy FVP UART output log
if: always()
run: |
docker cp test_container:/home/arm_mlops_docker/cmsis-mlek/template/audio/stdout_${{matrix.context.build_type}}_${{matrix.context.target_type}}.log ./ || true
- name: Upload FVP UART output log
if: always()
uses: actions/upload-artifact@v7
with:
name: stdout_${{matrix.context.build_type}}_${{matrix.context.target_type}}.log
path: ./stdout_${{matrix.context.build_type}}_${{matrix.context.target_type}}.log
- name: Cleanup
if: always()
run: docker rm -f test_container