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