]> granicus.if.org Git - esp-idf/blob - .gitlab-ci.yml
Merge branch 'bugfix/esp_err_name_idf_path' into 'master'
[esp-idf] / .gitlab-ci.yml
1 stages:
2   - build
3   - assign_test
4   - unit_test
5   - test
6   - test_report
7   - deploy
8
9 variables:
10 # System environment
11
12   # Common parameters for the 'make' during CI tests
13   MAKEFLAGS: "-j5 --no-keep-going"
14
15 # GitLab-CI environment
16
17   # more attempts for more robust
18   GET_SOURCES_ATTEMPTS: "10"
19   ARTIFACT_DOWNLOAD_ATTEMPTS: "10"
20
21   # We use get_sources.sh script to fetch the submodules and/or re-fetch the repo
22   # if it was corrupted (if submodule update fails this can happen)
23   GIT_STRATEGY: fetch
24   GIT_SUBMODULE_STRATEGY: none
25
26 # IDF environment
27
28   IDF_PATH: "$CI_PROJECT_DIR"
29   BATCH_BUILD: "1"
30   V: "0"
31   APPLY_BOT_FILTER_SCRIPT: "$CI_PROJECT_DIR/tools/ci/apply_bot_filter.py"
32   CHECKOUT_REF_SCRIPT: "$CI_PROJECT_DIR/tools/ci/checkout_project_ref.py"
33
34 # When 'fetch' strategy is used, Gitlab removes untracked files before checking out
35 # new revision. However if the new revision doesn't include some of the submodules
36 # which were present in the old revision, such submodule directories would not be
37 # removed by the checkout. This extra step ensures that these stale submodules
38 # are removed.
39 .git_clean_stale_submodules:  &git_clean_stale_submodules >
40   find . -name '.git' -not -path './.git' -printf '%P\n'
41   | sed 's|/.git||' 
42   | xargs -I {} sh -c '
43   grep -q {} .gitmodules 
44   ||  (echo "Removing {}, has .git directory but not in .gitmodules file" 
45   && rm -rf {});'
46
47 # before each job, we need to check if this job is filtered by bot stage/job filter
48 .apply_bot_filter: &apply_bot_filter
49   python $APPLY_BOT_FILTER_SCRIPT || exit 0
50
51 before_script:
52   - *git_clean_stale_submodules
53   # apply bot filter in before script
54   - *apply_bot_filter
55   # add gitlab ssh key
56   - mkdir -p ~/.ssh
57   - chmod 700 ~/.ssh
58   - echo -n $GITLAB_KEY > ~/.ssh/id_rsa_base64
59   - base64 --decode --ignore-garbage ~/.ssh/id_rsa_base64 > ~/.ssh/id_rsa
60   - chmod 600 ~/.ssh/id_rsa
61   - echo -e "Host gitlab.espressif.cn\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
62
63   # Set IS_PRIVATE or IS_PUBLIC depending on if our branch is public or not
64   #
65   # (the same regular expressions are used to set these are used in 'only:' sections below
66   - source tools/ci/configure_ci_environment.sh
67
68   # fetch the submodules (& if necessary re-fetch repo) from gitlab
69   - time ./tools/ci/get-full-sources.sh
70
71 .do_nothing_before:
72   before_script: &do_nothing_before
73     - *git_clean_stale_submodules
74     # apply bot filter in before script
75     - *apply_bot_filter
76     - echo "Not setting up GitLab key, not fetching submodules"
77     - source tools/ci/configure_ci_environment.sh
78
79 .add_gitlab_key_before:
80   before_script: &add_gitlab_key_before
81     - *git_clean_stale_submodules
82     # apply bot filter in before script
83     - *apply_bot_filter
84     - echo "Not fetching submodules"
85     - source tools/ci/configure_ci_environment.sh
86     # add gitlab ssh key
87     - mkdir -p ~/.ssh
88     - chmod 700 ~/.ssh
89     - echo -n $GITLAB_KEY > ~/.ssh/id_rsa_base64
90     - base64 --decode --ignore-garbage ~/.ssh/id_rsa_base64 > ~/.ssh/id_rsa
91     - chmod 600 ~/.ssh/id_rsa
92     - echo -e "Host gitlab.espressif.cn\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
93
94 build_template_app:
95   stage: build
96   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
97   tags:
98     - build
99   variables:
100     BATCH_BUILD: "1"
101     IDF_CI_BUILD: "1"
102   script:
103     - git clone https://github.com/espressif/esp-idf-template.git
104     - cd esp-idf-template
105     # Try to use the same branch name for esp-idf-template that we're
106     # using on esp-idf. If it doesn't exist then just stick to the default
107     # branch
108     - python $CHECKOUT_REF_SCRIPT esp-idf-template
109     # Test debug build (default)
110     - make all V=1
111     # Now test release build
112     - make clean
113     - sed -i.bak -e's/CONFIG_OPTIMIZATION_LEVEL_DEBUG\=y/CONFIG_OPTIMIZATION_LEVEL_RELEASE=y/' sdkconfig
114     - make all V=1
115     # Check if there are any stray printf/ets_printf references in WiFi libs
116     - cd ../components/esp32/lib
117     - test $(xtensa-esp32-elf-nm *.a | grep -w printf | wc -l) -eq 0
118     - test $(xtensa-esp32-elf-nm *.a | grep -w ets_printf | wc -l) -eq 0
119
120
121 .build_template: &build_template
122   stage: build
123   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
124   tags:
125     - build
126   variables:
127     BATCH_BUILD: "1"
128     V: "0"
129
130 .build_ssc_template: &build_ssc_template
131   <<: *build_template
132   artifacts:
133     paths:
134       - SSC/ssc_bin
135     expire_in: 1 mos
136   variables:
137     SSC_CONFIG_FOLDER: "$CI_PROJECT_DIR/SSC/configs/ESP32_IDF"
138   script:
139     - git clone $SSC_REPOSITORY
140     - cd SSC
141     - python $CHECKOUT_REF_SCRIPT SSC
142     - MAKEFLAGS= ./ci_build_ssc.sh "${CI_JOB_NAME}" "${IDF_PATH}/.gitlab-ci.yml"
143
144 # don't forget to add to dependency to test_template when adding new build_ssc jobs
145 build_ssc_00:
146   <<: *build_ssc_template
147
148 build_ssc_01:
149   <<: *build_ssc_template
150
151 build_ssc_02:
152   <<: *build_ssc_template
153
154 build_esp_idf_tests:
155   <<: *build_template
156   artifacts:
157     paths:
158       - tools/unit-test-app/output
159       - components/idf_test/unit_test/TestCaseAll.yml
160       - components/idf_test/unit_test/CIConfigs/*.yml
161     expire_in: 6 mos
162   script:
163     - cd tools/unit-test-app
164     - MAKEFLAGS= make help # make sure kconfig tools are built in single process
165     - make ut-clean-all-configs
166     - export EXTRA_CFLAGS="-Werror -Werror=deprecated-declarations"
167     - export EXTRA_CXXFLAGS=${EXTRA_CFLAGS}
168     - make ut-build-all-configs
169     - python tools/UnitTestParser.py
170
171 .build_examples_template: &build_examples_template
172   <<: *build_template
173   retry: 1
174   artifacts:
175     when: always
176     paths:
177       - build_examples/*/*/*/build/*.bin
178       - build_examples/*/*/*/build/*.elf
179       - build_examples/*/*/*/build/*.map
180       - build_examples/*/*/*/build/download.config
181       - build_examples/*/*/*/build/bootloader/*.bin
182       - $LOG_PATH
183     expire_in: 1 week
184   variables:
185     IDF_CI_BUILD: "1"
186     LOG_PATH: "$CI_PROJECT_DIR/log_examples"
187   script:
188     # it's not possible to build 100% out-of-tree and have the "artifacts"
189     # mechanism work, but this is the next best thing
190     - rm -rf build_examples
191     - mkdir build_examples
192     - cd build_examples
193     # build some of examples
194     - mkdir -p ${LOG_PATH}
195     - ${IDF_PATH}/tools/ci/build_examples.sh "${CI_JOB_NAME}"
196
197 build_examples_00:
198   <<: *build_examples_template
199
200 build_examples_01:
201   <<: *build_examples_template
202
203 build_examples_02:
204   <<: *build_examples_template
205
206 build_examples_03:
207   <<: *build_examples_template
208
209 build_examples_04:
210   <<: *build_examples_template
211
212 build_examples_05:
213   <<: *build_examples_template
214
215 build_examples_06:
216   <<: *build_examples_template
217
218 build_examples_07:
219   <<: *build_examples_template
220
221
222 build_docs:
223   stage: build
224   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
225   tags:
226     - build_docs
227   artifacts:
228     when: always
229     paths:
230       # English version of documentation
231       - docs/en/doxygen-warning-log.txt
232       - docs/en/sphinx-warning-log.txt
233       - docs/en/sphinx-warning-log-sanitized.txt
234       - docs/en/_build/html
235       # Chinese version of documentation
236       - docs/zh_CN/doxygen-warning-log.txt
237       - docs/zh_CN/sphinx-warning-log.txt
238       - docs/zh_CN/sphinx-warning-log-sanitized.txt
239       - docs/zh_CN/_build/html
240     expire_in: 1 mos
241   script:
242     - cd docs
243     - ./check_lang_folder_sync.sh
244     - cd en
245     - make gh-linkcheck
246     - make html
247     - ../check_doc_warnings.sh
248     - cd ../zh_CN
249     - make gh-linkcheck
250     - make html
251     - ../check_doc_warnings.sh
252
253 test_nvs_on_host:
254   stage: test
255   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
256   tags:
257     - host_test
258   dependencies: []
259   script:
260     - cd components/nvs_flash/test_nvs_host
261     - make test
262
263 test_nvs_coverage:
264   stage: test
265   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
266   tags:
267     - host_test
268   dependencies: []
269   artifacts:
270     paths:
271       - components/nvs_flash/test_nvs_host/coverage_report
272   only:
273     - triggers
274   # This job takes a few hours to finish, so only run it on demand
275   variables:
276     BOT_NEEDS_TRIGGER_BY_NAME: 1
277   script:
278     - cd components/nvs_flash/test_nvs_host
279     - make coverage_report
280
281 test_partition_table_on_host:
282   stage: test
283   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
284   tags:
285     - build
286   dependencies: []
287   script:
288     - cd components/partition_table/test_gen_esp32part_host
289     - ./gen_esp32part_tests.py
290
291 test_wl_on_host:
292   stage: test
293   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
294   tags:
295     - host_test
296   artifacts:
297     paths:
298       - components/wear_levelling/test_wl_host/coverage_report.zip
299   dependencies: []
300   script:
301     - cd components/wear_levelling/test_wl_host
302     - make test
303
304 test_fatfs_on_host:
305   stage: test
306   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
307   tags:
308     - wl_host_test
309   dependencies: []
310   script:
311     - cd components/fatfs/test_fatfs_host/
312     - make test
313
314 test_spiffs_on_host:
315   stage: test
316   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
317   tags:
318     - wl_host_test
319   dependencies: []
320   script:
321     - cd components/spiffs/test_spiffs_host/
322     - make test
323
324 test_multi_heap_on_host:
325   stage: test
326   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
327   tags:
328     - host_test
329   script:
330     - cd components/heap/test_multi_heap_host
331     - ./test_all_configs.sh
332
333 test_build_system:
334   stage: test
335   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
336   tags:
337     - host_test
338   dependencies: []
339   script:
340     - ${IDF_PATH}/tools/ci/test_configure_ci_environment.sh
341     - rm -rf test_build_system
342     - mkdir test_build_system
343     - cd test_build_system
344     - ${IDF_PATH}/tools/ci/test_build_system.sh
345
346 test_report:
347   stage: test_report
348   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
349   tags:
350     - report
351   only:
352     - master
353     - triggers
354     - schedules
355     - /^release\/v/
356     - /^v\d+\.\d+(\.\d+)?($|-)/
357   variables:
358     LOG_PATH: "$CI_PROJECT_DIR/$CI_COMMIT_SHA"
359     TEST_CASE_FILE_PATH: "$CI_PROJECT_DIR/components/idf_test"
360     REPORT_PATH: "$CI_PROJECT_DIR/CI_Test_Report"
361     MODULE_UPDATE_FILE: "$CI_PROJECT_DIR/tools/unit-test-app/tools/ModuleDefinition.yml"
362   #dependencies:
363   #We need all UT* and IT* artifacts except for only a few other
364   artifacts:
365     when: always
366     paths:
367       - $REPORT_PATH
368       - $LOG_PATH
369     expire_in: 12 mos
370   script:
371     # calc log path
372     - VER_NUM=`git rev-list HEAD | wc -l | awk '{print $1}'`
373     - SHA_ID=`echo $CI_COMMIT_SHA | cut -c 1-7`
374     - REVISION="${VER_NUM}_${SHA_ID}"
375     # replace / to _ in branch name
376     - ESCAPED_BRANCH_NAME=`echo $CI_COMMIT_REF_NAME | sed 's/\//___/g'`
377     # result path and artifacts path
378     - RESULT_PATH="$CI_PROJECT_NAME/$ESCAPED_BRANCH_NAME/$REVISION"
379     - ARTIFACTS_PATH="$GITLAB_HTTP_SERVER/idf/esp-idf/builds/$CI_JOB_ID/artifacts/browse/$CI_COMMIT_SHA"
380     # clone test bench
381     - git clone $GITLAB_SSH_SERVER/yinling/auto_test_script.git
382     - cd auto_test_script
383     - python $CHECKOUT_REF_SCRIPT auto_test_script
384     # generate report
385     - TEST_RESULT=Pass
386     - python CITestReport.py -l $LOG_PATH -t $TEST_CASE_FILE_PATH -p $REPORT_PATH -r $RESULT_PATH -a $ARTIFACTS_PATH -m $MODULE_UPDATE_FILE || TEST_RESULT=Fail
387     # commit to CI-test-result project
388     - git clone $GITLAB_SSH_SERVER/qa/CI-test-result.git
389     - rm -rf "CI-test-result/RawData/$RESULT_PATH"
390     - cp -R $CI_PROJECT_NAME CI-test-result/RawData
391     - cd CI-test-result
392     # config git user
393     - git config --global user.email "ci-test-result@espressif.com"
394     - git config --global user.name "ci-test-result"
395     # commit test result
396     - git add .
397     - git commit . -m "update test result for $CI_PROJECT_NAME/$CI_COMMIT_REF_NAME/$CI_COMMIT_SHA, pipeline ID $CI_PIPELINE_ID" || exit 0
398     - git push origin master
399     - test "${TEST_RESULT}" = "Pass" || exit 1
400
401 test_esp_err_to_name_on_host:
402   stage: test
403   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
404   tags:
405     - host_test
406   dependencies: []
407   script:
408     - cd tools/
409     - ./gen_esp_err_to_name.py
410     - 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)
411
412 push_master_to_github:
413   stage: deploy
414   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
415   tags:
416     - deploy
417   only:
418     - master
419     - /^release\/v/
420     - /^v\d+\.\d+(\.\d+)?($|-)/
421   when: on_success
422   dependencies: []
423   variables:
424     GITHUB_PUSH_REFS: refs/remotes/origin/release refs/remotes/origin/master
425   before_script: *do_nothing_before
426   script:
427     - mkdir -p ~/.ssh
428     - chmod 700 ~/.ssh
429     - echo -n $GH_PUSH_KEY > ~/.ssh/id_rsa_base64
430     - base64 --decode --ignore-garbage ~/.ssh/id_rsa_base64 > ~/.ssh/id_rsa
431     - chmod 600 ~/.ssh/id_rsa
432     - echo -e "Host github.com\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
433     - git remote remove github &>/dev/null || true
434     - git remote add github git@github.com:espressif/esp-idf.git
435     # What the next line of script does: goes through the list of refs for all branches we push to github,
436     # generates a snippet of shell which is evaluated. The snippet checks CI_COMMIT_SHA against the SHA
437     # (aka objectname) at tip of each branch, and if any SHAs match then it checks out the local branch
438     # and then pushes that ref to a corresponding github branch
439     - eval $(git for-each-ref --shell bash --format 'if [ $CI_COMMIT_SHA == %(objectname) ]; then git checkout -B %(refname:strip=3); git push --follow-tags github %(refname:strip=3); fi;' $GITHUB_PUSH_REFS)
440
441
442 deploy_docs:
443   stage: assign_test
444   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
445   tags:
446     - deploy
447   only:
448    - master
449    - /^release\/v/
450    - /^v\d+\.\d+(\.\d+)?($|-)/
451    - triggers
452   dependencies:
453     - build_docs
454   before_script: *do_nothing_before
455   script:
456     - mkdir -p ~/.ssh
457     - chmod 700 ~/.ssh
458     - echo -n $DOCS_DEPLOY_KEY > ~/.ssh/id_rsa_base64
459     - base64 --decode --ignore-garbage ~/.ssh/id_rsa_base64 > ~/.ssh/id_rsa
460     - chmod 600 ~/.ssh/id_rsa
461     - echo -e "Host $DOCS_SERVER\n\tStrictHostKeyChecking no\n\tUser $DOCS_SERVER_USER\n" >> ~/.ssh/config
462     - export GIT_VER=$(git describe --always)
463     - cd docs/en/_build/
464     - mv html $GIT_VER
465     - tar czvf $GIT_VER.tar.gz $GIT_VER
466     - scp $GIT_VER.tar.gz $DOCS_SERVER:$DOCS_PATH/en
467     - ssh $DOCS_SERVER -x "cd $DOCS_PATH/en && tar xzvf $GIT_VER.tar.gz && rm -f latest && ln -s $GIT_VER latest"
468     - cd ../../zh_CN/_build/
469     - mv html $GIT_VER
470     - tar czvf $GIT_VER.tar.gz $GIT_VER
471     - scp $GIT_VER.tar.gz $DOCS_SERVER:$DOCS_PATH/zh_CN
472     - ssh $DOCS_SERVER -x "cd $DOCS_PATH/zh_CN && tar xzvf $GIT_VER.tar.gz && rm -f latest && ln -s $GIT_VER latest"
473     # add link to preview doc
474     - echo "[document preview][en] $CI_DOCKER_REGISTRY/docs/esp-idf/en/${GIT_VER}/index.html"
475     - echo "[document preview][zh_CN] $CI_DOCKER_REGISTRY/docs/esp-idf/zh_CN/${GIT_VER}/index.html"
476
477 check_doc_links:
478   stage: test
479   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
480   tags:
481     - check_doc_links
482   only:
483     # can only be triggered
484     - triggers
485   artifacts:
486     paths:
487       - docs/_build/linkcheck
488     expire_in: 1 mos
489   script:
490     # must be triggered with CHECK_LINKS=Yes, otherwise exit without test
491     - test "$CHECK_LINKS" = "Yes" || exit 0
492     # can only run on master branch (otherwise the commit is not on Github yet)
493     - test "${CI_COMMIT_REF_NAME}" = "master" || exit 0
494     - cd docs
495     - make linkcheck
496
497 check_commit_msg:
498   stage: deploy
499   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
500   tags:
501     - build
502   except:
503     - master
504     - /^release\/v/
505     - /^v\d+\.\d+(\.\d+)?($|-)/
506   dependencies: []
507   before_script: *do_nothing_before
508   script:
509     - git status
510     - git log -n10 --oneline
511     # commit start with "WIP: " need to be squashed before merge
512     - 'git log --pretty=%s master.. -- | grep "^WIP: " && exit 1 || exit 0'
513
514 check_permissions:
515   stage: deploy
516   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
517   tags:
518     - build
519   except:
520     - master
521     - /^release\/v/
522     - /^v\d+\.\d+(\.\d+)?($|-)/
523   dependencies: []
524   before_script: *do_nothing_before
525   script:
526     - tools/ci/check-executable.sh
527
528 check_submodule_sync:
529   stage: deploy
530   image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
531   tags:
532     - build
533   except:
534     - master
535     - /^release\/v/
536     - /^v\d+\.\d+(\.\d+)?($|-)/
537   dependencies: []
538   variables:
539     GIT_STRATEGY: clone
540   before_script: *do_nothing_before
541   script:
542     # check if all submodules are correctly synced to public repostory
543     - git submodule update --init --recursive
544
545 assign_test:
546   tags:
547     - assign_test
548   image: $CI_DOCKER_REGISTRY/ubuntu-test-env$BOT_DOCKER_IMAGE_TAG
549   stage: assign_test
550   # gitlab ci do not support match job with RegEx or wildcard now in dependencies.
551   # we have a lot build example jobs. now we don't use dependencies, just download all artificats of build stage.
552   dependencies:
553     - build_ssc_00
554     - build_ssc_01
555     - build_ssc_02
556     - build_esp_idf_tests
557   variables:
558     TEST_FW_PATH: "$CI_PROJECT_DIR/tools/tiny-test-fw"
559     EXAMPLE_CONFIG_OUTPUT_PATH: "$CI_PROJECT_DIR/examples/test_configs"
560   artifacts:
561     paths:
562       - components/idf_test/*/CIConfigs
563       - components/idf_test/*/TC.sqlite
564       - $EXAMPLE_CONFIG_OUTPUT_PATH
565     expire_in: 1 mos
566   before_script: *add_gitlab_key_before
567   script:
568     # assign example tests
569     - python $TEST_FW_PATH/CIAssignExampleTest.py $IDF_PATH/examples $IDF_PATH/.gitlab-ci.yml $EXAMPLE_CONFIG_OUTPUT_PATH
570     # assign unit test cases
571     - 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
572     # clone test script to assign tests
573     - git clone $TEST_SCRIPT_REPOSITORY
574     - cd auto_test_script
575     - python $CHECKOUT_REF_SCRIPT auto_test_script
576     # assgin integration test cases
577     - python CIAssignTestCases.py -t $IDF_PATH/components/idf_test/integration_test -c $IDF_PATH/.gitlab-ci.yml -b $IDF_PATH/SSC/ssc_bin
578
579 .example_test_template: &example_test_template
580   stage: test
581   when: on_success
582   only:
583     - master
584     - /^release\/v/
585     - /^v\d+\.\d+(\.\d+)?($|-)/
586     - triggers
587     - schedules
588   # gitlab ci do not support match job with RegEx or wildcard now in dependencies.
589   # we have a lot build example jobs and the binaries them exceed the limitation of artifacts.
590   # we can't artifact them in one job. For example test jobs, download all artifacts from previous stages.
591   artifacts:
592     when: always
593     paths:
594       - $LOG_PATH
595     expire_in: 6 mos
596   variables:
597     TEST_FW_PATH: "$CI_PROJECT_DIR/tools/tiny-test-fw"
598     TEST_CASE_PATH: "$CI_PROJECT_DIR/examples"
599     CONFIG_FILE: "$CI_PROJECT_DIR/examples/test_configs/$CI_JOB_NAME.yml"
600     LOG_PATH: "$CI_PROJECT_DIR/TEST_LOGS"
601     ENV_FILE: "$CI_PROJECT_DIR/ci-test-runner-configs/$CI_RUNNER_DESCRIPTION/EnvConfig.yml"
602   script:
603     # first test if config file exists, if not exist, exit 0
604     - test -e $CONFIG_FILE || exit 0
605     # clone test env configs
606     - git clone $TEST_ENV_CONFIG_REPOSITORY
607     - cd ci-test-runner-configs
608     - python $CHECKOUT_REF_SCRIPT ci-test-runner-configs
609     - cd $TEST_FW_PATH
610     # run test
611     - python Runner.py $TEST_CASE_PATH -c $CONFIG_FILE -e $ENV_FILE
612
613 .unit_test_template: &unit_test_template
614   <<: *example_test_template
615   stage: unit_test
616   dependencies:
617     - assign_test
618     - build_esp_idf_tests
619   variables:
620     TEST_FW_PATH: "$CI_PROJECT_DIR/tools/tiny-test-fw"
621     TEST_CASE_PATH: "$CI_PROJECT_DIR/tools/unit-test-app"
622     CONFIG_FILE: "$CI_PROJECT_DIR/components/idf_test/unit_test/CIConfigs/$CI_JOB_NAME.yml"
623     LOG_PATH: "$CI_PROJECT_DIR/TEST_LOGS"
624     ENV_FILE: "$CI_PROJECT_DIR/ci-test-runner-configs/$CI_RUNNER_DESCRIPTION/EnvConfig.yml"
625
626 .test_template: &test_template
627   stage: test
628   when: on_success
629   only:
630     - master
631     - /^release\/v/
632     - /^v\d+\.\d+(\.\d+)?($|-)/
633     - triggers
634     - schedules
635   allow_failure: true
636   dependencies:
637     - assign_test
638     - build_ssc_00
639     - build_ssc_01
640     - build_ssc_02
641   artifacts:
642     when: always
643     paths:
644       - $LOG_PATH
645     expire_in: 6 mos
646   variables:
647     LOCAL_ENV_CONFIG_PATH: "$CI_PROJECT_DIR/ci-test-runner-configs/$CI_RUNNER_DESCRIPTION/ESP32_IDF"
648     LOG_PATH: "$CI_PROJECT_DIR/$CI_COMMIT_SHA"
649     TEST_CASE_FILE_PATH: "$CI_PROJECT_DIR/components/idf_test/integration_test"
650     MODULE_UPDATE_FILE: "$CI_PROJECT_DIR/components/idf_test/ModuleDefinition.yml"
651     CONFIG_FILE: "$CI_PROJECT_DIR/components/idf_test/integration_test/CIConfigs/$CI_JOB_NAME.yml"
652   before_script: *add_gitlab_key_before
653   script:
654     # first test if config file exists, if not exist, exit 0
655     - test -e $CONFIG_FILE || exit 0
656     # clone local test env configs
657     - git clone $TEST_ENV_CONFIG_REPOSITORY
658     - cd ci-test-runner-configs
659     - python $CHECKOUT_REF_SCRIPT ci-test-runner-configs
660     # clone test bench
661     - git clone $TEST_SCRIPT_REPOSITORY
662     - cd auto_test_script
663     - python $CHECKOUT_REF_SCRIPT auto_test_script
664     # run test
665     - 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
666
667 nvs_compatible_test:
668   <<: *test_template
669   artifacts:
670     when: always
671     paths:
672       - $LOG_PATH
673       - nvs_wifi.bin
674     expire_in: 6 mos
675   tags:
676     - ESP32_IDF
677     - NVS_Compatible
678   script:
679     # clone local test env configs
680     - git clone $TEST_ENV_CONFIG_REPOSITORY
681     - cd ci-test-runner-configs
682     - python $CHECKOUT_REF_SCRIPT ci-test-runner-configs
683     # clone test bench
684     - git clone $TEST_SCRIPT_REPOSITORY
685     - cd auto_test_script
686     - git checkout ${CI_COMMIT_REF_NAME} || echo "Using default branch..."
687     # prepare nvs bins
688     - ./Tools/prepare_nvs_bin.sh
689     # run test
690     - 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
691
692 example_test_001_01:
693   <<: *example_test_template
694   tags:
695     - ESP32
696     - Example_WIFI
697
698 example_test_002_01:
699   <<: *example_test_template
700   tags:
701     - ESP32
702     - Example_ShieldBox
703
704 example_test_003_01:
705   <<: *example_test_template
706   tags:
707     - ESP32
708     - Example_SDIO
709
710 UT_001_01:
711   <<: *unit_test_template
712   tags:
713     - ESP32_IDF
714     - UT_T1_1
715
716 UT_001_02:
717   <<: *unit_test_template
718   tags:
719     - ESP32_IDF
720     - UT_T1_1
721
722 UT_001_03:
723   <<: *unit_test_template
724   tags:
725     - ESP32_IDF
726     - UT_T1_1
727
728 UT_001_04:
729   <<: *unit_test_template
730   tags:
731     - ESP32_IDF
732     - UT_T1_1
733
734 UT_001_05:
735   <<: *unit_test_template
736   tags:
737     - ESP32_IDF
738     - UT_T1_1
739
740 UT_001_06:
741   <<: *unit_test_template
742   tags:
743     - ESP32_IDF
744     - UT_T1_1
745
746 UT_001_07:
747   <<: *unit_test_template
748   tags:
749     - ESP32_IDF
750     - UT_T1_1
751
752 UT_001_08:
753   <<: *unit_test_template
754   tags:
755     - ESP32_IDF
756     - UT_T1_1
757
758 UT_001_09:
759   <<: *unit_test_template
760   tags:
761     - ESP32_IDF
762     - UT_T1_1
763
764 UT_001_10:
765   <<: *unit_test_template
766   tags:
767     - ESP32_IDF
768     - UT_T1_1
769
770 UT_001_11:
771   <<: *unit_test_template
772   tags:
773     - ESP32_IDF
774     - UT_T1_1
775
776 UT_001_12:
777   <<: *unit_test_template
778   tags:
779     - ESP32_IDF
780     - UT_T1_1
781
782 UT_001_13:
783   <<: *unit_test_template
784   tags:
785     - ESP32_IDF
786     - UT_T1_1
787
788 UT_001_14:
789   <<: *unit_test_template
790   tags:
791     - ESP32_IDF
792     - UT_T1_1
793
794 UT_001_15:
795   <<: *unit_test_template
796   tags:
797     - ESP32_IDF
798     - UT_T1_1
799
800 UT_001_16:
801   <<: *unit_test_template
802   tags:
803     - ESP32_IDF
804     - UT_T1_1
805
806 UT_001_17:
807   <<: *unit_test_template
808   tags:
809     - ESP32_IDF
810     - UT_T1_1
811
812 UT_001_18:
813   <<: *unit_test_template
814   tags:
815     - ESP32_IDF
816     - UT_T1_1
817
818 UT_001_19:
819   <<: *unit_test_template
820   tags:
821     - ESP32_IDF
822     - UT_T1_1
823
824 UT_001_20:
825   <<: *unit_test_template
826   tags:
827     - ESP32_IDF
828     - UT_T1_1
829
830 UT_001_21:
831   <<: *unit_test_template
832   tags:
833     - ESP32_IDF
834     - UT_T1_1
835
836 UT_001_22:
837   <<: *unit_test_template
838   tags:
839     - ESP32_IDF
840     - UT_T1_1
841
842 UT_001_23:
843   <<: *unit_test_template
844   tags:
845     - ESP32_IDF
846     - UT_T1_1
847
848 UT_001_24:
849   <<: *unit_test_template
850   tags:
851     - ESP32_IDF
852     - UT_T1_1
853
854 UT_001_25:
855   <<: *unit_test_template
856   tags:
857     - ESP32_IDF
858     - UT_T1_1
859     
860 UT_001_26:
861   <<: *unit_test_template
862   tags:
863     - ESP32_IDF
864     - UT_T1_1
865
866 UT_001_27:
867   <<: *unit_test_template
868   tags:
869     - ESP32_IDF
870     - UT_T1_1
871
872 UT_001_28:
873   <<: *unit_test_template
874   tags:
875     - ESP32_IDF
876     - UT_T1_1
877
878 UT_001_29:
879   <<: *unit_test_template
880   tags:
881     - ESP32_IDF
882     - UT_T1_1
883
884 UT_001_30:
885   <<: *unit_test_template
886   tags:
887     - ESP32_IDF
888     - UT_T1_1
889
890 UT_001_31:
891   <<: *unit_test_template
892   tags:
893     - ESP32_IDF
894     - UT_T1_1
895
896 UT_002_01:
897   <<: *unit_test_template
898   tags:
899     - ESP32_IDF
900     - UT_T1_SDMODE
901
902 UT_002_02:
903   <<: *unit_test_template
904   tags:
905     - ESP32_IDF
906     - UT_T1_SDMODE
907
908 UT_002_03:
909   <<: *unit_test_template
910   tags:
911     - ESP32_IDF
912     - UT_T1_SDMODE
913
914 UT_003_01:
915   <<: *unit_test_template
916   tags:
917     - ESP32_IDF
918     - UT_T1_SPIMODE
919
920 UT_003_02:
921   <<: *unit_test_template
922   tags:
923     - ESP32_IDF
924     - UT_T1_SPIMODE
925
926 UT_003_03:
927   <<: *unit_test_template
928   tags:
929     - ESP32_IDF
930     - UT_T1_SPIMODE
931
932 UT_004_01:
933   <<: *unit_test_template
934   tags:
935     - ESP32_IDF
936     - UT_T1_1
937     - psram
938
939 UT_004_02:
940   <<: *unit_test_template
941   tags:
942     - ESP32_IDF
943     - UT_T1_1
944     - psram
945
946 UT_004_03:
947   <<: *unit_test_template
948   tags:
949     - ESP32_IDF
950     - UT_T1_1
951     - psram
952
953 UT_004_04:
954   <<: *unit_test_template
955   tags:
956     - ESP32_IDF
957     - UT_T1_1
958     - psram
959
960 UT_004_05:
961   <<: *unit_test_template
962   tags:
963     - ESP32_IDF
964     - UT_T1_1
965     - psram
966
967 UT_004_06:
968   <<: *unit_test_template
969   tags:
970     - ESP32_IDF
971     - UT_T1_1
972     - psram
973
974 UT_004_07:
975   <<: *unit_test_template
976   tags:
977     - ESP32_IDF
978     - UT_T1_1
979     - psram
980
981 UT_004_08:
982   <<: *unit_test_template
983   tags:
984     - ESP32_IDF
985     - UT_T1_1
986     - psram
987
988 UT_004_09:
989   <<: *unit_test_template
990   tags:
991     - ESP32_IDF
992     - UT_T1_1
993     - psram
994
995 UT_004_10:
996   <<: *unit_test_template
997   tags:
998     - ESP32_IDF
999     - UT_T1_1
1000     - psram
1001     
1002 UT_005_01:
1003   <<: *unit_test_template
1004   tags:
1005     - ESP32_IDF
1006     - UT_T1_SDMODE
1007     - psram
1008
1009 UT_005_02:
1010   <<: *unit_test_template
1011   tags:
1012     - ESP32_IDF
1013     - UT_T1_SPIMODE
1014     - psram
1015
1016 UT_006_01:
1017   <<: *unit_test_template
1018   tags:
1019     - ESP32_IDF
1020     - UT_T1_GPIO
1021
1022 UT_006_02:
1023   <<: *unit_test_template
1024   tags:
1025     - ESP32_IDF
1026     - UT_T1_GPIO
1027
1028 UT_006_03:
1029   <<: *unit_test_template
1030   tags:
1031     - ESP32_IDF
1032     - UT_T1_GPIO
1033
1034 UT_006_04:
1035   <<: *unit_test_template
1036   tags:
1037     - ESP32_IDF
1038     - UT_T1_GPIO
1039     - psram
1040
1041 UT_007_01:
1042   <<: *unit_test_template
1043   tags:
1044     - ESP32_IDF
1045     - UT_T1_PCNT
1046
1047 UT_007_02:
1048   <<: *unit_test_template
1049   tags:
1050     - ESP32_IDF
1051     - UT_T1_PCNT
1052
1053 UT_007_03:
1054   <<: *unit_test_template
1055   tags:
1056     - ESP32_IDF
1057     - UT_T1_PCNT
1058
1059 UT_007_04:
1060   <<: *unit_test_template
1061   tags:
1062     - ESP32_IDF
1063     - UT_T1_PCNT
1064     - psram
1065
1066 UT_008_01:
1067   <<: *unit_test_template
1068   tags:
1069     - ESP32_IDF
1070     - UT_T1_LEDC
1071
1072 UT_008_02:
1073   <<: *unit_test_template
1074   tags:
1075     - ESP32_IDF
1076     - UT_T1_LEDC
1077
1078 UT_008_03:
1079   <<: *unit_test_template
1080   tags:
1081     - ESP32_IDF
1082     - UT_T1_LEDC
1083
1084 UT_008_04:
1085   <<: *unit_test_template
1086   tags:
1087     - ESP32_IDF
1088     - UT_T1_LEDC
1089     - psram
1090
1091 UT_010_01:
1092   <<: *unit_test_template
1093   tags:
1094     - ESP32_IDF
1095     - UT_T1_RMT
1096
1097 UT_010_02:
1098   <<: *unit_test_template
1099   tags:
1100     - ESP32_IDF
1101     - UT_T1_RMT
1102
1103 UT_010_03:
1104   <<: *unit_test_template
1105   tags:
1106     - ESP32_IDF
1107     - UT_T1_RMT
1108
1109 UT_010_04:
1110   <<: *unit_test_template
1111   tags:
1112     - ESP32_IDF
1113     - UT_T1_RMT
1114     - psram
1115
1116 IT_001_01:
1117   <<: *test_template
1118   tags:
1119     - ESP32_IDF
1120     - SSC_T1_1
1121
1122 IT_001_02:
1123   <<: *test_template
1124   tags:
1125     - ESP32_IDF
1126     - SSC_T1_1
1127
1128 IT_001_03:
1129   <<: *test_template
1130   tags:
1131     - ESP32_IDF
1132     - SSC_T1_1
1133
1134 IT_001_04:
1135   <<: *test_template
1136   tags:
1137     - ESP32_IDF
1138     - SSC_T1_1
1139
1140 IT_001_05:
1141   <<: *test_template
1142   tags:
1143     - ESP32_IDF
1144     - SSC_T1_1
1145
1146 IT_001_06:
1147   <<: *test_template
1148   tags:
1149     - ESP32_IDF
1150     - SSC_T1_1
1151
1152 IT_001_07:
1153   <<: *test_template
1154   tags:
1155     - ESP32_IDF
1156     - SSC_T1_1
1157
1158 IT_001_08:
1159   <<: *test_template
1160   tags:
1161     - ESP32_IDF
1162     - SSC_T1_1
1163
1164 IT_001_09:
1165   <<: *test_template
1166   tags:
1167     - ESP32_IDF
1168     - SSC_T1_1
1169
1170 IT_002_01:
1171   <<: *test_template
1172   tags:
1173     - ESP32_IDF
1174     - SSC_T1_2
1175
1176 IT_003_01:
1177   <<: *test_template
1178   tags:
1179     - ESP32_IDF
1180     - SSC_T2_1
1181
1182 IT_003_02:
1183   <<: *test_template
1184   tags:
1185     - ESP32_IDF
1186     - SSC_T2_1
1187
1188 IT_003_03:
1189   <<: *test_template
1190   tags:
1191     - ESP32_IDF
1192     - SSC_T2_1
1193
1194 IT_003_04:
1195   <<: *test_template
1196   tags:
1197     - ESP32_IDF
1198     - SSC_T2_1
1199
1200 IT_003_05:
1201   <<: *test_template
1202   tags:
1203     - ESP32_IDF
1204     - SSC_T2_1
1205
1206 IT_003_06:
1207   <<: *test_template
1208   tags:
1209     - ESP32_IDF
1210     - SSC_T2_1
1211
1212 IT_003_07:
1213   <<: *test_template
1214   tags:
1215     - ESP32_IDF
1216     - SSC_T2_1
1217
1218 IT_003_08:
1219   <<: *test_template
1220   tags:
1221     - ESP32_IDF
1222     - SSC_T2_1
1223
1224 IT_003_09:
1225   <<: *test_template
1226   tags:
1227     - ESP32_IDF
1228     - SSC_T2_1
1229
1230 IT_003_10:
1231   <<: *test_template
1232   tags:
1233     - ESP32_IDF
1234     - SSC_T2_1
1235
1236 IT_003_11:
1237   <<: *test_template
1238   tags:
1239     - ESP32_IDF
1240     - SSC_T2_1
1241
1242 IT_003_12:
1243   <<: *test_template
1244   tags:
1245     - ESP32_IDF
1246     - SSC_T2_1
1247
1248 IT_003_13:
1249   <<: *test_template
1250   tags:
1251     - ESP32_IDF
1252     - SSC_T2_1
1253
1254 IT_003_14:
1255   <<: *test_template
1256   tags:
1257     - ESP32_IDF
1258     - SSC_T2_1
1259
1260 IT_004_01:
1261   <<: *test_template
1262   tags:
1263     - ESP32_IDF
1264     - SSC_T1_APC
1265
1266 IT_005_01:
1267   <<: *test_template
1268   tags:
1269     - ESP32_IDF
1270     - SSC_T1_WEP
1271
1272 IT_009_01:
1273   <<: *test_template
1274   tags:
1275     - ESP32_IDF
1276     - SSC_T1_3
1277
1278 IT_010_01:
1279   <<: *test_template
1280   tags:
1281     - ESP32_IDF
1282     - SSC_T5_1
1283
1284 IT_011_01:
1285   <<: *test_template
1286   tags:
1287     - ESP32_IDF
1288     - SSC_T50_1
1289
1290 IT_501_01:
1291   <<: *test_template
1292   tags:
1293     - ESP32_IDF
1294     - SSC_T1_1
1295     - stress_test
1296
1297 IT_501_02:
1298   <<: *test_template
1299   tags:
1300     - ESP32_IDF
1301     - SSC_T1_1
1302     - stress_test
1303
1304 IT_501_03:
1305   <<: *test_template
1306   tags:
1307     - ESP32_IDF
1308     - SSC_T1_1
1309     - stress_test
1310
1311 IT_502_01:
1312   <<: *test_template
1313   tags:
1314     - ESP32_IDF
1315     - SSC_T2_1
1316     - stress_test
1317
1318 IT_502_02:
1319   <<: *test_template
1320   tags:
1321     - ESP32_IDF
1322     - SSC_T2_1
1323     - stress_test
1324
1325 IT_503_01:
1326   <<: *test_template
1327   tags:
1328     - ESP32_IDF
1329     - SSC_T5_1
1330     - stress_test
1331
1332 IT_503_02:
1333   <<: *test_template
1334   tags:
1335     - ESP32_IDF
1336     - SSC_T5_1
1337     - stress_test
1338
1339 IT_503_03:
1340   <<: *test_template
1341   tags:
1342     - ESP32_IDF
1343     - SSC_T5_1
1344     - stress_test