chore: checkpoint 第一版
ci / verify (push) Canceled after 0s

This commit is contained in:
Codex Local
2026-09-06 17:04:11 +08:00
parent a8cdec98d1
commit 0c2151ace9
659 changed files with 185855 additions and 554 deletions
@@ -0,0 +1,19 @@
# The file mainly marks apps with special rules, while other apps are enabled by default
.disable_test_apps: &disable_test_apps
disable:
- if: TARGET_DIR_TYPE == "test_apps"
.disable_example: &disable_example
disable:
- if: TARGET_DIR_TYPE == "example"
.disable_test_apps_esp32: &disable_test_apps_esp32
disable:
- if: TARGET_DIR_TYPE == "test_apps" AND IDF_TARGET == "esp32"
gmf_core/test_apps:
<<: *disable_example
packages/esp_board_manager:
<<: *disable_test_apps_esp32
@@ -0,0 +1,72 @@
.build_cmake_template: &build_cmake_template
stage: build
image: ${IMAGE}
tags:
- multimedia_build
parallel: 2
interruptible: true
dependencies: # set dependencies to null to avoid missing artifacts issue
variables:
DEEP_CLONE: "false"
IDF_FIND_APP_PATH_ARG: "-p"
SDKCFG_DEFAULTS: "sdkconfig.defaults.$IDF_TARGET"
BASE_FRAMEWORK_PATH: "${IDF_PATH}"
BASE_FRAMEWORK: $IDF_REPOSITORY
artifacts:
paths:
- "**/build*/size.json"
- "**/build*/build_log.txt"
- "**/build*/*.bin"
- "**/build*/*.elf"
- "**/build*/flasher_args.json"
- "**/build*/flash_project_args"
- "**/build*/config/sdkconfig.json"
- "**/build*/sdkconfig"
- "**/build*/bootloader/*.bin"
- "**/build*/partition_table/*.bin"
- "**/build*/srmodels/*.bin"
when: always
expire_in: 4 days
extends:
- .build_template
script:
- python $CI_PROJECT_DIR/tools/ci/esp_bmgr_pre_build.py --target $IDF_TARGET --board $AUDIO_BOARD --project-path ${EXAMPLES_PATH[@]} --target-dir-type ${TARGET_DIR_TYPE}
- run_cmd python $CI_PROJECT_DIR/tools/ci/build_apps.py ${EXAMPLES_PATH[@]} \
-t $IDF_TARGET -vv \
--target-dir-type ${TARGET_DIR_TYPE} \
--build-dir ${IDF_VERSION_TAG}/build_@t_@w \
--parallel-count ${parallel##*/} \
--parallel-index ${parallel%%/*}
.matrix_template: &matrix_template
parallel:
matrix:
- IDF_VERSION_TAG: ['v5.4.3']
parallel: [ 1/1 ]
build_examples_esp32_lyrat_mini_v1_1:
extends:
- .rules:build:protected-merge-requests-pipeline
- .build_cmake_template
- .matrix_template
variables:
IDF_TARGET: esp32
AUDIO_BOARD: lyrat_mini_v1_1
.build_examples_esp32s2_kaluga_v1_2:
extends:
- .rules:build:protected-merge-requests-pipeline
- .build_cmake_template
- .matrix_template
variables:
IDF_TARGET: esp32s2
AUDIO_BOARD: ''
build_examples_esp32s3_korvo_v2:
extends:
- .rules:build:protected-merge-requests-pipeline
- .build_cmake_template
- .matrix_template
variables:
IDF_TARGET: esp32s3
AUDIO_BOARD: esp32_s3_korvo2_v3
@@ -0,0 +1,115 @@
variables:
BASE_FRAMEWORK_PATH: "${IDF_PATH}"
BASE_FRAMEWORK: $IDF_REPOSITORY
IDF_TAG_FLAG: true
.build_gmf_component:
interruptible: true
variables:
TARGET_DIR_TYPE: "test_apps"
TEST_DIR: ${CI_PROJECT_DIR}/gmf_core
parallel:
matrix:
- IDF_VERSION_TAG: ['v5.4.3']
parallel: [ 1/1 ]
extends:
- .rules:build:protected-merge-requests-pipeline
- .build_template
artifacts:
paths:
- "**/build*/size.json"
- "**/build*/build_log.txt"
- "**/build*/*.bin"
- "**/build*/*.elf"
- "**/build*/flasher_args.json"
- "**/build*/flash_project_args"
- "**/build*/config/sdkconfig.json"
- "**/build*/sdkconfig"
- "**/build*/bootloader/*.bin"
- "**/build*/partition_table/*.bin"
- "**/build*/srmodels/*.bin"
- "${TEST_DIR}/**/test_apps/*.py"
expire_in: 4 days
script:
- python $CI_PROJECT_DIR/tools/ci/esp_bmgr_pre_build.py --target $IDF_TARGET --board $AUDIO_BOARD --project-path ${TEST_DIR} --target-dir-type ${TARGET_DIR_TYPE}
- run_cmd python $CI_PROJECT_DIR/tools/ci/build_apps.py ${TEST_DIR} \
-t $IDF_TARGET -vv \
--target-dir-type ${TARGET_DIR_TYPE} \
--build-dir ${IDF_VERSION_TAG}/build_@t_@w \
--parallel-count ${parallel##*/} \
--parallel-index ${parallel%%/*}
- python $CI_PROJECT_DIR/tools/ci/check_test_cxx_build.py
.build_ut_gmf_packages:
extends:
- .build_gmf_component
variables:
TEST_DIR: ${CI_PROJECT_DIR}/packages
.build_ut_gmf_elements:
extends:
- .build_gmf_component
variables:
TEST_DIR: ${CI_PROJECT_DIR}/elements
build_ut_gmf_core_esp32:
extends:
- .build_gmf_component
variables:
IDF_TARGET: esp32
AUDIO_BOARD: lyrat_mini_v1_1
.build_ut_gmf_core_esp32c3:
extends:
- .build_gmf_component
variables:
IDF_TARGET: esp32c3
build_ut_gmf_core_esp32s3:
extends:
- .build_gmf_component
variables:
IDF_TARGET: esp32s3
AUDIO_BOARD: esp32_s3_korvo2_v3
.build_ut_gmf_core_esp32p4:
extends:
- .build_gmf_component
variables:
IDF_TARGET: esp32p4
AUDIO_BOARD: esp32_p4_function_ev
build_ut_gmf_elements_esp32:
extends:
- .build_ut_gmf_elements
variables:
IDF_TARGET: esp32
AUDIO_BOARD: lyrat_mini_v1_1
build_ut_gmf_elements_esp32s3:
extends:
- .build_ut_gmf_elements
variables:
IDF_TARGET: esp32s3
AUDIO_BOARD: esp32_s3_korvo2_v3
.build_ut_gmf_elements_esp32p4:
extends:
- .build_ut_gmf_elements
variables:
IDF_TARGET: esp32p4
AUDIO_BOARD: esp32_p4_function_ev
build_ut_gmf_packages_esp32:
extends:
- .build_ut_gmf_packages
variables:
IDF_TARGET: esp32
AUDIO_BOARD: lyrat_mini_v1_1
build_ut_gmf_packages_esp32s3:
extends:
- .build_ut_gmf_packages
variables:
IDF_TARGET: esp32s3
AUDIO_BOARD: esp32_s3_korvo2_v3
@@ -0,0 +1,47 @@
variables:
IDF_TAG_FLAG: true
IDF_EXTRA_ACTIONS_PATH: ${CI_PROJECT_DIR}/packages/esp_board_manager
.update_source: &update_source
- source ${CI_PROJECT_DIR}/tools/ci/utils.sh
- add_gitlab_ssh_keys
- git submodule update --init --recursive --depth 1
- git clone --depth 1 -b $IDF_VERSION_TAG $IDF_REPOSITORY $IDF_PATH
- fetch_idf_branch $IDF_VERSION_TAG
- cd $BASE_FRAMEWORK_PATH
- git log -2
- common_before_scripts
- setup_tools_and_idf_python_venv
- set_env_variable
- cd ${CI_PROJECT_DIR}
.build_template:
stage: build
image: ${IMAGE}
interruptible: true
tags:
- multimedia_build
before_script:
- *update_source
after_script:
- find "${TEST_DIR}" -type d \( -name "managed_components" -o -name "build" \) -exec rm -rf {} +
.target_test_template:
stage: target_test
image: "$CI_DOCKER_REGISTRY/target-test-env-v5.4:2"
interruptible: true
timeout: 1 hour
retry: 2
cache:
# Usually do not need submodule-cache in target_test
- key: pip-cache
paths:
- .cache/pip
policy: pull
before_script:
- source ${CI_PROJECT_DIR}/tools/ci/utils.sh
- add_gitlab_ssh_keys
- git clone --depth 1 -b $IDF_VERSION_TAG $IDF_REPOSITORY $IDF_PATH
- check_idf_version $IDF_VERSION_TAG
- export PYTHONPATH="$IDF_PATH/tools:$IDF_PATH/tools/ci/python_packages:$PYTHONPATH"
- export PYTHONPATH="$CI_PROJECT_DIR/tools:$PYTHONPATH"
@@ -0,0 +1,21 @@
push_to_github:
stage: deploy
rules:
- if:
'($CI_COMMIT_REF_NAME == "main" ||
$CI_COMMIT_BRANCH =~ /^release\/v/ ||
$CI_COMMIT_TAG =~ /^v\d+\.\d+(\.\d+)?($|-)/) &&
$CI_PIPELINE_SOURCE != "schedule"'
when: on_success
image: $CI_DOCKER_REGISTRY/esp32-ci-env
variables:
GIT_STRATEGY: clone
before_script:
- echo "skip default before_script"
script:
- source ${CI_PROJECT_DIR}/tools/ci/utils.sh
- add_github_ssh_keys
- git fetch --unshallow
- git remote remove github &>/dev/null || true
- git remote add github ${TARGET_GITHUB_REPO}
- push_to_github
@@ -0,0 +1,102 @@
.pre_check_template:
stage: pre_check
image: "${CI_DOCKER_REGISTRY}/esp-env-v5.3:1"
interruptible: true
tags:
- host_test
dependencies: []
.check_branch_script: &check_branch_script |
if [[ "$BOT_LABEL_SKIP_BRANCH_CHECK" = "true" || "$CI_MERGE_REQUEST_LABELS" =~ skip_branch_check ]]; then
echo "Skip branch name check."
else
${CHECK_TOOLS_PATH}/check_commit_format branch-name
fi
.check_commit_script: &check_commit_script |
if [[ "$BOT_LABEL_SKIP_COMMIT_CHECK" = "true" || "$CI_MERGE_REQUEST_LABELS" =~ skip_commit_check ]]; then
echo "Skip commit message check."
else
${CHECK_TOOLS_PATH}/check_commit_format commit-message
fi
.check_code_script: &check_code_script |
if [[ "$BOT_LABEL_SKIP_CODE_CHECK" = "true" || "$CI_MERGE_REQUEST_LABELS" =~ skip_code_check ]]; then
echo "Skip code style check."
else
${CHECK_TOOLS_PATH}/check_commit_format --verbose --format code-style;
if [ -d "${CHECK_REPO_PATH}/formatted" ] && [ "$(ls -A ${CHECK_REPO_PATH}/formatted)" ]; then
git diff -- . ':(exclude).gitmodules' > ${CHECK_REPO_PATH}/patch/code_format.patch
exit 1
fi
fi
check_commit_format:
image: "$CI_DOCKER_IMAGE_REGISTRY/pre_commit:1"
interruptible: true
stage: pre_check
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_LABELS !~ /^(?:[^,\n\r]+,)*skip_check(?:,[^,\n\r]+)*$/i'
script:
- git clone --depth 1 $CHECK_FORMAT_TOOL_REPO
- cd check-format-tool/bin
- export CHECK_REPO_PATH=${CI_PROJECT_DIR}
- ./install.sh
- . ./export.sh
- cd ${CHECK_REPO_PATH};
- *check_branch_script
- *check_commit_script
- *check_code_script
- check_project_root_dir_change
allow_failure: true
artifacts:
paths:
- ${CI_PROJECT_DIR}/patch
- ${CI_PROJECT_DIR}/formatted
when: always
expire_in: 4 days
check_pre_commit:
extends:
- .rules:build:protected-merge-requests
- .pre_check_template
before_script:
- pip install pre-commit
script:
- |
# merged results pipelines, by default
if [[ -n $CI_MERGE_REQUEST_SOURCE_BRANCH_SHA ]]; then
git fetch origin $CI_MERGE_REQUEST_DIFF_BASE_SHA --depth=1 ${GIT_FETCH_EXTRA_FLAGS}
git fetch origin $CI_MERGE_REQUEST_SOURCE_BRANCH_SHA --depth=1 ${GIT_FETCH_EXTRA_FLAGS}
export GIT_DIFF_OUTPUT=$(git diff --name-only $CI_MERGE_REQUEST_DIFF_BASE_SHA $CI_MERGE_REQUEST_SOURCE_BRANCH_SHA)
# merge request pipelines, when the mr got conflicts
elif [[ -n $CI_MERGE_REQUEST_DIFF_BASE_SHA ]]; then
git fetch origin $CI_MERGE_REQUEST_DIFF_BASE_SHA --depth=1 ${GIT_FETCH_EXTRA_FLAGS}
git fetch origin $CI_COMMIT_SHA --depth=1 ${GIT_FETCH_EXTRA_FLAGS}
export GIT_DIFF_OUTPUT=$(git diff --name-only $CI_MERGE_REQUEST_DIFF_BASE_SHA $CI_COMMIT_SHA)
# other pipelines, like the protected branches pipelines
elif [[ "$CI_COMMIT_BEFORE_SHA" != "0000000000000000000000000000000000000000" ]]; then
git fetch origin $CI_COMMIT_BEFORE_SHA --depth=1 ${GIT_FETCH_EXTRA_FLAGS}
git fetch origin $CI_COMMIT_SHA --depth=1 ${GIT_FETCH_EXTRA_FLAGS}
export GIT_DIFF_OUTPUT=$(git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA)
else
# pipeline source could be web, scheduler, etc.
git fetch origin $CI_COMMIT_SHA --depth=2 ${GIT_FETCH_EXTRA_FLAGS}
export GIT_DIFF_OUTPUT=$(git diff --name-only $CI_COMMIT_SHA~1 $CI_COMMIT_SHA)
fi
- MODIFIED_FILES=$(echo $GIT_DIFF_OUTPUT | xargs)
- echo "MODIFIED_FILES=$MODIFIED_FILES" >> pipeline.env
- pre-commit install --allow-missing-config -t pre-commit -t commit-msg
- pre-commit run --files $MODIFIED_FILES
after_script:
- git diff > fixed.patch
- cat fixed.patch
artifacts:
reports:
dotenv: pipeline.env
paths:
- pipeline.env
expire_in: 1 week
when: always
@@ -0,0 +1,118 @@
.patterns-build_components: &patterns-build_components
- ".gitlab/**/*"
- "tools/**/*"
- "elements/**/*"
- "gmf_core/**/*"
- "packages/**/*"
##############
# if anchors #
##############
.if-web: &if-web
if: '$CI_PIPELINE_SOURCE == "web"'
.if-ref-main: &if-ref-main
if: '$CI_COMMIT_REF_NAME == "main"'
.if-trigger: &if-trigger
if: '$CI_PIPELINE_SOURCE == "trigger"'
.if-pipeline: &if-pipeline
if: '$CI_PIPELINE_SOURCE == "pipeline"'
.if-schedule: &if-schedule
if: '$CI_PIPELINE_SOURCE == "schedule"'
.if-merge_request_event: &if-merge_request_event
if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
.if-open-merge-request: &if-open-merge-request
if: '$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && ($CI_PIPELINE_SOURCE == "push")'
.if-dev-push: &if-dev-push
if: '$CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_BRANCH !~ /^release\/v/ && $CI_COMMIT_TAG !~ /^v\d+\.\d+(\.\d+)?($|-)/ && ($CI_PIPELINE_SOURCE == "push")'
.if-protected: &if-protected
if: '($CI_COMMIT_REF_NAME == "main" || $CI_COMMIT_BRANCH =~ /^release\/v/ || $CI_COMMIT_TAG =~ /^v\d+\.\d+(\.\d+)?($|-)/)'
.if-label-skip_unit_test: &if-label-skip_unit_test
if: '$BOT_LABEL_SKIP_UNIT_TEST || $CI_MERGE_REQUEST_LABELS =~ /^(?:[^,\n\r]+,)*skip_unit_test(?:,[^,\n\r]+)*$/i'
.if-label-skip_example_test: &if-label-skip_example_test
if: '$BOT_LABEL_SKIP_EXAMPLE_TEST || $CI_MERGE_REQUEST_LABELS =~ /^(?:[^,\n\r]+,)*skip_example_test(?:,[^,\n\r]+)*$/i'
.if-label-skip_example: &if-label-skip_example
if: '$BOT_LABEL_SKIP_EXAMPLE_TEST || $CI_MERGE_REQUEST_LABELS =~ /^(?:[^,\n\r]+,)*skip_example(?:,[^,\n\r]+)*$/i'
.idf-version-tag-v5-3: &idf-version-tag-v5-3
if: '$IDF_VERSION_TAG == "v5.3"'
variables:
IMAGE: "$CI_DOCKER_IMAGE_REGISTRY/env_v5.3:1"
.idf-version-tag-v5-4: &idf-version-tag-v5-4
if: '$IDF_VERSION_TAG == "v5.4.3"'
variables:
IMAGE: "$CI_IDF_DOCKER_REGISTRY/esp-env-v5.4:2"
.rules:ref:main-schedule:
rules:
- <<: *if-ref-main
- <<: *if-schedule
.rules:ref:check-label:
rules:
- <<: *if-merge_request_event
.rules:build:regular-board-idf-ver-tag:
rules:
- <<: *if-dev-push
when: never
- <<: *if-schedule
when: never
.rules:build:non-regular-board-idf-ver-tag:
rules:
- <<: *if-dev-push
when: never
- <<: *if-merge_request_event
when: never
.rules:build:protected-merge-requests-pipeline:
rules:
- <<: *if-dev-push
when: never
- <<: *idf-version-tag-v5-3
- <<: *idf-version-tag-v5-4
- <<: *if-web
- <<: *if-trigger
- <<: *if-pipeline
- <<: *if-protected
- <<: *if-merge_request_event
.rules:build:protected-merge-requests:
rules:
- <<: *if-web
- <<: *if-protected
- <<: *if-merge_request_event
.rules:build:enable-gmf-example-test:
rules:
- <<: *if-label-skip_example_test
when: never
- <<: *if-label-skip_example
when: never
- <<: *if-web
- <<: *if-protected
- <<: *if-merge_request_event
.rules:build:enable-gmf-unit-test:
rules:
- <<: *if-dev-push
when: never
- <<: *if-label-skip_unit_test
when: never
- <<: *if-web
- <<: *if-protected
- <<: *if-trigger
- <<: *if-schedule
- changes: *patterns-build_components
@@ -0,0 +1,70 @@
.target_example_test_template:
extends:
- .target_test_template
parallel:
matrix:
- IDF_VERSION_TAG: ['v5.4.3']
variables:
GIT_DEPTH: 1
SUBMODULES_TO_FETCH: "none"
IDF_TAG_FLAG: "true"
TEST_FW_PATH: "$CI_PROJECT_DIR/tools/tiny-test-fw"
LOG_PATH: "$CI_PROJECT_DIR/TEST_LOGS"
ENV_FILE: "${BASE_FRAMEWORK_PATH}/ci-test-runner-configs/$CI_RUNNER_DESCRIPTION/EnvConfig.yml"
artifacts:
when: always
paths:
- XUNIT_RESULT.xml
- "**/*.log"
- $LOG_PATH
- "$CI_PROJECT_DIR/**/output.wav"
reports:
junit: XUNIT_RESULT.xml
expire_in: 1 week
.pytest_template:
extends:
- .target_example_test_template
script:
- pip install pytest pytest-embedded-idf pytest-embedded-serial-esp pytest-rerunfailures pytest-timeout idf_build_apps
- eval "$(python ${CI_PROJECT_DIR}/tools/ci/build_apps.py ${TEST_DIR} --find --target-dir-type ${TARGET_DIR_TYPE} --target ${IDF_TARGET} -vv)"
- pytest "${APP_LIST[@]}" --target ${IDF_TARGET} -m "${tags}" --junitxml=XUNIT_RESULT.xml --parallel-count 1 --parallel-index 1
.pytest_audio_loopback_template:
image: "$CI_DOCKER_IMAGE_REGISTRY/target_test_env_v5.3:2"
extends:
- .rules:build:enable-gmf-example-test
- .target_example_test_template
script:
- export PYTHONPATH="/usr/local/lib/python3.9/dist-packages:$PYTHONPATH"
- pip install pytest pytest-embedded-idf pytest-embedded-serial-esp pytest-rerunfailures pytest-timeout idf_build_apps
- arecord -l
- eval "$(python ${CI_PROJECT_DIR}/tools/ci/build_apps.py ${TEST_DIR} --find --target-dir-type ${TARGET_DIR_TYPE} --target ${IDF_TARGET} -vv)"
- pytest "${APP_LIST[@]}" --target ${IDF_TARGET} -m "${tags}" --junitxml=XUNIT_RESULT.xml --parallel-count 1 --parallel-index 1
variables:
TEST_DIR: "${EXAMPLES_PATH}"
.pytest_examples_dir_template:
extends:
- .rules:build:enable-gmf-example-test
- .pytest_template
variables:
TEST_DIR: "${EXAMPLES_PATH}"
audio_playback_test_esp32:
extends:
- .pytest_audio_loopback_template
variables:
IDF_TARGET: esp32
needs:
- 'build_examples_esp32_lyrat_mini_v1_1: [v5.4.3, 1/1]'
tags: [ esp32, AUDIO_LOOPBACK_ENV ]
example_test_esp32s3:
extends:
- .pytest_examples_dir_template
variables:
IDF_TARGET: esp32s3
needs:
- 'build_examples_esp32s3_korvo_v2: [v5.4.3, 1/1]'
tags: [ esp32s3 ]
@@ -0,0 +1,62 @@
.pytest_ut_template:
extends:
- .target_test_template
variables:
IDF_VERSION_TAG: v5.4.3
IDF_TAG_FLAG: true
TARGET_DIR_TYPE: "test_apps"
artifacts:
when: always
paths:
- XUNIT_RESULT.xml
- pytest-embedded/
reports:
junit: XUNIT_RESULT.xml
expire_in: 1 week
script:
- cd $CI_PROJECT_DIR
- pip install pytest pytest-embedded-idf pytest-embedded-serial-esp pytest-rerunfailures pytest-timeout idf_build_apps
- eval "$(python ${CI_PROJECT_DIR}/tools/ci/build_apps.py ${TEST_DIR} --find --target-dir-type ${TARGET_DIR_TYPE} --target ${IDF_TARGET} -vv)"
- pytest "${APP_LIST[@]}"
--target ${IDF_TARGET}
--junitxml=XUNIT_RESULT.xml
--parallel-count ${CI_NODE_TOTAL:-1}
--parallel-index ${CI_NODE_INDEX:-1}
${PYTEST_EXTRA_FLAGS}
.pytest_components_dir_template:
extends:
- .rules:build:enable-gmf-unit-test
- .pytest_ut_template
variables:
TEST_DIR: ${CI_PROJECT_DIR}/gmf_core
BUILD_JOB_PREFIX: build_pytest_components_
IDF_TARGET: esp32s3
retry: 2
ut_gmf_core_esp32s3:
extends:
- .pytest_components_dir_template
needs:
- 'build_ut_gmf_core_esp32s3: [v5.4.3, 1/1]'
variables:
TEST_DIR: ${CI_PROJECT_DIR}/gmf_core
tags: [ ESP32S3, ESP_GMF_COMPONENT ]
ut_gmf_elements_esp32s3:
extends:
- .pytest_components_dir_template
needs:
- 'build_ut_gmf_elements_esp32s3: [v5.4.3, 1/1]'
variables:
TEST_DIR: ${CI_PROJECT_DIR}/elements
tags: [ ESP32S3, ESP_GMF_COMPONENT ]
ut_gmf_packages_esp32s3:
extends:
- .pytest_components_dir_template
needs:
- 'build_ut_gmf_packages_esp32s3: [v5.4.3, 1/1]'
variables:
TEST_DIR: ${CI_PROJECT_DIR}/packages
tags: [ ESP32S3, ESP_GMF_COMPONENT ]