]> granicus.if.org Git - esp-idf/blob - .gitlab-ci.yml
CI: Fix a sporadic bug when building of the examples. Add logs to the artifacts
[esp-idf] / .gitlab-ci.yml
1 stages:
2   - build
3   - assign_test
4   - unit_test
5   - test
6   - test_report
7   - deploy
8
9 variables:
10 # System environment
11
12   # Common parameters for the 'make' during CI tests
13   MAKEFLAGS: "-j5 --no-keep-going"
14
15 # GitLab-CI environment
16
17   # more attempts for more robust
18   GET_SOURCES_ATTEMPTS: "10"
19   ARTIFACT_DOWNLOAD_ATTEMPTS: "10"
20
21   # We use get_sources.sh script to fetch the submodules and/or re-fetch the repo
22   # if it was corrupted (if submodule update fails this can happen)
23   GIT_STRATEGY: fetch
24   GIT_SUBMODULE_STRATEGY: none
25
26 # IDF environment
27
28   IDF_PATH: "$CI_PROJECT_DIR"
29   APPLY_BOT_FILTER_SCRIPT: "$CI_PROJECT_DIR/tools/ci/apply_bot_filter.py"
30   CHECKOUT_REF_SCRIPT: "$CI_PROJECT_DIR/tools/ci/checkout_project_ref.py"
31
32 # before each job, we need to check if this job is filtered by bot stage/job filter
33 .apply_bot_filter: &apply_bot_filter
34   python $APPLY_BOT_FILTER_SCRIPT || exit 0
35
36 before_script:
37   # apply bot filter in before script
38   - *apply_bot_filter
39   # add gitlab ssh key
40   - mkdir -p ~/.ssh
41   - chmod 700 ~/.ssh
42   - echo -n $GITLAB_KEY > ~/.ssh/id_rsa_base64
43   - base64 --decode --ignore-garbage ~/.ssh/id_rsa_base64 > ~/.ssh/id_rsa
44   - chmod 600 ~/.ssh/id_rsa
45   - echo -e "Host gitlab.espressif.cn\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
46
47   # Set IS_PRIVATE or IS_PUBLIC depending on if our branch is public or not
48   #
49   # (the same regular expressions are used to set these are used in 'only:' sections below
50   - source tools/ci/configure_ci_environment.sh
51
52   # fetch the submodules (& if necessary re-fetch repo) from gitlab
53   - time ./tools/ci/get-full-sources.sh
54
55 .do_nothing_before:
56   before_script: &do_nothing_before
57     # apply bot filter in before script
58     - *apply_bot_filter
59     - echo "Not setting up GitLab key, not fetching submodules"
60     - source tools/ci/configure_ci_environment.sh
61
62 .add_gitlab_key_before:
63   before_script: &add_gitlab_key_before
64     # apply bot filter in before script
65     - *apply_bot_filter
66     - echo "Not fetching submodules"
67     - source tools/ci/configure_ci_environment.sh
68     # add gitlab ssh key
69     - mkdir -p ~/.ssh
70     - chmod 700 ~/.ssh
71     - echo -n $GITLAB_KEY > ~/.ssh/id_rsa_base64
72     - base64 --decode --ignore-garbage ~/.ssh/id_rsa_base64 > ~/.ssh/id_rsa
73     - chmod 600 ~/.ssh/id_rsa
74     - echo -e "Host gitlab.espressif.cn\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
75
76 build_template_app:
77   stage: build
78   image: $CI_DOCKER_REGISTRY/esp32-ci-env
79   tags:
80     - build
81   variables:
82     BATCH_BUILD: "1"
83     IDF_CI_BUILD: "1"
84   script:
85     - git clone https://github.com/espressif/esp-idf-template.git
86     - cd esp-idf-template
87     # Try to use the same branch name for esp-idf-template that we're
88     # using on esp-idf. If it doesn't exist then just stick to the default
89     # branch
90     - python $CHECKOUT_REF_SCRIPT esp-idf-template
91     # Test debug build (default)
92     - make all V=1
93     # Now test release build
94     - make clean
95     - sed -i.bak -e's/CONFIG_OPTIMIZATION_LEVEL_DEBUG\=y/CONFIG_OPTIMIZATION_LEVEL_RELEASE=y/' sdkconfig
96     - make all V=1
97     # Check if there are any stray printf/ets_printf references in WiFi libs
98     - cd ../components/esp32/lib
99     - test $(xtensa-esp32-elf-nm *.a | grep -w printf | wc -l) -eq 0
100     - test $(xtensa-esp32-elf-nm *.a | grep -w ets_printf | wc -l) -eq 0
101
102
103 .build_template: &build_template
104   stage: build
105   image: $CI_DOCKER_REGISTRY/esp32-ci-env
106   tags:
107     - build
108   variables:
109     BATCH_BUILD: "1"
110     V: "0"
111
112 build_ssc:
113   <<: *build_template
114   artifacts:
115     paths:
116       - SSC/ssc_bin
117     expire_in: 6 mos
118   script:
119     - git clone $SSC_REPOSITORY
120     - cd SSC
121     - python $CHECKOUT_REF_SCRIPT SSC
122     - MAKEFLAGS= ./gen_misc_ng.sh
123
124 build_esp_idf_tests:
125   <<: *build_template
126   artifacts:
127     paths:
128       - tools/unit-test-app/output
129       - components/idf_test/unit_test/TestCaseAll.yml
130       - components/idf_test/unit_test/CIConfigs/*.yml
131     expire_in: 6 mos
132   script:
133     - cd tools/unit-test-app
134     - make help # make sure kconfig tools are built in single process
135     - make ut-clean-all-configs
136     - export EXTRA_CFLAGS="-Werror -Werror=deprecated-declarations"
137     - export EXTRA_CXXFLAGS=${EXTRA_CFLAGS}
138     - make ut-build-all-configs TESTS_ALL=1
139     - python tools/UnitTestParser.py
140
141 .build_examples_template: &build_examples_template
142   <<: *build_template
143   artifacts:
144     when: always
145     paths:
146       - build_examples/*/*/*/build/*.bin
147       - build_examples/*/*/*/build/*.elf
148       - build_examples/*/*/*/build/*.map
149       - build_examples/*/*/*/build/download.config
150       - build_examples/*/*/*/build/bootloader/*.bin
151       - $LOG_PATH
152     expire_in: 1 week
153   variables:
154     IDF_CI_BUILD: "1"
155     LOG_PATH: "$CI_PROJECT_DIR/log_examples"
156   script:
157     # it's not possible to build 100% out-of-tree and have the "artifacts"
158     # mechanism work, but this is the next best thing
159     - rm -rf build_examples
160     - mkdir build_examples
161     - cd build_examples
162     # build some of examples
163     - mkdir -p ${LOG_PATH}
164     - ${IDF_PATH}/tools/ci/build_examples.sh "${CI_JOB_NAME}"
165
166 build_examples_00:
167   <<: *build_examples_template
168
169 build_examples_01:
170   <<: *build_examples_template
171
172 build_examples_02:
173   <<: *build_examples_template
174
175 build_examples_03:
176   <<: *build_examples_template
177
178 build_examples_04:
179   <<: *build_examples_template
180
181 build_examples_05:
182   <<: *build_examples_template
183
184 build_examples_06:
185   <<: *build_examples_template
186
187 build_examples_07:
188   <<: *build_examples_template
189
190
191 build_docs:
192   stage: build
193   image: $CI_DOCKER_REGISTRY/esp32-ci-env
194   tags:
195     - build_docs
196   artifacts:
197     when: always
198     paths:
199       - docs/doxygen-warning-log.txt
200       - docs/sphinx-warning-log.txt
201       - docs/sphinx-warning-log-sanitized.txt
202       - docs/_build/html
203     expire_in: 1 mos
204   script:
205     - cd docs
206     - doxygen
207     # If there are Doxygen warnings, print them and bail out
208     - test $(cat doxygen-warning-log.txt | wc -l) -eq 0 || ( echo "Doxygen pass had some warnings:" && cat doxygen-warning-log.txt && false )
209     - make gh-linkcheck
210     - make html
211     - ./check_doc_warnings.sh
212
213 test_nvs_on_host:
214   stage: test
215   image: $CI_DOCKER_REGISTRY/esp32-ci-env
216   tags:
217     - nvs_host_test
218   dependencies: []
219   script:
220     - cd components/nvs_flash/test_nvs_host
221     - make test
222
223 test_partition_table_on_host:
224   stage: test
225   image: $CI_DOCKER_REGISTRY/esp32-ci-env
226   tags:
227     - build
228   dependencies: []
229   script:
230     - cd components/partition_table/test_gen_esp32part_host
231     - ./gen_esp32part_tests.py
232
233 test_wl_on_host:
234   stage: test
235   image: $CI_DOCKER_REGISTRY/esp32-ci-env
236   tags:
237     - wl_host_test
238   artifacts:
239     paths:
240       - components/wear_levelling/test_wl_host/coverage_report.zip
241   dependencies: []
242   script:
243     - cd components/wear_levelling/test_wl_host
244     - make test
245
246 test_multi_heap_on_host:
247   stage: test
248   image: $CI_DOCKER_REGISTRY/esp32-ci-env
249   tags:
250     - wl_host_test
251   script:
252     - cd components/heap/test_multi_heap_host
253     - make test
254
255 test_build_system:
256   stage: test
257   image: $CI_DOCKER_REGISTRY/esp32-ci-env
258   tags:
259     - build_test
260   dependencies: []
261   script:
262     - ${IDF_PATH}/tools/ci/test_configure_ci_environment.sh
263     - rm -rf test_build_system
264     - mkdir test_build_system
265     - cd test_build_system
266     - ${IDF_PATH}/tools/ci/test_build_system.sh
267
268 test_report:
269   stage: test_report
270   image: $CI_DOCKER_REGISTRY/esp32-ci-env
271   tags:
272     - report
273   only:
274     - master
275     - triggers
276     - /^release\/v/
277     - /^v\d+\.\d+(\.\d+)?($|-)/
278   variables:
279     LOG_PATH: "$CI_PROJECT_DIR/$CI_COMMIT_SHA"
280     TEST_CASE_FILE_PATH: "$CI_PROJECT_DIR/components/idf_test"
281     REPORT_PATH: "$CI_PROJECT_DIR/CI_Test_Report"
282     MODULE_UPDATE_FILE: "$CI_PROJECT_DIR/tools/unit-test-app/tools/ModuleDefinition.yml"
283   #dependencies:
284   #We need all UT* and IT* artifacts except for only a few other
285   artifacts:
286     when: always
287     paths:
288       - $REPORT_PATH
289       - $LOG_PATH
290     expire_in: 12 mos
291   script:
292     # calc log path
293     - VER_NUM=`git rev-list HEAD | wc -l | awk '{print $1}'`
294     - SHA_ID=`echo $CI_COMMIT_SHA | cut -c 1-7`
295     - REVISION="${VER_NUM}_${SHA_ID}"
296     # replace / to _ in branch name
297     - ESCAPED_BRANCH_NAME=`echo $CI_COMMIT_REF_NAME | sed 's/\//___/g'`
298     # result path and artifacts path
299     - RESULT_PATH="$CI_PROJECT_NAME/$ESCAPED_BRANCH_NAME/$REVISION"
300     - ARTIFACTS_PATH="$GITLAB_HTTP_SERVER/idf/esp-idf/builds/$CI_JOB_ID/artifacts/browse/$CI_COMMIT_SHA"
301     # clone test bench
302     - git clone $GITLAB_SSH_SERVER/yinling/auto_test_script.git
303     - cd auto_test_script
304     - python $CHECKOUT_REF_SCRIPT auto_test_script
305     # generate report
306     - TEST_RESULT=Pass
307     - 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
308     # commit to CI-test-result project
309     - git clone $GITLAB_SSH_SERVER/qa/CI-test-result.git
310     - rm -rf "CI-test-result/RawData/$RESULT_PATH"
311     - cp -R $CI_PROJECT_NAME CI-test-result/RawData
312     - cd CI-test-result
313     # config git user
314     - git config --global user.email "ci-test-result@espressif.com"
315     - git config --global user.name "ci-test-result"
316     # commit test result
317     - git add .
318     - git commit . -m "update test result for $CI_PROJECT_NAME/$CI_COMMIT_REF_NAME/$CI_COMMIT_SHA, pipeline ID $CI_PIPELINE_ID" || exit 0
319     - git push origin master
320     - test "${TEST_RESULT}" = "Pass" || exit 1
321
322 push_master_to_github:
323   stage: deploy
324   image: $CI_DOCKER_REGISTRY/esp32-ci-env
325   tags:
326     - deploy
327   only:
328     - master
329     - /^release\/v/
330     - /^v\d+\.\d+(\.\d+)?($|-)/
331   when: on_success
332   dependencies: []
333   variables:
334     GITHUB_PUSH_REFS: refs/remotes/origin/release refs/remotes/origin/master
335   before_script: *do_nothing_before
336   script:
337     - mkdir -p ~/.ssh
338     - chmod 700 ~/.ssh
339     - echo -n $GH_PUSH_KEY > ~/.ssh/id_rsa_base64
340     - base64 --decode --ignore-garbage ~/.ssh/id_rsa_base64 > ~/.ssh/id_rsa
341     - chmod 600 ~/.ssh/id_rsa
342     - echo -e "Host github.com\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
343     - git remote remove github &>/dev/null || true
344     - git remote add github git@github.com:espressif/esp-idf.git
345     # What the next line of script does: goes through the list of refs for all branches we push to github,
346     # generates a snippet of shell which is evaluated. The snippet checks CI_COMMIT_SHA against the SHA
347     # (aka objectname) at tip of each branch, and if any SHAs match then it checks out the local branch
348     # and then pushes that ref to a corresponding github branch
349     - eval $(git for-each-ref --shell bash --format 'if [ $CI_COMMIT_SHA == %(objectname) ]; then git checkout -B %(refname:strip=3); git push --follow-tags github %(refname:strip=3); fi;' $GITHUB_PUSH_REFS)
350
351
352 deploy_docs:
353   stage: deploy
354   image: $CI_DOCKER_REGISTRY/esp32-ci-env
355   tags:
356     - deploy
357   only:
358    - master
359    - /^release\/v/
360    - /^v\d+\.\d+(\.\d+)?($|-)/
361    - triggers
362   dependencies:
363     - build_docs
364   before_script: *do_nothing_before
365   script:
366     - mkdir -p ~/.ssh
367     - chmod 700 ~/.ssh
368     - echo -n $DOCS_DEPLOY_KEY > ~/.ssh/id_rsa_base64
369     - base64 --decode --ignore-garbage ~/.ssh/id_rsa_base64 > ~/.ssh/id_rsa
370     - chmod 600 ~/.ssh/id_rsa
371     - echo -e "Host $DOCS_SERVER\n\tStrictHostKeyChecking no\n\tUser $DOCS_SERVER_USER\n" >> ~/.ssh/config
372     - export GIT_VER=$(git describe --always)
373     - cd docs/_build/
374     - mv html $GIT_VER
375     - tar czvf $GIT_VER.tar.gz $GIT_VER
376     - scp $GIT_VER.tar.gz $DOCS_SERVER:$DOCS_PATH
377     - ssh $DOCS_SERVER -x "cd $DOCS_PATH && tar xzvf $GIT_VER.tar.gz && rm -f latest && ln -s $GIT_VER latest"
378
379 check_doc_links:
380   stage: test
381   image: $CI_DOCKER_REGISTRY/esp32-ci-env
382   tags:
383     - check_doc_links
384   only:
385     # can only be triggered
386     - triggers
387   artifacts:
388     paths:
389       - docs/_build/linkcheck
390     expire_in: 1 mos
391   script:
392     # must be triggered with CHECK_LINKS=Yes, otherwise exit without test
393     - test "$CHECK_LINKS" = "Yes" || exit 0
394     # can only run on master branch (otherwise the commit is not on Github yet)
395     - test "${CI_COMMIT_REF_NAME}" = "master" || exit 0
396     - cd docs
397     - make linkcheck
398
399 check_commit_msg:
400   stage: deploy
401   image: $CI_DOCKER_REGISTRY/esp32-ci-env
402   tags:
403     - build
404   except:
405     - master
406     - /^release\/v/
407     - /^v\d+\.\d+(\.\d+)?($|-)/
408   dependencies: []
409   before_script: *do_nothing_before
410   script:
411     - git status
412     - git log -n10 --oneline
413     # commit start with "WIP: " need to be squashed before merge
414     - 'git log --pretty=%s master.. -- | grep "^WIP: " && exit 1 || exit 0'
415
416 check_submodule_sync:
417   stage: deploy
418   image: $CI_DOCKER_REGISTRY/esp32-ci-env
419   tags:
420     - build
421   except:
422     - master
423     - /^release\/v/
424     - /^v\d+\.\d+(\.\d+)?($|-)/
425   dependencies: []
426   variables:
427     GIT_STRATEGY: clone
428   before_script: *do_nothing_before
429   script:
430     # check if all submodules are correctly synced to public repostory
431     - git submodule update --init --recursive
432
433 assign_test:
434   <<: *build_template
435   stage: assign_test
436   # gitlab ci do not support match job with RegEx or wildcard now in dependencies.
437   # we have a lot build example jobs. now we don't use dependencies, just download all artificats of build stage.
438   variables:
439     UT_BIN_PATH: "tools/unit-test-app/output"
440     OUTPUT_BIN_PATH: "test_bins/ESP32_IDF"
441     TEST_FW_PATH: "$CI_PROJECT_DIR/tools/tiny-test-fw"
442     EXAMPLE_CONFIG_OUTPUT_PATH: "$CI_PROJECT_DIR/examples/test_configs"
443   artifacts:
444     paths:
445       - test_bins
446       - components/idf_test/*/CIConfigs
447       - components/idf_test/*/TC.sqlite
448       - $EXAMPLE_CONFIG_OUTPUT_PATH
449     expire_in: 1 mos
450   before_script: *add_gitlab_key_before
451   script:
452     # first move test bins together: test_bins/CHIP_SDK/TestApp/bin_files
453     - mkdir -p $OUTPUT_BIN_PATH
454     # copy and rename folder name to "UT_config"
455     - for CONFIG in $(ls $UT_BIN_PATH); do cp -r "$UT_BIN_PATH/$CONFIG" "$OUTPUT_BIN_PATH/UT_$CONFIG"; done
456     - cp -r SSC/ssc_bin/* $OUTPUT_BIN_PATH
457     # assign example tests
458     - python $TEST_FW_PATH/CIAssignExampleTest.py $IDF_PATH/examples $IDF_PATH/.gitlab-ci.yml $EXAMPLE_CONFIG_OUTPUT_PATH
459     # clone test script to assign tests
460     - git clone $TEST_SCRIPT_REPOSITORY
461     - cd auto_test_script
462     - python $CHECKOUT_REF_SCRIPT auto_test_script
463     # assign unit test cases
464     - python CIAssignTestCases.py -t $IDF_PATH/components/idf_test/unit_test -c $IDF_PATH/.gitlab-ci.yml -b $IDF_PATH/test_bins
465     # assgin integration test cases
466     - python CIAssignTestCases.py -t $IDF_PATH/components/idf_test/integration_test -c $IDF_PATH/.gitlab-ci.yml -b $IDF_PATH/test_bins
467
468 .example_test_template: &example_test_template
469   stage: test
470   when: on_success
471   only:
472     - master
473     - /^release\/v/
474     - /^v\d+\.\d+(\.\d+)?($|-)/
475     - triggers
476   # gitlab ci do not support match job with RegEx or wildcard now in dependencies.
477   # we have a lot build example jobs and the binaries them exceed the limitation of artifacts.
478   # we can't artifact them in one job. For example test jobs, download all artifacts from previous stages.
479   artifacts:
480     when: always
481     paths:
482       - $LOG_PATH
483     expire_in: 6 mos
484   variables:
485     TEST_FW_PATH: "$CI_PROJECT_DIR/tools/tiny-test-fw"
486     TEST_CASE_PATH: "$CI_PROJECT_DIR/examples"
487     CONFIG_FILE: "$CI_PROJECT_DIR/examples/test_configs/$CI_JOB_NAME.yml"
488     LOG_PATH: "$CI_PROJECT_DIR/TEST_LOGS"
489   script:
490     # first test if config file exists, if not exist, exit 0
491     - test -e $CONFIG_FILE || exit 0
492     - cd $TEST_FW_PATH
493     # run test
494     - python Runner.py $TEST_CASE_PATH -c $CONFIG_FILE
495
496 .test_template: &test_template
497   stage: test
498   when: on_success
499   only:
500     - master
501     - /^release\/v/
502     - /^v\d+\.\d+(\.\d+)?($|-)/
503     - triggers
504   allow_failure: true
505   dependencies:
506     - assign_test
507   artifacts:
508     when: always
509     paths:
510       - $LOG_PATH
511     expire_in: 6 mos
512   variables:
513     LOCAL_ENV_CONFIG_PATH: "$CI_PROJECT_DIR/ci-test-runner-configs/$CI_RUNNER_DESCRIPTION/ESP32_IDF"
514     LOG_PATH: "$CI_PROJECT_DIR/$CI_COMMIT_SHA"
515     TEST_CASE_FILE_PATH: "$CI_PROJECT_DIR/components/idf_test/integration_test"
516     MODULE_UPDATE_FILE: "$CI_PROJECT_DIR/components/idf_test/ModuleDefinition.yml"
517     CONFIG_FILE: "$CI_PROJECT_DIR/components/idf_test/integration_test/CIConfigs/$CI_JOB_NAME.yml"
518   before_script: *add_gitlab_key_before
519   script:
520     # first test if config file exists, if not exist, exit 0
521     - test -e $CONFIG_FILE || exit 0
522     # clone local test env configs
523     - git clone $TEST_ENV_CONFIG_REPOSITORY
524     - cd ci-test-runner-configs
525     - python $CHECKOUT_REF_SCRIPT ci-test-runner-configs
526     # clone test bench
527     - git clone $TEST_SCRIPT_REPOSITORY
528     - cd auto_test_script
529     - python $CHECKOUT_REF_SCRIPT auto_test_script
530     # run test
531     - python CIRunner.py -l "$LOG_PATH/$CI_JOB_NAME" -c $CONFIG_FILE -e $LOCAL_ENV_CONFIG_PATH -t $TEST_CASE_FILE_PATH -m $MODULE_UPDATE_FILE
532
533 # template for unit test jobs
534 .unit_test_template: &unit_test_template
535   <<: *test_template
536   allow_failure: false
537   stage: unit_test
538   variables:
539     LOCAL_ENV_CONFIG_PATH: "$CI_PROJECT_DIR/ci-test-runner-configs/$CI_RUNNER_DESCRIPTION/ESP32_IDF"
540     LOG_PATH: "$CI_PROJECT_DIR/$CI_COMMIT_SHA"
541     TEST_CASE_FILE_PATH: "$CI_PROJECT_DIR/components/idf_test/unit_test"
542     MODULE_UPDATE_FILE: "$CI_PROJECT_DIR/components/idf_test/ModuleDefinition.yml"
543     CONFIG_FILE: "$CI_PROJECT_DIR/components/idf_test/unit_test/CIConfigs/$CI_JOB_NAME.yml"
544
545 nvs_compatible_test:
546   <<: *test_template
547   artifacts:
548     when: always
549     paths:
550       - $LOG_PATH
551       - nvs_wifi.bin
552     expire_in: 6 mos
553   tags:
554     - ESP32_IDF
555     - NVS_Compatible
556   script:
557     # clone local test env configs
558     - git clone $TEST_ENV_CONFIG_REPOSITORY
559     - cd ci-test-runner-configs
560     - python $CHECKOUT_REF_SCRIPT ci-test-runner-configs
561     # clone test bench
562     - git clone $TEST_SCRIPT_REPOSITORY
563     - cd auto_test_script
564     - git checkout ${CI_COMMIT_REF_NAME} || echo "Using default branch..."
565     # prepare nvs bins
566     - ./Tools/prepare_nvs_bin.sh
567     # run test
568     - python CIRunner.py -l "$LOG_PATH/$CI_JOB_NAME" -c $CONFIG_FILE -e $LOCAL_ENV_CONFIG_PATH -t $TEST_CASE_FILE_PATH -m $MODULE_UPDATE_FILE
569
570 example_test_001_01:
571   <<: *example_test_template
572   tags:
573     - ESP32
574     - Example_WIFI
575
576 UT_001_01:
577   <<: *unit_test_template
578   tags:
579     - ESP32_IDF
580     - UT_T1_1
581     - UT_default
582
583 UT_001_02:
584   <<: *unit_test_template
585   tags:
586     - ESP32_IDF
587     - UT_T1_1
588     - UT_default
589
590 UT_001_03:
591   <<: *unit_test_template
592   tags:
593     - ESP32_IDF
594     - UT_T1_1
595     - UT_default
596
597 UT_001_04:
598   <<: *unit_test_template
599   tags:
600     - ESP32_IDF
601     - UT_T1_1
602     - UT_default
603
604 UT_001_05:
605   <<: *unit_test_template
606   tags:
607     - ESP32_IDF
608     - UT_T1_SDMODE
609     - UT_default
610
611 UT_001_06:
612   <<: *unit_test_template
613   tags:
614     - ESP32_IDF
615     - UT_T1_SPIMODE
616     - UT_default
617
618 UT_001_07:
619   <<: *unit_test_template
620   tags:
621     - ESP32_IDF
622     - UT_T1_1
623     - UT_default
624
625 UT_001_08:
626   <<: *unit_test_template
627   tags:
628     - ESP32_IDF
629     - UT_T1_1
630     - UT_default
631
632 UT_001_09:
633   <<: *unit_test_template
634   tags:
635     - ESP32_IDF
636     - UT_T1_1
637     - UT_default
638
639 UT_002_01:
640   <<: *unit_test_template
641   tags:
642     - ESP32_IDF
643     - UT_T1_1
644     - UT_release
645
646 UT_002_02:
647   <<: *unit_test_template
648   tags:
649     - ESP32_IDF
650     - UT_T1_1
651     - UT_release
652
653 UT_002_03:
654   <<: *unit_test_template
655   tags:
656     - ESP32_IDF
657     - UT_T1_1
658     - UT_release
659
660 UT_002_04:
661   <<: *unit_test_template
662   tags:
663     - ESP32_IDF
664     - UT_T1_1
665     - UT_release
666
667 UT_002_05:
668   <<: *unit_test_template
669   tags:
670     - ESP32_IDF
671     - UT_T1_SDMODE
672     - UT_release
673
674 UT_002_06:
675   <<: *unit_test_template
676   tags:
677     - ESP32_IDF
678     - UT_T1_SPIMODE
679     - UT_release
680
681 UT_002_07:
682   <<: *unit_test_template
683   tags:
684     - ESP32_IDF
685     - UT_T1_1
686     - UT_release
687
688 UT_002_08:
689   <<: *unit_test_template
690   tags:
691     - ESP32_IDF
692     - UT_T1_1
693     - UT_release
694
695 UT_002_09:
696   <<: *unit_test_template
697   tags:
698     - ESP32_IDF
699     - UT_T1_1
700     - UT_release
701
702 UT_003_01:
703   <<: *unit_test_template
704   tags:
705     - ESP32_IDF
706     - UT_T1_1
707     - UT_single_core
708
709 UT_003_02:
710   <<: *unit_test_template
711   tags:
712     - ESP32_IDF
713     - UT_T1_1
714     - UT_single_core
715
716 UT_003_03:
717   <<: *unit_test_template
718   tags:
719     - ESP32_IDF
720     - UT_T1_1
721     - UT_single_core
722
723 UT_003_04:
724   <<: *unit_test_template
725   tags:
726     - ESP32_IDF
727     - UT_T1_1
728     - UT_single_core
729
730 UT_003_05:
731   <<: *unit_test_template
732   tags:
733     - ESP32_IDF
734     - UT_T1_SDMODE
735     - UT_single_core
736
737 UT_003_06:
738   <<: *unit_test_template
739   tags:
740     - ESP32_IDF
741     - UT_T1_SPIMODE
742     - UT_single_core
743
744 UT_003_07:
745   <<: *unit_test_template
746   tags:
747     - ESP32_IDF
748     - UT_T1_1
749     - UT_single_core
750
751 UT_003_08:
752   <<: *unit_test_template
753   tags:
754     - ESP32_IDF
755     - UT_T1_1
756     - UT_single_core
757
758 UT_003_09:
759   <<: *unit_test_template
760   tags:
761     - ESP32_IDF
762     - UT_T1_1
763     - UT_single_core
764
765 UT_004_01:
766   <<: *unit_test_template
767   tags:
768     - ESP32_IDF
769     - UT_T1_1
770     - UT_psram
771
772 UT_004_02:
773   <<: *unit_test_template
774   tags:
775     - ESP32_IDF
776     - UT_T1_1
777     - UT_psram
778
779 UT_004_03:
780   <<: *unit_test_template
781   tags:
782     - ESP32_IDF
783     - UT_T1_1
784     - UT_psram
785
786 UT_004_04:
787   <<: *unit_test_template
788   tags:
789     - ESP32_IDF
790     - UT_T1_1
791     - UT_psram
792
793 UT_004_05:
794   <<: *unit_test_template
795   tags:
796     - ESP32_IDF
797     - UT_T1_SDMODE
798     - UT_psram
799
800 UT_004_06:
801   <<: *unit_test_template
802   tags:
803     - ESP32_IDF
804     - UT_T1_SPIMODE
805     - UT_psram
806
807 UT_004_07:
808   <<: *unit_test_template
809   tags:
810     - ESP32_IDF
811     - UT_T1_1
812     - UT_psram
813
814 UT_004_08:
815   <<: *unit_test_template
816   tags:
817     - ESP32_IDF
818     - UT_T1_1
819     - UT_psram
820
821 UT_004_09:
822   <<: *unit_test_template
823   tags:
824     - ESP32_IDF
825     - UT_T1_1
826     - UT_psram
827
828 IT_001_01:
829   <<: *test_template
830   tags:
831     - ESP32_IDF
832     - SSC_T1_1
833
834 IT_001_02:
835   <<: *test_template
836   tags:
837     - ESP32_IDF
838     - SSC_T1_1
839
840 IT_001_03:
841   <<: *test_template
842   tags:
843     - ESP32_IDF
844     - SSC_T1_1
845
846 IT_001_04:
847   <<: *test_template
848   tags:
849     - ESP32_IDF
850     - SSC_T1_1
851
852 IT_001_05:
853   <<: *test_template
854   tags:
855     - ESP32_IDF
856     - SSC_T1_1
857
858 IT_001_06:
859   <<: *test_template
860   tags:
861     - ESP32_IDF
862     - SSC_T1_1
863
864 IT_001_07:
865   <<: *test_template
866   tags:
867     - ESP32_IDF
868     - SSC_T1_1
869
870 IT_001_08:
871   <<: *test_template
872   tags:
873     - ESP32_IDF
874     - SSC_T1_1
875
876 IT_001_09:
877   <<: *test_template
878   tags:
879     - ESP32_IDF
880     - SSC_T1_1
881
882 IT_002_01:
883   <<: *test_template
884   tags:
885     - ESP32_IDF
886     - SSC_T1_2
887
888 IT_003_01:
889   <<: *test_template
890   tags:
891     - ESP32_IDF
892     - SSC_T2_1
893
894 IT_003_02:
895   <<: *test_template
896   tags:
897     - ESP32_IDF
898     - SSC_T2_1
899
900 IT_003_03:
901   <<: *test_template
902   tags:
903     - ESP32_IDF
904     - SSC_T2_1
905
906 IT_003_04:
907   <<: *test_template
908   tags:
909     - ESP32_IDF
910     - SSC_T2_1
911
912 IT_003_05:
913   <<: *test_template
914   tags:
915     - ESP32_IDF
916     - SSC_T2_1
917
918 IT_003_06:
919   <<: *test_template
920   tags:
921     - ESP32_IDF
922     - SSC_T2_1
923
924 IT_003_07:
925   <<: *test_template
926   tags:
927     - ESP32_IDF
928     - SSC_T2_1
929
930 IT_004_01:
931   <<: *test_template
932   tags:
933     - ESP32_IDF
934     - SSC_T1_APC
935
936 IT_005_01:
937   <<: *test_template
938   tags:
939     - ESP32_IDF
940     - SSC_T1_WEP
941
942 IT_006_01:
943   <<: *test_template
944   tags:
945     - ESP32_IDF
946     - SSC_T3_PhyMode
947
948 IT_007_01:
949   <<: *test_template
950   tags:
951     - ESP32_IDF
952     - SSC_T2_PhyMode
953
954 IT_008_01:
955   <<: *test_template
956   tags:
957     - ESP32_IDF
958     - SSC_T2_PhyMode
959
960 IT_009_01:
961   <<: *test_template
962   tags:
963     - ESP32_IDF
964     - SSC_T1_3
965
966 IT_501_01:
967   <<: *test_template
968   tags:
969     - ESP32_IDF
970     - SSC_T1_1
971     - stress_test
972
973 IT_501_02:
974   <<: *test_template
975   tags:
976     - ESP32_IDF
977     - SSC_T1_1
978     - stress_test
979
980 IT_501_03:
981   <<: *test_template
982   tags:
983     - ESP32_IDF
984     - SSC_T1_1
985     - stress_test
986
987 IT_502_01:
988   <<: *test_template
989   tags:
990     - ESP32_IDF
991     - SSC_T2_1
992     - stress_test
993
994 IT_502_02:
995   <<: *test_template
996   tags:
997     - ESP32_IDF
998     - SSC_T2_1
999     - stress_test
1000
1001 IT_503_01:
1002   <<: *test_template
1003   tags:
1004     - ESP32_IDF
1005     - SSC_T5_1
1006     - stress_test
1007
1008 IT_503_02:
1009   <<: *test_template
1010   tags:
1011     - ESP32_IDF
1012     - SSC_T5_1
1013     - stress_test
1014
1015 IT_503_03:
1016   <<: *test_template
1017   tags:
1018     - ESP32_IDF
1019     - SSC_T5_1
1020     - stress_test