Automatiser les mises à jour de Home Assistant avec drone.io


  • 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 :

    test_ha.png

    maj_ha.png

    .drone.yml

    Voilà mon fichier .drone.ymldont 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.yamlutilisé 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.