Description
Le token d'accès groupe GitLab (<slug>-bot) utilisé pour le miroir des dépôts est créé avec une expiration GITLAB_MIRROR_TOKEN_EXPIRATION_DAYS (défaut 365 jours). Sa rotation n'est pourtant que réactive : getOrRotateMirrorCreds ne remplace le token que s'il est absent de Vault ou invalide (validateProjectToken). Il n'existe aucun seuil de rotation préventive : un token dont la rotation échoue silencieusement reste valide jusqu'à son expiration, et sa mort survient sans remplacement préparé.
Il faut un paramètre de configuration global GITLAB_MIRROR_TOKEN_ROTATION_THRESHOLD_DAYS (entier positif, en jours) : lorsque l'âge du secret Vault dépasse ce seuil, le token est régénéré de manière préventive (même mécanique que la rotation préventive des robots Harbor, cf. HARBOR_ROBOT_ROTATION_THRESHOLD_DAYS).
La rotation doit rester strictement inférieure à l'expiration pour qu'un token soit toujours remplacé avant qu'il n'expire : cette contrainte doit être validée par le schéma de configuration (rejet au démarrage si rotation >= expiration).
PRs liées
Issues liées
Exemples simples
GITLAB_MIRROR_TOKEN_EXPIRATION_DAYS=365, GITLAB_MIRROR_TOKEN_ROTATION_THRESHOLD_DAYS=180 : le token expire au bout de 365 jours et est régénéré vers 180 jours.
GITLAB_MIRROR_TOKEN_EXPIRATION_DAYS=180, GITLAB_MIRROR_TOKEN_ROTATION_THRESHOLD_DAYS=180 : la configuration est rejetée au démarrage.
Spécifications techniques
apps/server-nestjs/src/config/gitlab.config.ts : nouveau champ GITLAB_MIRROR_TOKEN_ROTATION_THRESHOLD_DAYS (z.coerce.number().int().positive(), défaut à définir), transformé en mirrorTokenRotationThresholdDays ; superRefine rejetant mirrorTokenRotationThresholdDays >= mirrorTokenExpirationDays.
apps/server-nestjs/src/modules/gitlab/gitlab.service.ts : getOrRotateMirrorCreds vérifie metadata.created_time du secret Vault et régénère le token quand l'âge dépasse le seuil (précédent : uniquement absent/invalide).
apps/server-nestjs/src/modules/gitlab/gitlab-client.service.ts : non modifié (l'expiration est déjà pilotée par GITLAB_MIRROR_TOKEN_EXPIRATION_DAYS).
- Le plugin historique
plugins/gitlab n'est pas modifié (cible backend : apps/server-nestjs).
Définition du fini
Description
Le token d'accès groupe GitLab (
<slug>-bot) utilisé pour le miroir des dépôts est créé avec une expirationGITLAB_MIRROR_TOKEN_EXPIRATION_DAYS(défaut 365 jours). Sa rotation n'est pourtant que réactive :getOrRotateMirrorCredsne remplace le token que s'il est absent de Vault ou invalide (validateProjectToken). Il n'existe aucun seuil de rotation préventive : un token dont la rotation échoue silencieusement reste valide jusqu'à son expiration, et sa mort survient sans remplacement préparé.Il faut un paramètre de configuration global
GITLAB_MIRROR_TOKEN_ROTATION_THRESHOLD_DAYS(entier positif, en jours) : lorsque l'âge du secret Vault dépasse ce seuil, le token est régénéré de manière préventive (même mécanique que la rotation préventive des robots Harbor, cf.HARBOR_ROBOT_ROTATION_THRESHOLD_DAYS).La rotation doit rester strictement inférieure à l'expiration pour qu'un token soit toujours remplacé avant qu'il n'expire : cette contrainte doit être validée par le schéma de configuration (rejet au démarrage si
rotation >= expiration).PRs liées
Issues liées
Exemples simples
GITLAB_MIRROR_TOKEN_EXPIRATION_DAYS=365,GITLAB_MIRROR_TOKEN_ROTATION_THRESHOLD_DAYS=180: le token expire au bout de 365 jours et est régénéré vers 180 jours.GITLAB_MIRROR_TOKEN_EXPIRATION_DAYS=180,GITLAB_MIRROR_TOKEN_ROTATION_THRESHOLD_DAYS=180: la configuration est rejetée au démarrage.Spécifications techniques
apps/server-nestjs/src/config/gitlab.config.ts: nouveau champGITLAB_MIRROR_TOKEN_ROTATION_THRESHOLD_DAYS(z.coerce.number().int().positive(), défaut à définir), transformé enmirrorTokenRotationThresholdDays; superRefine rejetantmirrorTokenRotationThresholdDays >= mirrorTokenExpirationDays.apps/server-nestjs/src/modules/gitlab/gitlab.service.ts:getOrRotateMirrorCredsvérifiemetadata.created_timedu secret Vault et régénère le token quand l'âge dépasse le seuil (précédent : uniquement absent/invalide).apps/server-nestjs/src/modules/gitlab/gitlab-client.service.ts: non modifié (l'expiration est déjà pilotée parGITLAB_MIRROR_TOKEN_EXPIRATION_DAYS).plugins/gitlabn'est pas modifié (cible backend :apps/server-nestjs).Définition du fini