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