name: CI on: push: branches: [dev, beta, release] pull_request: permissions: contents: read concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true jobs: ci: name: ${{ matrix.name }} runs-on: ubuntu-latest strategy: fail-fast: false matrix: include: - id: ci-custom name: Run script/ci-custom - id: lint-python name: Run script/lint-python - id: test file: tests/test1.yaml name: Test tests/test1.yaml pio_cache_key: test1 - id: test file: tests/test2.yaml name: Test tests/test2.yaml pio_cache_key: test2 - id: test file: tests/test3.yaml name: Test tests/test3.yaml pio_cache_key: test3 - id: test file: tests/test4.yaml name: Test tests/test4.yaml pio_cache_key: test4 - id: test file: tests/test5.yaml name: Test tests/test5.yaml pio_cache_key: test5 - id: pytest name: Run pytest - id: clang-format name: Run script/clang-format - id: clang-tidy name: Run script/clang-tidy for ESP8266 options: --environment esp8266-arduino-tidy --grep USE_ESP8266 pio_cache_key: tidyesp8266 - id: clang-tidy name: Run script/clang-tidy for ESP32 Arduino 1/4 options: --environment esp32-arduino-tidy --split-num 4 --split-at 1 pio_cache_key: tidyesp32 - id: clang-tidy name: Run script/clang-tidy for ESP32 Arduino 2/4 options: --environment esp32-arduino-tidy --split-num 4 --split-at 2 pio_cache_key: tidyesp32 - id: clang-tidy name: Run script/clang-tidy for ESP32 Arduino 3/4 options: --environment esp32-arduino-tidy --split-num 4 --split-at 3 pio_cache_key: tidyesp32 - id: clang-tidy name: Run script/clang-tidy for ESP32 Arduino 4/4 options: --environment esp32-arduino-tidy --split-num 4 --split-at 4 pio_cache_key: tidyesp32 - id: clang-tidy name: Run script/clang-tidy for ESP32 IDF options: --environment esp32-idf-tidy --grep USE_ESP_IDF pio_cache_key: tidyesp32-idf steps: - uses: actions/checkout@v3 - name: Set up Python uses: actions/setup-python@v4 id: python with: python-version: '3.8' - name: Cache virtualenv uses: actions/cache@v3 with: path: .venv key: venv-${{ steps.python.outputs.python-version }}-${{ hashFiles('requirements*.txt') }} restore-keys: | venv-${{ steps.python.outputs.python-version }}- - name: Set up virtualenv run: | python -m venv .venv source .venv/bin/activate pip install -U pip pip install -r requirements.txt -r requirements_optional.txt -r requirements_test.txt pip install -e . echo "$GITHUB_WORKSPACE/.venv/bin" >> $GITHUB_PATH echo "VIRTUAL_ENV=$GITHUB_WORKSPACE/.venv" >> $GITHUB_ENV # Use per check platformio cache because checks use different parts - name: Cache platformio uses: actions/cache@v3 with: path: ~/.platformio key: platformio-${{ matrix.pio_cache_key }}-${{ hashFiles('platformio.ini') }} if: matrix.id == 'test' || matrix.id == 'clang-tidy' - name: Install clang tools run: | sudo apt-get install \ clang-format-11 \ clang-tidy-11 if: matrix.id == 'clang-tidy' || matrix.id == 'clang-format' - name: Register problem matchers run: | echo "::add-matcher::.github/workflows/matchers/ci-custom.json" echo "::add-matcher::.github/workflows/matchers/lint-python.json" echo "::add-matcher::.github/workflows/matchers/python.json" echo "::add-matcher::.github/workflows/matchers/pytest.json" echo "::add-matcher::.github/workflows/matchers/gcc.json" echo "::add-matcher::.github/workflows/matchers/clang-tidy.json" - name: Lint Custom run: | script/ci-custom.py script/build_codeowners.py --check if: matrix.id == 'ci-custom' - name: Lint Python run: script/lint-python -a if: matrix.id == 'lint-python' - run: esphome compile ${{ matrix.file }} if: matrix.id == 'test' env: # Also cache libdeps, store them in a ~/.platformio subfolder PLATFORMIO_LIBDEPS_DIR: ~/.platformio/libdeps - name: Run pytest run: | pytest -vv --tb=native tests if: matrix.id == 'pytest' # Also run git-diff-index so that the step is marked as failed on formatting errors, # since clang-format doesn't do anything but change files if -i is passed. - name: Run clang-format run: | script/clang-format -i git diff-index --quiet HEAD -- if: matrix.id == 'clang-format' - name: Run clang-tidy run: | script/clang-tidy --all-headers --fix ${{ matrix.options }} if: matrix.id == 'clang-tidy' env: # Also cache libdeps, store them in a ~/.platformio subfolder PLATFORMIO_LIBDEPS_DIR: ~/.platformio/libdeps - name: Suggested changes run: script/ci-suggest-changes if: always() && (matrix.id == 'clang-tidy' || matrix.id == 'clang-format' || matrix.id == 'lint-python')