ci.yml 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565
  1. name: Continuous Integration
  2. on: [push, pull_request]
  3. concurrency:
  4. group: ${{ github.workflow }}-${{ github.ref }}
  5. cancel-in-progress: true
  6. jobs:
  7. lint:
  8. name: Lint
  9. runs-on: ubuntu-22.04
  10. steps:
  11. - name: Install
  12. run: sudo apt-get install -y clang-format
  13. - name: Checkout
  14. uses: actions/checkout@v4
  15. - name: Symlinks
  16. run: find * -type l -printf "::error::%p is a symlink. This is forbidden by the Arduino Library Specification." -exec false {} +
  17. - name: Clang-format
  18. run: |
  19. find src/ extras/ -name '*.[ch]pp' | xargs clang-format -i --verbose --style=file
  20. git diff --exit-code
  21. - name: Check URLs
  22. run: |
  23. grep -hREo "(http|https)://[a-zA-Z0-9./?=_%:-]*" src/ | sort -u | while read -r URL
  24. do
  25. STATUS=$(curl -s -o /dev/null -I -w "%{http_code}" "$URL")
  26. [ "$STATUS" -ge 400 ] && echo "::warning title=HTTP $STATUS::$URL returned $STATUS"
  27. done || true
  28. gcc:
  29. name: GCC
  30. needs: lint
  31. runs-on: ubuntu-22.04
  32. strategy:
  33. fail-fast: false
  34. matrix:
  35. include:
  36. - gcc: "5"
  37. - gcc: "6"
  38. - gcc: "7"
  39. cxxflags: -fsanitize=leak -fno-sanitize-recover=all
  40. - gcc: "8"
  41. cxxflags: -fsanitize=undefined -fno-sanitize-recover=all
  42. - gcc: "9"
  43. cxxflags: -fsanitize=address -fno-sanitize-recover=all
  44. - gcc: "10"
  45. cxxflags: -funsigned-char # Issue #1715
  46. - gcc: "11"
  47. - gcc: "12"
  48. steps:
  49. - name: Workaround for actions/runner-images#9491
  50. run: sudo sysctl vm.mmap_rnd_bits=28
  51. - name: Install
  52. run: |
  53. sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5 3B4FE6ACC0B21F32
  54. sudo add-apt-repository -yn 'deb http://archive.ubuntu.com/ubuntu/ xenial main universe'
  55. sudo add-apt-repository -yn 'deb http://archive.ubuntu.com/ubuntu/ bionic main universe'
  56. sudo add-apt-repository -yn 'deb http://archive.ubuntu.com/ubuntu/ focal main universe'
  57. sudo apt-get update
  58. sudo apt-get install -y gcc-${{ matrix.gcc }} g++-${{ matrix.gcc }}
  59. timeout-minutes: 5
  60. - name: Checkout
  61. uses: actions/checkout@v4
  62. timeout-minutes: 1
  63. - name: Configure
  64. run: cmake -DCMAKE_BUILD_TYPE=Debug .
  65. env:
  66. CC: gcc-${{ matrix.gcc }}
  67. CXX: g++-${{ matrix.gcc }}
  68. CXXFLAGS: ${{ matrix.cxxflags }}
  69. timeout-minutes: 1
  70. - name: Build
  71. run: cmake --build .
  72. timeout-minutes: 10
  73. - name: Test
  74. run: ctest --output-on-failure -C Debug .
  75. env:
  76. UBSAN_OPTIONS: print_stacktrace=1
  77. timeout-minutes: 2
  78. clang:
  79. name: Clang
  80. needs: lint
  81. strategy:
  82. fail-fast: false
  83. matrix:
  84. include:
  85. - clang: "7"
  86. runner: ubuntu-22.04
  87. archive: focal
  88. - clang: "8"
  89. cxxflags: -fsanitize=leak -fno-sanitize-recover=all
  90. runner: ubuntu-22.04
  91. archive: focal
  92. - clang: "9"
  93. cxxflags: -fsanitize=undefined -fno-sanitize-recover=all
  94. runner: ubuntu-22.04
  95. archive: focal
  96. - clang: "10"
  97. cxxflags: -fsanitize=address -fno-sanitize-recover=all
  98. runner: ubuntu-22.04
  99. archive: focal
  100. - clang: "11"
  101. runner: ubuntu-22.04
  102. - clang: "12"
  103. runner: ubuntu-22.04
  104. - clang: "13"
  105. runner: ubuntu-22.04
  106. - clang: 16
  107. - clang: 17
  108. - clang: 18
  109. - clang: 19
  110. runs-on: ${{ matrix.runner || 'ubuntu-latest' }}
  111. steps:
  112. - name: Add archive repositories
  113. if: matrix.archive
  114. run: |
  115. sudo gpg --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
  116. sudo gpg --export 3B4FE6ACC0B21F32 | sudo tee /etc/apt/trusted.gpg.d/ubuntu-keyring.gpg > /dev/null
  117. sudo add-apt-repository -yn 'deb http://archive.ubuntu.com/ubuntu/ ${{ matrix.archive }} main'
  118. sudo add-apt-repository -yn 'deb http://archive.ubuntu.com/ubuntu/ ${{ matrix.archive }} universe'
  119. - name: Install Clang ${{ matrix.clang }}
  120. run: |
  121. sudo apt-get update
  122. sudo apt-get install -y clang-${{ matrix.clang }}
  123. - name: Install libunwind ${{ matrix.clang }}
  124. if: matrix.clang == 12 # dependency is missing in Ubuntu 22.04
  125. run: sudo apt-get install -y libunwind-${{ matrix.clang }}-dev
  126. - name: Checkout
  127. uses: actions/checkout@v4
  128. - name: Configure
  129. run: cmake -DCMAKE_BUILD_TYPE=Debug .
  130. env:
  131. CC: clang-${{ matrix.clang }}
  132. CXX: clang++-${{ matrix.clang }}
  133. CXXFLAGS: ${{ matrix.cxxflags }}
  134. - name: Build
  135. run: cmake --build .
  136. - name: Test
  137. run: ctest --output-on-failure -C Debug .
  138. env:
  139. UBSAN_OPTIONS: print_stacktrace=1
  140. conf_test:
  141. name: Test configuration on Linux
  142. needs: [gcc, clang]
  143. runs-on: ubuntu-22.04
  144. steps:
  145. - name: Install
  146. run: |
  147. sudo apt-get update
  148. sudo apt-get install -y g++-multilib gcc-avr avr-libc
  149. - name: Checkout
  150. uses: actions/checkout@v4
  151. - name: AVR
  152. run: avr-g++ -std=c++11 -Isrc extras/conf_test/avr.cpp
  153. - name: GCC 32-bit
  154. run: g++ -std=c++11 -m32 -Isrc extras/conf_test/x86.cpp
  155. - name: GCC 64-bit
  156. run: g++ -std=c++11 -m64 -Isrc extras/conf_test/x64.cpp
  157. - name: Clang 32-bit
  158. run: clang++ -std=c++11 -m32 -Isrc extras/conf_test/x86.cpp
  159. - name: Clang 64-bit
  160. run: clang++ -std=c++11 -m64 -Isrc extras/conf_test/x64.cpp
  161. conf_test_windows:
  162. name: Test configuration on Windows
  163. runs-on: windows-2022
  164. needs: [gcc, clang]
  165. steps:
  166. - name: Checkout
  167. uses: actions/checkout@v4
  168. - name: 32-bit
  169. run: |
  170. call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars32.bat"
  171. cl /Isrc extras/conf_test/x86.cpp
  172. shell: cmd
  173. - name: 64-bit
  174. run: |
  175. call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
  176. cl /Isrc extras/conf_test/x64.cpp
  177. shell: cmd
  178. xcode:
  179. name: XCode
  180. needs: clang
  181. runs-on: macos-26
  182. strategy:
  183. fail-fast: false
  184. matrix:
  185. include:
  186. - xcode: "26.0"
  187. - xcode: "26.1"
  188. - xcode: "26.2"
  189. - xcode: "26.3"
  190. steps:
  191. - name: Checkout
  192. uses: actions/checkout@v4
  193. - name: Select XCode version
  194. run: sudo xcode-select --switch /Applications/Xcode_${{ matrix.xcode }}.app
  195. - name: Configure
  196. run: cmake -DCMAKE_BUILD_TYPE=Debug .
  197. - name: Build
  198. run: cmake --build .
  199. - name: Test
  200. run: ctest --output-on-failure -C Debug .
  201. # DISABLED: Running on AppVeyor instead because it supports older versions of the compiler
  202. # msvc:
  203. # name: Visual Studio
  204. # strategy:
  205. # fail-fast: false
  206. # matrix:
  207. # include:
  208. # - os: windows-2016
  209. # - os: windows-2019
  210. # runs-on: ${{ matrix.os }}
  211. # steps:
  212. # - name: Checkout
  213. # uses: actions/checkout@v4
  214. # - name: Configure
  215. # run: cmake -DCMAKE_BUILD_TYPE=Debug .
  216. # - name: Build
  217. # run: cmake --build .
  218. # - name: Test
  219. # run: ctest --output-on-failure -C Debug .
  220. arduino:
  221. name: Arduino
  222. needs: gcc
  223. strategy:
  224. fail-fast: false
  225. matrix:
  226. include:
  227. - core: arduino:avr
  228. board: arduino:avr:uno
  229. - core: arduino:samd
  230. board: arduino:samd:mkr1000
  231. runs-on: ubuntu-22.04
  232. steps:
  233. - name: Checkout
  234. uses: actions/checkout@v4
  235. - name: Install arduino-cli
  236. run: curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | BINDIR=/usr/local/bin sh
  237. - name: Install core
  238. run: arduino-cli core install ${{ matrix.core }}
  239. - name: Install libraries
  240. run: arduino-cli lib install SD Ethernet
  241. - name: Build JsonConfigFile
  242. run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/JsonConfigFile/JsonConfigFile.ino"
  243. - name: Build JsonFilterExample
  244. run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/JsonFilterExample/JsonFilterExample.ino"
  245. - name: Build JsonGeneratorExample
  246. run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/JsonGeneratorExample/JsonGeneratorExample.ino"
  247. - name: Build JsonHttpClient
  248. run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/JsonHttpClient/JsonHttpClient.ino"
  249. - name: Build JsonParserExample
  250. run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/JsonParserExample/JsonParserExample.ino"
  251. - name: Build JsonServer
  252. run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/JsonServer/JsonServer.ino"
  253. - name: Build JsonUdpBeacon
  254. run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/JsonUdpBeacon/JsonUdpBeacon.ino"
  255. - name: Build MsgPackParser
  256. run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/MsgPackParser/MsgPackParser.ino"
  257. - name: Build ProgmemExample
  258. run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/ProgmemExample/ProgmemExample.ino"
  259. - name: Build StringExample
  260. run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/StringExample/StringExample.ino"
  261. platformio:
  262. name: PlatformIO
  263. needs: gcc
  264. runs-on: ubuntu-latest
  265. strategy:
  266. fail-fast: false
  267. matrix:
  268. include:
  269. - platform: atmelavr
  270. board: leonardo
  271. libraries:
  272. - SD
  273. - Ethernet
  274. conf_test: avr
  275. - platform: espressif8266
  276. board: huzzah
  277. conf_test: esp8266
  278. - platform: espressif32
  279. board: esp32dev
  280. libraries:
  281. - Ethernet
  282. conf_test: esp8266
  283. - platform: atmelsam
  284. board: mkr1000USB
  285. libraries:
  286. - SD
  287. - Ethernet
  288. conf_test: esp8266
  289. - platform: teensy
  290. board: teensy31
  291. conf_test: esp8266
  292. - platform: ststm32
  293. board: adafruit_feather_f405
  294. libraries:
  295. - SD
  296. - Ethernet
  297. conf_test: esp8266
  298. - platform: nordicnrf52
  299. board: adafruit_feather_nrf52840
  300. libraries:
  301. - SD
  302. - Ethernet
  303. conf_test: esp8266
  304. steps:
  305. - name: Checkout
  306. uses: actions/checkout@v4
  307. - name: Set up cache for pip
  308. uses: actions/cache@v4
  309. with:
  310. path: ~/.cache/pip
  311. key: ${{ runner.os }}-pip
  312. - name: Set up Python 3.x
  313. uses: actions/setup-python@v5
  314. with:
  315. python-version: "3.x"
  316. - name: Install PlatformIO
  317. run: pip install platformio
  318. - name: Install adafruit-nrfutil
  319. if: ${{ matrix.platform == 'nordicnrf52' }}
  320. run: pip install adafruit-nrfutil
  321. - name: Include Adafruit_TinyUSB.h # https://github.com/adafruit/Adafruit_nRF52_Arduino/issues/653
  322. if: ${{ matrix.platform == 'nordicnrf52' }}
  323. run: find examples/ -name '*.ino' -exec sed -i 's/\(#include <ArduinoJson.h>\)/\1\n#include <Adafruit_TinyUSB.h>/' {} +
  324. - name: Set up cache for platformio
  325. uses: actions/cache@v4
  326. with:
  327. path: ~/.platformio
  328. key: ${{ runner.os }}-platformio-${{ matrix.platform }}
  329. - name: Install platform "${{ matrix.platform }}"
  330. run: platformio platform install ${{ matrix.platform }}
  331. - name: Install libraries
  332. if: ${{ matrix.libraries }}
  333. run: platformio lib install arduino-libraries/${{ join(matrix.libraries, ' arduino-libraries/') }}
  334. - name: Test configuration
  335. run: platformio ci "extras/conf_test/${{ matrix.conf_test }}.cpp" -l '.' -b ${{ matrix.board }}
  336. if: ${{ matrix.conf_test }}
  337. - name: Build JsonConfigFile
  338. run: platformio ci "examples/JsonConfigFile/JsonConfigFile.ino" -l '.' -b ${{ matrix.board }}
  339. - name: Build JsonFilterExample
  340. run: platformio ci "examples/JsonFilterExample/JsonFilterExample.ino" -l '.' -b ${{ matrix.board }}
  341. - name: Build JsonGeneratorExample
  342. run: platformio ci "examples/JsonGeneratorExample/JsonGeneratorExample.ino" -l '.' -b ${{ matrix.board }}
  343. - name: Build JsonHttpClient
  344. run: platformio ci "examples/JsonHttpClient/JsonHttpClient.ino" -l '.' -b ${{ matrix.board }}
  345. - name: Build JsonParserExample
  346. run: platformio ci "examples/JsonParserExample/JsonParserExample.ino" -l '.' -b ${{ matrix.board }}
  347. - name: Build JsonServer
  348. if: ${{ matrix.platform != 'espressif32' }}
  349. run: platformio ci "examples/JsonServer/JsonServer.ino" -l '.' -b ${{ matrix.board }}
  350. - name: Build JsonUdpBeacon
  351. run: platformio ci "examples/JsonUdpBeacon/JsonUdpBeacon.ino" -l '.' -b ${{ matrix.board }}
  352. - name: Build MsgPackParser
  353. run: platformio ci "examples/MsgPackParser/MsgPackParser.ino" -l '.' -b ${{ matrix.board }}
  354. - name: Build ProgmemExample
  355. run: platformio ci "examples/ProgmemExample/ProgmemExample.ino" -l '.' -b ${{ matrix.board }}
  356. - name: Build StringExample
  357. run: platformio ci "examples/StringExample/StringExample.ino" -l '.' -b ${{ matrix.board }}
  358. - name: PlatformIO prune
  359. if: ${{ always() }}
  360. run: platformio system prune -f
  361. particle:
  362. name: Particle
  363. needs: gcc
  364. runs-on: ubuntu-latest
  365. if: github.event_name == 'push'
  366. strategy:
  367. fail-fast: false
  368. matrix:
  369. include:
  370. - board: argon
  371. steps:
  372. - name: Checkout
  373. uses: actions/checkout@v4
  374. - name: Install Particle CLI
  375. run: |
  376. bash <( curl -sL https://particle.io/install-cli )
  377. echo "$HOME/bin" >> $GITHUB_PATH
  378. - name: Login to Particle
  379. run: particle login -t "${{ secrets.PARTICLE_TOKEN }}"
  380. - name: Compile
  381. run: extras/ci/particle.sh ${{ matrix.board }}
  382. arm:
  383. name: GCC for ARM processor
  384. needs: gcc
  385. runs-on: ubuntu-22.04
  386. steps:
  387. - name: Install
  388. run: |
  389. sudo apt-get update
  390. sudo apt-get install -y g++-arm-linux-gnueabihf
  391. - name: Checkout
  392. uses: actions/checkout@v4
  393. - name: Configure
  394. run: cmake .
  395. env:
  396. CC: arm-linux-gnueabihf-gcc
  397. CXX: arm-linux-gnueabihf-g++
  398. - name: Build
  399. run: cmake --build .
  400. coverage:
  401. needs: gcc
  402. name: Coverage
  403. runs-on: ubuntu-22.04
  404. steps:
  405. - name: Install
  406. run: sudo apt-get install -y lcov ninja-build
  407. - name: Checkout
  408. uses: actions/checkout@v4
  409. - name: Configure
  410. run: cmake -G Ninja -DCOVERAGE=true .
  411. - name: Build
  412. run: ninja
  413. - name: Test
  414. run: ctest --output-on-failure -LE 'WillFail|Fuzzing' -T test
  415. - name: lcov --capture
  416. run: lcov --capture --no-external --directory . --output-file coverage.info
  417. - name: lcov --remove
  418. run: lcov --remove coverage.info "$(pwd)/extras/*" --output-file coverage_filtered.info
  419. - name: genhtml
  420. run: mkdir coverage && genhtml coverage_filtered.info -o coverage -t ArduinoJson
  421. - name: Upload HTML report
  422. uses: actions/upload-artifact@v4
  423. with:
  424. name: Coverage report
  425. path: coverage
  426. - name: Upload to Coveralls
  427. uses: coverallsapp/github-action@v2
  428. with:
  429. github-token: ${{ secrets.GITHUB_TOKEN }}
  430. path-to-lcov: coverage_filtered.info
  431. valgrind:
  432. needs: gcc
  433. name: Valgrind
  434. runs-on: ubuntu-22.04
  435. steps:
  436. - name: Install
  437. run: |
  438. sudo apt-get update
  439. sudo apt-get install -y valgrind ninja-build
  440. - name: Checkout
  441. uses: actions/checkout@v4
  442. - name: Configure
  443. run: cmake -G Ninja -D MEMORYCHECK_COMMAND_OPTIONS="--error-exitcode=1 --leak-check=full" .
  444. - name: Build
  445. run: ninja
  446. - name: Memcheck
  447. run: ctest --output-on-failure -LE WillFail -T memcheck
  448. id: memcheck
  449. - name: MemoryChecker.*.log
  450. run: cat Testing/Temporary/MemoryChecker.*.log > $GITHUB_STEP_SUMMARY
  451. if: failure()
  452. clang-tidy:
  453. needs: clang
  454. name: Clang-Tidy
  455. runs-on: ubuntu-latest
  456. steps:
  457. - name: Install
  458. run: sudo apt-get install -y clang-tidy libc++-dev libc++abi-dev
  459. - name: Checkout
  460. uses: actions/checkout@v4
  461. - name: Configure
  462. run: cmake -G Ninja -DCMAKE_CXX_CLANG_TIDY="clang-tidy;--warnings-as-errors=*" -DCMAKE_BUILD_TYPE=Debug .
  463. env:
  464. CC: clang
  465. CXX: clang++
  466. - name: Check
  467. run: cmake --build . -- -k 0
  468. amalgamate:
  469. needs: gcc
  470. name: Amalgamate ArduinoJson.h
  471. runs-on: ubuntu-22.04
  472. steps:
  473. - name: Checkout
  474. uses: actions/checkout@v4
  475. - name: Setup
  476. run: |
  477. if [[ $GITHUB_REF == refs/tags/* ]]; then
  478. VERSION=${GITHUB_REF#refs/tags/}
  479. else
  480. VERSION=${GITHUB_SHA::7}
  481. fi
  482. echo "ARDUINOJSON_H=ArduinoJson-$VERSION.h" >> $GITHUB_ENV
  483. echo "ARDUINOJSON_HPP=ArduinoJson-$VERSION.hpp" >> $GITHUB_ENV
  484. - name: Amalgamate ArduinoJson.h
  485. run: extras/scripts/build-single-header.sh "src/ArduinoJson.h" "$ARDUINOJSON_H"
  486. - name: Amalgamate ArduinoJson.hpp
  487. run: extras/scripts/build-single-header.sh "src/ArduinoJson.hpp" "$ARDUINOJSON_HPP"
  488. - name: Upload artifact
  489. uses: actions/upload-artifact@v4
  490. with:
  491. name: Single headers
  492. path: |
  493. ${{ env.ARDUINOJSON_H }}
  494. ${{ env.ARDUINOJSON_HPP }}
  495. - name: Smoke test ArduinoJson.h
  496. run: |
  497. g++ -x c++ - <<END
  498. #include "$ARDUINOJSON_H"
  499. int main() {
  500. StaticJsonDocument<300> doc;
  501. deserializeJson(doc, "{}");
  502. }
  503. END
  504. - name: Smoke test ArduinoJson.hpp
  505. run: |
  506. g++ -x c++ - <<END
  507. #include "$ARDUINOJSON_HPP"
  508. int main() {
  509. ArduinoJson::StaticJsonDocument<300> doc;
  510. deserializeJson(doc, "{}");
  511. }
  512. END
  513. esp-idf:
  514. needs: gcc
  515. name: ESP-IDF
  516. runs-on: ubuntu-latest
  517. steps:
  518. - name: Setup cache
  519. uses: actions/cache@v4
  520. with:
  521. path: ~/.espressif
  522. key: ${{ runner.os }}-esp-idf
  523. - name: Checkout ArduinoJson
  524. uses: actions/checkout@v4
  525. - name: Checkout ESP-IDF
  526. uses: actions/checkout@v4
  527. with:
  528. repository: espressif/esp-idf
  529. path: esp-idf
  530. submodules: true
  531. - name: Install ESP-IDF
  532. run: ./esp-idf/install.sh
  533. - name: Add component
  534. # NOTE: we cannot commit the symlink because the Arduino Library Specification forbids it.
  535. run: |
  536. mkdir -p extras/ci/espidf/components
  537. ln -s $PWD extras/ci/espidf/components/ArduinoJson
  538. - name: Build example
  539. run: |
  540. source esp-idf/export.sh
  541. cd extras/ci/espidf
  542. idf.py build