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 :
kobol
qui est la machine qui sert uniquement au réveil,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