Skip to content

Validate and Build ESPHome #1491

Validate and Build ESPHome

Validate and Build ESPHome #1491

---
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 }}
...