Validate and Build ESPHome #1491
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--- | |
name: Validate and Build ESPHome | |
# yamllint disable-line rule:truthy | |
on: | |
push: | |
paths: | |
- "nspanel_esphome*.yaml" | |
- "esphome/nspanel_esphome*.yaml" | |
- "prebuilt/nspanel_esphome*.yaml" | |
- "prebuilt/wall_display*.yaml" | |
- ".test/*.yaml" | |
- "*.h" | |
- "*.c" | |
- "*.cpp" | |
- "*.py" | |
pull_request: | |
paths: | |
- "nspanel_esphome*.yaml" | |
- "esphome/nspanel_esphome*.yaml" | |
- "prebuilt/nspanel_esphome*.yaml" | |
- "prebuilt/wall_display*.yaml" | |
- ".test/*.yaml" | |
- "*.h" | |
- "*.c" | |
- "*.cpp" | |
- "*.py" | |
workflow_dispatch: | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} | |
cancel-in-progress: true | |
jobs: | |
setup_dependencies: | |
name: Setup & Cache Dependencies | |
runs-on: ubuntu-latest | |
outputs: | |
cache-hit-idf-v4: ${{ steps.cache-idf-v4.outputs.cache-hit }} | |
cache-hit-idf-v5: ${{ steps.cache-idf-v5.outputs.cache-hit }} | |
cache-hit-arduino: ${{ steps.cache-arduino.outputs.cache-hit }} | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@main | |
- name: Cache ESP-IDF v4 Dependencies | |
id: cache-idf-v4 | |
uses: actions/cache@main | |
with: | |
path: | | |
~/.esphome/cache | |
~/.platformio/packages | |
~/.platformio/platforms | |
key: ${{ runner.os }}-esp-idf-v4-${{ hashFiles('**/esphome_idf_basic.yaml') }} | |
restore-keys: | | |
${{ runner.os }}-esp-idf-v4- | |
- name: Cache ESP-IDF v5 Dependencies | |
id: cache-idf-v5 | |
uses: actions/cache@main | |
with: | |
path: | | |
~/.esphome/cache | |
~/.platformio/packages | |
~/.platformio/platforms | |
key: ${{ runner.os }}-esp-idf-v5-${{ hashFiles('**/esphome_idf5_basic.yaml') }} | |
restore-keys: | | |
${{ runner.os }}-esp-idf-v5- | |
- name: Cache Arduino Dependencies | |
id: cache-arduino | |
uses: actions/cache@main | |
with: | |
path: | | |
~/.esphome/cache | |
~/.platformio/packages | |
~/.platformio/platforms | |
key: ${{ runner.os }}-arduino-${{ hashFiles('**/esphome_ard_basic.yaml') }} | |
restore-keys: | | |
${{ runner.os }}-arduino- | |
code_scan: | |
name: Code scan (YAML) | |
runs-on: "ubuntu-latest" | |
needs: setup_dependencies | |
steps: | |
- name: Checkout Code | |
uses: actions/checkout@main | |
- name: Setup Python | |
uses: actions/setup-python@main | |
with: | |
python-version: '3.8' | |
- name: Install Yamllint | |
run: pip install yamllint | |
- name: Validate YAML files | |
run: find . -name "*.yaml" -exec yamllint -c ./.rules/yamllint.yml {} + | |
build_cores: | |
name: Core | |
needs: [code_scan, setup_dependencies] | |
runs-on: ubuntu-latest | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- id: idf_v4 | |
yaml_file: ".test/esphome_idf_basic.yaml" | |
cache-hit: ${{ needs.setup_dependencies.outputs.cache-hit-idf-v4 }} | |
- id: idf_v5 | |
yaml_file: ".test/esphome_idf5_basic.yaml" | |
cache-hit: ${{ needs.setup_dependencies.outputs.cache-hit-idf-v5 }} | |
- id: ard | |
yaml_file: ".test/esphome_ard_basic.yaml" | |
cache-hit: ${{ needs.setup_dependencies.outputs.cache-hit-arduino }} | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@main | |
- name: Build Firmware | |
if: matrix.cache-hit != 'true' | |
uses: esphome/build-action@main | |
with: | |
yaml-file: ${{ matrix.yaml_file }} | |
build_advanced: | |
name: Advanced | |
needs: build_cores | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
include: | |
- id: idf_v4 | |
base: idf_v4 | |
yaml-file: ".test/esphome_idf_advanced.yaml" | |
- id: idf_v5 | |
base: idf_v5 | |
yaml-file: ".test/esphome_idf5_advanced.yaml" | |
- id: ard | |
base: ard | |
yaml-file: ".test/esphome_ard_advanced.yaml" | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@main | |
- name: Build Advanced Firmware | |
uses: esphome/build-action@main | |
with: | |
yaml-file: ${{ matrix.yaml-file }} | |
build_ble_tracker: | |
name: BLE Tracker | |
needs: build_cores | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
include: | |
- id: idf_v4 | |
base: idf_v4 | |
yaml-file: ".test/esphome_idf_ble_tracker.yaml" | |
- id: idf_v5 | |
base: idf_v5 | |
yaml-file: ".test/esphome_idf5_ble_tracker.yaml" | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@main | |
- name: Build BLE Tracker Firmware | |
uses: esphome/build-action@main | |
with: | |
yaml-file: ${{ matrix.yaml-file }} | |
build_bluetooth_proxy: | |
name: Bluetooth Proxy | |
needs: build_cores | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
include: | |
- id: idf_v4 | |
base: idf_v4 | |
yaml-file: ".test/esphome_idf_bluetooth_proxy.yaml" | |
- id: idf_v5 | |
base: idf_v5 | |
yaml-file: ".test/esphome_idf5_bluetooth_proxy.yaml" | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@main | |
- name: Build Bluetooth Proxy Firmware | |
uses: esphome/build-action@main | |
with: | |
yaml-file: ${{ matrix.yaml-file }} | |
build_climate_cool: | |
name: Climate Cool | |
needs: build_cores | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
include: | |
- id: idf_v4 | |
base: idf_v4 | |
yaml-file: ".test/esphome_idf_climate_cool.yaml" | |
- id: idf_v5 | |
base: idf_v5 | |
yaml-file: ".test/esphome_idf5_climate_cool.yaml" | |
- id: ard | |
base: ard | |
yaml-file: ".test/esphome_ard_climate_cool.yaml" | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@main | |
- name: Build Climate Cool Firmware | |
uses: esphome/build-action@main | |
with: | |
yaml-file: ${{ matrix.yaml-file }} | |
build_climate_heat: | |
name: Climate Heat | |
needs: build_cores | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
include: | |
- id: idf_v4 | |
base: idf_v4 | |
yaml-file: ".test/esphome_idf_climate_heat.yaml" | |
- id: idf_v5 | |
base: idf_v5 | |
yaml-file: ".test/esphome_idf5_climate_heat.yaml" | |
- id: ard | |
base: ard | |
yaml-file: ".test/esphome_ard_climate_heat.yaml" | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@main | |
- name: Build Climate Heat Firmware | |
uses: esphome/build-action@main | |
with: | |
yaml-file: ${{ matrix.yaml-file }} | |
build_climate_dual: | |
name: Climate Dual | |
needs: build_cores | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
include: | |
- id: idf_v4 | |
base: idf_v4 | |
yaml-file: ".test/esphome_idf_climate_dual.yaml" | |
- id: idf_v5 | |
base: idf_v5 | |
yaml-file: ".test/esphome_idf5_climate_dual.yaml" | |
- id: ard | |
base: ard | |
yaml-file: ".test/esphome_ard_climate_dual.yaml" | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@main | |
- name: Build Climate Dual Firmware | |
uses: esphome/build-action@main | |
with: | |
yaml-file: ${{ matrix.yaml-file }} | |
build_customizations: | |
name: Customizations | |
needs: | |
- build_advanced | |
- build_climate_heat | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
include: | |
- id: idf_v4 | |
base: idf_v4 | |
yaml-file: ".test/esphome_idf_advanced_climate_heat_customizations.yaml" | |
- id: ard | |
base: ard | |
yaml-file: ".test/esphome_ard_advanced_climate_heat_customizations.yaml" | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@main | |
- name: Build Customizations Firmware | |
uses: esphome/build-action@main | |
with: | |
yaml-file: ${{ matrix.yaml-file }} | |
build_climate_ble_proxy: | |
name: Climate Cool + Bluetooth Proxy | |
needs: | |
- build_climate_cool | |
- build_bluetooth_proxy | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
include: | |
- id: idf_v4 | |
base: idf_v4 | |
yaml-file: ".test/esphome_idf_climate_cool_bluetooth_proxy.yaml" | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@main | |
- name: Build Customizations Firmware | |
uses: esphome/build-action@main | |
with: | |
yaml-file: ${{ matrix.yaml-file }} | |
build_cover: | |
name: Cover | |
needs: | |
- build_cores | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
include: | |
- id: idf_v4 | |
base: idf_v4 | |
yaml-file: ".test/esphome_idf_cover.yaml" | |
- id: idf_v5 | |
base: idf_v5 | |
yaml-file: ".test/esphome_idf5_cover.yaml" | |
- id: ard | |
base: ard | |
yaml-file: ".test/esphome_ard_cover.yaml" | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@main | |
- name: Build Cover Firmware | |
uses: esphome/build-action@main | |
with: | |
yaml-file: ${{ matrix.yaml-file }} | |
build_prebuilt_firmware: | |
name: Prebuilt Firmware | |
runs-on: ubuntu-latest | |
needs: code_scan | |
if: contains(github.ref, 'dev') || contains(github.base_ref, 'dev') | |
steps: | |
- uses: actions/checkout@main | |
- name: Extract Version Number | |
id: extract_version | |
run: | | |
VERSION=$(yq eval '.substitutions.version' esphome/nspanel_esphome_version.yaml) | |
if [ -z "$VERSION" ]; then | |
echo "Error: No version found in esphome/nspanel_esphome_version.yaml" | |
exit 1 | |
fi | |
echo "Extracted Version: ${VERSION}" | |
echo "version=${VERSION}" >> $GITHUB_OUTPUT | |
echo "VERSION=${VERSION}" >> $GITHUB_ENV | |
- name: Debug Version Output | |
run: | | |
echo "Version from setup_dependencies: ${{ steps.extract_version.outputs.version }}" | |
echo "Environment Variable VERSION: $VERSION" | |
if [ -z "${{ steps.extract_version.outputs.version }}" ]; then | |
echo "Error: Version output is empty. Exiting..." | |
exit 1 | |
fi | |
- name: Build ESPHome Prebuilt Firmware | |
id: build_nspanel_fw | |
uses: esphome/build-action@main | |
with: | |
yaml-file: prebuilt/nspanel_esphome_prebuilt.yaml | |
- name: Update manifest.json - name | |
uses: jossef/action-set-json-field@v2.2 | |
with: | |
file: ${{ steps.build_nspanel_fw.outputs.name }}/manifest.json | |
field: name | |
value: NSPanel HA Blueprint | |
- name: Update manifest.json - version | |
uses: jossef/action-set-json-field@v2.2 | |
with: | |
file: ${{ steps.build_nspanel_fw.outputs.name }}/manifest.json | |
field: version | |
value: ${{ steps.extract_version.outputs.version }} | |
- name: Update manifest.json - builds.chipFamily | |
uses: jossef/action-set-json-field@v2.2 | |
with: | |
file: ${{ steps.build_nspanel_fw.outputs.name }}/manifest.json | |
field: builds.chipFamily | |
value: ESP32 | |
- name: Update manifest.json - builds.ota.path | |
uses: jossef/action-set-json-field@v2.2 | |
with: | |
file: ${{ steps.build_nspanel_fw.outputs.name }}/manifest.json | |
field: builds.ota.path | |
value: "https://raw.githubusercontent.com/Blackymas/NSPanel_HA_Blueprint/main/prebuilt/nspanel_esphome_prebuilt.bin" | |
- name: Update manifest.json - builds.ota.release_url | |
uses: jossef/action-set-json-field@v2.2 | |
with: | |
file: ${{ steps.build_nspanel_fw.outputs.name }}/manifest.json | |
field: builds.ota.release_url | |
value: "https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v${{ steps.extract_version.outputs.version }}" | |
- name: Move and Rename Firmware File - nspanel_esphome_prebuilt | |
run: | | |
mkdir -p prebuilt | |
cp -R ${{ steps.build_nspanel_fw.outputs.name }}/. prebuilt/${{ steps.build_nspanel_fw.outputs.name }}/ | |
cp ${{ steps.build_nspanel_fw.outputs.name }}/${{ steps.build_nspanel_fw.outputs.name }}.ota.bin prebuilt/nspanel_esphome_prebuilt.bin || true | |
cp ${{ steps.build_nspanel_fw.outputs.name }}/${{ steps.build_nspanel_fw.outputs.name }}.factory.bin prebuilt/nspanel_esphome_prebuilt.factory.bin || true | |
cp ${{ steps.build_nspanel_fw.outputs.name }}/manifest.json prebuilt/nspanel_esphome_prebuilt.manifest.json || true | |
- name: Build ESPHome Prebuilt Wall Display Firmware | |
id: build_wall_display_fw | |
uses: esphome/build-action@main | |
with: | |
yaml-file: prebuilt/wall_display.yaml | |
- name: Update manifest.json - name | |
uses: jossef/action-set-json-field@v2.2 | |
with: | |
file: ${{ steps.build_wall_display_fw.outputs.name }}/manifest.json | |
field: name | |
value: Wall Display | |
- name: Update manifest.json - version | |
uses: jossef/action-set-json-field@v2.2 | |
with: | |
file: ${{ steps.build_wall_display_fw.outputs.name }}/manifest.json | |
field: version | |
value: ${{ steps.extract_version.outputs.version }} | |
- name: Update manifest.json - builds.chipFamily | |
uses: jossef/action-set-json-field@v2.2 | |
with: | |
file: ${{ steps.build_wall_display_fw.outputs.name }}/manifest.json | |
field: builds.chipFamily | |
value: ESP32 | |
- name: Update manifest.json - builds.ota.path | |
uses: jossef/action-set-json-field@v2.2 | |
with: | |
file: ${{ steps.build_wall_display_fw.outputs.name }}/manifest.json | |
field: builds.ota.path | |
value: "https://raw.githubusercontent.com/Blackymas/NSPanel_HA_Blueprint/main/prebuilt/wall_display.bin" | |
- name: Update manifest.json - builds.ota.release_url | |
uses: jossef/action-set-json-field@v2.2 | |
with: | |
file: ${{ steps.build_wall_display_fw.outputs.name }}/manifest.json | |
field: builds.ota.release_url | |
value: "https://github.com/Blackymas/NSPanel_HA_Blueprint/releases/tag/v${{ steps.extract_version.outputs.version }}" | |
- name: Move and Rename Firmware File - wall_display | |
run: | | |
mkdir -p prebuilt | |
cp -R ${{ steps.build_wall_display_fw.outputs.name }}/. prebuilt/${{ steps.build_wall_display_fw.outputs.name }}/ | |
cp ${{ steps.build_wall_display_fw.outputs.name }}/${{ steps.build_wall_display_fw.outputs.name }}.ota.bin prebuilt/wall_display.bin || true | |
cp ${{ steps.build_wall_display_fw.outputs.name }}/${{ steps.build_wall_display_fw.outputs.name }}.factory.bin prebuilt/wall_display.factory.bin || true | |
cp ${{ steps.build_wall_display_fw.outputs.name }}/manifest.json prebuilt/wall_display.manifest.json || true | |
- name: Generate checksum for Firmware Files | |
run: | | |
md5sum prebuilt/nspanel_esphome_prebuilt.bin > prebuilt/nspanel_esphome_prebuilt.bin.md5 | |
md5sum prebuilt/nspanel_esphome_prebuilt.factory.bin > prebuilt/nspanel_esphome_prebuilt.factory.bin.md5 | |
md5sum prebuilt/wall_display.bin > prebuilt/wall_display.bin.md5 | |
md5sum prebuilt/wall_display.factory.bin > prebuilt/wall_display.factory.bin.md5 | |
- name: Commit and Push Firmware Files | |
run: | | |
git config --global user.name 'GitHub Actions' | |
git config --global user.email 'actions@github.com' | |
git add prebuilt/*.bin prebuilt/*.md5 prebuilt/*.json prebuilt/${{ steps.build_nspanel_fw.outputs.name }}/*.* prebuilt/${{ steps.build_wall_display_fw.outputs.name }}/*.* | |
git commit -m "Pre-built firmware update: ${{ github.run_id }}" | |
git push | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
... |