]> granicus.if.org Git - esp-idf/blob - .gitlab-ci.yml
Merge branch 'bugfix/fix_psram_eid' into 'master'
[esp-idf] / .gitlab-ci.yml
1 stages:
2   - build
3   - assign_test
4   - host_test
5   - target_test
6   - check
7   - deploy
8   - post_check
9
10 variables:
11 # System environment
12
13   # Common parameters for the 'make' during CI tests
14   MAKEFLAGS: "-j5 --no-keep-going"
15
16 # GitLab-CI environment
17
18   # more attempts for more robust
19   GET_SOURCES_ATTEMPTS: "10"
20   ARTIFACT_DOWNLOAD_ATTEMPTS: "10"
21
22   # We use get_sources.sh script to fetch the submodules and/or re-fetch the repo
23   # if it was corrupted (if submodule update fails this can happen)
24   GIT_STRATEGY: fetch
25   GIT_SUBMODULE_STRATEGY: none
26
27   UNIT_TEST_BUILD_SYSTEM: make
28 # IDF environment
29
30   IDF_PATH: "$CI_PROJECT_DIR"
31   BATCH_BUILD: "1"
32   V: "0"
33   APPLY_BOT_FILTER_SCRIPT: "$CI_PROJECT_DIR/tools/ci/apply_bot_filter.py"
34   CHECKOUT_REF_SCRIPT: "$CI_PROJECT_DIR/tools/ci/checkout_project_ref.py"
35
36 # Docker images
37   BOT_DOCKER_IMAGE_TAG: ":latest"
38
39 # When 'fetch' strategy is used, Gitlab removes untracked files before checking out
40 # new revision. However if the new revision doesn't include some of the submodules
41 # which were present in the old revision, such submodule directories would not be
42 # removed by the checkout. This extra step ensures that these stale submodules
43 # are removed.
44 .git_clean_stale_submodules:  &git_clean_stale_submodules >
45   find . -name '.git' -not -path './.git' -printf '%P\n'
46   | sed 's|/.git||'
47   | xargs -I {} sh -c '
48   grep -q {} .gitmodules
49   ||  (echo "Removing {}, has .git directory but not in .gitmodules file"
50   && rm -rf {});'
51
52 # before each job, we need to check if this job is filtered by bot stage/job filter
53 .apply_bot_filter: &apply_bot_filter
54   python $APPLY_BOT_FILTER_SCRIPT || exit 0
55
56 before_script:
57   - source tools/ci/setup_python.sh
58   - *git_clean_stale_submodules
59   # apply bot filter in before script
60   - *apply_bot_filter
61   # add gitlab ssh key
62   - mkdir -p ~/.ssh
63   - chmod 700 ~/.ssh
64   - echo -n $GITLAB_KEY > ~/.ssh/id_rsa_base64
65   - base64 --decode --ignore-garbage ~/.ssh/id_rsa_base64 > ~/.ssh/id_rsa
66   - chmod 600 ~/.ssh/id_rsa
67   - echo -e "Host gitlab.espressif.cn\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
68
69   # Set IS_PRIVATE or IS_PUBLIC depending on if our branch is public or not
70   #
71   # (the same regular expressions are used to set these are used in 'only:' sections below
72   - source tools/ci/configure_ci_environment.sh
73
74   # fetch the submodules (& if necessary re-fetch repo) from gitlab
75   - time ./tools/ci/get-full-sources.sh
76
77 # used for check scripts which we want to run unconditionally
78 .do_nothing_before_no_filter:
79   before_script: &do_nothing_before_no_filter
80     - source tools/ci/setup_python.sh
81     - *git_clean_stale_submodules
82
83 # used for everything else where we want to do no prep, except for bot filter
84 .do_nothing_before:
85   before_script: &do_nothing_before
86     - source tools/ci/setup_python.sh
87     - *git_clean_stale_submodules
88     # apply bot filter in before script
89     - *apply_bot_filter
90     - echo "Not setting up GitLab key, not fetching submodules"
91     - source tools/ci/configure_ci_environment.sh
92
93 .add_gitlab_key_before:
94   before_script: &add_gitlab_key_before
95     - source tools/ci/setup_python.sh
96     - *git_clean_stale_submodules
97     # apply bot filter in before script
98     - *apply_bot_filter
99     - echo "Not fetching submodules"
100     - source tools/ci/configure_ci_environment.sh
101     # add gitlab ssh key
102     - mkdir -p ~/.ssh
103     - chmod 700 ~/.ssh
104     - echo -n $GITLAB_KEY > ~/.ssh/id_rsa_base64
105     - base64 --decode --ignore-garbage ~/.ssh/id_rsa_base64 > ~/.ssh/id_rsa
106     - chmod 600 ~/.ssh/id_rsa
107     - echo -e "Host gitlab.espressif.cn\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
108
109 build_template_app:
110   stage: build
111   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
112   tags:
113     - build
114   variables:
115     BATCH_BUILD: "1"
116     IDF_CI_BUILD: "1"
117   only:
118     variables:
119       - $BOT_TRIGGER_WITH_LABEL == null
120       - $BOT_LABEL_BUILD
121       - $BOT_LABEL_REGULAR_TEST
122   script:
123     # Set the variable for 'esp-idf-template' testing
124     - ESP_IDF_TEMPLATE_GIT=${ESP_IDF_TEMPLATE_GIT:-"https://github.com/espressif/esp-idf-template.git"}
125     - git clone ${ESP_IDF_TEMPLATE_GIT}
126     - cd esp-idf-template
127     # Try to use the same branch name for esp-idf-template that we're
128     # using on esp-idf. If it doesn't exist then just stick to the default
129     # branch
130     - python $CHECKOUT_REF_SCRIPT esp-idf-template
131     - make defconfig
132     # Test debug build (default)
133     - make all V=1
134     # Now test release build
135     - make clean
136     - sed -i.bak -e's/CONFIG_OPTIMIZATION_LEVEL_DEBUG\=y/CONFIG_OPTIMIZATION_LEVEL_RELEASE=y/' sdkconfig
137     - make all V=1
138     # Check if there are any stray printf/ets_printf references in WiFi libs
139     - cd ../components/esp32/lib
140     - test $(xtensa-esp32-elf-nm *.a | grep -w printf | wc -l) -eq 0
141     - test $(xtensa-esp32-elf-nm *.a | grep -w ets_printf | wc -l) -eq 0
142
143
144 .build_template: &build_template
145   stage: build
146   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
147   tags:
148     - build
149   variables:
150     BATCH_BUILD: "1"
151     V: "0"
152
153 .build_ssc_template: &build_ssc_template
154   <<: *build_template
155   artifacts:
156     paths:
157       - SSC/ssc_bin
158     expire_in: 1 week
159   variables:
160     SSC_CONFIG_FOLDER: "$CI_PROJECT_DIR/SSC/configs/ESP32_IDF"
161   only:
162     variables:
163       - $BOT_TRIGGER_WITH_LABEL == null
164       - $BOT_LABEL_BUILD
165       - $BOT_LABEL_INTEGRATION_TEST
166       - $BOT_LABEL_REGULAR_TEST
167   script:
168     - git clone $SSC_REPOSITORY
169     - cd SSC
170     - python $CHECKOUT_REF_SCRIPT SSC
171     - MAKEFLAGS= ./ci_build_ssc.sh "${CI_JOB_NAME}" "${IDF_PATH}/.gitlab-ci.yml"
172
173 # don't forget to add to dependency to test_template when adding new build_ssc jobs
174 build_ssc_00:
175   <<: *build_ssc_template
176
177 build_ssc_01:
178   <<: *build_ssc_template
179
180 build_ssc_02:
181   <<: *build_ssc_template
182
183 # If you want to add new build ssc jobs, please add it into dependencies of `assign_test` and `.test_template`
184
185
186 .build_esp_idf_unit_test_template: &build_esp_idf_unit_test_template
187   <<: *build_template
188   artifacts:
189     paths:
190       - tools/unit-test-app/output
191       - components/idf_test/unit_test/TestCaseAll.yml
192     expire_in: 2 days
193   only:
194     variables:
195       - $BOT_TRIGGER_WITH_LABEL == null
196       - $BOT_LABEL_BUILD
197       - $BOT_LABEL_UNIT_TEST
198       - $BOT_LABEL_REGULAR_TEST
199
200 build_esp_idf_tests_make:
201   <<: *build_esp_idf_unit_test_template
202   script:
203     - export EXTRA_CFLAGS=${PEDANTIC_CFLAGS}
204     - export EXTRA_CXXFLAGS=${EXTRA_CFLAGS}
205     - cd $CI_PROJECT_DIR/tools/unit-test-app
206     - MAKEFLAGS= make help # make sure kconfig tools are built in single process
207     - make ut-clean-all-configs
208     - make ut-build-all-configs
209     - python tools/UnitTestParser.py
210     # Check if the tests demand Make built binaries. If not, delete them
211     - if [ "$UNIT_TEST_BUILD_SYSTEM" == "make" ]; then exit 0; fi
212     - rm -rf builds output sdkconfig
213     - rm -rf components/idf_test/unit_test/TestCaseAll.yml
214     - rm -rf components/idf_test/unit_test/CIConfigs/*.yml
215
216 build_esp_idf_tests_cmake:
217   <<: *build_esp_idf_unit_test_template
218   script:
219     - export PATH="$IDF_PATH/tools:$PATH"
220     - export EXTRA_CFLAGS=${PEDANTIC_CFLAGS}
221     - export EXTRA_CXXFLAGS=${EXTRA_CFLAGS}
222     - cd $CI_PROJECT_DIR/tools/unit-test-app
223     - idf.py ut-clean-all-configs
224     - idf.py ut-build-all-configs
225     - python tools/UnitTestParser.py
226     # Check if the tests demand CMake built binaries. If not, delete them
227     - if [ "$UNIT_TEST_BUILD_SYSTEM" == "cmake" ]; then exit 0; fi
228     - rm -rf builds output sdkconfig
229     - rm -rf components/idf_test/unit_test/TestCaseAll.yml
230     - rm -rf components/idf_test/unit_test/CIConfigs/*.yml
231
232 .build_examples_make_template: &build_examples_make_template
233   <<: *build_template
234   # This is a workaround for a rarely encountered issue with building examples in CI.
235   # Probably related to building of Kconfig in 'make clean' stage
236   retry: 1
237   artifacts:
238     when: always
239     paths:
240       - build_examples/*/*/*/build/*.bin
241       - build_examples/*/*/*/sdkconfig
242       - build_examples/*/*/*/build/*.elf
243       - build_examples/*/*/*/build/*.map
244       - build_examples/*/*/*/build/download.config
245       - build_examples/*/*/*/build/bootloader/*.bin
246       - $LOG_PATH
247     expire_in: 2 days
248   variables:
249     IDF_CI_BUILD: "1"
250     LOG_PATH: "$CI_PROJECT_DIR/log_examples_make"
251   only:
252     variables:
253       - $BOT_TRIGGER_WITH_LABEL == null
254       - $BOT_LABEL_BUILD
255       - $BOT_LABEL_EXAMPLE_TEST
256       - $BOT_LABEL_REGULAR_TEST
257   script:
258     # it's not possible to build 100% out-of-tree and have the "artifacts"
259     # mechanism work, but this is the next best thing
260     - rm -rf build_examples
261     - mkdir build_examples
262     - cd build_examples
263     # build some of examples
264     - mkdir -p ${LOG_PATH}
265     - ${IDF_PATH}/tools/ci/build_examples.sh "${CI_JOB_NAME}"
266
267 # same as above, but for CMake
268 .build_examples_cmake_template: &build_examples_cmake_template
269   <<: *build_template
270   artifacts:
271     when: always
272     paths:
273       - build_examples_cmake/*/*/*/build/*.bin
274       - build_examples_cmake/*/*/*/sdkconfig
275       - build_examples_cmake/*/*/*/build/*.elf
276       - build_examples_cmake/*/*/*/build/*.map
277       - build_examples_cmake/*/*/*/build/download.config
278       - build_examples_cmake/*/*/*/build/bootloader/*.bin
279       - $LOG_PATH
280     expire_in: 2 days
281   variables:
282     IDF_CI_BUILD: "1"
283     LOG_PATH: "$CI_PROJECT_DIR/log_examples_cmake"
284   only:
285     variables:
286       - $BOT_TRIGGER_WITH_LABEL == null
287       - $BOT_LABEL_BUILD
288       - $BOT_LABEL_EXAMPLE_TEST
289       - $BOT_LABEL_REGULAR_TEST
290   script:
291     # it's not possible to build 100% out-of-tree and have the "artifacts"
292     # mechanism work, but this is the next best thing
293     - rm -rf build_examples_cmake
294     - mkdir build_examples_cmake
295     - cd build_examples_cmake
296     # build some of examples
297     - mkdir -p ${LOG_PATH}
298     - ${IDF_PATH}/tools/ci/build_examples_cmake.sh "${CI_JOB_NAME}"
299
300 build_examples_make_00:
301   <<: *build_examples_make_template
302
303 build_examples_make_01:
304   <<: *build_examples_make_template
305
306 build_examples_make_02:
307   <<: *build_examples_make_template
308
309 build_examples_make_03:
310   <<: *build_examples_make_template
311
312 build_examples_make_04:
313   <<: *build_examples_make_template
314
315 build_examples_make_05:
316   <<: *build_examples_make_template
317
318 build_examples_make_06:
319   <<: *build_examples_make_template
320
321 build_examples_make_07:
322   <<: *build_examples_make_template
323
324 build_examples_cmake_00:
325   <<: *build_examples_cmake_template
326
327 build_examples_cmake_01:
328   <<: *build_examples_cmake_template
329
330 build_examples_cmake_02:
331   <<: *build_examples_cmake_template
332
333 build_examples_cmake_03:
334   <<: *build_examples_cmake_template
335
336 build_examples_cmake_04:
337   <<: *build_examples_cmake_template
338
339 build_examples_cmake_05:
340   <<: *build_examples_cmake_template
341
342 build_examples_cmake_06:
343   <<: *build_examples_cmake_template
344
345 build_examples_cmake_07:
346   <<: *build_examples_cmake_template
347
348 # If you want to add new build example jobs, please add it into dependencies of `.example_test_template`
349
350 build_docs:
351   stage: build
352   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
353   tags:
354     - build_docs
355   artifacts:
356     when: always
357     paths:
358       # English version of documentation
359       - docs/en/doxygen-warning-log.txt
360       - docs/en/sphinx-warning-log.txt
361       - docs/en/sphinx-warning-log-sanitized.txt
362       - docs/en/_build/html
363       - docs/sphinx-err-*
364       # Chinese version of documentation
365       - docs/zh_CN/doxygen-warning-log.txt
366       - docs/zh_CN/sphinx-warning-log.txt
367       - docs/zh_CN/sphinx-warning-log-sanitized.txt
368       - docs/zh_CN/_build/html
369     expire_in: 1 day
370   only:
371     variables:
372       - $BOT_TRIGGER_WITH_LABEL == null
373       - $BOT_LABEL_BUILD
374       - $BOT_LABEL_BUILD_DOCS
375       - $BOT_LABEL_REGULAR_TEST
376   script:
377     - cd docs
378     - ./check_lang_folder_sync.sh
379     - cd en
380     - make gh-linkcheck
381     - make html
382     - ../check_doc_warnings.sh
383     - cd ../zh_CN
384     - make gh-linkcheck
385     - make html
386     - ../check_doc_warnings.sh
387
388 .check_job_template: &check_job_template
389   stage: check
390   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
391   tags:
392     - host_test
393   dependencies: []
394   before_script: *do_nothing_before_no_filter
395
396 verify_cmake_style:
397   <<: *check_job_template
398   stage: build
399   only:
400     variables:
401       - $BOT_TRIGGER_WITH_LABEL == null
402       - $BOT_LABEL_BUILD
403       - $BOT_LABEL_REGULAR_TEST
404   script:
405     tools/cmake/run_cmake_lint.sh
406
407 .host_test_template: &host_test_template
408   stage: host_test
409   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
410   tags:
411     - host_test
412   dependencies: []
413   only:
414     variables:
415       - $BOT_TRIGGER_WITH_LABEL == null
416       - $BOT_LABEL_HOST_TEST
417       - $BOT_LABEL_REGULAR_TEST
418
419 test_nvs_on_host:
420   <<: *host_test_template
421   script:
422     - cd components/nvs_flash/test_nvs_host
423     - make test
424
425 test_nvs_coverage:
426   <<: *host_test_template
427   artifacts:
428     paths:
429       - components/nvs_flash/test_nvs_host/coverage_report
430     expire_in: 1 week
431   only:
432     refs:
433       - triggers
434     variables:
435       - $BOT_LABEL_NVS_COVERAGE
436   script:
437     - cd components/nvs_flash/test_nvs_host
438     - make coverage_report
439
440 test_partition_table_on_host:
441   <<: *host_test_template
442   tags:
443     - build
444   script:
445     - cd components/partition_table/test_gen_esp32part_host
446     - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh ./gen_esp32part_tests.py
447
448 test_wl_on_host:
449   <<: *host_test_template
450   artifacts:
451     paths:
452       - components/wear_levelling/test_wl_host/coverage_report.zip
453     expire_in: 1 week
454   script:
455     - cd components/wear_levelling/test_wl_host
456     - make test
457
458 test_fatfs_on_host:
459   <<: *host_test_template
460   script:
461     - cd components/fatfs/test_fatfs_host/
462     - make test
463
464 test_ldgen_on_host:
465   <<: *host_test_template
466   script:
467     - cd tools/ldgen/test
468     - ./test_fragments.py
469     - ./test_generation.py
470
471 .host_fuzzer_test_template: &host_fuzzer_test_template
472   stage: host_test
473   image: $CI_DOCKER_REGISTRY/afl-fuzzer-test
474   tags:
475     - host_test
476   dependencies: []
477   artifacts:
478     when: always
479     paths:
480       - ${FUZZER_TEST_DIR}/out/crashes
481       - ${FUZZER_TEST_DIR}/fuzz_output.log
482     expire_in: 1 week
483   only:
484     refs:
485       # can only be triggered
486       - triggers
487     variables:
488       - $BOT_LABEL_FUZZER_TEST
489   script:
490     - export AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES=1 && export AFL_SKIP_CPUFREQ=1
491     - cd ${FUZZER_TEST_DIR}
492     # run AFL fuzzer for one hour
493     - ( ( make ${FUZZER_PARAMS} fuzz | tee fuzz_output.log | grep -v '\(Fuzzing test case\|Entering queue cycle\)' ) || pkill sleep ) &
494     - ( sleep 3600 || mkdir -p out/crashes/env_failed ) && pkill afl-fuz
495     # check no crashes found
496     - test -z "$(ls out/crashes/)" || exit 1
497
498 test_mdns_fuzzer_on_host:
499   <<: *host_fuzzer_test_template
500   variables:
501     BOT_NEEDS_TRIGGER_BY_NAME: 1
502     FUZZER_TEST_DIR: components/mdns/test_afl_fuzz_host
503
504 test_lwip_dns_fuzzer_on_host:
505   <<: *host_fuzzer_test_template
506   variables:
507     BOT_NEEDS_TRIGGER_BY_NAME: 1
508     FUZZER_TEST_DIR: components/lwip/test_afl_host
509     FUZZER_PARAMS: MODE=dns
510
511 test_lwip_dhcp_fuzzer_on_host:
512   <<: *host_fuzzer_test_template
513   variables:
514     BOT_NEEDS_TRIGGER_BY_NAME: 1
515     FUZZER_TEST_DIR: components/lwip/test_afl_host
516     FUZZER_PARAMS: MODE=dhcp_client
517
518 test_lwip_dhcps_fuzzer_on_host:
519   <<: *host_fuzzer_test_template
520   variables:
521     BOT_NEEDS_TRIGGER_BY_NAME: 1
522     FUZZER_TEST_DIR: components/lwip/test_afl_host
523     FUZZER_PARAMS: MODE=dhcp_server
524
525 test_spiffs_on_host:
526   <<: *host_test_template
527   script:
528     - cd components/spiffs/test_spiffs_host/
529     - make test
530
531 test_multi_heap_on_host:
532   <<: *host_test_template
533   script:
534     - cd components/heap/test_multi_heap_host
535     - ./test_all_configs.sh
536
537 test_confserver:
538   <<: *host_test_template
539   script:
540     - cd tools/kconfig_new/test
541     - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh ./test_confserver.py
542
543 test_build_system:
544   <<: *host_test_template
545   script:
546     - ${IDF_PATH}/tools/ci/test_configure_ci_environment.sh
547     - rm -rf test_build_system
548     - mkdir test_build_system
549     - cd test_build_system
550     - ${IDF_PATH}/tools/ci/test_build_system.sh
551
552 test_build_system_cmake:
553   <<: *host_test_template
554   script:
555     - ${IDF_PATH}/tools/ci/test_configure_ci_environment.sh
556     - rm -rf test_build_system
557     - mkdir test_build_system
558     - cd test_build_system
559     - ${IDF_PATH}/tools/ci/test_build_system_cmake.sh
560
561 test_idf_monitor:
562   <<: *host_test_template
563   artifacts:
564     when: on_failure
565     paths:
566       - tools/test_idf_monitor/outputs/*
567     expire_in: 1 week
568   script:
569     - cd ${IDF_PATH}/tools/test_idf_monitor
570     - ./run_test_idf_monitor.py
571
572 test_idf_size:
573   <<: *host_test_template
574   artifacts:
575     when: on_failure
576     paths:
577       - tools/test_idf_size/output
578       - tools/test_idf_size/.coverage
579     expire_in: 1 week
580   script:
581     - cd ${IDF_PATH}/tools/test_idf_size
582     - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh ./test.sh
583
584 test_esp_err_to_name_on_host:
585   <<: *host_test_template
586   artifacts:
587     when: on_failure
588     paths:
589       - components/esp32/esp_err_to_name.c
590     expire_in: 1 week
591   script:
592     - cd ${IDF_PATH}/tools/
593     - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh -p 2.7.15 ./gen_esp_err_to_name.py
594     - git diff --exit-code -- ../components/esp32/esp_err_to_name.c || { echo 'Differences found. Please run gen_esp_err_to_name.py and commit the changes.'; exit 1; }
595     - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh -p 3.4.8 ./gen_esp_err_to_name.py
596     - git diff --exit-code -- ../components/esp32/esp_err_to_name.c || { echo 'Differences found between running under Python 2 and 3.'; exit 1; }
597
598 test_espcoredump:
599   <<: *host_test_template
600   artifacts:
601     when: always
602     paths:
603       - components/espcoredump/test/.coverage
604       - components/espcoredump/test/output
605     expire_in: 1 week
606   script:
607     - cd components/espcoredump/test/
608     - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh ./test_espcoredump.sh
609
610 push_to_github:
611   stage: deploy
612   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
613   tags:
614     - deploy
615   only:
616     - master
617     - /^release\/v/
618     - /^v\d+\.\d+(\.\d+)?($|-)/
619   when: on_success
620   dependencies: []
621   before_script: *do_nothing_before
622   script:
623     - mkdir -p ~/.ssh
624     - chmod 700 ~/.ssh
625     - echo -n $GH_PUSH_KEY > ~/.ssh/id_rsa_base64
626     - base64 --decode --ignore-garbage ~/.ssh/id_rsa_base64 > ~/.ssh/id_rsa
627     - chmod 600 ~/.ssh/id_rsa
628     - echo -e "Host github.com\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
629     - git remote remove github &>/dev/null || true
630     - git remote add github git@github.com:espressif/esp-idf.git
631     - tools/ci/push_to_github.sh
632
633 deploy_docs:
634   stage: deploy
635   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
636   tags:
637     - deploy
638   only:
639     refs:
640       - master
641       - /^release\/v/
642       - /^v\d+\.\d+(\.\d+)?($|-)/
643       - triggers
644     variables:
645       - $BOT_TRIGGER_WITH_LABEL == null
646       - $BOT_LABEL_BUILD_DOCS
647   dependencies:
648     - build_docs
649   before_script: *do_nothing_before
650   script:
651     - mkdir -p ~/.ssh
652     - chmod 700 ~/.ssh
653     - echo -n $DOCS_DEPLOY_KEY > ~/.ssh/id_rsa_base64
654     - base64 --decode --ignore-garbage ~/.ssh/id_rsa_base64 > ~/.ssh/id_rsa
655     - chmod 600 ~/.ssh/id_rsa
656     - echo -e "Host $DOCS_SERVER\n\tStrictHostKeyChecking no\n\tUser $DOCS_SERVER_USER\n" >> ~/.ssh/config
657     - export GIT_VER=$(git describe --always)
658     - cd docs/en/_build/
659     - mv html $GIT_VER
660     - tar czvf $GIT_VER.tar.gz $GIT_VER
661     - scp $GIT_VER.tar.gz $DOCS_SERVER:$DOCS_PATH/en
662     - ssh $DOCS_SERVER -x "cd $DOCS_PATH/en && tar xzvf $GIT_VER.tar.gz && rm -f latest && ln -s $GIT_VER latest"
663     - cd ../../zh_CN/_build/
664     - mv html $GIT_VER
665     - tar czvf $GIT_VER.tar.gz $GIT_VER
666     - scp $GIT_VER.tar.gz $DOCS_SERVER:$DOCS_PATH/zh_CN
667     - ssh $DOCS_SERVER -x "cd $DOCS_PATH/zh_CN && tar xzvf $GIT_VER.tar.gz && rm -f latest && ln -s $GIT_VER latest"
668     # add link to preview doc
669     - echo "[document preview][en] $CI_DOCKER_REGISTRY/docs/esp-idf/en/${GIT_VER}/index.html"
670     - echo "[document preview][zh_CN] $CI_DOCKER_REGISTRY/docs/esp-idf/zh_CN/${GIT_VER}/index.html"
671
672 check_doc_links:
673   stage: host_test
674   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
675   tags:
676     - check_doc_links
677   only:
678     refs:
679       # can only be triggered
680       - triggers
681     variables:
682       - $BOT_TRIGGER_WITH_LABEL == null
683       - $BOT_LABEL_BUILD_DOCS
684   artifacts:
685     paths:
686       - docs/_build/linkcheck
687     expire_in: 1 week
688   script:
689     # must be triggered with CHECK_LINKS=Yes, otherwise exit without test
690     - test "$CHECK_LINKS" = "Yes" || exit 0
691     # can only run on master branch (otherwise the commit is not on Github yet)
692     - test "${CI_COMMIT_REF_NAME}" = "master" || exit 0
693     - cd docs
694     - make linkcheck
695
696 check_line_endings:
697   <<: *check_job_template
698   script:
699     - tools/ci/check-line-endings.sh ${IDF_PATH}
700
701 check_commit_msg:
702   <<: *check_job_template
703   script:
704     - git status
705     - git log -n10 --oneline
706     # commit start with "WIP: " need to be squashed before merge
707     - 'git log --pretty=%s master.. -- | grep "^WIP: " && exit 1 || exit 0'
708
709 check_permissions:
710   <<: *check_job_template
711   script:
712     - tools/ci/check-executable.sh
713
714 check_examples_cmake_make:
715   <<: *check_job_template
716   except:
717     - master
718     - /^release\/v/
719     - /^v\d+\.\d+(\.\d+)?($|-)/
720   before_script: *do_nothing_before
721   script:
722     - tools/ci/check_examples_cmake_make.sh
723
724 check_python_style:
725   <<: *check_job_template
726   artifacts:
727     when: on_failure
728     paths:
729       - flake8_output.txt
730     expire_in: 1 week
731   before_script: *do_nothing_before
732   script:
733     # run it only under Python 3 (it is very slow under Python 2)
734     - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh -p 3.4.8 python -m flake8 --config=$IDF_PATH/.flake8 --output-file=flake8_output.txt --tee --benchmark $IDF_PATH
735
736 check_kconfigs:
737   <<: *check_job_template
738   before_script: *do_nothing_before
739   artifacts:
740     when: on_failure
741     paths:
742       - components/*/Kconfig*.new
743       - examples/*/*/*/Kconfig*.new
744       - examples/*/*/*/*/Kconfig*.new
745       - tools/*/Kconfig*.new
746       - tools/*/*/Kconfig*.new
747       - tools/*/*/*/Kconfig*.new
748     expire_in: 1 week
749   script:
750     - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh ${IDF_PATH}/tools/test_check_kconfigs.py
751     - ${IDF_PATH}/tools/check_kconfigs.py
752
753 check_ut_cmake_make:
754   stage: check
755   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
756   tags:
757     - build
758   except:
759     - master
760     - /^release\/v/
761     - /^v\d+\.\d+(\.\d+)?($|-)/
762   dependencies: []
763   before_script: *do_nothing_before
764   script:
765     - tools/ci/check_ut_cmake_make.sh
766
767 check_submodule_sync:
768   <<: *check_job_template
769   variables:
770     GIT_STRATEGY: clone
771   script:
772     # check if all submodules are correctly synced to public repostory
773     - git submodule update --init --recursive
774
775 check_artifacts_expire_time:
776   <<: *check_job_template
777   script:
778     # check if we have set expire time for all artifacts
779     - python tools/ci/check_artifacts_expire_time.py
780
781 check_pipeline_triggered_by_label:
782   <<: *check_job_template
783   stage: post_check
784   only:
785     variables:
786       - $BOT_TRIGGER_WITH_LABEL
787   script:
788     # If the pipeline is triggered with label, the pipeline will only succeeded if "regular_test" label is added.
789     # We want to make sure some jobs are always executed to detect regression.
790     - test "$BOT_LABEL_REGULAR_TEST" = "true" || exit -1
791
792 assign_test:
793   tags:
794     - assign_test
795   image: $CI_DOCKER_REGISTRY/ubuntu-test-env$BOT_DOCKER_IMAGE_TAG
796   stage: assign_test
797   # gitlab ci do not support match job with RegEx or wildcard now in dependencies.
798   # we have a lot build example jobs. now we don't use dependencies, just download all artificats of build stage.
799   dependencies:
800     - build_ssc_00
801     - build_ssc_01
802     - build_ssc_02
803     - build_esp_idf_tests_make
804     - build_esp_idf_tests_cmake
805   variables:
806     TEST_FW_PATH: "$CI_PROJECT_DIR/tools/tiny-test-fw"
807     EXAMPLE_CONFIG_OUTPUT_PATH: "$CI_PROJECT_DIR/examples/test_configs"
808   artifacts:
809     paths:
810       - components/idf_test/*/CIConfigs
811       - components/idf_test/*/TC.sqlite
812       - $EXAMPLE_CONFIG_OUTPUT_PATH
813     expire_in: 1 week
814   only:
815     variables:
816       - $BOT_TRIGGER_WITH_LABEL == null
817       - $BOT_LABEL_UNIT_TEST
818       - $BOT_LABEL_INTEGRATION_TEST
819       - $BOT_LABEL_EXAMPLE_TEST
820   script:
821     # assign example tests
822     - python $TEST_FW_PATH/CIAssignExampleTest.py $IDF_PATH/examples $IDF_PATH/.gitlab-ci.yml $EXAMPLE_CONFIG_OUTPUT_PATH
823     # assign unit test cases
824     - python $TEST_FW_PATH/CIAssignUnitTest.py $IDF_PATH/components/idf_test/unit_test/TestCaseAll.yml $IDF_PATH/.gitlab-ci.yml $IDF_PATH/components/idf_test/unit_test/CIConfigs
825     # clone test script to assign tests
826     - git clone $TEST_SCRIPT_REPOSITORY
827     - cd auto_test_script
828     - python $CHECKOUT_REF_SCRIPT auto_test_script
829     # assgin integration test cases
830     - python CIAssignTestCases.py -t $IDF_PATH/components/idf_test/integration_test -c $IDF_PATH/.gitlab-ci.yml -b $IDF_PATH/SSC/ssc_bin
831
832 .example_test_template: &example_test_template
833   stage: target_test
834   when: on_success
835   only:
836     refs:
837       - master
838       - /^release\/v/
839       - /^v\d+\.\d+(\.\d+)?($|-)/
840       - triggers
841       - schedules
842     variables:
843       - $BOT_TRIGGER_WITH_LABEL == null
844       - $BOT_LABEL_EXAMPLE_TEST
845   dependencies:
846     - assign_test
847     - build_examples_make_00
848     - build_examples_make_01
849     - build_examples_make_02
850     - build_examples_make_03
851     - build_examples_make_04
852     - build_examples_make_05
853     - build_examples_make_06
854     - build_examples_make_07
855     - build_examples_cmake_00
856     - build_examples_cmake_01
857     - build_examples_cmake_02
858     - build_examples_cmake_03
859     - build_examples_cmake_04
860     - build_examples_cmake_05
861     - build_examples_cmake_06
862     - build_examples_cmake_07
863   artifacts:
864     when: always
865     paths:
866       - $LOG_PATH
867     expire_in: 1 week
868     reports:
869         junit: $LOG_PATH/*/XUNIT_RESULT.xml
870   variables:
871     TEST_FW_PATH: "$CI_PROJECT_DIR/tools/tiny-test-fw"
872     TEST_CASE_PATH: "$CI_PROJECT_DIR/examples"
873     CONFIG_FILE: "$CI_PROJECT_DIR/examples/test_configs/$CI_JOB_NAME.yml"
874     LOG_PATH: "$CI_PROJECT_DIR/TEST_LOGS"
875     ENV_FILE: "$CI_PROJECT_DIR/ci-test-runner-configs/$CI_RUNNER_DESCRIPTION/EnvConfig.yml"
876   script:
877     # first test if config file exists, if not exist, exit 0
878     - test -e $CONFIG_FILE || exit 0
879     # clone test env configs
880     - git clone $TEST_ENV_CONFIG_REPOSITORY
881     - cd ci-test-runner-configs
882     - python $CHECKOUT_REF_SCRIPT ci-test-runner-configs
883     - cd $TEST_FW_PATH
884     # run test
885     - python Runner.py $TEST_CASE_PATH -c $CONFIG_FILE -e $ENV_FILE
886
887 .unit_test_template: &unit_test_template
888   <<: *example_test_template
889   stage: target_test
890   dependencies:
891     - assign_test
892     - build_esp_idf_tests_make
893     - build_esp_idf_tests_cmake
894   only:
895     refs:
896       - master
897       - /^release\/v/
898       - /^v\d+\.\d+(\.\d+)?($|-)/
899       - triggers
900       - schedules
901     variables:
902       - $BOT_TRIGGER_WITH_LABEL == null
903       - $BOT_LABEL_UNIT_TEST
904   variables:
905     TEST_FW_PATH: "$CI_PROJECT_DIR/tools/tiny-test-fw"
906     TEST_CASE_PATH: "$CI_PROJECT_DIR/tools/unit-test-app"
907     CONFIG_FILE: "$CI_PROJECT_DIR/components/idf_test/unit_test/CIConfigs/$CI_JOB_NAME.yml"
908     LOG_PATH: "$CI_PROJECT_DIR/TEST_LOGS"
909     ENV_FILE: "$CI_PROJECT_DIR/ci-test-runner-configs/$CI_RUNNER_DESCRIPTION/EnvConfig.yml"
910
911 .test_template: &test_template
912   stage: target_test
913   when: on_success
914   only:
915     refs:
916       - master
917       - /^release\/v/
918       - /^v\d+\.\d+(\.\d+)?($|-)/
919       - triggers
920       - schedules
921     variables:
922       - $BOT_TRIGGER_WITH_LABEL == null
923       - $BOT_LABEL_INTEGRATION_TEST
924   dependencies:
925     - assign_test
926     - build_ssc_00
927     - build_ssc_01
928     - build_ssc_02
929   artifacts:
930     when: always
931     paths:
932       - $LOG_PATH
933     expire_in: 1 week
934   variables:
935     LOCAL_ENV_CONFIG_PATH: "$CI_PROJECT_DIR/ci-test-runner-configs/$CI_RUNNER_DESCRIPTION/ESP32_IDF"
936     LOG_PATH: "$CI_PROJECT_DIR/$CI_COMMIT_SHA"
937     TEST_CASE_FILE_PATH: "$CI_PROJECT_DIR/components/idf_test/integration_test"
938     MODULE_UPDATE_FILE: "$CI_PROJECT_DIR/components/idf_test/ModuleDefinition.yml"
939     CONFIG_FILE: "$CI_PROJECT_DIR/components/idf_test/integration_test/CIConfigs/$CI_JOB_NAME.yml"
940   before_script: *add_gitlab_key_before
941   script:
942     # first test if config file exists, if not exist, exit 0
943     - test -e $CONFIG_FILE || exit 0
944     # clone local test env configs
945     - git clone $TEST_ENV_CONFIG_REPOSITORY
946     - cd ci-test-runner-configs
947     - python $CHECKOUT_REF_SCRIPT ci-test-runner-configs
948     # clone test bench
949     - git clone $TEST_SCRIPT_REPOSITORY
950     - cd auto_test_script
951     - python $CHECKOUT_REF_SCRIPT auto_test_script
952     # run test
953     - 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
954
955 nvs_compatible_test:
956   <<: *test_template
957   artifacts:
958     when: always
959     paths:
960       - $LOG_PATH
961       - nvs_wifi.bin
962     expire_in: 1 mos
963   tags:
964     - ESP32_IDF
965     - NVS_Compatible
966   script:
967     # clone local test env configs
968     - git clone $TEST_ENV_CONFIG_REPOSITORY
969     - cd ci-test-runner-configs
970     - python $CHECKOUT_REF_SCRIPT ci-test-runner-configs
971     # clone test bench
972     - git clone $TEST_SCRIPT_REPOSITORY
973     - cd auto_test_script
974     - git checkout ${CI_COMMIT_REF_NAME} || echo "Using default branch..."
975     # prepare nvs bins
976     - ./Tools/prepare_nvs_bin.sh
977     # run test
978     - 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
979
980 example_test_001_01:
981   <<: *example_test_template
982   tags:
983     - ESP32
984     - Example_WIFI
985
986 example_test_001_02:
987   <<: *example_test_template
988   tags:
989     - ESP32
990     - Example_WIFI
991
992 example_test_002_01:
993   <<: *example_test_template
994   image: $CI_DOCKER_REGISTRY/ubuntu-test-env$BOT_DOCKER_IMAGE_TAG
995   tags:
996     - ESP32
997     - Example_ShieldBox_Basic
998
999 example_test_003_01:
1000   <<: *example_test_template
1001   tags:
1002     - ESP32
1003     - Example_SDIO
1004
1005 example_test_004_01:
1006   <<: *example_test_template
1007   tags:
1008     - ESP32
1009     - Example_CAN
1010
1011 example_test_005_01:
1012   <<: *example_test_template
1013   tags:
1014     - ESP32
1015     - Example_WIFI_BT
1016
1017 example_test_006_01:
1018   <<: *example_test_template
1019   image: $CI_DOCKER_REGISTRY/ubuntu-test-env$BOT_DOCKER_IMAGE_TAG
1020   only:
1021     variables:
1022       - $BOT_LABEL_IPERF_STRESS_TEST
1023   tags:
1024     - ESP32
1025     - Example_ShieldBox
1026
1027 example_test_007_01:
1028   <<: *example_test_template
1029   tags:
1030     - ESP32
1031     - Example_I2C_CCS811_SENSOR
1032
1033 UT_001_01:
1034   <<: *unit_test_template
1035   tags:
1036     - ESP32_IDF
1037     - UT_T1_1
1038
1039 UT_001_02:
1040   <<: *unit_test_template
1041   tags:
1042     - ESP32_IDF
1043     - UT_T1_1
1044
1045 UT_001_03:
1046   <<: *unit_test_template
1047   tags:
1048     - ESP32_IDF
1049     - UT_T1_1
1050
1051 UT_001_04:
1052   <<: *unit_test_template
1053   tags:
1054     - ESP32_IDF
1055     - UT_T1_1
1056
1057 UT_001_05:
1058   <<: *unit_test_template
1059   tags:
1060     - ESP32_IDF
1061     - UT_T1_1
1062
1063 UT_001_06:
1064   <<: *unit_test_template
1065   tags:
1066     - ESP32_IDF
1067     - UT_T1_1
1068
1069 UT_001_07:
1070   <<: *unit_test_template
1071   tags:
1072     - ESP32_IDF
1073     - UT_T1_1
1074
1075 UT_001_08:
1076   <<: *unit_test_template
1077   tags:
1078     - ESP32_IDF
1079     - UT_T1_1
1080
1081 UT_001_09:
1082   <<: *unit_test_template
1083   tags:
1084     - ESP32_IDF
1085     - UT_T1_1
1086
1087 UT_001_10:
1088   <<: *unit_test_template
1089   tags:
1090     - ESP32_IDF
1091     - UT_T1_1
1092
1093 UT_001_11:
1094   <<: *unit_test_template
1095   tags:
1096     - ESP32_IDF
1097     - UT_T1_1
1098
1099 UT_001_12:
1100   <<: *unit_test_template
1101   tags:
1102     - ESP32_IDF
1103     - UT_T1_1
1104
1105 UT_001_13:
1106   <<: *unit_test_template
1107   tags:
1108     - ESP32_IDF
1109     - UT_T1_1
1110
1111 UT_001_14:
1112   <<: *unit_test_template
1113   tags:
1114     - ESP32_IDF
1115     - UT_T1_1
1116
1117 UT_001_15:
1118   <<: *unit_test_template
1119   tags:
1120     - ESP32_IDF
1121     - UT_T1_1
1122
1123 UT_001_16:
1124   <<: *unit_test_template
1125   tags:
1126     - ESP32_IDF
1127     - UT_T1_1
1128
1129 UT_001_17:
1130   <<: *unit_test_template
1131   tags:
1132     - ESP32_IDF
1133     - UT_T1_1
1134
1135 UT_001_18:
1136   <<: *unit_test_template
1137   tags:
1138     - ESP32_IDF
1139     - UT_T1_1
1140
1141 UT_001_19:
1142   <<: *unit_test_template
1143   tags:
1144     - ESP32_IDF
1145     - UT_T1_1
1146
1147 UT_001_20:
1148   <<: *unit_test_template
1149   tags:
1150     - ESP32_IDF
1151     - UT_T1_1
1152
1153 UT_001_21:
1154   <<: *unit_test_template
1155   tags:
1156     - ESP32_IDF
1157     - UT_T1_1
1158
1159 UT_001_22:
1160   <<: *unit_test_template
1161   tags:
1162     - ESP32_IDF
1163     - UT_T1_1
1164
1165 UT_001_23:
1166   <<: *unit_test_template
1167   tags:
1168     - ESP32_IDF
1169     - UT_T1_1
1170
1171 UT_001_24:
1172   <<: *unit_test_template
1173   tags:
1174     - ESP32_IDF
1175     - UT_T1_1
1176
1177 UT_001_25:
1178   <<: *unit_test_template
1179   tags:
1180     - ESP32_IDF
1181     - UT_T1_1
1182
1183 UT_001_26:
1184   <<: *unit_test_template
1185   tags:
1186     - ESP32_IDF
1187     - UT_T1_1
1188
1189 UT_001_27:
1190   <<: *unit_test_template
1191   tags:
1192     - ESP32_IDF
1193     - UT_T1_1
1194
1195 UT_001_28:
1196   <<: *unit_test_template
1197   tags:
1198     - ESP32_IDF
1199     - UT_T1_1
1200
1201 UT_001_29:
1202   <<: *unit_test_template
1203   tags:
1204     - ESP32_IDF
1205     - UT_T1_1
1206
1207 UT_001_30:
1208   <<: *unit_test_template
1209   tags:
1210     - ESP32_IDF
1211     - UT_T1_1
1212
1213 UT_001_31:
1214   <<: *unit_test_template
1215   tags:
1216     - ESP32_IDF
1217     - UT_T1_1
1218
1219 UT_001_32:
1220   <<: *unit_test_template
1221   tags:
1222     - ESP32_IDF
1223     - UT_T1_1
1224
1225 UT_001_33:
1226   <<: *unit_test_template
1227   tags:
1228     - ESP32_IDF
1229     - UT_T1_1
1230
1231 UT_001_34:
1232   <<: *unit_test_template
1233   tags:
1234     - ESP32_IDF
1235     - UT_T1_1
1236
1237 UT_001_35:
1238   <<: *unit_test_template
1239   tags:
1240     - ESP32_IDF
1241     - UT_T1_1
1242
1243 UT_001_36:
1244   <<: *unit_test_template
1245   tags:
1246     - ESP32_IDF
1247     - UT_T1_1
1248
1249 UT_001_37:
1250   <<: *unit_test_template
1251   tags:
1252     - ESP32_IDF
1253     - UT_T1_1
1254
1255 UT_001_38:
1256   <<: *unit_test_template
1257   tags:
1258     - ESP32_IDF
1259     - UT_T1_1
1260
1261 UT_001_39:
1262   <<: *unit_test_template
1263   tags:
1264     - ESP32_IDF
1265     - UT_T1_1
1266
1267 UT_001_40:
1268   <<: *unit_test_template
1269   tags:
1270     - ESP32_IDF
1271     - UT_T1_1
1272
1273 UT_001_41:
1274   <<: *unit_test_template
1275   tags:
1276     - ESP32_IDF
1277     - UT_T1_1
1278
1279 UT_001_42:
1280   <<: *unit_test_template
1281   tags:
1282     - ESP32_IDF
1283     - UT_T1_1
1284
1285 UT_002_01:
1286   <<: *unit_test_template
1287   tags:
1288     - ESP32_IDF
1289     - UT_T1_SDMODE
1290
1291 UT_002_02:
1292   <<: *unit_test_template
1293   tags:
1294     - ESP32_IDF
1295     - UT_T1_SDMODE
1296
1297 UT_002_03:
1298   <<: *unit_test_template
1299   tags:
1300     - ESP32_IDF
1301     - UT_T1_SDMODE
1302
1303 UT_003_01:
1304   <<: *unit_test_template
1305   tags:
1306     - ESP32_IDF
1307     - UT_T1_SPIMODE
1308
1309 UT_003_02:
1310   <<: *unit_test_template
1311   tags:
1312     - ESP32_IDF
1313     - UT_T1_SPIMODE
1314
1315 UT_003_03:
1316   <<: *unit_test_template
1317   tags:
1318     - ESP32_IDF
1319     - UT_T1_SPIMODE
1320
1321 UT_004_01:
1322   <<: *unit_test_template
1323   tags:
1324     - ESP32_IDF
1325     - UT_T1_1
1326     - psram
1327
1328 UT_004_02:
1329   <<: *unit_test_template
1330   tags:
1331     - ESP32_IDF
1332     - UT_T1_1
1333     - psram
1334
1335 UT_004_03:
1336   <<: *unit_test_template
1337   tags:
1338     - ESP32_IDF
1339     - UT_T1_1
1340     - psram
1341
1342 UT_004_04:
1343   <<: *unit_test_template
1344   tags:
1345     - ESP32_IDF
1346     - UT_T1_1
1347     - psram
1348
1349 UT_004_05:
1350   <<: *unit_test_template
1351   tags:
1352     - ESP32_IDF
1353     - UT_T1_1
1354     - psram
1355
1356 UT_004_06:
1357   <<: *unit_test_template
1358   tags:
1359     - ESP32_IDF
1360     - UT_T1_1
1361     - psram
1362
1363 UT_004_07:
1364   <<: *unit_test_template
1365   tags:
1366     - ESP32_IDF
1367     - UT_T1_1
1368     - psram
1369
1370 UT_004_08:
1371   <<: *unit_test_template
1372   tags:
1373     - ESP32_IDF
1374     - UT_T1_1
1375     - psram
1376
1377 UT_004_09:
1378   <<: *unit_test_template
1379   tags:
1380     - ESP32_IDF
1381     - UT_T1_1
1382     - psram
1383
1384 UT_004_10:
1385   <<: *unit_test_template
1386   tags:
1387     - ESP32_IDF
1388     - UT_T1_1
1389     - psram
1390
1391 UT_004_11:
1392   <<: *unit_test_template
1393   tags:
1394     - ESP32_IDF
1395     - UT_T1_1
1396     - psram
1397
1398 UT_004_12:
1399   <<: *unit_test_template
1400   tags:
1401     - ESP32_IDF
1402     - UT_T1_1
1403     - psram
1404
1405 UT_004_13:
1406   <<: *unit_test_template
1407   tags:
1408     - ESP32_IDF
1409     - UT_T1_1
1410     - psram
1411
1412 UT_004_14:
1413   <<: *unit_test_template
1414   tags:
1415     - ESP32_IDF
1416     - UT_T1_1
1417     - psram
1418
1419 UT_004_15:
1420   <<: *unit_test_template
1421   tags:
1422     - ESP32_IDF
1423     - UT_T1_1
1424     - psram
1425
1426 UT_004_14:
1427   <<: *unit_test_template
1428   tags:
1429     - ESP32_IDF
1430     - UT_T1_1
1431     - psram
1432
1433 UT_005_01:
1434   <<: *unit_test_template
1435   tags:
1436     - ESP32_IDF
1437     - UT_T1_SDMODE
1438     - psram
1439
1440 UT_005_02:
1441   <<: *unit_test_template
1442   tags:
1443     - ESP32_IDF
1444     - UT_T1_SPIMODE
1445     - psram
1446
1447 UT_005_03:
1448   <<: *unit_test_template
1449   tags:
1450     - ESP32_IDF
1451     - UT_T1_SPIMODE
1452     - psram
1453
1454 UT_006_01:
1455   <<: *unit_test_template
1456   tags:
1457     - ESP32_IDF
1458     - UT_T1_GPIO
1459
1460 UT_006_02:
1461   <<: *unit_test_template
1462   tags:
1463     - ESP32_IDF
1464     - UT_T1_GPIO
1465
1466 UT_006_03:
1467   <<: *unit_test_template
1468   tags:
1469     - ESP32_IDF
1470     - UT_T1_GPIO
1471
1472 UT_006_04:
1473   <<: *unit_test_template
1474   tags:
1475     - ESP32_IDF
1476     - UT_T1_GPIO
1477     - psram
1478
1479 UT_007_01:
1480   <<: *unit_test_template
1481   tags:
1482     - ESP32_IDF
1483     - UT_T1_PCNT
1484
1485 UT_007_02:
1486   <<: *unit_test_template
1487   tags:
1488     - ESP32_IDF
1489     - UT_T1_PCNT
1490
1491 UT_007_03:
1492   <<: *unit_test_template
1493   tags:
1494     - ESP32_IDF
1495     - UT_T1_PCNT
1496
1497 UT_007_04:
1498   <<: *unit_test_template
1499   tags:
1500     - ESP32_IDF
1501     - UT_T1_PCNT
1502     - psram
1503
1504 UT_008_01:
1505   <<: *unit_test_template
1506   tags:
1507     - ESP32_IDF
1508     - UT_T1_LEDC
1509
1510 UT_008_02:
1511   <<: *unit_test_template
1512   tags:
1513     - ESP32_IDF
1514     - UT_T1_LEDC
1515
1516 UT_008_03:
1517   <<: *unit_test_template
1518   tags:
1519     - ESP32_IDF
1520     - UT_T1_LEDC
1521
1522 UT_008_04:
1523   <<: *unit_test_template
1524   tags:
1525     - ESP32_IDF
1526     - UT_T1_LEDC
1527     - psram
1528
1529 UT_009_01:
1530   <<: *unit_test_template
1531   tags:
1532     - ESP32_IDF
1533     - UT_T2_RS485
1534
1535 UT_009_02:
1536   <<: *unit_test_template
1537   tags:
1538     - ESP32_IDF
1539     - UT_T2_RS485
1540
1541 UT_009_03:
1542   <<: *unit_test_template
1543   tags:
1544     - ESP32_IDF
1545     - UT_T2_RS485
1546
1547 UT_009_04:
1548   <<: *unit_test_template
1549   tags:
1550     - ESP32_IDF
1551     - UT_T2_RS485
1552     - psram
1553
1554 UT_010_01:
1555   <<: *unit_test_template
1556   tags:
1557     - ESP32_IDF
1558     - UT_T1_RMT
1559
1560 UT_010_02:
1561   <<: *unit_test_template
1562   tags:
1563     - ESP32_IDF
1564     - UT_T1_RMT
1565
1566 UT_010_03:
1567   <<: *unit_test_template
1568   tags:
1569     - ESP32_IDF
1570     - UT_T1_RMT
1571
1572 UT_010_04:
1573   <<: *unit_test_template
1574   tags:
1575     - ESP32_IDF
1576     - UT_T1_RMT
1577     - psram
1578
1579 UT_011_01:
1580   <<: *unit_test_template
1581   tags:
1582     - ESP32_IDF
1583     - EMMC
1584
1585 UT_011_02:
1586   <<: *unit_test_template
1587   tags:
1588     - ESP32_IDF
1589     - EMMC
1590
1591 UT_011_03:
1592   <<: *unit_test_template
1593   tags:
1594     - ESP32_IDF
1595     - EMMC
1596
1597 UT_012_01:
1598   <<: *unit_test_template
1599   tags:
1600     - ESP32_IDF
1601     - UT_T1_1
1602     - 8Mpsram
1603
1604 UT_012_02:
1605   <<: *unit_test_template
1606   tags:
1607     - ESP32_IDF
1608     - UT_T1_1
1609     - 8Mpsram
1610
1611 UT_012_03:
1612   <<: *unit_test_template
1613   tags:
1614     - ESP32_IDF
1615     - UT_T1_1
1616     - 8Mpsram
1617
1618 UT_012_04:
1619   <<: *unit_test_template
1620   tags:
1621     - ESP32_IDF
1622     - UT_T1_1
1623     - 8Mpsram
1624
1625 UT_012_05:
1626   <<: *unit_test_template
1627   tags:
1628     - ESP32_IDF
1629     - UT_T1_1
1630     - 8Mpsram
1631
1632 UT_014_01:
1633   <<: *unit_test_template
1634   tags:
1635     - ESP32_IDF
1636     - UT_T2_I2C
1637
1638 UT_014_02:
1639   <<: *unit_test_template
1640   tags:
1641     - ESP32_IDF
1642     - UT_T2_I2C
1643
1644 UT_014_03:
1645   <<: *unit_test_template
1646   tags:
1647     - ESP32_IDF
1648     - UT_T2_I2C
1649
1650 UT_014_04:
1651   <<: *unit_test_template
1652   tags:
1653     - ESP32_IDF
1654     - UT_T2_I2C
1655     - psram
1656
1657 UT_015_01:
1658   <<: *unit_test_template
1659   tags:
1660     - ESP32_IDF
1661     - UT_T1_MCPWM
1662
1663 UT_015_02:
1664   <<: *unit_test_template
1665   tags:
1666     - ESP32_IDF
1667     - UT_T1_MCPWM
1668
1669 UT_015_03:
1670   <<: *unit_test_template
1671   tags:
1672     - ESP32_IDF
1673     - UT_T1_MCPWM
1674
1675 UT_015_04:
1676   <<: *unit_test_template
1677   tags:
1678     - ESP32_IDF
1679     - UT_T1_MCPWM
1680     - psram
1681
1682 UT_016_01:
1683   <<: *unit_test_template
1684   tags:
1685     - ESP32_IDF
1686     - UT_T1_I2S
1687
1688 UT_016_02:
1689   <<: *unit_test_template
1690   tags:
1691     - ESP32_IDF
1692     - UT_T1_I2S
1693
1694 UT_016_03:
1695   <<: *unit_test_template
1696   tags:
1697     - ESP32_IDF
1698     - UT_T1_I2S
1699
1700 UT_016_04:
1701   <<: *unit_test_template
1702   tags:
1703     - ESP32_IDF
1704     - UT_T1_I2S
1705     - psram
1706
1707 UT_017_01:
1708   <<: *unit_test_template
1709   tags:
1710     - ESP32_IDF
1711     - UT_T2_1
1712
1713 UT_017_02:
1714   <<: *unit_test_template
1715   tags:
1716     - ESP32_IDF
1717     - UT_T2_1
1718
1719 UT_017_03:
1720   <<: *unit_test_template
1721   tags:
1722     - ESP32_IDF
1723     - UT_T2_1
1724
1725 UT_017_04:
1726   <<: *unit_test_template
1727   tags:
1728     - ESP32_IDF
1729     - UT_T2_1
1730     - psram
1731
1732 UT_017_05:
1733   <<: *unit_test_template
1734   tags:
1735     - ESP32_IDF
1736     - UT_T2_1
1737     - 8Mpsram
1738
1739 UT_601_01:
1740   <<: *unit_test_template
1741   tags:
1742     - ESP32_IDF
1743     - UT_T1_1
1744
1745 IT_001_01:
1746   <<: *test_template
1747   tags:
1748     - ESP32_IDF
1749     - SSC_T1_4
1750
1751 IT_001_02:
1752   <<: *test_template
1753   tags:
1754     - ESP32_IDF
1755     - SSC_T1_4
1756
1757 IT_001_03:
1758   <<: *test_template
1759   tags:
1760     - ESP32_IDF
1761     - SSC_T1_4
1762
1763 IT_002_01:
1764   <<: *test_template
1765   tags:
1766     - ESP32_IDF
1767     - SSC_T1_2
1768
1769 IT_003_01:
1770   <<: *test_template
1771   tags:
1772     - ESP32_IDF
1773     - SSC_T2_5
1774
1775 IT_003_02:
1776   <<: *test_template
1777   tags:
1778     - ESP32_IDF
1779     - SSC_T2_5
1780
1781 IT_003_03:
1782   <<: *test_template
1783   tags:
1784     - ESP32_IDF
1785     - SSC_T2_5
1786
1787 IT_003_04:
1788   <<: *test_template
1789   tags:
1790     - ESP32_IDF
1791     - SSC_T2_5
1792
1793 IT_003_05:
1794   <<: *test_template
1795   tags:
1796     - ESP32_IDF
1797     - SSC_T2_5
1798
1799 IT_003_06:
1800   <<: *test_template
1801   tags:
1802     - ESP32_IDF
1803     - SSC_T2_5
1804
1805 IT_003_07:
1806   <<: *test_template
1807   tags:
1808     - ESP32_IDF
1809     - SSC_T2_5
1810
1811 IT_003_08:
1812   <<: *test_template
1813   tags:
1814     - ESP32_IDF
1815     - SSC_T2_5
1816
1817 IT_003_09:
1818   <<: *test_template
1819   tags:
1820     - ESP32_IDF
1821     - SSC_T2_5
1822
1823 IT_003_10:
1824   <<: *test_template
1825   tags:
1826     - ESP32_IDF
1827     - SSC_T2_5
1828
1829 IT_003_11:
1830   <<: *test_template
1831   tags:
1832     - ESP32_IDF
1833     - SSC_T2_5
1834
1835 IT_003_12:
1836   <<: *test_template
1837   tags:
1838     - ESP32_IDF
1839     - SSC_T2_5
1840
1841 IT_003_13:
1842   <<: *test_template
1843   tags:
1844     - ESP32_IDF
1845     - SSC_T2_5
1846
1847 IT_004_01:
1848   <<: *test_template
1849   tags:
1850     - ESP32_IDF
1851     - SSC_T1_APC
1852
1853 IT_005_01:
1854   <<: *test_template
1855   tags:
1856     - ESP32_IDF
1857     - SSC_T1_5
1858
1859 IT_005_02:
1860   <<: *test_template
1861   tags:
1862     - ESP32_IDF
1863     - SSC_T1_5
1864
1865 IT_006_01:
1866   <<: *test_template
1867   tags:
1868     - ESP32_IDF
1869     - SSC_T1_6
1870
1871 IT_006_02:
1872   <<: *test_template
1873   tags:
1874     - ESP32_IDF
1875     - SSC_T1_6
1876
1877 IT_006_03:
1878   <<: *test_template
1879   tags:
1880     - ESP32_IDF
1881     - SSC_T1_6
1882
1883 IT_006_04:
1884   <<: *test_template
1885   tags:
1886     - ESP32_IDF
1887     - SSC_T1_6
1888
1889 IT_006_05:
1890   <<: *test_template
1891   tags:
1892     - ESP32_IDF
1893     - SSC_T1_6
1894
1895 IT_007_01:
1896   <<: *test_template
1897   tags:
1898     - ESP32_IDF
1899     - SSC_T1_7
1900
1901 IT_007_02:
1902   <<: *test_template
1903   tags:
1904     - ESP32_IDF
1905     - SSC_T1_7
1906
1907 IT_008_01:
1908   <<: *test_template
1909   tags:
1910     - ESP32_IDF
1911     - SSC_T1_8
1912
1913 IT_009_01:
1914   <<: *test_template
1915   tags:
1916     - ESP32_IDF
1917     - SSC_T1_3
1918
1919 IT_010_01:
1920   <<: *test_template
1921   tags:
1922     - ESP32_IDF
1923     - SSC_T5_1
1924
1925 IT_011_01:
1926   <<: *test_template
1927   tags:
1928     - ESP32_IDF
1929     - SSC_T50_1
1930
1931 IT_012_01:
1932   <<: *test_template
1933   tags:
1934     - ESP32_IDF
1935     - SSC_T1_9
1936
1937 IT_013_01:
1938   <<: *test_template
1939   tags:
1940     - ESP32_IDF
1941     - SSC_T2_2
1942
1943 IT_013_02:
1944   <<: *test_template
1945   tags:
1946     - ESP32_IDF
1947     - SSC_T2_2
1948
1949 IT_014_01:
1950   <<: *test_template
1951   tags:
1952     - ESP32_IDF
1953     - SSC_T2_3
1954
1955 IT_015_01:
1956   <<: *test_template
1957   tags:
1958     - ESP32_IDF
1959     - SSC_T2_4