Quelques scripts pour gérer mon instance forgejo qui pourraient être d'utilité plus générale à d'autres utilisateurs.
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Eric Coissac 1619c0a258 Add three-phase CLI toolchain for migrating Gitea to Forgejo
Adds a complete workflow consisting of audit, migrate, and diff phases to transfer Gitea instances to Forgejo via the v1 REST API. The toolchain includes a dedicated HTTP client with automatic pagination, retry logic that dynamically disables failing features, and strict ownership enforcement. The audit phase catalogs instance components and flags items requiring manual review. The migrate phase handles repository transfers with configurable scope filtering and dry-run support. The diff phase verifies post-migration parity by comparing aggregate counts across organizations and repositories. All scripts enforce non-zero exit codes on failures and accept configuration via environment variables or CLI flags.
2026-08-18 23:30:22 +02:00
gitea_api.py Add three-phase CLI toolchain for migrating Gitea to Forgejo 2026-08-18 23:30:22 +02:00
gitea_forgejo_diff.py Add three-phase CLI toolchain for migrating Gitea to Forgejo 2026-08-18 23:30:22 +02:00
gitea_forgejo_migrate.py Add three-phase CLI toolchain for migrating Gitea to Forgejo 2026-08-18 23:30:22 +02:00
gitea_migration_audit.py Add three-phase CLI toolchain for migrating Gitea to Forgejo 2026-08-18 23:30:22 +02:00
README.md Add three-phase CLI toolchain for migrating Gitea to Forgejo 2026-08-18 23:30:22 +02:00

Migration Gitea -> Forgejo

Scripts pour auditer, migrer et vérifier le passage d'une instance Gitea vers une nouvelle instance Forgejo, via l'API v1 (commune aux deux, Forgejo étant un fork de Gitea).

gitea_api.py est un client HTTP minimal partagé par les trois scripts, sans dépendance autre que certifi (optionnel, pour la validation SSL).

1. Audit (avant migration)

Dresse l'inventaire de l'instance Gitea source et distingue ce qui se transporte automatiquement lors d'une bascule Gitea -> Forgejo de ce qui nécessite une action manuelle (secrets de webhooks, jetons runners, OAuth2 upstream, etc.).

GITEA_URL=https://ancien-gitea.fr GITEA_TOKEN=xxxx python3 gitea_migration_audit.py

# ou explicitement :
python3 gitea_migration_audit.py \
    --source-url https://ancien-gitea.fr --source-token xxxx \
    [--json audit.json]

2. Migration

Migre dépôts, issues/PRs/labels/milestones/releases/wiki/LFS, organisations et utilisateurs de Gitea vers Forgejo, via /repos/migrate. Réessaie automatiquement en désactivant une fonctionnalité (issues, wiki, ...) si sa migration échoue plutôt que d'abandonner le dépôt entier.

python3 gitea_forgejo_migrate.py \
    --source-url https://ancien-gitea.fr --source-token XXX \
    --target-url https://nouveau-forgejo.fr --target-token YYY \
    [--dry-run] [--exclude-user testuser] [--only-owner image]
  • --dry-run : n'écrit rien côté Forgejo, affiche seulement ce qui serait fait.
  • --only-owner : limite à un seul propriétaire (user ou org), utile pour tester.
  • Les organisations sont créées automatiquement côté Forgejo si absentes ; les comptes utilisateurs, eux, doivent déjà exister (le script s'arrête en erreur claire sinon, plutôt que de réassigner les dépôts ailleurs).

3. Diff (après migration)

Compare, dépôt par dépôt, la présence côté Forgejo et le nombre total d'issues/PRs/releases/labels entre source et cible. Un écart signale une migration partielle (à corriger en relançant gitea_forgejo_migrate.py sur ce propriétaire) ou un dépôt jamais migré.

python3 gitea_forgejo_diff.py \
    --source-url https://ancien-gitea.fr --source-token XXX \
    --target-url https://nouveau-forgejo.fr --target-token YYY \
    [--only-owner image] [--json diff.json]

Paramètres communs

Les trois scripts acceptent leurs identifiants soit en variables d'environnement (GITEA_URL, GITEA_TOKEN, FORGEJO_URL, FORGEJO_TOKEN), soit en options --source-url/--source-token/--target-url/--target-token (l'audit n'a que la source, les deux autres ont source et cible). Le code de sortie est non nul en cas d'échec (gitea_forgejo_migrate.py) ou d'écarts détectés (gitea_forgejo_diff.py).