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