Calcul à la demande

Dans une volonté d’hébergement le plus possible @home et ne pas laisser de veilles machines dormir, j’ai réfléchi à comment je pouvais réutiliser un vieux laptop en worker d’intégration continue (CI).

J’ai parfois besoin d’un peu puissance de calcul, pour de la compilation, des taches de CI, ce genre de chose. J’utilise distcc comme compilateur pour mes paquets AUR et des workers gitea pour mes différents projets personnels.

L’avantage de gitea est que la syntaxe pour sa CI est très proche de celle de Github.

Le point qui m’embête est que j’ai besoin de cette puissance de calcul que très rarement, environ 1h ou 2 par semaine. Sur année cela représente <1%. Même si la consommation en idle est modérée, c’est encore mieux de mettre en veille la machine.

C'est très facile à mettre en place, en ajoutant une première étape à la pipeline pour réveiller la machine avec wake-on-lan. La seule contrainte est de devoir déployer un second Worker minimaliste uniquement utilisé pour cette étape du réveil.

Si l'on considère 2 workers disponibles :

  1. kobol qui est la machine qui sert uniquement au réveil,
  2. ubuntu-latest qui tourne sur la machine qui sera réveillée après l'appel wake-on-lan.

Je fais ici du Wake-on-Lan (wol) mais les cartes réseaux peuvent également supporter du Wireless Wake-on-Lan (wwol).

J'ai stocké l'adresse MAC en secret de Gitea pour ne pas l'exposer dans le code source du projet.

En résumé voilà la configuration complète du test:

name: CI/CD
run-name: $ is testing out Gitea Actions 🚀

on: [push]

jobs:
wol:
    runs-on: kobol
    steps:
    - name: Wake On Lan
        run: wol $
    - name: Wait for the server to be reachable
        run: |
        while ! ping -c 1 -W 1 $; do
            echo "Waiting for server to be reachable..."
            sleep 5
        done
build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - name: Set up Python
        uses: actions/setup-python@v5
        with:
        python-version: '3.12'
        cache: 'pip'
    - run: pip install -r requirements.txt
    - name: Install the code linting and formatting tool Ruff
        run: pip install ruff
    - name: Lint code with Ruff
        run: ruff check --output-format=github --target-version=py39
    - name: Check code formatting with Ruff
        run: ruff format --diff --target-version=py39
        continue-on-error: true
    - name: Go back to sleep
        run: systemctl suspend