ci.yml 19 KB

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