.build_template: stage: build image: $ESP_ENV_IMAGE tags: - build # build only on shiny servers since shiny storage server is at the same location - shiny variables: # Enable ccache for all build jobs. See configure_ci_environment.sh for more ccache related settings. IDF_CCACHE_ENABLE: "1" after_script: # Show ccache statistics if enabled globally - test "$CI_CCACHE_STATS" == 1 && test -n "$(which ccache)" && ccache --show-stats || true dependencies: [] .build_cmake_template: extends: - .build_template - .before_script_build_jobs dependencies: # set dependencies to null to avoid missing artifacts issue needs: - job: fast_template_app artifacts: false artifacts: paths: - "**/build*/size.json" - "**/build*/build_log.txt" - "**/build*/*.bin" # upload to s3 server to save the artifacts size # - "**/build*/*.map" # ttfw tests require elf files - "**/build*/*.elf" - "**/build*/flasher_args.json" - "**/build*/flash_project_args" - "**/build*/config/sdkconfig.json" # ttfw tests require sdkconfig file - "**/build*/sdkconfig" - "**/build*/bootloader/*.bin" - "**/build*/partition_table/*.bin" - list_job_*.json - size_info.txt # unit test specific - components/idf_test/unit_test/*.yml when: always expire_in: 4 days after_script: # Show ccache statistics if enabled globally - test "$CI_CCACHE_STATS" == 1 && test -n "$(which ccache)" && ccache --show-stats || true # upload the binary files to s3 server - echo -e "\e[0Ksection_start:`date +%s`:upload_binaries_to_s3_server[collapsed=true]\r\e[0KUploading binaries to s3 Server" - shopt -s globstar # use || true to bypass the no-file error - zip ${CI_JOB_ID}.zip **/build*/*.bin || true - zip ${CI_JOB_ID}.zip **/build*/*.elf || true - zip ${CI_JOB_ID}.zip **/build*/*.map || true - zip ${CI_JOB_ID}.zip **/build*/flasher_args.json || true - zip ${CI_JOB_ID}.zip **/build*/flash_project_args || true - zip ${CI_JOB_ID}.zip **/build*/config/sdkconfig.json || true - zip ${CI_JOB_ID}.zip **/build*/sdkconfig || true - zip ${CI_JOB_ID}.zip **/build*/bootloader/*.bin || true - zip ${CI_JOB_ID}.zip **/build*/partition_table/*.bin || true - mc alias set shiny-s3 ${SHINY_S3_SERVER} ${SHINY_S3_ACCESS_KEY} ${SHINY_S3_SECRET_KEY} - mc cp ${CI_JOB_ID}.zip shiny-s3/idf-artifacts/${CI_PIPELINE_ID}/${CI_JOB_ID}.zip - echo -e "\e[0Ksection_end:`date +%s`:upload_binaries_to_s3_server\r\e[0K" - echo "Please download the full binary files (including *.elf and *.map files) from the following share link" # would be clean up after 4 days - mc share download shiny-s3/idf-artifacts/${CI_PIPELINE_ID}/${CI_JOB_ID}.zip --expire=96h script: # CI specific options start from "--collect-size-info xxx". could ignore when running locally - run_cmd python tools/ci/ci_build_apps.py $TEST_DIR -v -t $IDF_TARGET --copy-sdkconfig --collect-size-info size_info.txt --collect-app-info list_job_${CI_NODE_INDEX:-1}.json --parallel-count ${CI_NODE_TOTAL:-1} --parallel-index ${CI_NODE_INDEX:-1} --extra-preserve-dirs examples/bluetooth/esp_ble_mesh/ble_mesh_console examples/bluetooth/hci/controller_hci_uart_esp32 examples/wifi/iperf .build_cmake_clang_template: extends: - .build_cmake_template variables: IDF_TOOLCHAIN: clang TEST_BUILD_OPTS_EXTRA: "" TEST_DIR: tools/test_apps/system/cxx_pthread_bluetooth script: # CI specific options start from "--collect-size-info xxx". could ignore when running locally - run_cmd python tools/ci/ci_build_apps.py $TEST_DIR -v -t $IDF_TARGET --copy-sdkconfig --collect-size-info size_info.txt --collect-app-info list_job_${CI_NODE_INDEX:-1}.json --parallel-count ${CI_NODE_TOTAL:-1} --parallel-index ${CI_NODE_INDEX:-1} $TEST_BUILD_OPTS_EXTRA .build_pytest_template: extends: - .build_cmake_template - .before_script_build_jobs artifacts: paths: - "**/build*/size.json" - "**/build*/build_log.txt" - "**/build*/*.bin" # upload to s3 server to save the artifacts size # - "**/build*/*.map" # - "**/build*/*.elf" - "**/build*/flasher_args.json" - "**/build*/flash_project_args" - "**/build*/config/sdkconfig.json" - "**/build*/bootloader/*.bin" - "**/build*/partition_table/*.bin" - list_job_*.json - size_info.txt when: always expire_in: 4 days script: # CI specific options start from "--collect-size-info xxx". could ignore when running locally - run_cmd python tools/ci/ci_build_apps.py $TEST_DIR -v -t $IDF_TARGET --pytest-apps --collect-size-info size_info.txt --parallel-count ${CI_NODE_TOTAL:-1} --parallel-index ${CI_NODE_INDEX:-1} .build_pytest_no_jtag_template: extends: .build_pytest_template script: # CI specific options start from "--collect-size-info xxx". could ignore when running locally - run_cmd python tools/ci/ci_build_apps.py $TEST_DIR -v -t $IDF_TARGET -m \"not host_test and not jtag\" --pytest-apps --collect-size-info size_info.txt --parallel-count ${CI_NODE_TOTAL:-1} --parallel-index ${CI_NODE_INDEX:-1} .build_pytest_jtag_template: extends: - .build_cmake_template - .before_script_build_jobs artifacts: paths: - "**/build*/size.json" - "**/build*/build_log.txt" - "**/build*/*.bin" # upload to s3 server to save the artifacts size # - "**/build*/*.map" - "**/build*/*.elf" # need elf for gdb - "**/build*/flasher_args.json" - "**/build*/flash_project_args" - "**/build*/config/sdkconfig.json" - "**/build*/bootloader/*.bin" - "**/build*/partition_table/*.bin" - list_job_*.json - size_info.txt when: always expire_in: 4 days script: # CI specific options start from "--collect-size-info xxx". could ignore when running locally - run_cmd python tools/ci/ci_build_apps.py $TEST_DIR -v -t $IDF_TARGET -m \"not host_test and jtag\" --pytest-apps --collect-size-info size_info.txt --parallel-count ${CI_NODE_TOTAL:-1} --parallel-index ${CI_NODE_INDEX:-1} build_pytest_examples_esp32: extends: - .build_pytest_no_jtag_template - .rules:build:example_test-esp32 parallel: 6 variables: IDF_TARGET: esp32 TEST_DIR: examples build_pytest_examples_esp32s2: extends: - .build_pytest_no_jtag_template - .rules:build:example_test-esp32s2 parallel: 3 variables: IDF_TARGET: esp32s2 TEST_DIR: examples build_pytest_examples_esp32s3: extends: - .build_pytest_no_jtag_template - .rules:build:example_test-esp32s3 parallel: 4 variables: IDF_TARGET: esp32s3 TEST_DIR: examples build_pytest_examples_esp32c3: extends: - .build_pytest_no_jtag_template - .rules:build:example_test-esp32c3 parallel: 4 variables: IDF_TARGET: esp32c3 TEST_DIR: examples build_pytest_examples_esp32c2: extends: - .build_pytest_no_jtag_template - .rules:build:example_test-esp32c2 parallel: 2 variables: IDF_TARGET: esp32c2 TEST_DIR: examples build_pytest_examples_jtag: # for all targets extends: - .build_pytest_jtag_template - .rules:build:example_test-esp32 variables: IDF_TARGET: all TEST_DIR: examples build_pytest_examples_esp32c6: extends: - .build_pytest_template - .rules:build:example_test-esp32c6 parallel: 2 variables: IDF_TARGET: esp32c6 TEST_DIR: examples build_pytest_examples_esp32h2: extends: - .build_pytest_template - .rules:build:example_test-esp32h2 variables: IDF_TARGET: esp32h2 TEST_DIR: examples build_pytest_components_esp32: extends: - .build_pytest_template - .rules:build:component_ut-esp32 parallel: 5 variables: IDF_TARGET: esp32 TEST_DIR: components build_pytest_components_esp32s2: extends: - .build_pytest_template - .rules:build:component_ut-esp32s2 parallel: 4 variables: IDF_TARGET: esp32s2 TEST_DIR: components build_pytest_components_esp32s3: extends: - .build_pytest_template - .rules:build:component_ut-esp32s3 parallel: 4 variables: IDF_TARGET: esp32s3 TEST_DIR: components build_pytest_components_esp32c3: extends: - .build_pytest_template - .rules:build:component_ut-esp32c3 parallel: 4 variables: IDF_TARGET: esp32c3 TEST_DIR: components build_pytest_components_esp32c2: extends: - .build_pytest_template - .rules:build:component_ut-esp32c2 parallel: 3 variables: IDF_TARGET: esp32c2 TEST_DIR: components build_pytest_components_esp32c6: extends: - .build_pytest_template - .rules:build:component_ut-esp32c6 parallel: 3 variables: IDF_TARGET: esp32c6 TEST_DIR: components build_pytest_components_esp32h2: extends: - .build_pytest_template - .rules:build:component_ut-esp32h2 parallel: 4 variables: IDF_TARGET: esp32h2 TEST_DIR: components build_only_components_apps: extends: - .build_cmake_template - .rules:build:component_ut parallel: 5 script: - set_component_ut_vars # CI specific options start from "--collect-size-info xxx". could ignore when running locally - run_cmd python tools/ci/ci_build_apps.py $COMPONENT_UT_DIRS -v -t all --collect-size-info size_info.txt --collect-app-info list_job_${CI_NODE_INDEX:-1}.json --parallel-count ${CI_NODE_TOTAL:-1} --parallel-index ${CI_NODE_INDEX:-1} .build_pytest_test_apps_template: extends: .build_pytest_template artifacts: paths: - "**/build*/size.json" - "**/build*/build_log.txt" - "**/build*/*.bin" # upload to s3 server to save the artifacts size # - "**/build*/*.map" # pytest test apps requires elf files for coredump tests - "**/build*/*.elf" - "**/build*/flasher_args.json" - "**/build*/flash_project_args" - "**/build*/config/sdkconfig.json" - "**/build*/bootloader/*.elf" - "**/build*/bootloader/*.bin" - "**/build*/partition_table/*.bin" - "**/build*/project_description.json" - list_job_*.json - size_info.txt when: always expire_in: 4 days build_pytest_test_apps_esp32: extends: - .build_pytest_test_apps_template - .rules:build:custom_test-esp32 variables: IDF_TARGET: esp32 TEST_DIR: tools/test_apps build_pytest_test_apps_esp32s2: extends: - .build_pytest_test_apps_template - .rules:build:custom_test-esp32s2 variables: IDF_TARGET: esp32s2 TEST_DIR: tools/test_apps build_pytest_test_apps_esp32s3: extends: - .build_pytest_test_apps_template - .rules:build:custom_test-esp32s3 parallel: 2 variables: IDF_TARGET: esp32s3 TEST_DIR: tools/test_apps build_pytest_test_apps_esp32c3: extends: - .build_pytest_test_apps_template - .rules:build:custom_test-esp32c3 variables: IDF_TARGET: esp32c3 TEST_DIR: tools/test_apps build_pytest_test_apps_esp32c2: extends: - .build_pytest_test_apps_template - .rules:build:custom_test-esp32c2 variables: IDF_TARGET: esp32c2 TEST_DIR: tools/test_apps build_pytest_test_apps_esp32c6: extends: - .build_pytest_test_apps_template - .rules:build:custom_test-esp32c6 variables: IDF_TARGET: esp32c6 TEST_DIR: tools/test_apps build_pytest_test_apps_esp32h2: extends: - .build_pytest_test_apps_template - .rules:build:custom_test-esp32h2 variables: IDF_TARGET: esp32h2 TEST_DIR: tools/test_apps build_only_tools_test_apps: extends: - .build_cmake_template - .rules:build:custom_test parallel: 9 script: # CI specific options start from "--collect-size-info xxx". could ignore when running locally - run_cmd python tools/ci/ci_build_apps.py tools/test_apps -v -t all --collect-size-info size_info.txt --collect-app-info list_job_${CI_NODE_INDEX:-1}.json --parallel-count ${CI_NODE_TOTAL:-1} --parallel-index ${CI_NODE_INDEX:-1} .build_template_app_template: extends: - .build_template - .before_script_build_jobs variables: LOG_PATH: "${CI_PROJECT_DIR}/log_template_app" BUILD_PATH: "${CI_PROJECT_DIR}/build_template_app" BUILD_DIR: "@t/@w" BUILD_LOG_CMAKE: "${LOG_PATH}/cmake_@t_@w.txt" BUILD_COMMAND_ARGS: "" artifacts: when: always paths: - log_template_app/* - size_info.txt - build_template_app/**/size.json expire_in: 1 week script: # Set the variable for 'esp-idf-template' testing - ESP_IDF_TEMPLATE_GIT=${ESP_IDF_TEMPLATE_GIT:-"https://github.com/espressif/esp-idf-template.git"} - retry_failed git clone ${ESP_IDF_TEMPLATE_GIT} # Try to use the same branch name for esp-idf-template that we're # using on esp-idf. If it doesn't exist then just stick to the default branch - python $CHECKOUT_REF_SCRIPT esp-idf-template esp-idf-template - export PATH="$IDF_PATH/tools:$PATH" # Only do the default cmake build for each target, remaining part are done in the build_template_app job - tools/ci/build_template_app.sh ${BUILD_COMMAND_ARGS} # build-related-pre-check-jobs ------------------------------------------------ # Build at least one project for each target at earliest stage to reduce build cost for obvious failing commits fast_template_app: extends: - .build_template_app_template - .rules:build:target_test stage: pre_check variables: BUILD_COMMAND_ARGS: "-p" #------------------------------------------------------------------------------ .build_ssc_template: extends: - .build_template - .rules:build:integration_test needs: - job: fast_template_app artifacts: false artifacts: paths: - SSC/ssc_bin expire_in: 1 week script: - retry_failed git clone $SSC_REPOSITORY - python $CHECKOUT_REF_SCRIPT SSC SSC - cd SSC - MAKEFLAGS= ./ci_build_ssc.sh $TARGET_NAME build_ssc_esp32: extends: .build_ssc_template parallel: 3 variables: TARGET_NAME: "ESP32" build_ssc_esp32s2: extends: .build_ssc_template parallel: 2 variables: TARGET_NAME: "ESP32S2" build_ssc_esp32c2: extends: .build_ssc_template parallel: 2 variables: TARGET_NAME: "ESP32C2" build_ssc_esp32c3: extends: .build_ssc_template parallel: 3 variables: TARGET_NAME: "ESP32C3" build_ssc_esp32s3: extends: .build_ssc_template parallel: 3 variables: TARGET_NAME: "ESP32S3" build_ssc_esp32c6: extends: .build_ssc_template parallel: 3 variables: TARGET_NAME: "ESP32C6" build_ssc_esp32h2: extends: .build_ssc_template parallel: 2 variables: TARGET_NAME: "ESP32H2" .build_esp_idf_tests_cmake_template: extends: - .build_cmake_template - .before_script_build_jobs artifacts: paths: - "**/build*/size.json" - "**/build*/build_log.txt" - "**/build*/*.bin" # upload to s3 server to save the artifacts size # - "**/build*/*.map" # ttfw tests require elf files - "**/build*/*.elf" - "**/build*/flasher_args.json" - "**/build*/flash_project_args" - "**/build*/config/sdkconfig.json" - "**/build*/sdkconfig" - "**/build*/bootloader/*.bin" - "**/build*/partition_table/*.bin" - list_job_*.json - size_info.txt - components/idf_test/unit_test/*.yml when: always expire_in: 4 days script: # CI specific options start from "--collect-size-info xxx". could ignore when running locally - run_cmd python tools/ci/ci_build_apps.py tools/unit-test-app -v -t $IDF_TARGET --config "configs/*=" --copy-sdkconfig --preserve-all --collect-size-info size_info.txt --collect-app-info list_job_${CI_NODE_INDEX:-1}.json --parallel-count ${CI_NODE_TOTAL:-1} --parallel-index ${CI_NODE_INDEX:-1} - run_cmd python tools/unit-test-app/tools/UnitTestParser.py tools/unit-test-app ${CI_NODE_INDEX:-1} build_esp_idf_tests_cmake_esp32: extends: - .build_esp_idf_tests_cmake_template - .rules:build:unit_test-esp32 variables: IDF_TARGET: esp32 build_esp_idf_tests_cmake_esp32s2: extends: - .build_esp_idf_tests_cmake_template - .rules:build:unit_test-esp32s2 variables: IDF_TARGET: esp32s2 build_esp_idf_tests_cmake_esp32s3: extends: - .build_esp_idf_tests_cmake_template - .rules:build:unit_test-esp32s3 variables: IDF_TARGET: esp32s3 build_esp_idf_tests_cmake_esp32c2: extends: - .build_esp_idf_tests_cmake_template - .rules:build:unit_test-esp32c2 variables: IDF_TARGET: esp32c2 build_esp_idf_tests_cmake_esp32c3: extends: - .build_esp_idf_tests_cmake_template - .rules:build:unit_test-esp32c3 variables: IDF_TARGET: esp32c3 build_esp_idf_tests_cmake_esp32c6: extends: - .build_esp_idf_tests_cmake_template - .rules:build:unit_test-esp32c6 variables: IDF_TARGET: esp32c6 build_esp_idf_tests_cmake_esp32h2: extends: - .build_esp_idf_tests_cmake_template - .rules:build:unit_test-esp32h2 variables: IDF_TARGET: esp32h2 build_examples_cmake_esp32: extends: - .build_cmake_template - .rules:build:example_test-esp32 parallel: 8 variables: IDF_TARGET: esp32 TEST_DIR: examples build_examples_cmake_esp32s2: extends: - .build_cmake_template - .rules:build:example_test-esp32s2 parallel: 7 variables: IDF_TARGET: esp32s2 TEST_DIR: examples build_examples_cmake_esp32s3: extends: - .build_cmake_template - .rules:build:example_test-esp32s3 parallel: 7 variables: IDF_TARGET: esp32s3 TEST_DIR: examples build_examples_cmake_esp32c2: extends: - .build_cmake_template - .rules:build:example_test-esp32c2 parallel: 6 variables: IDF_TARGET: esp32c2 TEST_DIR: examples build_examples_cmake_esp32c3: extends: - .build_cmake_template - .rules:build:example_test-esp32c3 parallel: 6 variables: IDF_TARGET: esp32c3 TEST_DIR: examples build_examples_cmake_esp32c6: extends: - .build_cmake_template - .rules:build:example_test-esp32c6 parallel: 6 variables: IDF_TARGET: esp32c6 TEST_DIR: examples build_examples_cmake_esp32h2: extends: - .build_cmake_template - .rules:build:example_test-esp32h2 parallel: 2 variables: IDF_TARGET: esp32h2 TEST_DIR: examples build_clang_test_apps_esp32: extends: - .build_cmake_clang_template - .rules:build:custom_test-esp32 variables: IDF_TARGET: esp32 build_clang_test_apps_esp32s2: extends: - .build_cmake_clang_template - .rules:build:custom_test-esp32s2 variables: IDF_TARGET: esp32s2 build_clang_test_apps_esp32s3: extends: - .build_cmake_clang_template - .rules:build:custom_test-esp32s3 variables: IDF_TARGET: esp32s3 .build_clang_test_apps_riscv: extends: - .build_cmake_clang_template variables: # For RISCV clang generates '.linker-options' sections of type 'llvm_linker_options' in asm files. # See (https://llvm.org/docs/Extensions.html#linker-options-section-linker-options). # Binutils gas ignores them with warning. # TODO: LLVM-112, Use integrated assembler. TEST_BUILD_OPTS_EXTRA: "--ignore-warning-str 'Warning: unrecognized section type'" build_clang_test_apps_esp32c3: extends: - .build_clang_test_apps_riscv - .rules:build:custom_test-esp32c3 variables: IDF_TARGET: esp32c3 build_clang_test_apps_esp32c2: extends: - .build_clang_test_apps_riscv - .rules:build:custom_test-esp32c2 variables: IDF_TARGET: esp32c2 build_clang_test_apps_esp32c6: extends: - .build_clang_test_apps_riscv - .rules:build:custom_test-esp32c6 # TODO: c6 builds fail in master due to missing headers allow_failure: true variables: IDF_TARGET: esp32c6 .test_build_system_template: stage: host_test extends: - .build_template - .rules:build needs: - job: fast_template_app artifacts: false script: - ${IDF_PATH}/tools/ci/test_configure_ci_environment.sh - rm -rf test_build_system - mkdir test_build_system - cd test_build_system - ${IDF_PATH}/tools/ci/${SHELL_TEST_SCRIPT} test_build_system_cmake: extends: .test_build_system_template variables: SHELL_TEST_SCRIPT: test_build_system_cmake.sh test_build_system_cmake_macos: extends: - .test_build_system_template - .before_script_macos - .rules:build:macos tags: - macos_shell variables: SHELL_TEST_SCRIPT: test_build_system_cmake.sh test_build_system_spaces: extends: .test_build_system_template variables: SHELL_TEST_SCRIPT: test_build_system_spaces.py pytest_build_system: extends: .test_build_system_template artifacts: paths: - XUNIT_RESULT.xml - test_build_system when: always expire_in: 2 days reports: junit: XUNIT_RESULT.xml script: - ${IDF_PATH}/tools/ci/test_configure_ci_environment.sh - cd ${IDF_PATH}/tools/test_build_system - pytest --work-dir ${CI_PROJECT_DIR}/test_build_system --junitxml=${CI_PROJECT_DIR}/XUNIT_RESULT.xml build_docker: extends: - .before_script_minimal - .rules:build:docker stage: host_test needs: [] image: espressif/docker-builder:1 tags: - build_docker_amd64_brno variables: DOCKER_TMP_IMAGE_NAME: "idf_tmp_image" script: - export LOCAL_CI_REPOSITORY_URL=$CI_REPOSITORY_URL - if [ -n "$LOCAL_GITLAB_HTTPS_HOST" ]; then export LOCAL_CI_REPOSITORY_URL="https://gitlab-ci-token:${CI_JOB_TOKEN}@${LOCAL_GITLAB_HTTPS_HOST}/${CI_PROJECT_PATH}"; fi - if [ -n "$LOCAL_GIT_MIRROR" ]; then export LOCAL_CI_REPOSITORY_URL="${LOCAL_GIT_MIRROR}/${CI_PROJECT_PATH}"; fi - echo "Using repository at $LOCAL_CI_REPOSITORY_URL" - export DOCKER_BUILD_ARGS="--build-arg IDF_CLONE_URL=${LOCAL_CI_REPOSITORY_URL} --build-arg IDF_CLONE_BRANCH_OR_TAG=${CI_COMMIT_REF_NAME} --build-arg IDF_CHECKOUT_REF=${CI_COMMIT_TAG:-$PIPELINE_COMMIT_SHA}" # Build - docker build --tag ${DOCKER_TMP_IMAGE_NAME} ${DOCKER_BUILD_ARGS} tools/docker/ # We can't mount $PWD/examples/get-started/blink into the container, see https://gitlab.com/gitlab-org/gitlab-ce/issues/41227. # The workaround mentioned there works, but leaves around directories which need to be cleaned up manually. # Therefore, build a copy of the example located inside the container. - docker run --rm --workdir /opt/esp/idf/examples/get-started/blink ${DOCKER_TMP_IMAGE_NAME} idf.py build # This job builds template app with permutations of targets and optimization levels build_template_app: extends: - .build_template_app_template - .rules:build stage: host_test needs: - job: fast_template_app artifacts: false