fix-hypershift-repo-robot-pr

Par openshift · hypershift

Corriger les PRs robot/bot dans le dépôt HyperShift en régénérant les fichiers et en créant une nouvelle PR avec une vérification réussie

npx skills add https://github.com/openshift/hypershift --skill fix-hypershift-repo-robot-pr

Corriger les PRs créées par robot/bot dans le repository HyperShift qui ont des échecs CI dus à des fichiers générés manquants.

[Extended thinking: Cette commande valide qu'une PR provient d'un bot, récupère la branche du bot, crée une branche de correction, cherry-pick les commits avec format de conventional commit, exécute make verify pour régénérer les fichiers, organise les changements en commits logiques, exécute la validation, et si réussie crée une nouvelle PR tout en fermant/commentant l'original. Si la validation échoue, la PR originale est préservée.]

Corriger une PR Robot du Repository HyperShift

Exemples d'utilisation :

  1. Corriger une PR dependabot par numéro : /fix-hypershift-repo-robot-pr 7435

  2. Corriger une PR konflux par URL : /fix-hypershift-repo-robot-pr https://github.com/openshift/hypershift/pull/7332

Ce que fait cette commande :

  1. Valide que la PR est créée par un bot (is_bot: true)
  2. Récupère les commits de la PR du bot
  3. Crée une nouvelle branche : fix/<nom-branche-originale> à partir de la branche de base
  4. Cherry-pick les commits et les convertit au format conventional commit
  5. Exécute make verify pour régénérer tous les fichiers nécessaires
  6. Exécute UPDATE=true make test pour mettre à jour les fixtures de test
  7. Organise les changements en commits logiques et bien structurés
  8. Exécute make verify et make test pour validation finale
  9. Si succès : Crée une nouvelle PR et ferme/commente l'original
  10. Si échec : Préserve la PR originale et signale l'échec

Flux du processus :

Étape 1 : Analyser l'entrée et valider la PR

Extraire le numéro de PR de l'argument (gère les formats numéro et URL) :

PR_NUMBER=$(echo "{{args.0}}" | grep -oE '[0-9]+$')

Récupérer les détails de la PR et valider :

gh pr view "$PR_NUMBER" --json number,title,author,headRefName,baseRefName,body,state,url,commits

Validations requises :

  • La PR doit exister
  • L'état de la PR doit être OPEN
  • author.is_bot doit être true
  • Le répertoire de travail doit être propre (pas de changements non committés)

Erreur si ce n'est pas un bot :

ERROR: PR #7435 is not authored by a bot.
Author: username (is_bot: false)

This command is specifically for fixing bot-authored PRs.

Étape 2 : Créer une branche de correction à partir de la base

# Sauvegarder la branche actuelle
ORIGINAL_BRANCH=$(git rev-parse --abbrev-ref HEAD)

# Récupérer les dernières modifications de upstream
git fetch upstream

# Créer la branche de correction à partir de la branche de base de la PR
FIX_BRANCH="fix/${BOT_BRANCH_NAME}"
git checkout -b "$FIX_BRANCH" upstream/${BASE_REF_NAME}

Exemples de noms de branche :

  • dependabot/go_modules/github-dependencies-0a2d1f925efix/dependabot/go_modules/github-dependencies-0a2d1f925e
  • konflux-hypershift-operator-hotfix-ocpbugs-61296-0170fix/konflux-hypershift-operator-hotfix-ocpbugs-61296-0170

Étape 3 : Cherry-pick et convertir les commits

Pour chaque commit dans la PR du bot :

  1. Cherry-pick le commit
  2. Amender le message de commit au format conventional commit

Conversion des messages de commit du bot au format conventional :

Bot Format original Format converti
Dependabot NO-JIRA: Bump the misc-dependencies group... chore(deps): bump misc-dependencies group...
Dependabot build(deps): bump X from A to B Conserver tel quel (déjà conventional)
Konflux Red Hat Konflux update hypershift-operator... chore(konflux): update hypershift-operator...

Remarque : La logique de conversion ci-dessous est du pseudocode. Claude doit implémenter la conversion basée sur les règles du tableau ci-dessus, en détectant le type de bot à partir du format du message de commit et en effectuant la transformation en conséquence.

# Cherry-pick chaque commit de la PR du bot
for COMMIT in $(gh pr view $PR_NUMBER --json commits -q '.commits[].oid'); do
  git cherry-pick "$COMMIT"

  # Récupérer le message original et le convertir au format conventional
  # Claude implémente la conversion basée sur le tableau ci-dessus :
  # - Supprimer le préfixe "NO-JIRA: " si présent
  # - Convertir "Bump" en "bump" pour la cohérence
  # - Ajouter le préfixe de type approprié (chore(deps):, chore(konflux):, etc.)
  # - Préserver le reste du message
  ORIGINAL_MSG=$(git log -1 --format='%B')

  # Amender avec le message converti
  git commit --amend -m "$CONVERTED_MSG"
done

Étape 4 : Exécuter make verify, mettre à jour les fixtures de test, et organiser les changements

Exécuter make verify pour régénérer les fichiers, exécuter les tests avec UPDATE=true pour mettre à jour les fixtures, puis organiser en commits logiques :

# Exécuter make verify (peut générer des fichiers)
make verify 2>&1 || true

# Exécuter make test avec UPDATE=true pour mettre à jour les fixtures de test
UPDATE=true make test 2>&1 || true

# Vérifier les changements
git status --porcelain

Organiser les changements en commits séparés :

  1. Changements go.mod/go.sum (module racine) :

    git add go.mod go.sum
    git commit -m "chore(deps): update go.mod dependencies
    
    Signed-off-by: ...
    Commit-Message-Assisted-by: Claude (via Claude Code)"
  2. Changements vendor/ (module racine) :

    git add vendor/
    git commit -m "chore(deps): update vendored dependencies
    
    Signed-off-by: ...
    Commit-Message-Assisted-by: Claude (via Claude Code)"
  3. Changements du module api/ (go.mod, go.sum, vendor/) :

    git add api/go.mod api/go.sum api/vendor/
    git commit -m "chore(api): update api module dependencies
    
    Signed-off-by: ...
    Commit-Message-Assisted-by: Claude (via Claude Code)"
  4. Assets régénérés (CRDs, manifests) :

    git add cmd/install/assets/
    git commit -m "chore: regenerate CRD manifests
    
    Signed-off-by: ...
    Commit-Message-Assisted-by: Claude (via Claude Code)"
  5. Autres changements de code (le cas échéant) :

    git add -A
    git commit -m "chore: additional changes from make verify
    
    Signed-off-by: ...
    Commit-Message-Assisted-by: Claude (via Claude Code)"

Important : Vérifier les fichiers non suivis que make verify peut générer :

git status --porcelain | grep '^??'
# Ajouter tous les fichiers générés non suivis

Étape 5 : Exécuter la validation complète

# Exécuter make verify (devrait passer maintenant avec un état git propre)
make verify

# Exécuter make test
make test

Étape 6 : Gérer les résultats

Si la validation échoue - ABANDONNER et préserver l'original :

============================================
VALIDATION FAILED - ABORTING
============================================

The original PR #7435 has been PRESERVED.
Please investigate the failures manually.

- make verify: FAILED/PASSED
- make test: FAILED/PASSED

Returning to original branch...
  • Nettoyer la branche de correction localement
  • Retourner à la branche originale
  • NE PAS fermer la PR originale

Si la validation réussit - Créer une nouvelle PR et fermer/commenter l'original :

# Pousser la branche de correction
git push -u origin "$FIX_BRANCH"

# Créer une nouvelle PR avec référence à l'original
# Le titre de la PR doit être préfixé avec NO-JIRA: pour les mises à jour de dépendances des bots
gh pr create \
  --title "NO-JIRA: $CONVENTIONAL_TITLE" \
  --base "$BASE_REF_NAME" \
  --body "## Summary

This PR supersedes #${PR_NUMBER} (authored by ${AUTHOR_LOGIN}).

The original bot PR required regeneration of files to pass CI verification. This PR includes:
- All changes from the original bot PR (with conventional commit format)
- Regenerated files from \`make verify\`

### Commits

This PR organizes changes into logical commits:
1. Dependency updates (go.mod/go.sum)
2. Vendored dependencies
3. API module updates
4. Regenerated assets (CRDs)

### Original PR Description

${ORIGINAL_BODY}


**Original PR:** #${PR_NUMBER}
**Bot Author:** ${AUTHOR_LOGIN}


Assisted-by: Claude (via Claude Code)"

# Essayer de fermer la PR originale, revenir à un commentaire si pas de permission
gh pr close "$PR_NUMBER" --comment "..." || \
gh pr comment "$PR_NUMBER" --body "This PR has been superseded by #${NEW_PR_NUMBER}.
A maintainer can close this PR.
..."

Format de sortie attendu :

Succès :

============================================
SUCCESS
============================================

Original PR #7435 has been closed (or commented).
New PR created: https://github.com/openshift/hypershift/pull/7500

The new PR includes:
  - All changes from the bot PR (conventional commits)
  - Regenerated files from make verify
  - Organized into logical commits

Next steps:
  1. Review the new PR: https://github.com/openshift/hypershift/pull/7500
  2. Request reviews as needed
  3. Merge when CI passes

Échec :

============================================
VALIDATION FAILED - ABORTING
============================================

The original PR #7435 has been PRESERVED.
Please investigate the failures manually.

- make verify: FAILED
- make test: PASSED

The fix branch 'fix/dependabot/go_modules/...' has been deleted locally.

Stratégie d'organisation des commits :

Les changements doivent être organisés en commits logiques pour faciliter la revue :

Commit Fichiers Format du message
1 go.mod, go.sum chore(deps): update go.mod dependencies
2 vendor/ chore(deps): update vendored dependencies
3 api/go.mod, api/go.sum, api/vendor/ chore(api): update api module dependencies
4 cmd/install/assets/**/*.yaml chore: regenerate CRD manifests
5 Autres changements chore: additional changes from make verify

Gestion des erreurs :

Scénario Message
PR non trouvée ERROR: PR #99999 not found or you don't have access.
PR non ouverte ERROR: PR #7435 is not open (current state: MERGED).
Pas un bot ERROR: PR #7435 is not authored by a bot. Author: username (is_bot: false)
Répertoire de travail sale ERROR: Working directory has uncommitted changes. Please commit or stash before running.
make verify échoué ERROR: make verify failed. Original PR #7435 has been PRESERVED.
make test échoué ERROR: make test failed. Original PR #7435 has been PRESERVED.
git push échoué ERROR: Failed to push branch. Check your permissions and credentials.
Création de PR échouée ERROR: Failed to create new PR. The fix branch has been pushed but you may need to create the PR manually.
Pas de permission de fermeture Revenir à un commentaire sur la PR originale à la place de la fermer

Fonctionnalités de sécurité :

  • Vérification bot : Traite uniquement les PRs avec is_bot: true dans les données auteur
  • Opérations atomiques : La PR originale n'est fermée QUE APRÈS la création réussie de la nouvelle PR
  • Préservation en cas d'échec : La PR originale n'est JAMAIS fermée si la validation échoue
  • État propre requis : Refuse de s'exécuter si le répertoire de travail a des changements non committés
  • Restauration de branche : Retourne toujours à la branche originale après la fin
  • Nettoyage local : Supprime la branche de correction localement en cas d'échec pour éviter le désordre
  • Fallback de permission : Commente sur la PR originale si pas de permission pour la fermer

Bots pris en charge :

Tout auteur bot est pris en charge. Bots courants dans HyperShift :

Bot Connexion auteur PRs typiques
Dependabot app/dependabot Mises à jour de dépendances Go
Konflux app/red-hat-konflux Mises à jour d'images et pipelines
Renovate app/renovate Mises à jour de dépendances
N'importe quel is_bot: true Diverses mises à jour automatisées

Format du titre de la PR :

Le titre de la nouvelle PR doit être préfixé avec NO-JIRA: puisque les mises à jour de dépendances des bots n'ont généralement pas de tickets Jira associés :

NO-JIRA: chore(deps): bump misc-dependencies group with 2 updates

Prérequis :

  • La CLI gh doit être installée et authentifiée avec accès push/PR
  • git doit être configuré avec user.name et user.email
  • make et la chaîne d'outils Go doivent être disponibles
  • Répertoire de travail propre (pas de changements non committés)

Arguments :

  • {{args.0}}: Numéro de PR ou URL GitHub complète (obligatoire)
    • Exemples : 7435, https://github.com/openshift/hypershift/pull/7435

La commande fournira des mises à jour de progression via l'outil TodoWrite et signalera le succès ou l'échec avec des informations détaillées.

Skills similaires