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