···882882883883=== Une image de base avec Docker
884884885885+L'environnement d'éxécution des workflows ne comporte pas d'installation de Gazebo. Étant donné le temps de compilation élevé, on peut "factoriser" cette étape dans une _image de base_, de laquelle on démarre pour chaque éxécution du workflow, dans laquelle tout les programmes nécéssaires sont déjà installés.
886886+887887+Pour cela, on part d'une image Ubuntu, dans lequelle on installe le nécéssaire: Just (pour lancer des commandes, un sorte de Makefile mais plus moderne @just), FFMpeg (pour l'encodage H.264 servant à la création du fichier vidéo), XVFB (pour émuler un serveur X, cf @simulate-x), Python (pour lancer la politique RL), et Gazebo.
888888+889889+```dockerfile
890890+FROM ubuntu:24.04
891891+892892+RUN apt update
893893+RUN apt install -y curl just sudo
894894+# Python (via le gestionnaire de versions et dépendances UV)
895895+COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
896896+897897+# Code source de gz-unitree
898898+COPY . .
899899+900900+# Gazebo et outils de compilation
901901+RUN just setup
902902+903903+# FFMpeg, XVFB
904904+RUN apt install -y git ffmpeg xvfb xterm
905905+906906+907907+# Compilation et installation de de gz-unitree
908908+RUN mkdir -p /usr/local/lib/gz-unitree/
909909+RUN just install
910910+```
911911+912912+Un autre workflow, celui-là vivant dans le dépôt de gz-unitree, crée une image Docker depuis ce Dockerfile, qui est ensuite utilisable via `ghcr.io/Gepetto/gz-unitree` @gzu-ghcr.
913913+885914=== Une pipeline Github Actions
915915+916916+Une fois cette image disponible, on peut l'utiliser dans un workflow Github:
917917+918918+#zebraw(
919919+ highlight-lines: (6, 7),
920920+ ```yaml
921921+ ...
922922+923923+ jobs:
924924+ test:
925925+ runs-on: ubuntu-latest
926926+ container:
927927+ image: ghcr.io/gepetto/gz-unitree:latest
928928+ steps:
929929+ - name: Checkout repository
930930+ uses: actions/checkout@v5
931931+ ...
932932+ ```
933933+)
934934+935935+==== Émuler un serveur graphique <simulate-x>