diff --git a/ops/Dockerfile.gitea-runner b/ops/Dockerfile.gitea-runner index 152d246..5712c01 100644 --- a/ops/Dockerfile.gitea-runner +++ b/ops/Dockerfile.gitea-runner @@ -1,5 +1,8 @@ -# Image locale du runner recette. Basée sur Node 20 déjà utilisée par le dashboard, -# elle évite un téléchargement externe et fournit le shell Bash attendu par Gitea Actions. -FROM node:20-alpine +# Image locale de CI : Node 22, Bash, Git et le pnpm exact du workspace Contacts. +# Les jobs n'ont donc plus à télécharger ou installer ces outils à chaque exécution. +FROM node:22-alpine -RUN apk add --no-cache bash git +RUN apk add --no-cache bash git \ + && corepack enable \ + && corepack prepare pnpm@10.4.1 --activate \ + && pnpm --version diff --git a/ops/README.md b/ops/README.md index 0381da8..cea428b 100644 --- a/ops/README.md +++ b/ops/README.md @@ -4,7 +4,9 @@ Le script `healthcheck-apps.sh` est exécuté par le timer systemd toutes les ci Le dernier rapport est écrit dans `/var/lib/manus-apps-health/latest.txt`. Les anomalies sont aussi consignées dans le journal système avec le tag `manus-apps-health`. -Le runner de recette est installé par `install-gitea-act-runner.sh`. Il construit une image locale Node 20 avec Bash, puis s’enregistre auprès de Gitea avec un jeton éphémère. Les workflows s’exécutent ensuite dans cette image isolée sur le réseau Docker `web`. +Le runner de recette est installé par `install-gitea-act-runner.sh`. Il construit une image locale Node 22 avec Bash, Git et pnpm 10.4.1 préactivé, puis s’enregistre auprès de Gitea avec un jeton éphémère. Les workflows s’exécutent ensuite dans cette image isolée sur le réseau Docker `web`. + +Le cache Gitea Actions est actif sur le port hôte `18088` et stocke ses archives sous `/opt/manus-deploy/gitea-runner/cache`. Les workflows doivent utiliser une clé dérivée de leur fichier de verrouillage, par exemple `pnpm-lock.yaml`, afin de ne jamais réutiliser des dépendances incompatibles. Les pushes du dépôt `manus-dashboard` créent une demande atomique prise en charge par `manus-dashboard-self-deploy.path`. Le conteneur ne se redéploie donc jamais lui-même : le service systemd hôte effectue le build et le démarrage du remplacement. diff --git a/ops/gitea-act-runner-config.yaml b/ops/gitea-act-runner-config.yaml index df7aef1..84e7112 100644 --- a/ops/gitea-act-runner-config.yaml +++ b/ops/gitea-act-runner-config.yaml @@ -6,5 +6,13 @@ runner: envs: DOCKER_HOST: unix:///var/run/docker.sock +# Le cache intégré est servi par le runner hôte et accessible par les jobs +# depuis le réseau Docker web. Les clés restent définies par chaque workflow. +cache: + enabled: true + dir: /opt/manus-deploy/gitea-runner/cache + host: 172.18.0.1 + port: 18088 + container: network: web diff --git a/ops/install-gitea-act-runner.sh b/ops/install-gitea-act-runner.sh index 6b713a8..f260d55 100755 --- a/ops/install-gitea-act-runner.sh +++ b/ops/install-gitea-act-runner.sh @@ -8,11 +8,12 @@ readonly RUNNER_DIR="/opt/manus-deploy/gitea-runner" readonly GITEA_CONTAINER="gitea" readonly GITEA_URL="https://git.recette.santinova-soft.org" readonly RUNNER_NAME="recette-docker-runner" -readonly RUNNER_IMAGE="gitea-runner-node:20" -readonly RUNNER_LABELS="ubuntu-latest:docker://${RUNNER_IMAGE}" +readonly RUNNER_IMAGE="gitea-runner-node:22" +readonly RUNNER_LABELS="ci-node22:docker://${RUNNER_IMAGE}" readonly LABEL_FILE="${RUNNER_DIR}/labels" install -d -m 0750 "${RUNNER_DIR}" +install -d -m 0750 "${RUNNER_DIR}/cache" install -m 0640 "${SCRIPT_DIR}/gitea-act-runner-config.yaml" "${RUNNER_DIR}/config.yaml" install -D -m 0644 "${SCRIPT_DIR}/gitea-act-runner.service" /etc/systemd/system/gitea-act-runner.service docker build --tag "${RUNNER_IMAGE}" --file "${SCRIPT_DIR}/Dockerfile.gitea-runner" "${APP_DIR}"