13 # Common parameters for the 'make' during CI tests
14 MAKEFLAGS: "-j5 --no-keep-going"
16 # GitLab-CI environment
18 # more attempts for more robust
19 GET_SOURCES_ATTEMPTS: "10"
20 ARTIFACT_DOWNLOAD_ATTEMPTS: "10"
22 # GIT_STRATEGY is not defined here.
23 # Use an option from "CI / CD Settings" - "General pipelines".
25 # "normal" strategy for fetching only top-level submodules since nothing requires the sub-submodules code for building IDF.
26 # If the "recursive" strategy is used we have a problem with using relative URLs for sub-submodules.
27 GIT_SUBMODULE_STRATEGY: normal
29 UNIT_TEST_BUILD_SYSTEM: make
32 IDF_PATH: "$CI_PROJECT_DIR"
35 APPLY_BOT_FILTER_SCRIPT: "$CI_PROJECT_DIR/tools/ci/apply_bot_filter.py"
36 CHECKOUT_REF_SCRIPT: "$CI_PROJECT_DIR/tools/ci/checkout_project_ref.py"
37 CUSTOM_TOOLCHAIN_PATH: "/opt/xtensa-custom"
40 BOT_DOCKER_IMAGE_TAG: ":latest"
42 # before each job, we need to check if this job is filtered by bot stage/job filter
43 .apply_bot_filter: &apply_bot_filter
44 python $APPLY_BOT_FILTER_SCRIPT || exit 0
46 .setup_custom_toolchain: &setup_custom_toolchain |
47 if [ "$IDF_XTENSA_TOOLCHAIN_URL" ] ; then
48 echo "Use a custom toolchain: ${IDF_XTENSA_TOOLCHAIN_URL:-Unknown}"
49 rm -rf "$CUSTOM_TOOLCHAIN_PATH" &&
50 mkdir -p -v "$CUSTOM_TOOLCHAIN_PATH" &&
51 pushd "$CUSTOM_TOOLCHAIN_PATH" &&
52 curl -sSL -o xtensa-custom.xxx "$IDF_XTENSA_TOOLCHAIN_URL" &&
53 ls -l xtensa-custom.xxx &&
54 tar xf xtensa-custom.xxx --strip-components 1 &&
57 PATH=$CUSTOM_TOOLCHAIN_PATH/bin:$PATH
61 .cleanup_custom_toolchain: &cleanup_custom_toolchain |
62 echo "Cleaning up $CUSTOM_TOOLCHAIN_PATH"
63 rm -rf "$CUSTOM_TOOLCHAIN_PATH"
65 .setup_tools_unless_target_test: &setup_tools_unless_target_test |
66 if [ "$CI_JOB_STAGE" != "target_test" ]; then
67 tools/idf_tools.py --non-interactive install && eval "$(tools/idf_tools.py --non-interactive export)" || exit 1
70 .show_submodule_urls: &show_submodule_urls |
71 git config --get-regexp '^submodule\..*\.url$' || true
74 - echo "Running common script"
75 - *show_submodule_urls
76 - source tools/ci/setup_python.sh
77 # apply bot filter in before script
82 - echo -n $GITLAB_KEY > ~/.ssh/id_rsa_base64
83 - base64 --decode --ignore-garbage ~/.ssh/id_rsa_base64 > ~/.ssh/id_rsa
84 - chmod 600 ~/.ssh/id_rsa
85 - echo -e "Host gitlab.espressif.cn\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
86 # Set some options and environment for CI
87 - source tools/ci/configure_ci_environment.sh
89 - *setup_tools_unless_target_test
91 - *setup_custom_toolchain
93 # used for check scripts which we want to run unconditionally
94 .before_script_lesser_nofilter: &before_script_lesser_nofilter
96 GIT_SUBMODULE_STRATEGY: none
98 - echo "Not setting up GitLab key, not fetching submodules, not applying bot filter"
99 - source tools/ci/setup_python.sh
100 - source tools/ci/configure_ci_environment.sh
101 - *setup_custom_toolchain
103 # used for everything else where we want to do no prep, except for bot filter
104 .before_script_lesser: &before_script_lesser
106 GIT_SUBMODULE_STRATEGY: none
108 - echo "Not setting up GitLab key, not fetching submodules"
109 - source tools/ci/setup_python.sh
110 # apply bot filter in before script
112 - source tools/ci/configure_ci_environment.sh
113 - *setup_custom_toolchain
116 - *cleanup_custom_toolchain
120 image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
127 - $BOT_TRIGGER_WITH_LABEL == null
129 - $BOT_LABEL_REGULAR_TEST
131 # Set the variable for 'esp-idf-template' testing
132 - ESP_IDF_TEMPLATE_GIT=${ESP_IDF_TEMPLATE_GIT:-"https://github.com/espressif/esp-idf-template.git"}
133 - git clone ${ESP_IDF_TEMPLATE_GIT}
134 - cd esp-idf-template
135 # Try to use the same branch name for esp-idf-template that we're
136 # using on esp-idf. If it doesn't exist then just stick to the default
138 - python $CHECKOUT_REF_SCRIPT esp-idf-template
140 # Test debug build (default)
142 # Now test release build
144 - sed -i.bak -e's/CONFIG_OPTIMIZATION_LEVEL_DEBUG\=y/CONFIG_OPTIMIZATION_LEVEL_RELEASE=y/' sdkconfig
146 # Check if there are any stray printf/ets_printf references in WiFi libs
147 - cd ../components/esp_wifi/lib_esp32
148 - test $(xtensa-esp32-elf-nm *.a | grep -w printf | wc -l) -eq 0
149 - test $(xtensa-esp32-elf-nm *.a | grep -w ets_printf | wc -l) -eq 0
152 .build_template: &build_template
154 image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
169 SSC_CONFIG_FOLDER: "$CI_PROJECT_DIR/SSC/configs/ESP32_IDF"
172 - $BOT_TRIGGER_WITH_LABEL == null
174 - $BOT_LABEL_INTEGRATION_TEST
175 - $BOT_LABEL_REGULAR_TEST
177 - git clone $SSC_REPOSITORY
179 - python $CHECKOUT_REF_SCRIPT SSC
180 - MAKEFLAGS= ./ci_build_ssc.sh
182 # If you want to add new build ssc jobs, please add it into dependencies of `assign_test` and `.test_template`
184 .build_esp_idf_unit_test_template: &build_esp_idf_unit_test_template
188 - tools/unit-test-app/output
189 - components/idf_test/unit_test/TestCaseAll.yml
193 - $BOT_TRIGGER_WITH_LABEL == null
195 - $BOT_LABEL_UNIT_TEST
196 - $BOT_LABEL_REGULAR_TEST
198 build_esp_idf_tests_make:
199 <<: *build_esp_idf_unit_test_template
201 - export EXTRA_CFLAGS=${PEDANTIC_CFLAGS}
202 - export EXTRA_CXXFLAGS=${EXTRA_CFLAGS}
203 - cd $CI_PROJECT_DIR/tools/unit-test-app
204 - MAKEFLAGS= make help # make sure kconfig tools are built in single process
205 - make ut-clean-all-configs
206 - make ut-build-all-configs
207 - python tools/UnitTestParser.py
208 # Check if the tests demand Make built binaries. If not, delete them
209 - if [ "$UNIT_TEST_BUILD_SYSTEM" == "make" ]; then exit 0; fi
210 - rm -rf builds output sdkconfig
211 - rm $CI_PROJECT_DIR/components/idf_test/unit_test/TestCaseAll.yml
213 build_esp_idf_tests_cmake:
214 <<: *build_esp_idf_unit_test_template
216 - export PATH="$IDF_PATH/tools:$PATH"
217 - export EXTRA_CFLAGS=${PEDANTIC_CFLAGS}
218 - export EXTRA_CXXFLAGS=${EXTRA_CFLAGS}
219 - cd $CI_PROJECT_DIR/tools/unit-test-app
220 - idf.py ut-clean-all-configs
221 - idf.py ut-build-all-configs
222 - python tools/UnitTestParser.py
223 # Check if the tests demand CMake built binaries. If not, delete them
224 - if [ "$UNIT_TEST_BUILD_SYSTEM" == "cmake" ]; then exit 0; fi
225 - rm -rf builds output sdkconfig
226 - rm $CI_PROJECT_DIR/components/idf_test/unit_test/TestCaseAll.yml
231 # This is a workaround for a rarely encountered issue with building examples in CI.
232 # Probably related to building of Kconfig in 'make clean' stage
237 - build_examples/*/*/*/build/*.bin
238 - build_examples/*/*/*/sdkconfig
239 - build_examples/*/*/*/build/*.elf
240 - build_examples/*/*/*/build/*.map
241 - build_examples/*/*/*/build/download.config
242 - build_examples/*/*/*/build/bootloader/*.bin
246 LOG_PATH: "$CI_PROJECT_DIR/log_examples_make"
249 - $BOT_TRIGGER_WITH_LABEL == null
251 - $BOT_LABEL_EXAMPLE_TEST
252 - $BOT_LABEL_REGULAR_TEST
253 - $BOT_LABEL_WEEKEND_TEST
255 # it's not possible to build 100% out-of-tree and have the "artifacts"
256 # mechanism work, but this is the next best thing
257 - rm -rf build_examples
258 - mkdir build_examples
260 # build some of examples
261 - mkdir -p ${LOG_PATH}
262 - ${IDF_PATH}/tools/ci/build_examples.sh
264 # same as above, but for CMake
265 build_examples_cmake:
271 - build_examples_cmake/*/*/*/build/*.bin
272 - build_examples_cmake/*/*/*/sdkconfig
273 - build_examples_cmake/*/*/*/build/*.elf
274 - build_examples_cmake/*/*/*/build/*.map
275 - build_examples_cmake/*/*/*/build/flasher_args.json
276 - build_examples_cmake/*/*/*/build/bootloader/*.bin
280 LOG_PATH: "$CI_PROJECT_DIR/log_examples_cmake"
283 - $BOT_TRIGGER_WITH_LABEL == null
285 - $BOT_LABEL_EXAMPLE_TEST
286 - $BOT_LABEL_REGULAR_TEST
287 - $BOT_LABEL_WEEKEND_TEST
289 # it's not possible to build 100% out-of-tree and have the "artifacts"
290 # mechanism work, but this is the next best thing
291 - rm -rf build_examples_cmake
292 - mkdir build_examples_cmake
293 - cd build_examples_cmake
294 # build some of examples
295 - mkdir -p ${LOG_PATH}
296 - ${IDF_PATH}/tools/ci/build_examples_cmake.sh
298 # If you want to add new build example jobs, please add it into dependencies of `.example_test_template`
302 image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
308 # English version of documentation
309 - docs/en/doxygen-warning-log.txt
310 - docs/en/sphinx-warning-log.txt
311 - docs/en/sphinx-warning-log-sanitized.txt
312 - docs/en/_build/html
314 # Chinese version of documentation
315 - docs/zh_CN/doxygen-warning-log.txt
316 - docs/zh_CN/sphinx-warning-log.txt
317 - docs/zh_CN/sphinx-warning-log-sanitized.txt
318 - docs/zh_CN/_build/html
322 - $BOT_TRIGGER_WITH_LABEL == null
324 - $BOT_LABEL_BUILD_DOCS
325 - $BOT_LABEL_REGULAR_TEST
328 - ./check_lang_folder_sync.sh
332 - ../check_doc_warnings.sh
336 - ../check_doc_warnings.sh
338 .check_job_template: &check_job_template
340 image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
344 <<: *before_script_lesser_nofilter
347 <<: *check_job_template
351 - $BOT_TRIGGER_WITH_LABEL == null
353 - $BOT_LABEL_REGULAR_TEST
355 tools/cmake/run_cmake_lint.sh
357 .host_test_template: &host_test_template
359 image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
365 - $BOT_TRIGGER_WITH_LABEL == null
366 - $BOT_LABEL_HOST_TEST
367 - $BOT_LABEL_REGULAR_TEST
370 <<: *host_test_template
372 - cd components/nvs_flash/test_nvs_host
376 <<: *host_test_template
379 - components/nvs_flash/test_nvs_host/coverage_report
385 - $BOT_LABEL_NVS_COVERAGE
387 - cd components/nvs_flash/test_nvs_host
388 - make coverage_report
390 test_partition_table_on_host:
391 <<: *host_test_template
395 - cd components/partition_table/test_gen_esp32part_host
396 - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh ./gen_esp32part_tests.py
399 <<: *host_test_template
402 - components/wear_levelling/test_wl_host/coverage_report.zip
405 - cd components/wear_levelling/test_wl_host
409 <<: *host_test_template
411 - cd components/fatfs/test_fatfs_host/
415 <<: *host_test_template
417 - cd tools/ldgen/test
418 - ./test_fragments.py
419 - ./test_generation.py
421 .host_fuzzer_test_template: &host_fuzzer_test_template
423 image: $CI_DOCKER_REGISTRY/afl-fuzzer-test
430 - ${FUZZER_TEST_DIR}/out/crashes
431 - ${FUZZER_TEST_DIR}/fuzz_output.log
435 - $BOT_LABEL_FUZZER_TEST
436 - $BOT_LABEL_WEEKEND_TEST
438 - export AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES=1 && export AFL_SKIP_CPUFREQ=1
439 - cd ${FUZZER_TEST_DIR}
440 # run AFL fuzzer for one hour
441 - ( ( make ${FUZZER_PARAMS} fuzz | tee fuzz_output.log | grep -v '\(Fuzzing test case\|Entering queue cycle\)' ) || pkill sleep ) &
442 - ( sleep 3600 || mkdir -p out/crashes/env_failed ) && pkill afl-fuz
443 # check no crashes found
444 - test -z "$(ls out/crashes/)" || exit 1
446 .clang_tidy_check_template: &clang_tidy_check_template
448 image: ${CI_DOCKER_REGISTRY}/clang-static-analysis
454 junit: $IDF_PATH/output.xml
457 - $IDF_PATH/examples/get-started/hello_world/tidybuild/report/*
460 - git clone $IDF_ANALYSIS_UTILS static_analysis_utils && cd static_analysis_utils
461 # Setup parameters of triggered/regular job
462 - export TRIGGERED_RELATIVE=${BOT_LABEL_STATIC_ANALYSIS-} && export TRIGGERED_ABSOLUTE=${BOT_LABEL_STATIC_ANALYSIS_ALL-} && export TARGET_BRANCH=${BOT_CUSTOMIZED_REVISION-}
463 - ./analyze.sh $IDF_PATH/examples/get-started/hello_world/ $IDF_PATH/tools/ci/static-analysis-rules.yml $IDF_PATH/output.xml
465 .clang_tidy_deploy_template: &clang_tidy_deploy_template
467 image: $CI_DOCKER_REGISTRY/esp32-ci-env
473 - echo -n $DOCS_DEPLOY_KEY > ~/.ssh/id_rsa_base64
474 - base64 --decode --ignore-garbage ~/.ssh/id_rsa_base64 > ~/.ssh/id_rsa
475 - chmod 600 ~/.ssh/id_rsa
476 - echo -e "Host $DOCS_SERVER\n\tStrictHostKeyChecking no\n\tUser $DOCS_SERVER_USER\n" >> ~/.ssh/config
477 - export GIT_VER=$(git describe --always)
478 - cd $IDF_PATH/examples/get-started/hello_world/tidybuild
480 - tar czvf $GIT_VER.tar.gz $GIT_VER
481 - export STATIC_REPORT_PATH="web/static_analysis/esp-idf/"
482 - ssh $DOCS_SERVER -x "mkdir -p $STATIC_REPORT_PATH/clang-tidy"
483 - scp $GIT_VER.tar.gz $DOCS_SERVER:$STATIC_REPORT_PATH/clang-tidy
484 - ssh $DOCS_SERVER -x "cd $STATIC_REPORT_PATH/clang-tidy && tar xzvf $GIT_VER.tar.gz && rm -f latest && ln -s $GIT_VER latest"
485 # add link to view the report
486 - echo "[static analysis][clang tidy] $CI_DOCKER_REGISTRY/static_analysis/esp-idf/clang-tidy/${GIT_VER}/index.html"
487 - test ! -e ${GIT_VER}/FAILED_RULES || { echo 'Failed static analysis rules!'; cat ${GIT_VER}/FAILED_RULES; exit 1; }
490 <<: *clang_tidy_check_template
492 BOT_NEEDS_TRIGGER_BY_NAME: 1
493 BOT_LABEL_STATIC_ANALYSIS: 1
495 clang_tidy_check_regular:
496 <<: *clang_tidy_check_template
498 clang_tidy_check_all:
499 <<: *clang_tidy_check_template
501 BOT_NEEDS_TRIGGER_BY_NAME: 1
502 BOT_LABEL_STATIC_ANALYSIS_ALL: 1
505 <<: *clang_tidy_deploy_template
508 - clang_tidy_check_all
510 BOT_NEEDS_TRIGGER_BY_NAME: 1
512 clang_tidy_deploy_regular:
513 <<: *clang_tidy_deploy_template
515 - clang_tidy_check_regular
520 - /^v\d+\.\d+(\.\d+)?($|-)/
524 - $BOT_LABEL_STATIC_ANALYSIS
525 - $BOT_LABEL_STATIC_ANALYSIS_ALL
527 test_mdns_fuzzer_on_host:
528 <<: *host_fuzzer_test_template
530 FUZZER_TEST_DIR: components/mdns/test_afl_fuzz_host
532 test_lwip_dns_fuzzer_on_host:
533 <<: *host_fuzzer_test_template
535 FUZZER_TEST_DIR: components/lwip/test_afl_host
536 FUZZER_PARAMS: MODE=dns
538 test_lwip_dhcp_fuzzer_on_host:
539 <<: *host_fuzzer_test_template
541 FUZZER_TEST_DIR: components/lwip/test_afl_host
542 FUZZER_PARAMS: MODE=dhcp_client
544 test_lwip_dhcps_fuzzer_on_host:
545 <<: *host_fuzzer_test_template
547 FUZZER_TEST_DIR: components/lwip/test_afl_host
548 FUZZER_PARAMS: MODE=dhcp_server
551 <<: *host_test_template
553 - cd components/spiffs/test_spiffs_host/
556 test_multi_heap_on_host:
557 <<: *host_test_template
559 - cd components/heap/test_multi_heap_host
560 - ./test_all_configs.sh
563 <<: *host_test_template
565 - cd tools/kconfig_new/test
566 - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh ./test_confserver.py
569 <<: *host_test_template
571 - ${IDF_PATH}/tools/ci/test_configure_ci_environment.sh
572 - rm -rf test_build_system
573 - mkdir test_build_system
574 - cd test_build_system
575 - ${IDF_PATH}/tools/ci/test_build_system.sh
577 test_build_system_cmake:
578 <<: *host_test_template
580 - ${IDF_PATH}/tools/ci/test_configure_ci_environment.sh
581 - rm -rf test_build_system
582 - mkdir test_build_system
583 - cd test_build_system
584 - ${IDF_PATH}/tools/ci/test_build_system_cmake.sh
587 <<: *host_test_template
589 # save artifacts always in order to access results which were retried without consequent failure
592 - tools/test_idf_monitor/outputs/*
595 - cd ${IDF_PATH}/tools/test_idf_monitor
596 - ./run_test_idf_monitor.py
599 <<: *host_test_template
603 - tools/test_idf_size/output
604 - tools/test_idf_size/.coverage
607 - cd ${IDF_PATH}/tools/test_idf_size
608 - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh ./test.sh
611 <<: *host_test_template
613 # Remove Xtensa and ULP toolchains from the PATH, tests will expect a clean environment
614 - export PATH=$(p=$(echo $PATH | tr ":" "\n" | grep -v "/root/.espressif/tools\|/opt/espressif${CUSTOM_TOOLCHAIN_PATH:+\|${CUSTOM_TOOLCHAIN_PATH}}" | tr "\n" ":"); echo ${p%:})
615 - cd ${IDF_PATH}/tools/test_idf_tools
616 - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh ./test_idf_tools.py
618 test_esp_err_to_name_on_host:
619 <<: *host_test_template
623 - components/esp32/esp_err_to_name.c
626 - cd ${IDF_PATH}/tools/
627 - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh -p 2.7.15 ./gen_esp_err_to_name.py
628 - 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; }
629 - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh -p 3.4.8 ./gen_esp_err_to_name.py
630 - git diff --exit-code -- ../components/esp32/esp_err_to_name.c || { echo 'Differences found between running under Python 2 and 3.'; exit 1; }
632 test_esp_efuse_table_on_host:
633 <<: *host_test_template
637 - components/efuse/esp32/esp_efuse_table.c
640 - cd ${IDF_PATH}/components/efuse/
641 - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh -p 2.7.15 ./efuse_table_gen.py ${IDF_PATH}/components/efuse/esp32/esp_efuse_table.csv
642 - git diff --exit-code -- esp32/esp_efuse_table.c || { echo 'Differences found. Please run make efuse_common_table or idf.py efuse_common_table and commit the changes.'; exit 1; }
643 - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh -p 3.4.8 ./efuse_table_gen.py ${IDF_PATH}/components/efuse/esp32/esp_efuse_table.csv
644 - git diff --exit-code -- ../components/esp32/esp_efuse_table.c || { echo 'Differences found between running under Python 2 and 3.'; exit 1; }
645 - cd ${IDF_PATH}/components/efuse/test_efuse_host
646 - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh ./efuse_tests.py
649 <<: *host_test_template
653 - components/espcoredump/test/.coverage
654 - components/espcoredump/test/output
657 - cd components/espcoredump/test/
658 - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh ./test_espcoredump.sh
661 <<: *host_test_template
665 - tools/esp_app_trace/test/logtrace/output
666 - tools/esp_app_trace/test/logtrace/.coverage
669 - cd ${IDF_PATH}/tools/esp_app_trace/test/logtrace
670 - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh ./test.sh
672 test_sysviewtrace_proc:
673 <<: *host_test_template
677 - tools/esp_app_trace/test/sysview/output
678 - tools/esp_app_trace/test/sysview/.coverage
681 - cd ${IDF_PATH}/tools/esp_app_trace/test/sysview
682 - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh ./test.sh
686 image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
692 - /^v\d+\.\d+(\.\d+)?($|-)/
695 <<: *before_script_lesser
699 - echo -n $GH_PUSH_KEY > ~/.ssh/id_rsa_base64
700 - base64 --decode --ignore-garbage ~/.ssh/id_rsa_base64 > ~/.ssh/id_rsa
701 - chmod 600 ~/.ssh/id_rsa
702 - echo -e "Host github.com\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
703 - git remote remove github &>/dev/null || true
704 - git remote add github git@github.com:espressif/esp-idf.git
705 - tools/ci/push_to_github.sh
709 image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
716 - /^v\d+\.\d+(\.\d+)?($|-)/
719 - $BOT_TRIGGER_WITH_LABEL == null
720 - $BOT_LABEL_BUILD_DOCS
723 <<: *before_script_lesser
727 - echo -n $DOCS_DEPLOY_KEY > ~/.ssh/id_rsa_base64
728 - base64 --decode --ignore-garbage ~/.ssh/id_rsa_base64 > ~/.ssh/id_rsa
729 - chmod 600 ~/.ssh/id_rsa
730 - echo -e "Host $DOCS_SERVER\n\tStrictHostKeyChecking no\n\tUser $DOCS_SERVER_USER\n" >> ~/.ssh/config
731 - export GIT_VER=$(git describe --always)
734 - tar czvf $GIT_VER.tar.gz $GIT_VER
735 - scp $GIT_VER.tar.gz $DOCS_SERVER:$DOCS_PATH/en
736 - ssh $DOCS_SERVER -x "cd $DOCS_PATH/en && tar xzvf $GIT_VER.tar.gz && rm -f latest && ln -s $GIT_VER latest"
737 - cd ../../zh_CN/_build/
739 - tar czvf $GIT_VER.tar.gz $GIT_VER
740 - scp $GIT_VER.tar.gz $DOCS_SERVER:$DOCS_PATH/zh_CN
741 - ssh $DOCS_SERVER -x "cd $DOCS_PATH/zh_CN && tar xzvf $GIT_VER.tar.gz && rm -f latest && ln -s $GIT_VER latest"
742 # add link to preview doc
743 - echo "[document preview][en] $CI_DOCKER_REGISTRY/docs/esp-idf/en/${GIT_VER}/index.html"
744 - echo "[document preview][zh_CN] $CI_DOCKER_REGISTRY/docs/esp-idf/zh_CN/${GIT_VER}/index.html"
748 image: $CI_DOCKER_REGISTRY/ubuntu-test-env
756 - $DEPLOY_TEST_RESULT_TO_JIRA == "Yes"
758 - build_esp_idf_tests_make
759 - build_esp_idf_tests_cmake
763 - ${CI_PROJECT_DIR}/test-management/*.log
766 UNIT_TEST_CASE_FILE: "${CI_PROJECT_DIR}/components/idf_test/unit_test/TestCaseAll.yml"
767 BOT_ACCOUNT_CONFIG_FILE: "${CI_PROJECT_DIR}/test-management/Config/Account.local.yml"
768 TEST_FW_PATH: "$CI_PROJECT_DIR/tools/tiny-test-fw"
769 AUTO_TEST_SCRIPT_PATH: "${CI_PROJECT_DIR}/auto_test_script"
772 - export GIT_SHA=$(echo ${CI_COMMIT_SHA} | cut -c 1-8)
773 - git clone $TEST_MANAGEMENT_REPO
775 - python $CHECKOUT_REF_SCRIPT test-management
776 - echo $BOT_JIRA_ACCOUNT > ${BOT_ACCOUNT_CONFIG_FILE}
777 # update unit test cases
778 - python ImportTestCase.py $JIRA_TEST_MANAGEMENT_PROJECT unity -d $UNIT_TEST_CASE_FILE -r $GIT_SHA
779 # update example test cases
780 - python ImportTestCase.py $JIRA_TEST_MANAGEMENT_PROJECT tiny_test_fw -d ${CI_PROJECT_DIR}/examples -r $GIT_SHA
781 # organize test cases
782 - python OrganizeTestCases.py $JIRA_TEST_MANAGEMENT_PROJECT
786 image: $CI_DOCKER_REGISTRY/bot-env
795 - $DEPLOY_TEST_RESULT_TO_JIRA == "Yes"
799 - ${CI_PROJECT_DIR}/test-management/*.log
800 # save all test logs as artifacts, make it easier to track errors
801 - ${CI_PROJECT_DIR}/TEST_LOGS
802 - $CI_PROJECT_DIR/$CI_COMMIT_SHA
805 UNIT_TEST_CASE_FILE: "${CI_PROJECT_DIR}/components/idf_test/unit_test/TestCaseAll.yml"
806 BOT_ACCOUNT_CONFIG_FILE: "${CI_PROJECT_DIR}/test-management/Config/Account.local.yml"
807 TEST_FW_PATH: "$CI_PROJECT_DIR/tools/tiny-test-fw"
808 AUTO_TEST_SCRIPT_PATH: "${CI_PROJECT_DIR}/auto_test_script"
812 - echo -n $GITLAB_KEY > ~/.ssh/id_rsa_base64
813 - base64 --decode --ignore-garbage ~/.ssh/id_rsa_base64 > ~/.ssh/id_rsa
814 - chmod 600 ~/.ssh/id_rsa
815 - echo -e "Host gitlab.espressif.cn\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
817 - export GIT_SHA=$(echo ${CI_COMMIT_SHA} | cut -c 1-8)
818 - export REV_COUNT=$(git rev-list --count HEAD)
819 - export SUMMARY="IDF CI test result for $GIT_SHA (r${REV_COUNT})"
820 # artifacts of job update_test_cases creates test-management folder
821 # we need to remove it so we can clone test-management folder again
822 - rm -r test-management
823 - git clone $TEST_MANAGEMENT_REPO
825 - python3 $CHECKOUT_REF_SCRIPT test-management
826 - echo $BOT_JIRA_ACCOUNT > ${BOT_ACCOUNT_CONFIG_FILE}
827 # update test results
828 - python3 ImportTestResult.py -r "$GIT_SHA (r${REV_COUNT})" -j $JIRA_TEST_MANAGEMENT_PROJECT -s "$SUMMARY" -l CI -p ${CI_PROJECT_DIR}/TEST_LOGS ${CI_PROJECT_DIR}/${CI_COMMIT_SHA} --pipeline_url ${CI_PIPELINE_URL}
832 image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
837 # can only be triggered
840 - $BOT_TRIGGER_WITH_LABEL == null
841 - $BOT_LABEL_BUILD_DOCS
844 - docs/_build/linkcheck
847 # must be triggered with CHECK_LINKS=Yes, otherwise exit without test
848 - test "$CHECK_LINKS" = "Yes" || exit 0
849 # can only run on master branch (otherwise the commit is not on Github yet)
850 - test "${CI_COMMIT_REF_NAME}" = "master" || exit 0
855 <<: *check_job_template
857 - tools/ci/check-line-endings.sh ${IDF_PATH}
860 <<: *check_job_template
863 - git log -n10 --oneline
864 # commit start with "WIP: " need to be squashed before merge
865 - 'git log --pretty=%s master.. -- | grep "^WIP: " && exit 1 || exit 0'
868 <<: *check_job_template
870 - tools/ci/check-executable.sh
873 <<: *check_job_template
874 # Don't run this for feature/bugfix branches, so that it is possible to modify
875 # esp_idf_version.h in a branch before tagging the next version.
879 - /^v\d+\.\d+(\.\d+)?($|-)/
881 - export IDF_PATH=$PWD
882 - tools/ci/check_idf_version.sh
884 check_examples_cmake_make:
885 <<: *check_job_template
889 - /^v\d+\.\d+(\.\d+)?($|-)/
890 <<: *before_script_lesser
892 - tools/ci/check_examples_cmake_make.sh
895 <<: *check_job_template
901 <<: *before_script_lesser
903 # run it only under Python 3 (it is very slow under Python 2)
904 - ${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
907 <<: *check_job_template
911 - components/*/Kconfig*.new
912 - examples/*/*/*/Kconfig*.new
913 - examples/*/*/*/*/Kconfig*.new
914 - tools/*/Kconfig*.new
915 - tools/*/*/Kconfig*.new
916 - tools/*/*/*/Kconfig*.new
918 <<: *before_script_lesser
920 - ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh ${IDF_PATH}/tools/test_check_kconfigs.py
921 - ${IDF_PATH}/tools/check_kconfigs.py
925 image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
931 - /^v\d+\.\d+(\.\d+)?($|-)/
933 <<: *before_script_lesser
935 - tools/ci/check_ut_cmake_make.sh
937 check_submodule_sync:
938 <<: *check_job_template
944 GIT_SUBMODULE_STRATEGY: none
945 PUBLIC_IDF_URL: "https://github.com/espressif/esp-idf.git"
949 - git submodule deinit --force .
950 # setting the default remote URL to the public one, to resolve relative location URLs
951 - git config remote.origin.url ${PUBLIC_IDF_URL}
952 # check if all submodules are correctly synced to public repostory
954 - *show_submodule_urls
955 - git submodule update --recursive
956 - echo "IDF was cloned from ${PUBLIC_IDF_URL} completely"
958 check_artifacts_expire_time:
959 <<: *check_job_template
961 # check if we have set expire time for all artifacts
962 - python tools/ci/check_artifacts_expire_time.py
964 check_pipeline_triggered_by_label:
965 <<: *check_job_template
969 - $BOT_TRIGGER_WITH_LABEL
971 # If the pipeline is triggered with label, the pipeline will only succeeded if "regular_test" label is added.
972 # We want to make sure some jobs are always executed to detect regression.
973 - test "$BOT_LABEL_REGULAR_TEST" = "true" || { echo "CI can only pass if 'regular_test' label is included"; exit -1; }
978 image: $CI_DOCKER_REGISTRY/ubuntu-test-env$BOT_DOCKER_IMAGE_TAG
980 # gitlab ci do not support match job with RegEx or wildcard now in dependencies.
981 # we have a lot build example jobs. now we don't use dependencies, just download all artificats of build stage.
984 - build_esp_idf_tests_make
985 - build_esp_idf_tests_cmake
987 TEST_FW_PATH: "$CI_PROJECT_DIR/tools/tiny-test-fw"
988 EXAMPLE_CONFIG_OUTPUT_PATH: "$CI_PROJECT_DIR/examples/test_configs"
991 - components/idf_test/*/CIConfigs
992 - components/idf_test/*/TC.sqlite
993 - $EXAMPLE_CONFIG_OUTPUT_PATH
997 - $BOT_TRIGGER_WITH_LABEL == null
998 - $BOT_LABEL_UNIT_TEST
999 - $BOT_LABEL_INTEGRATION_TEST
1000 - $BOT_LABEL_EXAMPLE_TEST
1002 # assign example tests
1003 - python $TEST_FW_PATH/CIAssignExampleTest.py $IDF_PATH/examples $IDF_PATH/.gitlab-ci.yml $EXAMPLE_CONFIG_OUTPUT_PATH
1004 # assign unit test cases
1005 - 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
1006 # clone test script to assign tests
1007 - git clone $TEST_SCRIPT_REPOSITORY
1008 - cd auto_test_script
1009 - python $CHECKOUT_REF_SCRIPT auto_test_script
1010 # assgin integration test cases
1011 - python CIAssignTestCases.py -t $IDF_PATH/components/idf_test/integration_test -c $IDF_PATH/.gitlab-ci.yml -b $IDF_PATH/SSC/ssc_bin
1013 .example_test_template: &example_test_template
1020 - /^v\d+\.\d+(\.\d+)?($|-)/
1024 - $BOT_TRIGGER_WITH_LABEL == null
1025 - $BOT_LABEL_EXAMPLE_TEST
1028 - build_examples_make
1029 - build_examples_cmake
1036 junit: $LOG_PATH/*/XUNIT_RESULT.xml
1038 TEST_FW_PATH: "$CI_PROJECT_DIR/tools/tiny-test-fw"
1039 TEST_CASE_PATH: "$CI_PROJECT_DIR/examples"
1040 CONFIG_FILE: "$CI_PROJECT_DIR/examples/test_configs/$CI_JOB_NAME_$CI_NODE_INDEX.yml"
1041 LOG_PATH: "$CI_PROJECT_DIR/TEST_LOGS"
1042 ENV_FILE: "$CI_PROJECT_DIR/ci-test-runner-configs/$CI_RUNNER_DESCRIPTION/EnvConfig.yml"
1044 # first test if config file exists, if not exist, exit 0
1045 - test -e $CONFIG_FILE || exit 0
1046 # clone test env configs
1047 - git clone $TEST_ENV_CONFIG_REPOSITORY
1048 - cd ci-test-runner-configs
1049 - python $CHECKOUT_REF_SCRIPT ci-test-runner-configs
1052 - python Runner.py $TEST_CASE_PATH -c $CONFIG_FILE -e $ENV_FILE
1054 .unit_test_template: &unit_test_template
1055 <<: *example_test_template
1059 - build_esp_idf_tests_make
1060 - build_esp_idf_tests_cmake
1065 - /^v\d+\.\d+(\.\d+)?($|-)/
1069 - $BOT_TRIGGER_WITH_LABEL == null
1070 - $BOT_LABEL_UNIT_TEST
1072 TEST_FW_PATH: "$CI_PROJECT_DIR/tools/tiny-test-fw"
1073 TEST_CASE_PATH: "$CI_PROJECT_DIR/tools/unit-test-app"
1074 CONFIG_FILE: "$CI_PROJECT_DIR/components/idf_test/unit_test/CIConfigs/$CI_JOB_NAME_$CI_NODE_INDEX.yml"
1075 LOG_PATH: "$CI_PROJECT_DIR/TEST_LOGS"
1076 ENV_FILE: "$CI_PROJECT_DIR/ci-test-runner-configs/$CI_RUNNER_DESCRIPTION/EnvConfig.yml"
1079 <<: *example_test_template
1086 - $BOT_LABEL_WEEKEND_TEST
1088 TEST_CASE_PATH: "$CI_PROJECT_DIR/components/mqtt/weekend_test"
1089 TEST_FW_PATH: "$CI_PROJECT_DIR/tools/tiny-test-fw"
1090 LOG_PATH: "$CI_PROJECT_DIR/TEST_LOGS"
1091 ENV_FILE: "$CI_PROJECT_DIR/components/mqtt/weekend_test/env.yml"
1092 CONFIG_FILE: "$CI_PROJECT_DIR/components/mqtt/weekend_test/config.yml"
1094 test_weekend_network:
1095 <<: *example_test_template
1097 image: $CI_DOCKER_REGISTRY/rpi-net-suite$BOT_DOCKER_IMAGE_TAG
1103 - $BOT_LABEL_WEEKEND_TEST
1105 TEST_CASE_PATH: "$CI_PROJECT_DIR/components/lwip/weekend_test"
1106 TEST_FW_PATH: "$CI_PROJECT_DIR/tools/tiny-test-fw"
1107 LOG_PATH: "$CI_PROJECT_DIR/TEST_LOGS"
1108 ENV_FILE: "$CI_PROJECT_DIR/components/lwip/weekend_test/env.yml"
1109 CONFIG_FILE: "$CI_PROJECT_DIR/components/lwip/weekend_test/config.yml"
1111 .test_template: &test_template
1118 - /^v\d+\.\d+(\.\d+)?($|-)/
1122 - $BOT_TRIGGER_WITH_LABEL == null
1123 - $BOT_LABEL_INTEGRATION_TEST
1130 junit: $LOG_PATH/*/XUNIT_RESULT.xml
1135 GIT_SUBMODULE_STRATEGY: none
1136 LOCAL_ENV_CONFIG_PATH: "$CI_PROJECT_DIR/ci-test-runner-configs/$CI_RUNNER_DESCRIPTION/ESP32_IDF"
1137 LOG_PATH: "$CI_PROJECT_DIR/$CI_COMMIT_SHA"
1138 TEST_CASE_FILE_PATH: "$CI_PROJECT_DIR/components/idf_test/integration_test"
1139 MODULE_UPDATE_FILE: "$CI_PROJECT_DIR/components/idf_test/ModuleDefinition.yml"
1140 CONFIG_FILE: "$CI_PROJECT_DIR/components/idf_test/integration_test/CIConfigs/$CI_JOB_NAME_$CI_NODE_INDEX.yml"
1142 # first test if config file exists, if not exist, exit 0
1143 - test -e $CONFIG_FILE || exit 0
1144 # clone local test env configs
1145 - git clone $TEST_ENV_CONFIG_REPOSITORY
1146 - cd ci-test-runner-configs
1147 - python $CHECKOUT_REF_SCRIPT ci-test-runner-configs
1149 - git clone $TEST_SCRIPT_REPOSITORY
1150 - cd auto_test_script
1151 - python $CHECKOUT_REF_SCRIPT auto_test_script
1153 - python CIRunner.py -l "$LOG_PATH/$CI_JOB_NAME_$CI_NODE_INDEX" -c $CONFIG_FILE -e $LOCAL_ENV_CONFIG_PATH -t $TEST_CASE_FILE_PATH -m $MODULE_UPDATE_FILE
1155 nvs_compatible_test:
1167 # clone local test env configs
1168 - git clone $TEST_ENV_CONFIG_REPOSITORY
1169 - cd ci-test-runner-configs
1170 - python $CHECKOUT_REF_SCRIPT ci-test-runner-configs
1172 - git clone $TEST_SCRIPT_REPOSITORY
1173 - cd auto_test_script
1174 - git checkout ${CI_COMMIT_REF_NAME} || echo "Using default branch..."
1176 - ./Tools/prepare_nvs_bin.sh
1178 - 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
1181 <<: *example_test_template
1188 <<: *example_test_template
1189 image: $CI_DOCKER_REGISTRY/ubuntu-test-env$BOT_DOCKER_IMAGE_TAG
1192 - Example_ShieldBox_Basic
1195 <<: *example_test_template
1201 <<: *example_test_template
1207 <<: *example_test_template
1213 <<: *example_test_template
1214 image: $CI_DOCKER_REGISTRY/ubuntu-test-env$BOT_DOCKER_IMAGE_TAG
1217 - $BOT_LABEL_IPERF_STRESS_TEST
1223 <<: *example_test_template
1226 - Example_I2C_CCS811_SENSOR
1229 <<: *unit_test_template
1236 <<: *unit_test_template
1244 <<: *unit_test_template
1251 <<: *unit_test_template
1258 <<: *unit_test_template
1265 <<: *unit_test_template
1272 <<: *unit_test_template
1279 <<: *unit_test_template
1286 <<: *unit_test_template
1293 <<: *unit_test_template
1300 <<: *unit_test_template
1307 <<: *unit_test_template
1314 <<: *unit_test_template
1321 <<: *unit_test_template
1328 <<: *unit_test_template
1335 <<: *unit_test_template
1342 <<: *unit_test_template
1349 <<: *unit_test_template
1357 <<: *unit_test_template
1361 - Example_SPI_Multi_device
1364 <<: *unit_test_template
1367 - Example_SPI_Multi_device
1371 <<: *unit_test_template
1378 <<: *unit_test_template
1385 <<: *unit_test_template
1392 <<: *unit_test_template
1399 <<: *unit_test_template
1406 <<: *unit_test_template
1413 <<: *unit_test_template
1420 <<: *unit_test_template
1427 <<: *unit_test_template
1434 <<: *unit_test_template