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