]> granicus.if.org Git - esp-idf/blob - .gitlab-ci.yml
ci: Fix the choice of runner for the CMake verification, and change .check_job_templa...
[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="-Werror -Werror=deprecated-declarations"
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     - if [ "$UNIT_TEST_BUILD_SYSTEM" == "make" ]; then exit 0; fi
211     # If Make, delete the CMake built artifacts
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="-Werror -Werror=deprecated-declarations"
221     - export EXTRA_CXXFLAGS=${EXTRA_CFLAGS}
222     - cd $CI_PROJECT_DIR/tools/unit-test-app
223     # Build with CMake first
224     - idf.py ut-clean-all-configs
225     - idf.py ut-build-all-configs
226     - python tools/UnitTestParser.py
227     # Check if test demands CMake or Make built binaries. If CMake leave the built artifacts as is then exit.
228     - if [ "$UNIT_TEST_BUILD_SYSTEM" == "cmake" ]; then exit 0; fi
229     # If Make, delete the CMake built artifacts
230     - rm -rf builds output sdkconfig
231     - rm -rf components/idf_test/unit_test/TestCaseAll.yml
232     - rm -rf components/idf_test/unit_test/CIConfigs/*.yml
233
234 .build_examples_make_template: &build_examples_make_template
235   <<: *build_template
236   # This is a workaround for a rarely encountered issue with building examples in CI.
237   # Probably related to building of Kconfig in 'make clean' stage
238   retry: 1
239   artifacts:
240     when: always
241     paths:
242       - build_examples/*/*/*/build/*.bin
243       - build_examples/*/*/*/build/*.elf
244       - build_examples/*/*/*/build/*.map
245       - build_examples/*/*/*/build/download.config
246       - build_examples/*/*/*/build/bootloader/*.bin
247       - $LOG_PATH
248     expire_in: 2 days
249   variables:
250     IDF_CI_BUILD: "1"
251     LOG_PATH: "$CI_PROJECT_DIR/log_examples_make"
252   only:
253     variables:
254       - $BOT_TRIGGER_WITH_LABEL == null
255       - $BOT_LABEL_BUILD
256       - $BOT_LABEL_EXAMPLE_TEST
257       - $BOT_LABEL_REGULAR_TEST
258   script:
259     # it's not possible to build 100% out-of-tree and have the "artifacts"
260     # mechanism work, but this is the next best thing
261     - rm -rf build_examples
262     - mkdir build_examples
263     - cd build_examples
264     # build some of examples
265     - mkdir -p ${LOG_PATH}
266     - ${IDF_PATH}/tools/ci/build_examples.sh "${CI_JOB_NAME}"
267
268 # same as above, but for CMake
269 .build_examples_cmake_template: &build_examples_cmake_template
270   <<: *build_template
271   artifacts:
272     when: always
273     paths:
274       - build_examples_cmake/*/*/*/build/*.bin
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_ut_cmake_make:
737   stage: check
738   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
739   tags:
740     - build
741   except:
742     - master
743     - /^release\/v/
744     - /^v\d+\.\d+(\.\d+)?($|-)/
745   dependencies: []
746   before_script: *do_nothing_before
747   script:
748     - tools/ci/check_ut_cmake_make.sh
749
750 check_submodule_sync:
751   <<: *check_job_template
752   variables:
753     GIT_STRATEGY: clone
754   script:
755     # check if all submodules are correctly synced to public repostory
756     - git submodule update --init --recursive
757
758 check_artifacts_expire_time:
759   <<: *check_job_template
760   script:
761     # check if we have set expire time for all artifacts
762     - python tools/ci/check_artifacts_expire_time.py
763
764 check_pipeline_triggered_by_label:
765   <<: *check_job_template
766   stage: post_check
767   only:
768     variables:
769       - $BOT_TRIGGER_WITH_LABEL
770   script:
771     # If the pipeline is triggered with label, the pipeline will only succeeded if "regular_test" label is added.
772     # We want to make sure some jobs are always executed to detect regression.
773     - test "$BOT_LABEL_REGULAR_TEST" = "true" || exit -1
774
775 assign_test:
776   tags:
777     - assign_test
778   image: $CI_DOCKER_REGISTRY/ubuntu-test-env$BOT_DOCKER_IMAGE_TAG
779   stage: assign_test
780   # gitlab ci do not support match job with RegEx or wildcard now in dependencies.
781   # we have a lot build example jobs. now we don't use dependencies, just download all artificats of build stage.
782   dependencies:
783     - build_ssc_00
784     - build_ssc_01
785     - build_ssc_02
786     - build_esp_idf_tests_make
787     - build_esp_idf_tests_cmake
788   variables:
789     TEST_FW_PATH: "$CI_PROJECT_DIR/tools/tiny-test-fw"
790     EXAMPLE_CONFIG_OUTPUT_PATH: "$CI_PROJECT_DIR/examples/test_configs"
791   artifacts:
792     paths:
793       - components/idf_test/*/CIConfigs
794       - components/idf_test/*/TC.sqlite
795       - $EXAMPLE_CONFIG_OUTPUT_PATH
796     expire_in: 1 week
797   only:
798     variables:
799       - $BOT_TRIGGER_WITH_LABEL == null
800       - $BOT_LABEL_UNIT_TEST
801       - $BOT_LABEL_INTEGRATION_TEST
802       - $BOT_LABEL_EXAMPLE_TEST
803   before_script: *add_gitlab_key_before
804   script:
805     # assign example tests
806     - python $TEST_FW_PATH/CIAssignExampleTest.py $IDF_PATH/examples $IDF_PATH/.gitlab-ci.yml $EXAMPLE_CONFIG_OUTPUT_PATH
807     # assign unit test cases
808     - 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
809     # clone test script to assign tests
810     - git clone $TEST_SCRIPT_REPOSITORY
811     - cd auto_test_script
812     - python $CHECKOUT_REF_SCRIPT auto_test_script
813     # assgin integration test cases
814     - python CIAssignTestCases.py -t $IDF_PATH/components/idf_test/integration_test -c $IDF_PATH/.gitlab-ci.yml -b $IDF_PATH/SSC/ssc_bin
815
816 .example_test_template: &example_test_template
817   stage: target_test
818   when: on_success
819   only:
820     refs:
821       - master
822       - /^release\/v/
823       - /^v\d+\.\d+(\.\d+)?($|-)/
824       - triggers
825       - schedules
826     variables:
827       - $BOT_TRIGGER_WITH_LABEL == null
828       - $BOT_LABEL_EXAMPLE_TEST
829   dependencies:
830     - assign_test
831     - build_examples_make_00
832     - build_examples_make_01
833     - build_examples_make_02
834     - build_examples_make_03
835     - build_examples_make_04
836     - build_examples_make_05
837     - build_examples_make_06
838     - build_examples_make_07
839     - build_examples_cmake_00
840     - build_examples_cmake_01
841     - build_examples_cmake_02
842     - build_examples_cmake_03
843     - build_examples_cmake_04
844     - build_examples_cmake_05
845     - build_examples_cmake_06
846     - build_examples_cmake_07
847   artifacts:
848     when: always
849     paths:
850       - $LOG_PATH
851     expire_in: 1 week
852     reports:
853         junit: $LOG_PATH/*/XUNIT_RESULT.xml
854   variables:
855     TEST_FW_PATH: "$CI_PROJECT_DIR/tools/tiny-test-fw"
856     TEST_CASE_PATH: "$CI_PROJECT_DIR/examples"
857     CONFIG_FILE: "$CI_PROJECT_DIR/examples/test_configs/$CI_JOB_NAME.yml"
858     LOG_PATH: "$CI_PROJECT_DIR/TEST_LOGS"
859     ENV_FILE: "$CI_PROJECT_DIR/ci-test-runner-configs/$CI_RUNNER_DESCRIPTION/EnvConfig.yml"
860   script:
861     # first test if config file exists, if not exist, exit 0
862     - test -e $CONFIG_FILE || exit 0
863     # clone test env configs
864     - git clone $TEST_ENV_CONFIG_REPOSITORY
865     - cd ci-test-runner-configs
866     - python $CHECKOUT_REF_SCRIPT ci-test-runner-configs
867     - cd $TEST_FW_PATH
868     # run test
869     - python Runner.py $TEST_CASE_PATH -c $CONFIG_FILE -e $ENV_FILE
870
871 .unit_test_template: &unit_test_template
872   <<: *example_test_template
873   stage: target_test
874   dependencies:
875     - assign_test
876     - build_esp_idf_tests_make
877     - build_esp_idf_tests_cmake
878   only:
879     refs:
880       - master
881       - /^release\/v/
882       - /^v\d+\.\d+(\.\d+)?($|-)/
883       - triggers
884       - schedules
885     variables:
886       - $BOT_TRIGGER_WITH_LABEL == null
887       - $BOT_LABEL_UNIT_TEST
888   variables:
889     TEST_FW_PATH: "$CI_PROJECT_DIR/tools/tiny-test-fw"
890     TEST_CASE_PATH: "$CI_PROJECT_DIR/tools/unit-test-app"
891     CONFIG_FILE: "$CI_PROJECT_DIR/components/idf_test/unit_test/CIConfigs/$CI_JOB_NAME.yml"
892     LOG_PATH: "$CI_PROJECT_DIR/TEST_LOGS"
893     ENV_FILE: "$CI_PROJECT_DIR/ci-test-runner-configs/$CI_RUNNER_DESCRIPTION/EnvConfig.yml"
894
895 .test_template: &test_template
896   stage: target_test
897   when: on_success
898   only:
899     refs:
900       - master
901       - /^release\/v/
902       - /^v\d+\.\d+(\.\d+)?($|-)/
903       - triggers
904       - schedules
905     variables:
906       - $BOT_TRIGGER_WITH_LABEL == null
907       - $BOT_LABEL_INTEGRATION_TEST
908   dependencies:
909     - assign_test
910     - build_ssc_00
911     - build_ssc_01
912     - build_ssc_02
913   artifacts:
914     when: always
915     paths:
916       - $LOG_PATH
917     expire_in: 1 week
918   variables:
919     LOCAL_ENV_CONFIG_PATH: "$CI_PROJECT_DIR/ci-test-runner-configs/$CI_RUNNER_DESCRIPTION/ESP32_IDF"
920     LOG_PATH: "$CI_PROJECT_DIR/$CI_COMMIT_SHA"
921     TEST_CASE_FILE_PATH: "$CI_PROJECT_DIR/components/idf_test/integration_test"
922     MODULE_UPDATE_FILE: "$CI_PROJECT_DIR/components/idf_test/ModuleDefinition.yml"
923     CONFIG_FILE: "$CI_PROJECT_DIR/components/idf_test/integration_test/CIConfigs/$CI_JOB_NAME.yml"
924   before_script: *add_gitlab_key_before
925   script:
926     # first test if config file exists, if not exist, exit 0
927     - test -e $CONFIG_FILE || exit 0
928     # clone local test env configs
929     - git clone $TEST_ENV_CONFIG_REPOSITORY
930     - cd ci-test-runner-configs
931     - python $CHECKOUT_REF_SCRIPT ci-test-runner-configs
932     # clone test bench
933     - git clone $TEST_SCRIPT_REPOSITORY
934     - cd auto_test_script
935     - python $CHECKOUT_REF_SCRIPT auto_test_script
936     # run test
937     - 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
938
939 nvs_compatible_test:
940   <<: *test_template
941   artifacts:
942     when: always
943     paths:
944       - $LOG_PATH
945       - nvs_wifi.bin
946     expire_in: 1 mos
947   tags:
948     - ESP32_IDF
949     - NVS_Compatible
950   script:
951     # clone local test env configs
952     - git clone $TEST_ENV_CONFIG_REPOSITORY
953     - cd ci-test-runner-configs
954     - python $CHECKOUT_REF_SCRIPT ci-test-runner-configs
955     # clone test bench
956     - git clone $TEST_SCRIPT_REPOSITORY
957     - cd auto_test_script
958     - git checkout ${CI_COMMIT_REF_NAME} || echo "Using default branch..."
959     # prepare nvs bins
960     - ./Tools/prepare_nvs_bin.sh
961     # run test
962     - 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
963
964 example_test_001_01:
965   <<: *example_test_template
966   tags:
967     - ESP32
968     - Example_WIFI
969
970 example_test_001_02:
971   <<: *example_test_template
972   tags:
973     - ESP32
974     - Example_WIFI
975
976 example_test_002_01:
977   <<: *example_test_template
978   image: $CI_DOCKER_REGISTRY/ubuntu-test-env$BOT_DOCKER_IMAGE_TAG
979   tags:
980     - ESP32
981     - Example_ShieldBox_Basic
982
983 example_test_003_01:
984   <<: *example_test_template
985   tags:
986     - ESP32
987     - Example_SDIO
988
989 example_test_004_01:
990   <<: *example_test_template
991   tags:
992     - ESP32
993     - Example_CAN
994
995 example_test_005_01:
996   <<: *example_test_template
997   tags:
998     - ESP32
999     - Example_WIFI_BT
1000
1001 example_test_006_01:
1002   <<: *example_test_template
1003   image: $CI_DOCKER_REGISTRY/ubuntu-test-env$BOT_DOCKER_IMAGE_TAG
1004   only:
1005     variables:
1006       - $BOT_LABEL_IPERF_STRESS_TEST
1007   tags:
1008     - ESP32
1009     - Example_ShieldBox
1010
1011 example_test_007_01:
1012   <<: *example_test_template
1013   tags:
1014     - ESP32
1015     - Example_I2C_CCS811_SENSOR
1016
1017 UT_001_01:
1018   <<: *unit_test_template
1019   tags:
1020     - ESP32_IDF
1021     - UT_T1_1
1022
1023 UT_001_02:
1024   <<: *unit_test_template
1025   tags:
1026     - ESP32_IDF
1027     - UT_T1_1
1028
1029 UT_001_03:
1030   <<: *unit_test_template
1031   tags:
1032     - ESP32_IDF
1033     - UT_T1_1
1034
1035 UT_001_04:
1036   <<: *unit_test_template
1037   tags:
1038     - ESP32_IDF
1039     - UT_T1_1
1040
1041 UT_001_05:
1042   <<: *unit_test_template
1043   tags:
1044     - ESP32_IDF
1045     - UT_T1_1
1046
1047 UT_001_06:
1048   <<: *unit_test_template
1049   tags:
1050     - ESP32_IDF
1051     - UT_T1_1
1052
1053 UT_001_07:
1054   <<: *unit_test_template
1055   tags:
1056     - ESP32_IDF
1057     - UT_T1_1
1058
1059 UT_001_08:
1060   <<: *unit_test_template
1061   tags:
1062     - ESP32_IDF
1063     - UT_T1_1
1064
1065 UT_001_09:
1066   <<: *unit_test_template
1067   tags:
1068     - ESP32_IDF
1069     - UT_T1_1
1070
1071 UT_001_10:
1072   <<: *unit_test_template
1073   tags:
1074     - ESP32_IDF
1075     - UT_T1_1
1076
1077 UT_001_11:
1078   <<: *unit_test_template
1079   tags:
1080     - ESP32_IDF
1081     - UT_T1_1
1082
1083 UT_001_12:
1084   <<: *unit_test_template
1085   tags:
1086     - ESP32_IDF
1087     - UT_T1_1
1088
1089 UT_001_13:
1090   <<: *unit_test_template
1091   tags:
1092     - ESP32_IDF
1093     - UT_T1_1
1094
1095 UT_001_14:
1096   <<: *unit_test_template
1097   tags:
1098     - ESP32_IDF
1099     - UT_T1_1
1100
1101 UT_001_15:
1102   <<: *unit_test_template
1103   tags:
1104     - ESP32_IDF
1105     - UT_T1_1
1106
1107 UT_001_16:
1108   <<: *unit_test_template
1109   tags:
1110     - ESP32_IDF
1111     - UT_T1_1
1112
1113 UT_001_17:
1114   <<: *unit_test_template
1115   tags:
1116     - ESP32_IDF
1117     - UT_T1_1
1118
1119 UT_001_18:
1120   <<: *unit_test_template
1121   tags:
1122     - ESP32_IDF
1123     - UT_T1_1
1124
1125 UT_001_19:
1126   <<: *unit_test_template
1127   tags:
1128     - ESP32_IDF
1129     - UT_T1_1
1130
1131 UT_001_20:
1132   <<: *unit_test_template
1133   tags:
1134     - ESP32_IDF
1135     - UT_T1_1
1136
1137 UT_001_21:
1138   <<: *unit_test_template
1139   tags:
1140     - ESP32_IDF
1141     - UT_T1_1
1142
1143 UT_001_22:
1144   <<: *unit_test_template
1145   tags:
1146     - ESP32_IDF
1147     - UT_T1_1
1148
1149 UT_001_23:
1150   <<: *unit_test_template
1151   tags:
1152     - ESP32_IDF
1153     - UT_T1_1
1154
1155 UT_001_24:
1156   <<: *unit_test_template
1157   tags:
1158     - ESP32_IDF
1159     - UT_T1_1
1160
1161 UT_001_25:
1162   <<: *unit_test_template
1163   tags:
1164     - ESP32_IDF
1165     - UT_T1_1
1166
1167 UT_001_26:
1168   <<: *unit_test_template
1169   tags:
1170     - ESP32_IDF
1171     - UT_T1_1
1172
1173 UT_001_27:
1174   <<: *unit_test_template
1175   tags:
1176     - ESP32_IDF
1177     - UT_T1_1
1178
1179 UT_001_28:
1180   <<: *unit_test_template
1181   tags:
1182     - ESP32_IDF
1183     - UT_T1_1
1184
1185 UT_001_29:
1186   <<: *unit_test_template
1187   tags:
1188     - ESP32_IDF
1189     - UT_T1_1
1190
1191 UT_001_30:
1192   <<: *unit_test_template
1193   tags:
1194     - ESP32_IDF
1195     - UT_T1_1
1196
1197 UT_001_31:
1198   <<: *unit_test_template
1199   tags:
1200     - ESP32_IDF
1201     - UT_T1_1
1202
1203 UT_001_32:
1204   <<: *unit_test_template
1205   tags:
1206     - ESP32_IDF
1207     - UT_T1_1
1208
1209 UT_001_33:
1210   <<: *unit_test_template
1211   tags:
1212     - ESP32_IDF
1213     - UT_T1_1
1214
1215 UT_001_34:
1216   <<: *unit_test_template
1217   tags:
1218     - ESP32_IDF
1219     - UT_T1_1
1220
1221 UT_001_35:
1222   <<: *unit_test_template
1223   tags:
1224     - ESP32_IDF
1225     - UT_T1_1
1226
1227 UT_001_36:
1228   <<: *unit_test_template
1229   tags:
1230     - ESP32_IDF
1231     - UT_T1_1
1232
1233 UT_001_37:
1234   <<: *unit_test_template
1235   tags:
1236     - ESP32_IDF
1237     - UT_T1_1
1238
1239 UT_001_38:
1240   <<: *unit_test_template
1241   tags:
1242     - ESP32_IDF
1243     - UT_T1_1
1244
1245 UT_001_39:
1246   <<: *unit_test_template
1247   tags:
1248     - ESP32_IDF
1249     - UT_T1_1
1250
1251 UT_001_40:
1252   <<: *unit_test_template
1253   tags:
1254     - ESP32_IDF
1255     - UT_T1_1
1256
1257 UT_001_41:
1258   <<: *unit_test_template
1259   tags:
1260     - ESP32_IDF
1261     - UT_T1_1
1262
1263 UT_001_42:
1264   <<: *unit_test_template
1265   tags:
1266     - ESP32_IDF
1267     - UT_T1_1
1268
1269 UT_002_01:
1270   <<: *unit_test_template
1271   tags:
1272     - ESP32_IDF
1273     - UT_T1_SDMODE
1274
1275 UT_002_02:
1276   <<: *unit_test_template
1277   tags:
1278     - ESP32_IDF
1279     - UT_T1_SDMODE
1280
1281 UT_002_03:
1282   <<: *unit_test_template
1283   tags:
1284     - ESP32_IDF
1285     - UT_T1_SDMODE
1286
1287 UT_003_01:
1288   <<: *unit_test_template
1289   tags:
1290     - ESP32_IDF
1291     - UT_T1_SPIMODE
1292
1293 UT_003_02:
1294   <<: *unit_test_template
1295   tags:
1296     - ESP32_IDF
1297     - UT_T1_SPIMODE
1298
1299 UT_003_03:
1300   <<: *unit_test_template
1301   tags:
1302     - ESP32_IDF
1303     - UT_T1_SPIMODE
1304
1305 UT_004_01:
1306   <<: *unit_test_template
1307   tags:
1308     - ESP32_IDF
1309     - UT_T1_1
1310     - psram
1311
1312 UT_004_02:
1313   <<: *unit_test_template
1314   tags:
1315     - ESP32_IDF
1316     - UT_T1_1
1317     - psram
1318
1319 UT_004_03:
1320   <<: *unit_test_template
1321   tags:
1322     - ESP32_IDF
1323     - UT_T1_1
1324     - psram
1325
1326 UT_004_04:
1327   <<: *unit_test_template
1328   tags:
1329     - ESP32_IDF
1330     - UT_T1_1
1331     - psram
1332
1333 UT_004_05:
1334   <<: *unit_test_template
1335   tags:
1336     - ESP32_IDF
1337     - UT_T1_1
1338     - psram
1339
1340 UT_004_06:
1341   <<: *unit_test_template
1342   tags:
1343     - ESP32_IDF
1344     - UT_T1_1
1345     - psram
1346
1347 UT_004_07:
1348   <<: *unit_test_template
1349   tags:
1350     - ESP32_IDF
1351     - UT_T1_1
1352     - psram
1353
1354 UT_004_08:
1355   <<: *unit_test_template
1356   tags:
1357     - ESP32_IDF
1358     - UT_T1_1
1359     - psram
1360
1361 UT_004_09:
1362   <<: *unit_test_template
1363   tags:
1364     - ESP32_IDF
1365     - UT_T1_1
1366     - psram
1367
1368 UT_004_10:
1369   <<: *unit_test_template
1370   tags:
1371     - ESP32_IDF
1372     - UT_T1_1
1373     - psram
1374
1375 UT_004_11:
1376   <<: *unit_test_template
1377   tags:
1378     - ESP32_IDF
1379     - UT_T1_1
1380     - psram
1381
1382 UT_004_12:
1383   <<: *unit_test_template
1384   tags:
1385     - ESP32_IDF
1386     - UT_T1_1
1387     - psram
1388
1389 UT_004_13:
1390   <<: *unit_test_template
1391   tags:
1392     - ESP32_IDF
1393     - UT_T1_1
1394     - psram
1395
1396 UT_004_14:
1397   <<: *unit_test_template
1398   tags:
1399     - ESP32_IDF
1400     - UT_T1_1
1401     - psram
1402
1403 UT_004_15:
1404   <<: *unit_test_template
1405   tags:
1406     - ESP32_IDF
1407     - UT_T1_1
1408     - psram
1409
1410 UT_004_14:
1411   <<: *unit_test_template
1412   tags:
1413     - ESP32_IDF
1414     - UT_T1_1
1415     - psram
1416
1417 UT_005_01:
1418   <<: *unit_test_template
1419   tags:
1420     - ESP32_IDF
1421     - UT_T1_SDMODE
1422     - psram
1423
1424 UT_005_02:
1425   <<: *unit_test_template
1426   tags:
1427     - ESP32_IDF
1428     - UT_T1_SPIMODE
1429     - psram
1430
1431 UT_005_03:
1432   <<: *unit_test_template
1433   tags:
1434     - ESP32_IDF
1435     - UT_T1_SPIMODE
1436     - psram
1437
1438 UT_006_01:
1439   <<: *unit_test_template
1440   tags:
1441     - ESP32_IDF
1442     - UT_T1_GPIO
1443
1444 UT_006_02:
1445   <<: *unit_test_template
1446   tags:
1447     - ESP32_IDF
1448     - UT_T1_GPIO
1449
1450 UT_006_03:
1451   <<: *unit_test_template
1452   tags:
1453     - ESP32_IDF
1454     - UT_T1_GPIO
1455
1456 UT_006_04:
1457   <<: *unit_test_template
1458   tags:
1459     - ESP32_IDF
1460     - UT_T1_GPIO
1461     - psram
1462
1463 UT_007_01:
1464   <<: *unit_test_template
1465   tags:
1466     - ESP32_IDF
1467     - UT_T1_PCNT
1468
1469 UT_007_02:
1470   <<: *unit_test_template
1471   tags:
1472     - ESP32_IDF
1473     - UT_T1_PCNT
1474
1475 UT_007_03:
1476   <<: *unit_test_template
1477   tags:
1478     - ESP32_IDF
1479     - UT_T1_PCNT
1480
1481 UT_007_04:
1482   <<: *unit_test_template
1483   tags:
1484     - ESP32_IDF
1485     - UT_T1_PCNT
1486     - psram
1487
1488 UT_008_01:
1489   <<: *unit_test_template
1490   tags:
1491     - ESP32_IDF
1492     - UT_T1_LEDC
1493
1494 UT_008_02:
1495   <<: *unit_test_template
1496   tags:
1497     - ESP32_IDF
1498     - UT_T1_LEDC
1499
1500 UT_008_03:
1501   <<: *unit_test_template
1502   tags:
1503     - ESP32_IDF
1504     - UT_T1_LEDC
1505
1506 UT_008_04:
1507   <<: *unit_test_template
1508   tags:
1509     - ESP32_IDF
1510     - UT_T1_LEDC
1511     - psram
1512
1513 UT_009_01:
1514   <<: *unit_test_template
1515   tags:
1516     - ESP32_IDF
1517     - UT_T2_RS485
1518
1519 UT_009_02:
1520   <<: *unit_test_template
1521   tags:
1522     - ESP32_IDF
1523     - UT_T2_RS485
1524
1525 UT_009_03:
1526   <<: *unit_test_template
1527   tags:
1528     - ESP32_IDF
1529     - UT_T2_RS485
1530
1531 UT_009_04:
1532   <<: *unit_test_template
1533   tags:
1534     - ESP32_IDF
1535     - UT_T2_RS485
1536     - psram
1537
1538 UT_010_01:
1539   <<: *unit_test_template
1540   tags:
1541     - ESP32_IDF
1542     - UT_T1_RMT
1543
1544 UT_010_02:
1545   <<: *unit_test_template
1546   tags:
1547     - ESP32_IDF
1548     - UT_T1_RMT
1549
1550 UT_010_03:
1551   <<: *unit_test_template
1552   tags:
1553     - ESP32_IDF
1554     - UT_T1_RMT
1555
1556 UT_010_04:
1557   <<: *unit_test_template
1558   tags:
1559     - ESP32_IDF
1560     - UT_T1_RMT
1561     - psram
1562
1563 UT_011_01:
1564   <<: *unit_test_template
1565   tags:
1566     - ESP32_IDF
1567     - EMMC
1568
1569 UT_011_02:
1570   <<: *unit_test_template
1571   tags:
1572     - ESP32_IDF
1573     - EMMC
1574
1575 UT_011_03:
1576   <<: *unit_test_template
1577   tags:
1578     - ESP32_IDF
1579     - EMMC
1580
1581 UT_012_01:
1582   <<: *unit_test_template
1583   tags:
1584     - ESP32_IDF
1585     - UT_T1_1
1586     - 8Mpsram
1587
1588 UT_012_02:
1589   <<: *unit_test_template
1590   tags:
1591     - ESP32_IDF
1592     - UT_T1_1
1593     - 8Mpsram
1594
1595 UT_012_03:
1596   <<: *unit_test_template
1597   tags:
1598     - ESP32_IDF
1599     - UT_T1_1
1600     - 8Mpsram
1601
1602 UT_012_04:
1603   <<: *unit_test_template
1604   tags:
1605     - ESP32_IDF
1606     - UT_T1_1
1607     - 8Mpsram
1608
1609 UT_012_05:
1610   <<: *unit_test_template
1611   tags:
1612     - ESP32_IDF
1613     - UT_T1_1
1614     - 8Mpsram
1615
1616 UT_014_01:
1617   <<: *unit_test_template
1618   tags:
1619     - ESP32_IDF
1620     - UT_T2_I2C
1621
1622 UT_014_02:
1623   <<: *unit_test_template
1624   tags:
1625     - ESP32_IDF
1626     - UT_T2_I2C
1627
1628 UT_014_03:
1629   <<: *unit_test_template
1630   tags:
1631     - ESP32_IDF
1632     - UT_T2_I2C
1633
1634 UT_014_04:
1635   <<: *unit_test_template
1636   tags:
1637     - ESP32_IDF
1638     - UT_T2_I2C
1639     - psram
1640
1641 UT_015_01:
1642   <<: *unit_test_template
1643   tags:
1644     - ESP32_IDF
1645     - UT_T1_MCPWM
1646
1647 UT_015_02:
1648   <<: *unit_test_template
1649   tags:
1650     - ESP32_IDF
1651     - UT_T1_MCPWM
1652
1653 UT_015_03:
1654   <<: *unit_test_template
1655   tags:
1656     - ESP32_IDF
1657     - UT_T1_MCPWM
1658
1659 UT_015_04:
1660   <<: *unit_test_template
1661   tags:
1662     - ESP32_IDF
1663     - UT_T1_MCPWM
1664     - psram
1665
1666 UT_016_01:
1667   <<: *unit_test_template
1668   tags:
1669     - ESP32_IDF
1670     - UT_T1_I2S
1671
1672 UT_016_02:
1673   <<: *unit_test_template
1674   tags:
1675     - ESP32_IDF
1676     - UT_T1_I2S
1677
1678 UT_016_03:
1679   <<: *unit_test_template
1680   tags:
1681     - ESP32_IDF
1682     - UT_T1_I2S
1683
1684 UT_016_04:
1685   <<: *unit_test_template
1686   tags:
1687     - ESP32_IDF
1688     - UT_T1_I2S
1689     - psram
1690
1691 UT_601_01:
1692   <<: *unit_test_template
1693   tags:
1694     - ESP32_IDF
1695     - UT_T1_1
1696
1697 IT_001_01:
1698   <<: *test_template
1699   tags:
1700     - ESP32_IDF
1701     - SSC_T1_4
1702
1703 IT_001_02:
1704   <<: *test_template
1705   tags:
1706     - ESP32_IDF
1707     - SSC_T1_4
1708
1709 IT_001_03:
1710   <<: *test_template
1711   tags:
1712     - ESP32_IDF
1713     - SSC_T1_4
1714
1715 IT_002_01:
1716   <<: *test_template
1717   tags:
1718     - ESP32_IDF
1719     - SSC_T1_2
1720
1721 IT_003_01:
1722   <<: *test_template
1723   tags:
1724     - ESP32_IDF
1725     - SSC_T2_5
1726
1727 IT_003_02:
1728   <<: *test_template
1729   tags:
1730     - ESP32_IDF
1731     - SSC_T2_5
1732
1733 IT_003_03:
1734   <<: *test_template
1735   tags:
1736     - ESP32_IDF
1737     - SSC_T2_5
1738
1739 IT_003_04:
1740   <<: *test_template
1741   tags:
1742     - ESP32_IDF
1743     - SSC_T2_5
1744
1745 IT_003_05:
1746   <<: *test_template
1747   tags:
1748     - ESP32_IDF
1749     - SSC_T2_5
1750
1751 IT_003_06:
1752   <<: *test_template
1753   tags:
1754     - ESP32_IDF
1755     - SSC_T2_5
1756
1757 IT_003_07:
1758   <<: *test_template
1759   tags:
1760     - ESP32_IDF
1761     - SSC_T2_5
1762
1763 IT_003_08:
1764   <<: *test_template
1765   tags:
1766     - ESP32_IDF
1767     - SSC_T2_5
1768
1769 IT_003_09:
1770   <<: *test_template
1771   tags:
1772     - ESP32_IDF
1773     - SSC_T2_5
1774
1775 IT_003_10:
1776   <<: *test_template
1777   tags:
1778     - ESP32_IDF
1779     - SSC_T2_5
1780
1781 IT_003_11:
1782   <<: *test_template
1783   tags:
1784     - ESP32_IDF
1785     - SSC_T2_5
1786
1787 IT_003_12:
1788   <<: *test_template
1789   tags:
1790     - ESP32_IDF
1791     - SSC_T2_5
1792
1793 IT_003_13:
1794   <<: *test_template
1795   tags:
1796     - ESP32_IDF
1797     - SSC_T2_5
1798
1799 IT_004_01:
1800   <<: *test_template
1801   tags:
1802     - ESP32_IDF
1803     - SSC_T1_APC
1804
1805 IT_005_01:
1806   <<: *test_template
1807   tags:
1808     - ESP32_IDF
1809     - SSC_T1_5
1810
1811 IT_005_02:
1812   <<: *test_template
1813   tags:
1814     - ESP32_IDF
1815     - SSC_T1_5
1816
1817 IT_006_01:
1818   <<: *test_template
1819   tags:
1820     - ESP32_IDF
1821     - SSC_T1_6
1822
1823 IT_006_02:
1824   <<: *test_template
1825   tags:
1826     - ESP32_IDF
1827     - SSC_T1_6
1828
1829 IT_006_03:
1830   <<: *test_template
1831   tags:
1832     - ESP32_IDF
1833     - SSC_T1_6
1834
1835 IT_006_04:
1836   <<: *test_template
1837   tags:
1838     - ESP32_IDF
1839     - SSC_T1_6
1840
1841 IT_006_05:
1842   <<: *test_template
1843   tags:
1844     - ESP32_IDF
1845     - SSC_T1_6
1846
1847 IT_007_01:
1848   <<: *test_template
1849   tags:
1850     - ESP32_IDF
1851     - SSC_T1_7
1852
1853 IT_007_02:
1854   <<: *test_template
1855   tags:
1856     - ESP32_IDF
1857     - SSC_T1_7
1858
1859 IT_008_01:
1860   <<: *test_template
1861   tags:
1862     - ESP32_IDF
1863     - SSC_T1_8
1864
1865 IT_009_01:
1866   <<: *test_template
1867   tags:
1868     - ESP32_IDF
1869     - SSC_T1_3
1870
1871 IT_010_01:
1872   <<: *test_template
1873   tags:
1874     - ESP32_IDF
1875     - SSC_T5_1
1876
1877 IT_011_01:
1878   <<: *test_template
1879   tags:
1880     - ESP32_IDF
1881     - SSC_T50_1
1882
1883 IT_012_01:
1884   <<: *test_template
1885   tags:
1886     - ESP32_IDF
1887     - SSC_T1_9
1888
1889 IT_013_01:
1890   <<: *test_template
1891   tags:
1892     - ESP32_IDF
1893     - SSC_T2_2
1894
1895 IT_013_02:
1896   <<: *test_template
1897   tags:
1898     - ESP32_IDF
1899     - SSC_T2_2
1900
1901 IT_014_01:
1902   <<: *test_template
1903   tags:
1904     - ESP32_IDF
1905     - SSC_T2_3
1906
1907 IT_015_01:
1908   <<: *test_template
1909   tags:
1910     - ESP32_IDF
1911     - SSC_T2_4