Je vais vous décrire ici la solution que j’utilise pour mettre à jour mon Home Assistant en évitant au maximum les problèmes de compatibilité de configuration. L’idée est de valider la configuration actuelle avec la version courante de HA puis avec la dernière version et de mettre à jour automatiquement s’il n’y a pas d’erreur remontée. L’utilisation de drone.io est une alternative à Github Actions mais vous imposera une installation @home de quelques outils. La solution proposée est donnée à titre d’exemple (fonctionnel) et sera à adapter pour coller à votre fonctionnement.
Prérequis
Pour continuer, vous devez :
- Gérer votre configuration HA avec un outil de gestion de version tel que Git.
- Un serveur Git comme gogs.io ou gitea.io qui devra être compatible avec drone.io (à voir ici).
- Installer un serveur drone.io et un runner qui va gérer les étapes à réaliser pour mettre à jour HA selon le scénario décrit.
- Relier votre drone.io à votre projet git qui héberge votre configuration.
Fonctionnement
Ma configuration est donc gérée par Git. J’utilise 2 branches :
- La branche “test” sur laquelle je pousse toutes mes modifications de configuration. Chaque push déclenche la validation de la configuration avec la version actuelle de HA et la version fraichement mise à jour.
- Quand je souhaite déployer mes mises à jour et mettre à jour ma version de HA, je merge la branche “test” sur “master” et le push va déclencher l’installation de mes modifications et la mise à jour de HA.
- drone.io me permet aussi de déclencher en console la mise à jour de HA ou via l’IHM.
- Si ma configuration n’est pas valide, le scénario de mise à jour s’arrête.
Home Assistant est installé en virtualenv python. J’utilise 2 virtualenv :
- Un pour la version déployée de Home Assistant, celle actuellement utilisée.
- Un qui est systématiquement mis à jour et qui me permet de vérifier que ma configuration est toujours valide avec l’éventuelle mise à jour.
Mon scénario drone.io va réaliser les étapes suivantes (en s’arrêtant si un problème est rencontré) :
- Tester ma configuration sur la version HA actuellement déployée.
- Tester ma configuration sur la version HA mise à jour.
Si je ne suis pas sur ma branche de test, on rajoutera au scénario :
- Un status et stop de HA.
- Mise à jour des confs.
- Mise à jour de ma version de HA.
- Redémarrage/status de HA.
En image, ca donne ca :
.drone.yml
Voilà mon fichier .drone.yml
dont je viens de vous détailler le fonctionnement.
kind: pipeline
type: exec
name: check config
platform:
os: linux
arch: amd64
steps:
- name: on latest
commands:
- . /srv/homeassistant-test/bin/activate
- python3 -m pip install --upgrade homeassistant
- vault login -address=$VAULT_ADDR -no-print $VAULT_TOKEN > /dev/null 2>&1
- >
vault kv get -format=json hass/secrets|jq -r '.data.data|keys[] as $k | "\($k): \(.[$k])"' > conf/secrets.yaml
- hass -c conf --script check_config
environment:
VAULT_TOKEN:
from_secret: vaultToken
VAULT_ADDR: https://vault
- name: on current
commands:
- . /srv/homeassistant/bin/activate
- vault login -address=$VAULT_ADDR -no-print $VAULT_TOKEN > /dev/null 2>&1
- >
vault kv get -format=json hass/secrets|jq -r '.data.data|keys[] as $k | "\($k): \(.[$k])"' > conf/secrets.yaml
- hass -c conf --script check_config
when:
branch:
- test
environment:
VAULT_TOKEN:
from_secret: vaultToken
VAULT_ADDR: https://vault
trigger:
branch:
- test
- master
node:
host:hass
---
kind: pipeline
type: exec
name: upgrade
platform:
os: linux
arch: amd64
steps:
- name: HA status
commands:
- sudo systemctl status hass@homeassistant.service
- name: HA stop
commands:
- sudo systemctl stop hass@homeassistant.service
- name: HA upgrade
commands:
- rsync -avS --no-o --no-g --exclude .git --exclude zwcfg_0x.xml conf/ /home/homeassistant/hass/conf/
- vault login -address=$VAULT_ADDR -no-print $VAULT_TOKEN > /dev/null 2>&1
- >
vault kv get -format=json hass/secrets|jq -r '.data.data|keys[] as $k | "\($k): \(.[$k])"' > /home/homeassistant/hass/conf/secrets.yaml
- cd /srv/homeassistant
- . bin/activate
- python3 -m pip install --upgrade homeassistant
environment:
VAULT_TOKEN:
from_secret: vaultToken
VAULT_ADDR: https://vault
- name: HA start
commands:
- sudo systemctl start hass@homeassistant.service
- name: HA check restart
commands:
- sudo systemctl status hass@homeassistant.service
depends_on:
- check config
trigger:
status:
- success
branch:
- master
node:
host: hass
---
kind: secret
name: vaultToken
get:
path: certificates/data/drone
name: token
Un petit détail ne vous à certainement pas échappé… Je gère mes secrets Home Assistant dans un Vault. Il faudra adapter cette partie là pour gérer votre secrets.yaml
utilisé lors des validations de configuration de HA. Ou attendre la suite ;)
Je fonctionne sur ce principe depuis quelques semaines et j’en suis satisfait. L’utilisation de drone.io est une bonne alternative à Github Actions et tout ce mécanisme permet de garder la main sur ses données.