mirror of
https://github.com/espressif/esp-idf.git
synced 2025-07-31 03:07:21 +02:00
Merge branch 'test/workaround_ci_failures_v3.0' into 'release/v3.0'
CI: erase nvs partition before test (backport v3.0) See merge request idf/esp-idf!2870
This commit is contained in:
127
.gitlab-ci.yml
127
.gitlab-ci.yml
@ -1,9 +1,9 @@
|
|||||||
stages:
|
stages:
|
||||||
- build
|
- build
|
||||||
- assign_test
|
- assign_test
|
||||||
|
- host_test
|
||||||
- unit_test
|
- unit_test
|
||||||
- test
|
- integration_test
|
||||||
- test_report
|
|
||||||
- deploy
|
- deploy
|
||||||
|
|
||||||
variables:
|
variables:
|
||||||
@ -133,6 +133,8 @@ build_ssc_01:
|
|||||||
build_ssc_02:
|
build_ssc_02:
|
||||||
<<: *build_ssc_template
|
<<: *build_ssc_template
|
||||||
|
|
||||||
|
# If you want to add new build ssc jobs, please add it into dependencies of `assign_test` and `.test_template`
|
||||||
|
|
||||||
build_esp_idf_tests:
|
build_esp_idf_tests:
|
||||||
<<: *build_template
|
<<: *build_template
|
||||||
artifacts:
|
artifacts:
|
||||||
@ -140,7 +142,7 @@ build_esp_idf_tests:
|
|||||||
- tools/unit-test-app/output
|
- tools/unit-test-app/output
|
||||||
- components/idf_test/unit_test/TestCaseAll.yml
|
- components/idf_test/unit_test/TestCaseAll.yml
|
||||||
- components/idf_test/unit_test/CIConfigs/*.yml
|
- components/idf_test/unit_test/CIConfigs/*.yml
|
||||||
expire_in: 6 mos
|
expire_in: 1 mos
|
||||||
script:
|
script:
|
||||||
- cd tools/unit-test-app
|
- cd tools/unit-test-app
|
||||||
- make help # make sure kconfig tools are built in single process
|
- make help # make sure kconfig tools are built in single process
|
||||||
@ -199,6 +201,7 @@ build_examples_06:
|
|||||||
build_examples_07:
|
build_examples_07:
|
||||||
<<: *build_examples_template
|
<<: *build_examples_template
|
||||||
|
|
||||||
|
# If you want to add new build example jobs, please add it into dependencies of `.example_test_template`
|
||||||
|
|
||||||
build_docs:
|
build_docs:
|
||||||
stage: build
|
stage: build
|
||||||
@ -222,54 +225,44 @@ build_docs:
|
|||||||
- make html
|
- make html
|
||||||
- ./check_doc_warnings.sh
|
- ./check_doc_warnings.sh
|
||||||
|
|
||||||
test_nvs_on_host:
|
.host_test_template: &host_test_template
|
||||||
stage: test
|
stage: host_test
|
||||||
image: $CI_DOCKER_REGISTRY/esp32-ci-env
|
image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
|
||||||
tags:
|
tags:
|
||||||
- nvs_host_test
|
- host_test
|
||||||
dependencies: []
|
dependencies: []
|
||||||
|
|
||||||
|
test_nvs_on_host:
|
||||||
|
<<: *host_test_template
|
||||||
script:
|
script:
|
||||||
- cd components/nvs_flash/test_nvs_host
|
- cd components/nvs_flash/test_nvs_host
|
||||||
- make test
|
- make test
|
||||||
|
|
||||||
test_partition_table_on_host:
|
test_partition_table_on_host:
|
||||||
stage: test
|
<<: *host_test_template
|
||||||
image: $CI_DOCKER_REGISTRY/esp32-ci-env
|
|
||||||
tags:
|
tags:
|
||||||
- build
|
- build
|
||||||
dependencies: []
|
|
||||||
script:
|
script:
|
||||||
- cd components/partition_table/test_gen_esp32part_host
|
- cd components/partition_table/test_gen_esp32part_host
|
||||||
- ./gen_esp32part_tests.py
|
- ./gen_esp32part_tests.py
|
||||||
|
|
||||||
test_wl_on_host:
|
test_wl_on_host:
|
||||||
stage: test
|
<<: *host_test_template
|
||||||
image: $CI_DOCKER_REGISTRY/esp32-ci-env
|
|
||||||
tags:
|
|
||||||
- wl_host_test
|
|
||||||
artifacts:
|
artifacts:
|
||||||
paths:
|
paths:
|
||||||
- components/wear_levelling/test_wl_host/coverage_report.zip
|
- components/wear_levelling/test_wl_host/coverage_report.zip
|
||||||
dependencies: []
|
|
||||||
script:
|
script:
|
||||||
- cd components/wear_levelling/test_wl_host
|
- cd components/wear_levelling/test_wl_host
|
||||||
- make test
|
- make test
|
||||||
|
|
||||||
test_multi_heap_on_host:
|
test_multi_heap_on_host:
|
||||||
stage: test
|
<<: *host_test_template
|
||||||
image: $CI_DOCKER_REGISTRY/esp32-ci-env
|
|
||||||
tags:
|
|
||||||
- wl_host_test
|
|
||||||
script:
|
script:
|
||||||
- cd components/heap/test_multi_heap_host
|
- cd components/heap/test_multi_heap_host
|
||||||
- ./test_all_configs.sh
|
- ./test_all_configs.sh
|
||||||
|
|
||||||
test_build_system:
|
test_build_system:
|
||||||
stage: test
|
<<: *host_test_template
|
||||||
image: $CI_DOCKER_REGISTRY/esp32-ci-env
|
|
||||||
tags:
|
|
||||||
- build_test
|
|
||||||
dependencies: []
|
|
||||||
script:
|
script:
|
||||||
- ${IDF_PATH}/tools/ci/test_configure_ci_environment.sh
|
- ${IDF_PATH}/tools/ci/test_configure_ci_environment.sh
|
||||||
- rm -rf test_build_system
|
- rm -rf test_build_system
|
||||||
@ -277,60 +270,6 @@ test_build_system:
|
|||||||
- cd test_build_system
|
- cd test_build_system
|
||||||
- ${IDF_PATH}/tools/ci/test_build_system.sh
|
- ${IDF_PATH}/tools/ci/test_build_system.sh
|
||||||
|
|
||||||
test_report:
|
|
||||||
stage: test_report
|
|
||||||
image: $CI_DOCKER_REGISTRY/esp32-ci-env
|
|
||||||
tags:
|
|
||||||
- report
|
|
||||||
only:
|
|
||||||
- master
|
|
||||||
- triggers
|
|
||||||
- /^release\/v/
|
|
||||||
- /^v\d+\.\d+(\.\d+)?($|-)/
|
|
||||||
variables:
|
|
||||||
LOG_PATH: "$CI_PROJECT_DIR/$CI_COMMIT_SHA"
|
|
||||||
TEST_CASE_FILE_PATH: "$CI_PROJECT_DIR/components/idf_test"
|
|
||||||
REPORT_PATH: "$CI_PROJECT_DIR/CI_Test_Report"
|
|
||||||
MODULE_UPDATE_FILE: "$CI_PROJECT_DIR/tools/unit-test-app/tools/ModuleDefinition.yml"
|
|
||||||
#dependencies:
|
|
||||||
#We need all UT* and IT* artifacts except for only a few other
|
|
||||||
artifacts:
|
|
||||||
when: always
|
|
||||||
paths:
|
|
||||||
- $REPORT_PATH
|
|
||||||
- $LOG_PATH
|
|
||||||
expire_in: 12 mos
|
|
||||||
script:
|
|
||||||
# calc log path
|
|
||||||
- VER_NUM=`git rev-list HEAD | wc -l | awk '{print $1}'`
|
|
||||||
- SHA_ID=`echo $CI_COMMIT_SHA | cut -c 1-7`
|
|
||||||
- REVISION="${VER_NUM}_${SHA_ID}"
|
|
||||||
# replace / to _ in branch name
|
|
||||||
- ESCAPED_BRANCH_NAME=`echo $CI_COMMIT_REF_NAME | sed 's/\//___/g'`
|
|
||||||
# result path and artifacts path
|
|
||||||
- RESULT_PATH="$CI_PROJECT_NAME/$ESCAPED_BRANCH_NAME/$REVISION"
|
|
||||||
- ARTIFACTS_PATH="$GITLAB_HTTP_SERVER/idf/esp-idf/builds/$CI_JOB_ID/artifacts/browse/$CI_COMMIT_SHA"
|
|
||||||
# clone test bench
|
|
||||||
- git clone $GITLAB_SSH_SERVER/yinling/auto_test_script.git
|
|
||||||
- cd auto_test_script
|
|
||||||
- python $CHECKOUT_REF_SCRIPT auto_test_script
|
|
||||||
# generate report
|
|
||||||
- TEST_RESULT=Pass
|
|
||||||
- python CITestReport.py -l $LOG_PATH -t $TEST_CASE_FILE_PATH -p $REPORT_PATH -r $RESULT_PATH -a $ARTIFACTS_PATH -m $MODULE_UPDATE_FILE || TEST_RESULT=Fail
|
|
||||||
# commit to CI-test-result project
|
|
||||||
- git clone $GITLAB_SSH_SERVER/qa/CI-test-result.git
|
|
||||||
- rm -rf "CI-test-result/RawData/$RESULT_PATH"
|
|
||||||
- cp -R $CI_PROJECT_NAME CI-test-result/RawData
|
|
||||||
- cd CI-test-result
|
|
||||||
# config git user
|
|
||||||
- git config --global user.email "ci-test-result@espressif.com"
|
|
||||||
- git config --global user.name "ci-test-result"
|
|
||||||
# commit test result
|
|
||||||
- git add .
|
|
||||||
- git commit . -m "update test result for $CI_PROJECT_NAME/$CI_COMMIT_REF_NAME/$CI_COMMIT_SHA, pipeline ID $CI_PIPELINE_ID" || exit 0
|
|
||||||
- git push origin master
|
|
||||||
- test "${TEST_RESULT}" = "Pass" || exit 1
|
|
||||||
|
|
||||||
push_master_to_github:
|
push_master_to_github:
|
||||||
stage: deploy
|
stage: deploy
|
||||||
image: $CI_DOCKER_REGISTRY/esp32-ci-env
|
image: $CI_DOCKER_REGISTRY/esp32-ci-env
|
||||||
@ -362,8 +301,8 @@ push_master_to_github:
|
|||||||
|
|
||||||
|
|
||||||
deploy_docs:
|
deploy_docs:
|
||||||
stage: deploy
|
stage: host_test
|
||||||
image: $CI_DOCKER_REGISTRY/esp32-ci-env
|
image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
|
||||||
tags:
|
tags:
|
||||||
- deploy
|
- deploy
|
||||||
only:
|
only:
|
||||||
@ -389,8 +328,8 @@ deploy_docs:
|
|||||||
- ssh $DOCS_SERVER -x "cd $DOCS_PATH && tar xzvf $GIT_VER.tar.gz && rm -f latest && ln -s $GIT_VER latest"
|
- ssh $DOCS_SERVER -x "cd $DOCS_PATH && tar xzvf $GIT_VER.tar.gz && rm -f latest && ln -s $GIT_VER latest"
|
||||||
|
|
||||||
check_doc_links:
|
check_doc_links:
|
||||||
stage: test
|
stage: host_test
|
||||||
image: $CI_DOCKER_REGISTRY/esp32-ci-env
|
image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
|
||||||
tags:
|
tags:
|
||||||
- check_doc_links
|
- check_doc_links
|
||||||
only:
|
only:
|
||||||
@ -478,21 +417,28 @@ assign_test:
|
|||||||
- python CIAssignTestCases.py -t $IDF_PATH/components/idf_test/integration_test -c $IDF_PATH/.gitlab-ci.yml -b $IDF_PATH/SSC/ssc_bin
|
- python CIAssignTestCases.py -t $IDF_PATH/components/idf_test/integration_test -c $IDF_PATH/.gitlab-ci.yml -b $IDF_PATH/SSC/ssc_bin
|
||||||
|
|
||||||
.example_test_template: &example_test_template
|
.example_test_template: &example_test_template
|
||||||
stage: test
|
stage: integration_test
|
||||||
when: on_success
|
when: on_success
|
||||||
only:
|
only:
|
||||||
- master
|
- master
|
||||||
- /^release\/v/
|
- /^release\/v/
|
||||||
- /^v\d+\.\d+(\.\d+)?($|-)/
|
- /^v\d+\.\d+(\.\d+)?($|-)/
|
||||||
- triggers
|
- triggers
|
||||||
# gitlab ci do not support match job with RegEx or wildcard now in dependencies.
|
dependencies:
|
||||||
# we have a lot build example jobs and the binaries them exceed the limitation of artifacts.
|
- assign_test
|
||||||
# we can't artifact them in one job. For example test jobs, download all artifacts from previous stages.
|
- build_examples_00
|
||||||
|
- build_examples_01
|
||||||
|
- build_examples_02
|
||||||
|
- build_examples_03
|
||||||
|
- build_examples_04
|
||||||
|
- build_examples_05
|
||||||
|
- build_examples_06
|
||||||
|
- build_examples_07
|
||||||
artifacts:
|
artifacts:
|
||||||
when: always
|
when: always
|
||||||
paths:
|
paths:
|
||||||
- $LOG_PATH
|
- $LOG_PATH
|
||||||
expire_in: 6 mos
|
expire_in: 1 mos
|
||||||
variables:
|
variables:
|
||||||
TEST_FW_PATH: "$CI_PROJECT_DIR/tools/tiny-test-fw"
|
TEST_FW_PATH: "$CI_PROJECT_DIR/tools/tiny-test-fw"
|
||||||
TEST_CASE_PATH: "$CI_PROJECT_DIR/examples"
|
TEST_CASE_PATH: "$CI_PROJECT_DIR/examples"
|
||||||
@ -506,14 +452,13 @@ assign_test:
|
|||||||
- python Runner.py $TEST_CASE_PATH -c $CONFIG_FILE
|
- python Runner.py $TEST_CASE_PATH -c $CONFIG_FILE
|
||||||
|
|
||||||
.test_template: &test_template
|
.test_template: &test_template
|
||||||
stage: test
|
stage: integration_test
|
||||||
when: on_success
|
when: on_success
|
||||||
only:
|
only:
|
||||||
- master
|
- master
|
||||||
- /^release\/v/
|
- /^release\/v/
|
||||||
- /^v\d+\.\d+(\.\d+)?($|-)/
|
- /^v\d+\.\d+(\.\d+)?($|-)/
|
||||||
- triggers
|
- triggers
|
||||||
allow_failure: true
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- assign_test
|
- assign_test
|
||||||
- build_ssc_00
|
- build_ssc_00
|
||||||
@ -523,7 +468,7 @@ assign_test:
|
|||||||
when: always
|
when: always
|
||||||
paths:
|
paths:
|
||||||
- $LOG_PATH
|
- $LOG_PATH
|
||||||
expire_in: 6 mos
|
expire_in: 1 mos
|
||||||
variables:
|
variables:
|
||||||
LOCAL_ENV_CONFIG_PATH: "$CI_PROJECT_DIR/ci-test-runner-configs/$CI_RUNNER_DESCRIPTION/ESP32_IDF"
|
LOCAL_ENV_CONFIG_PATH: "$CI_PROJECT_DIR/ci-test-runner-configs/$CI_RUNNER_DESCRIPTION/ESP32_IDF"
|
||||||
LOG_PATH: "$CI_PROJECT_DIR/$CI_COMMIT_SHA"
|
LOG_PATH: "$CI_PROJECT_DIR/$CI_COMMIT_SHA"
|
||||||
@ -564,7 +509,7 @@ nvs_compatible_test:
|
|||||||
paths:
|
paths:
|
||||||
- $LOG_PATH
|
- $LOG_PATH
|
||||||
- nvs_wifi.bin
|
- nvs_wifi.bin
|
||||||
expire_in: 6 mos
|
expire_in: 1 mos
|
||||||
tags:
|
tags:
|
||||||
- ESP32_IDF
|
- ESP32_IDF
|
||||||
- NVS_Compatible
|
- NVS_Compatible
|
||||||
|
@ -17,6 +17,8 @@ import os
|
|||||||
import re
|
import re
|
||||||
import subprocess
|
import subprocess
|
||||||
import functools
|
import functools
|
||||||
|
import random
|
||||||
|
import tempfile
|
||||||
|
|
||||||
import DUT
|
import DUT
|
||||||
|
|
||||||
@ -40,6 +42,8 @@ class IDFDUT(DUT.SerialDUT):
|
|||||||
""" IDF DUT, extends serial with ESPTool methods """
|
""" IDF DUT, extends serial with ESPTool methods """
|
||||||
|
|
||||||
CHIP_TYPE_PATTERN = re.compile(r"Detecting chip type[.:\s]+(.+)")
|
CHIP_TYPE_PATTERN = re.compile(r"Detecting chip type[.:\s]+(.+)")
|
||||||
|
# if need to erase NVS partition in start app
|
||||||
|
ERASE_NVS = True
|
||||||
|
|
||||||
def __init__(self, name, port, log_file, app, **kwargs):
|
def __init__(self, name, port, log_file, app, **kwargs):
|
||||||
self.download_config, self.partition_table = app.process_app_info()
|
self.download_config, self.partition_table = app.process_app_info()
|
||||||
@ -68,24 +72,39 @@ class IDFDUT(DUT.SerialDUT):
|
|||||||
return cls.get_chip(app, port) is not None
|
return cls.get_chip(app, port) is not None
|
||||||
|
|
||||||
@_tool_method
|
@_tool_method
|
||||||
def start_app(self):
|
def start_app(self, erase_nvs=ERASE_NVS):
|
||||||
"""
|
"""
|
||||||
download and start app.
|
download and start app.
|
||||||
|
|
||||||
|
:param: erase_nvs: whether erase NVS partition during flash
|
||||||
:return: None
|
:return: None
|
||||||
"""
|
"""
|
||||||
|
if erase_nvs:
|
||||||
|
address = self.partition_table["nvs"]["offset"]
|
||||||
|
size = self.partition_table["nvs"]["size"]
|
||||||
|
nvs_file = tempfile.NamedTemporaryFile()
|
||||||
|
nvs_file.write(chr(0xFF) * size)
|
||||||
|
nvs_file.flush()
|
||||||
|
download_config = self.download_config + [address, nvs_file.name]
|
||||||
|
else:
|
||||||
|
download_config = self.download_config
|
||||||
|
|
||||||
retry_baud_rates = ["921600", "115200"]
|
retry_baud_rates = ["921600", "115200"]
|
||||||
error = IDFToolError()
|
error = IDFToolError()
|
||||||
for baud_rate in retry_baud_rates:
|
try:
|
||||||
try:
|
for baud_rate in retry_baud_rates:
|
||||||
subprocess.check_output(["python", self.app.esptool,
|
try:
|
||||||
"--port", self.port, "--baud", baud_rate]
|
subprocess.check_output(["python", self.app.esptool,
|
||||||
+ self.download_config)
|
"--port", self.port, "--baud", baud_rate]
|
||||||
break
|
+ download_config)
|
||||||
except subprocess.CalledProcessError as error:
|
break
|
||||||
continue
|
except subprocess.CalledProcessError as error:
|
||||||
else:
|
continue
|
||||||
raise error
|
else:
|
||||||
|
raise error
|
||||||
|
finally:
|
||||||
|
if erase_nvs:
|
||||||
|
nvs_file.close()
|
||||||
|
|
||||||
@_tool_method
|
@_tool_method
|
||||||
def reset(self):
|
def reset(self):
|
||||||
@ -96,6 +115,17 @@ class IDFDUT(DUT.SerialDUT):
|
|||||||
"""
|
"""
|
||||||
subprocess.check_output(["python", self.app.esptool, "--port", self.port, "run"])
|
subprocess.check_output(["python", self.app.esptool, "--port", self.port, "run"])
|
||||||
|
|
||||||
|
@_tool_method
|
||||||
|
def erase_partition(self, partition):
|
||||||
|
"""
|
||||||
|
:param partition: partition name to erase
|
||||||
|
:return: None
|
||||||
|
"""
|
||||||
|
address = self.partition_table[partition]["offset"]
|
||||||
|
size = self.partition_table[partition]["size"]
|
||||||
|
with open(".erase_partition.tmp", "wb") as f:
|
||||||
|
f.write(chr(0xFF) * size)
|
||||||
|
|
||||||
@_tool_method
|
@_tool_method
|
||||||
def dump_flush(self, output_file, **kwargs):
|
def dump_flush(self, output_file, **kwargs):
|
||||||
"""
|
"""
|
||||||
|
@ -20,9 +20,8 @@ from IDF.IDFApp import IDFApp, Example, UT
|
|||||||
from IDF.IDFDUT import IDFDUT
|
from IDF.IDFDUT import IDFDUT
|
||||||
|
|
||||||
|
|
||||||
def idf_example_test(app=Example, dut=IDFDUT, chip="ESP32",
|
def idf_example_test(app=Example, dut=IDFDUT, chip="ESP32", module="examples", execution_time=1,
|
||||||
module="examples", execution_time=1,
|
level="example", erase_nvs=True, **kwargs):
|
||||||
**kwargs):
|
|
||||||
"""
|
"""
|
||||||
decorator for testing idf examples (with default values for some keyword args).
|
decorator for testing idf examples (with default values for some keyword args).
|
||||||
|
|
||||||
@ -31,12 +30,19 @@ def idf_example_test(app=Example, dut=IDFDUT, chip="ESP32",
|
|||||||
:param chip: chip supported, string or tuple
|
:param chip: chip supported, string or tuple
|
||||||
:param module: module, string
|
:param module: module, string
|
||||||
:param execution_time: execution time in minutes, int
|
:param execution_time: execution time in minutes, int
|
||||||
|
:param level: test level, could be used to filter test cases, string
|
||||||
|
:param erase_nvs: if need to erase_nvs in DUT.start_app()
|
||||||
:param kwargs: other keyword args
|
:param kwargs: other keyword args
|
||||||
:return: test method
|
:return: test method
|
||||||
"""
|
"""
|
||||||
# not use partial function as define as function support auto generating document
|
try:
|
||||||
|
# try to config the default behavior of erase nvs
|
||||||
|
dut.ERASE_NVS = erase_nvs
|
||||||
|
except AttributeError:
|
||||||
|
pass
|
||||||
|
|
||||||
return TinyFW.test_method(app=app, dut=dut, chip=chip, module=module,
|
return TinyFW.test_method(app=app, dut=dut, chip=chip, module=module,
|
||||||
execution_time=execution_time, **kwargs)
|
execution_time=execution_time, level=level, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
def log_performance(item, value):
|
def log_performance(item, value):
|
||||||
|
Reference in New Issue
Block a user