mirror of
https://github.com/esphome/home-assistant-addon.git
synced 2024-11-23 12:06:51 +01:00
Publish dev addon as versioned (#120)
This commit is contained in:
parent
599905313a
commit
db411b1f09
82
.github/workflows/bump-version.yml
vendored
82
.github/workflows/bump-version.yml
vendored
@ -15,45 +15,47 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.1.1
|
- uses: actions/checkout@v4.1.1
|
||||||
- uses: actions/setup-python@v4.8.0
|
- uses: actions/setup-python@v4.8.0
|
||||||
with:
|
with:
|
||||||
python-version: '3.11'
|
python-version: "3.11"
|
||||||
- run: pip install -r script/requirements.txt
|
- run: pip install -r script/requirements.txt
|
||||||
- run: script/bump-version.py ${{ github.event.inputs.version }}
|
- run: script/bump-version.py ${{ github.event.inputs.version }}
|
||||||
- name: Write Beta changelog
|
- name: Write Beta changelog
|
||||||
run: |
|
if: ${{ !contains(github.event.inputs.version, 'dev') }}
|
||||||
cat > esphome-beta/CHANGELOG.md << 'EOF'
|
run: |
|
||||||
## ${{ github.event.inputs.version }}
|
cat > esphome-beta/CHANGELOG.md << 'EOF'
|
||||||
|
## ${{ github.event.inputs.version }}
|
||||||
|
|
||||||
${{ github.event.inputs.content }}
|
${{ github.event.inputs.content }}
|
||||||
EOF
|
EOF
|
||||||
- name: Write Stable changelog
|
- name: Write Stable changelog
|
||||||
if: ${{ !contains(github.event.inputs.version, 'b') }}
|
if: ${{ !contains(github.event.inputs.version, 'b') && !contains(github.event.inputs.version, 'dev') }}
|
||||||
run: |
|
run: |
|
||||||
cat > esphome/CHANGELOG.md << 'EOF'
|
cat > esphome/CHANGELOG.md << 'EOF'
|
||||||
## ${{ github.event.inputs.version }}
|
## ${{ github.event.inputs.version }}
|
||||||
|
|
||||||
${{ github.event.inputs.content }}
|
${{ github.event.inputs.content }}
|
||||||
EOF
|
EOF
|
||||||
- name: Commit version bump
|
- name: Commit version bump
|
||||||
id: commit_version
|
id: commit_version
|
||||||
run: |
|
run: |
|
||||||
git config user.name esphomebot
|
git config user.name esphomebot
|
||||||
git config user.email esphome@nabucasa.com
|
git config user.email esphome@nabucasa.com
|
||||||
git add .
|
git add .
|
||||||
git commit -m "Bump version to ${{ github.event.inputs.version }}"
|
git commit -m "Bump version to ${{ github.event.inputs.version }}"
|
||||||
git push
|
git push
|
||||||
COMMIT=$(git rev-parse HEAD)
|
COMMIT=$(git rev-parse HEAD)
|
||||||
echo "::set-output name=commit_sha::${COMMIT}"
|
echo "::set-output name=commit_sha::${COMMIT}"
|
||||||
- name: Create a Release
|
- name: Create a Release
|
||||||
uses: actions/create-release@v1.1.4
|
uses: actions/create-release@v1.1.4
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
env:
|
if: ${{ !contains(github.event.inputs.version, 'dev') }}
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
env:
|
||||||
with:
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
tag_name: ${{ github.event.inputs.version }}
|
with:
|
||||||
release_name: ${{ github.event.inputs.version }}
|
tag_name: ${{ github.event.inputs.version }}
|
||||||
body: ${{ github.event.inputs.content }}
|
release_name: ${{ github.event.inputs.version }}
|
||||||
prerelease: ${{ contains(github.event.inputs.version, 'b') }}
|
body: ${{ github.event.inputs.content }}
|
||||||
commitish: ${{ steps.commit_version.outputs.commit_sha }}
|
prerelease: ${{ contains(github.event.inputs.version, 'b') }}
|
||||||
|
commitish: ${{ steps.commit_version.outputs.commit_sha }}
|
||||||
|
@ -1 +1 @@
|
|||||||
See https://esphome.io/changelog/index.html
|
See https://github.com/esphome/esphome/commits/dev
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
ARG BUILD_FROM=esphome/esphome-hassio-amd64:dev
|
|
||||||
FROM ${BUILD_FROM}
|
|
||||||
|
|
||||||
# Copy root filesystem
|
|
||||||
COPY rootfs /
|
|
||||||
|
|
||||||
# Labels
|
|
||||||
LABEL \
|
|
||||||
io.hass.type="addon" \
|
|
||||||
io.hass.version=dev
|
|
@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
build_from:
|
|
||||||
aarch64: ghcr.io/esphome/esphome-hassio:dev
|
|
||||||
amd64: ghcr.io/esphome/esphome-hassio:dev
|
|
||||||
armv7: ghcr.io/esphome/esphome-hassio:dev
|
|
@ -33,9 +33,10 @@ backup_exclude:
|
|||||||
init: false
|
init: false
|
||||||
startup: services
|
startup: services
|
||||||
name: ESPHome (dev)
|
name: ESPHome (dev)
|
||||||
version: dev
|
version: 2024.5.0-dev20240411
|
||||||
slug: esphome-dev
|
slug: esphome-dev
|
||||||
description: Development version of ESPHome add-on
|
description: Development version of ESPHome add-on
|
||||||
|
image: ghcr.io/esphome/esphome-hassio
|
||||||
stage: experimental
|
stage: experimental
|
||||||
advanced: true
|
advanced: true
|
||||||
options:
|
options:
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 69 KiB |
@ -1,47 +0,0 @@
|
|||||||
#!/usr/bin/with-contenv bashio
|
|
||||||
# ==============================================================================
|
|
||||||
# Community Hass.io Add-ons: ESPHome
|
|
||||||
# This files installs the user ESPHome fork if specified
|
|
||||||
# The fork must be up to date with the latest ESPHome dev branch
|
|
||||||
# and have no conflicts
|
|
||||||
# ==============================================================================
|
|
||||||
|
|
||||||
declare esphome_fork
|
|
||||||
|
|
||||||
if bashio::config.has_value 'esphome_fork'; then
|
|
||||||
esphome_fork=$(bashio::config 'esphome_fork')
|
|
||||||
if [[ $esphome_fork == *":"* ]]; then
|
|
||||||
IFS=':' read -r -a array <<< "$esphome_fork"
|
|
||||||
username=${array[0]}
|
|
||||||
ref=${array[1]}
|
|
||||||
else
|
|
||||||
username="esphome"
|
|
||||||
ref=$esphome_fork
|
|
||||||
fi
|
|
||||||
full_url="https://github.com/${username}/esphome/archive/${ref}.tar.gz"
|
|
||||||
bashio::log.info "Checking forked ESPHome"
|
|
||||||
dev_version=$(python3 -c "from esphome.const import __version__; print(__version__)")
|
|
||||||
bashio::log.info "Downloading ESPHome from fork '${esphome_fork}' (${full_url})..."
|
|
||||||
curl -L -o /tmp/esphome.tar.gz "${full_url}" -qq \
|
|
||||||
|| bashio::exit.nok "Failed downloading ESPHome fork."
|
|
||||||
bashio::log.info "Installing ESPHome from fork '${esphome_fork}' (${full_url})..."
|
|
||||||
rm -rf /esphome || bashio::exit.nok "Failed to remove ESPHome."
|
|
||||||
mkdir /esphome
|
|
||||||
tar -zxf /tmp/esphome.tar.gz -C /esphome --strip-components=1 \
|
|
||||||
|| bashio::exit.nok "Failed installing ESPHome from fork."
|
|
||||||
pip install -U -e /esphome || bashio::exit.nok "Failed installing ESPHome from fork."
|
|
||||||
rm -f /tmp/esphome.tar.gz
|
|
||||||
fork_version=$(python3 -c "from esphome.const import __version__; print(__version__)")
|
|
||||||
|
|
||||||
if [[ "$fork_version" != "$dev_version" ]]; then
|
|
||||||
bashio::log.error "############################"
|
|
||||||
bashio::log.error "Uninstalled fork as version does not match"
|
|
||||||
bashio::log.error "Update (or ask the author to update) the branch"
|
|
||||||
bashio::log.error "This is important as the dev addon and the dev ESPHome"
|
|
||||||
bashio::log.error "branch can have changes that are not compatible with old forks"
|
|
||||||
bashio::log.error "and get reported as bugs which we cannot solve easily."
|
|
||||||
bashio::log.error "############################"
|
|
||||||
bashio::exit.nok
|
|
||||||
fi
|
|
||||||
bashio::log.info "Installed ESPHome from fork '${esphome_fork}' (${full_url})..."
|
|
||||||
fi
|
|
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
import re
|
import re
|
||||||
import subprocess
|
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
@ -17,72 +16,71 @@ class Version:
|
|||||||
minor: int
|
minor: int
|
||||||
patch: int
|
patch: int
|
||||||
beta: int = 0
|
beta: int = 0
|
||||||
dev: bool = False
|
dev: str = ""
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f'{self.major}.{self.minor}.{self.full_patch}'
|
return f"{self.major}.{self.minor}.{self.full_patch}"
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def full_patch(self):
|
def full_patch(self):
|
||||||
res = f'{self.patch}'
|
res = f"{self.patch}"
|
||||||
if self.beta > 0:
|
if self.beta > 0:
|
||||||
res += f'b{self.beta}'
|
res += f"b{self.beta}"
|
||||||
if self.dev:
|
if self.dev:
|
||||||
res += '-dev'
|
res += f"-dev{self.dev}"
|
||||||
return res
|
return res
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def parse(cls, value):
|
def parse(cls, value):
|
||||||
match = re.match(r'(\d+).(\d+).(\d+)(b\d+)?(-dev)?', value)
|
match = re.match(r"(\d+).(\d+).(\d+)(b\d+)?(-dev\d+)?", value)
|
||||||
assert match is not None
|
assert match is not None
|
||||||
major = int(match[1])
|
major = int(match[1])
|
||||||
minor = int(match[2])
|
minor = int(match[2])
|
||||||
patch = int(match[3])
|
patch = int(match[3])
|
||||||
beta = int(match[4][1:]) if match[4] else 0
|
beta = int(match[4][1:]) if match[4] else 0
|
||||||
dev = bool(match[5])
|
dev = str(match[5][4:]) if match[5] else ""
|
||||||
return Version(
|
return Version(major=major, minor=minor, patch=patch, beta=beta, dev=dev)
|
||||||
major=major, minor=minor, patch=patch,
|
|
||||||
beta=beta, dev=dev
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def sub(path, pattern, repl, expected_count=1):
|
def _sub(path, pattern, repl, expected_count=1):
|
||||||
with open(path) as fh:
|
with open(path, encoding="utf-8") as fh:
|
||||||
content = fh.read()
|
content = fh.read()
|
||||||
content, count = re.subn(pattern, repl, content, flags=re.MULTILINE)
|
content, count = re.subn(pattern, repl, content, flags=re.NOFLAG)
|
||||||
if expected_count is not None:
|
if expected_count is not None:
|
||||||
assert count == expected_count, f"Pattern {pattern} replacement failed!"
|
assert count == expected_count, f"Pattern {pattern} replacement failed!"
|
||||||
with open(path, "wt") as fh:
|
with open(path, "wt", encoding="utf-8") as fh:
|
||||||
fh.write(content)
|
fh.write(content)
|
||||||
|
|
||||||
|
|
||||||
def write_version(target: str, version: Version):
|
def _write_version(target: str, version: Version):
|
||||||
# version: '1.14.5' # BETA
|
# version: "2024.5.0-dev20240412" # DEV
|
||||||
# version: '1.14.5' # STABLE
|
# version: "1.14.5" # BETA
|
||||||
sub(
|
# version: "1.14.5" # STABLE
|
||||||
'template/addon_config.yaml',
|
_sub(
|
||||||
r" version: '[^']+' # {}".format(target.upper()),
|
"template/addon_config.yaml",
|
||||||
f" version: '{version}' # {target.upper()}"
|
f' version: "[^"]+" # {target.upper()}',
|
||||||
|
f' version: "{version}" # {target.upper()}',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument('new_version', type=str)
|
parser.add_argument("new_version", type=str)
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
version = Version.parse(args.new_version)
|
version = Version.parse(args.new_version)
|
||||||
assert not version.dev
|
|
||||||
|
|
||||||
print(f"Bumping to {version}")
|
print(f"Bumping to {version}")
|
||||||
if version.beta:
|
if version.dev:
|
||||||
write_version('beta', version)
|
_write_version("dev", version)
|
||||||
generate.main(['beta'])
|
generate.main(["dev"])
|
||||||
|
elif version.beta:
|
||||||
|
_write_version("beta", version)
|
||||||
|
generate.main(["beta"])
|
||||||
else:
|
else:
|
||||||
assert not version.beta
|
_write_version("stable", version)
|
||||||
write_version('stable', version)
|
_write_version("beta", version)
|
||||||
write_version('beta', version)
|
generate.main(["stable", "beta"])
|
||||||
generate.main(['stable', 'beta'])
|
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,13 +1,14 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
import yaml
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from shutil import copyfile
|
from shutil import copyfile
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
|
||||||
class Channel(Enum):
|
class Channel(Enum):
|
||||||
stable = "stable"
|
stable = "stable"
|
||||||
@ -25,17 +26,16 @@ def main(args):
|
|||||||
root = Path(__file__).parent.parent
|
root = Path(__file__).parent.parent
|
||||||
templ = root / "template"
|
templ = root / "template"
|
||||||
|
|
||||||
with open(templ / "addon_config.yaml", "r") as f:
|
with open(templ / "addon_config.yaml", "r", encoding="utf-8") as f:
|
||||||
config = yaml.safe_load(f)
|
config = yaml.safe_load(f)
|
||||||
|
|
||||||
copyf = config["copy_files"]
|
copyf = config["copy_files"]
|
||||||
|
|
||||||
for channel in args.channels:
|
for channel in args.channels:
|
||||||
conf = config[f"esphome-{channel.value}"]
|
conf = config[f"esphome-{channel.value}"]
|
||||||
base_image = conf.pop("base_image", None)
|
|
||||||
dir_ = root / conf.pop("directory")
|
dir_ = root / conf.pop("directory")
|
||||||
path = dir_ / "config.yaml"
|
path = dir_ / "config.yaml"
|
||||||
with open(path, "w") as f:
|
with open(path, "w", encoding="utf-8") as f:
|
||||||
yaml.dump(conf, f, indent=2, sort_keys=False, explicit_start=True)
|
yaml.dump(conf, f, indent=2, sort_keys=False, explicit_start=True)
|
||||||
|
|
||||||
for file_ in copyf:
|
for file_ in copyf:
|
||||||
@ -46,19 +46,9 @@ def main(args):
|
|||||||
copyfile(templ / file_, dir_ / file_)
|
copyfile(templ / file_, dir_ / file_)
|
||||||
|
|
||||||
path = dir_ / "FILES ARE GENERATED DO NOT EDIT"
|
path = dir_ / "FILES ARE GENERATED DO NOT EDIT"
|
||||||
with open(path, "w") as f:
|
with open(path, "w", encoding="utf-8") as f:
|
||||||
f.write("Any edits should be made to the files in the 'template' directory")
|
f.write("Any edits should be made to the files in the 'template' directory")
|
||||||
|
|
||||||
if channel == Channel.dev:
|
|
||||||
path = dir_ / "build.yaml"
|
|
||||||
build_conf = {
|
|
||||||
"build_from": {
|
|
||||||
arch: base_image for arch in conf["arch"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
with open(path, "w") as f:
|
|
||||||
yaml.dump(build_conf, f, indent=2, sort_keys=True, explicit_start=True)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main(sys.argv[1:])
|
main(sys.argv[1:])
|
||||||
|
@ -16,11 +16,11 @@ base: &base
|
|||||||
# Ingress settings
|
# Ingress settings
|
||||||
ingress: true
|
ingress: true
|
||||||
ingress_port: 0
|
ingress_port: 0
|
||||||
panel_icon: 'mdi:chip'
|
panel_icon: "mdi:chip"
|
||||||
# Automatically add UART devices to add-on
|
# Automatically add UART devices to add-on
|
||||||
uart: true
|
uart: true
|
||||||
ports:
|
ports:
|
||||||
'6052/tcp': null
|
"6052/tcp": null
|
||||||
map:
|
map:
|
||||||
- ssl:ro
|
- ssl:ro
|
||||||
- config:rw
|
- config:rw
|
||||||
@ -46,10 +46,11 @@ esphome-dev:
|
|||||||
<<: *base
|
<<: *base
|
||||||
directory: esphome-dev
|
directory: esphome-dev
|
||||||
name: ESPHome (dev)
|
name: ESPHome (dev)
|
||||||
version: 'dev' # DEV
|
version: "2024.5.0-dev20240411" # DEV
|
||||||
slug: esphome-dev
|
slug: esphome-dev
|
||||||
description: "Development version of ESPHome add-on"
|
description: "Development version of ESPHome add-on"
|
||||||
url: https://next.esphome.io/
|
url: https://next.esphome.io/
|
||||||
|
image: ghcr.io/esphome/esphome-hassio
|
||||||
stage: experimental
|
stage: experimental
|
||||||
advanced: true
|
advanced: true
|
||||||
schema:
|
schema:
|
||||||
@ -62,15 +63,14 @@ esphome-dev:
|
|||||||
certfile: str?
|
certfile: str?
|
||||||
keyfile: str?
|
keyfile: str?
|
||||||
leave_front_door_open: bool?
|
leave_front_door_open: bool?
|
||||||
base_image: ghcr.io/esphome/esphome-hassio:dev
|
|
||||||
options:
|
options:
|
||||||
home_assistant_dashboard_integration: false
|
home_assistant_dashboard_integration: false
|
||||||
|
|
||||||
esphome-beta:
|
esphome-beta:
|
||||||
<<: *base
|
<<: *base
|
||||||
directory: esphome-beta
|
directory: esphome-beta
|
||||||
name: ESPHome (beta)
|
name: ESPHome (beta)
|
||||||
version: '2024.4.0' # BETA
|
version: "2024.4.0" # BETA
|
||||||
slug: esphome-beta
|
slug: esphome-beta
|
||||||
description: "Beta version of ESPHome add-on"
|
description: "Beta version of ESPHome add-on"
|
||||||
url: https://beta.esphome.io/
|
url: https://beta.esphome.io/
|
||||||
@ -78,13 +78,13 @@ esphome-beta:
|
|||||||
stage: experimental
|
stage: experimental
|
||||||
advanced: true
|
advanced: true
|
||||||
options:
|
options:
|
||||||
home_assistant_dashboard_integration: false
|
home_assistant_dashboard_integration: false
|
||||||
|
|
||||||
esphome-stable:
|
esphome-stable:
|
||||||
<<: *base
|
<<: *base
|
||||||
directory: esphome
|
directory: esphome
|
||||||
name: ESPHome
|
name: ESPHome
|
||||||
version: '2024.4.0' # STABLE
|
version: "2024.4.0" # STABLE
|
||||||
slug: esphome
|
slug: esphome
|
||||||
description: "ESPHome add-on for intelligently managing all your ESP8266/ESP32 devices"
|
description: "ESPHome add-on for intelligently managing all your ESP8266/ESP32 devices"
|
||||||
image: ghcr.io/esphome/esphome-hassio
|
image: ghcr.io/esphome/esphome-hassio
|
||||||
|
Loading…
Reference in New Issue
Block a user